From 23fd8e3d127ab20c430ec7b6b37b8a1f86342943 Mon Sep 17 00:00:00 2001 From: skuli434 Date: Thu, 22 Dec 2011 14:28:30 +0000 Subject: [PATCH] myispconfig --- .../interface/admin/firewall_del.php | 51 + .../interface/admin/firewall_edit.php | 72 + .../interface/admin/firewall_list.php | 52 + .../interface/admin/form/dbsync.tform.php | 264 + .../interface/admin/form/filesync.tform.php | 205 + .../interface/admin/form/firewall.tform.php | 112 + .../interface/admin/form/groups.tform.php | 112 + .../admin/form/remote_user.tform.php | 160 + .../interface/admin/form/server.tform.php | 157 + .../admin/form/server_config.tform.php | 750 ++ .../interface/admin/form/server_ip.tform.php | 125 + .../admin/form/software_repo.tform.php | 153 + .../admin/form/system_config.tform.php | 167 + .../interface/admin/form/users.tform.php | 456 + .../ispconfig/interface/admin/groups_del.php | 51 + .../ispconfig/interface/admin/groups_edit.php | 53 + .../ispconfig/interface/admin/groups_list.php | 51 + interface/ispconfig/interface/admin/index.php | 78 + .../interface/admin/language_add.php | 104 + .../interface/admin/language_complete.php | 167 + .../interface/admin/language_edit.php | 104 + .../interface/admin/language_export.php | 120 + .../interface/admin/language_import.php | 105 + .../interface/admin/language_list.php | 108 + .../ispconfig/interface/admin/lib/lang/bg.lng | 40 + .../interface/admin/lib/lang/bg_firewall.lng | 11 + .../admin/lib/lang/bg_firewall_list.lng | 8 + .../interface/admin/lib/lang/bg_groups.lng | 5 + .../admin/lib/lang/bg_groups_list.lng | 7 + .../admin/lib/lang/bg_language_add.lng | 8 + .../admin/lib/lang/bg_language_complete.lng | 7 + .../admin/lib/lang/bg_language_edit.lng | 8 + .../admin/lib/lang/bg_language_export.lng | 6 + .../admin/lib/lang/bg_language_import.lng | 8 + .../admin/lib/lang/bg_language_list.lng | 7 + .../admin/lib/lang/bg_remote_user.lng | 42 + .../admin/lib/lang/bg_remote_user_list.lng | 7 + .../interface/admin/lib/lang/bg_server.lng | 13 + .../admin/lib/lang/bg_server_config.lng | 68 + .../admin/lib/lang/bg_server_config_list.lng | 4 + .../interface/admin/lib/lang/bg_server_ip.lng | 7 + .../admin/lib/lang/bg_server_ip_list.lng | 6 + .../admin/lib/lang/bg_server_list.lng | 11 + .../lib/lang/bg_software_package_list.lng | 7 + .../admin/lib/lang/bg_software_repo.lng | 7 + .../admin/lib/lang/bg_software_repo_list.lng | 6 + .../lib/lang/bg_software_update_list.lng | 8 + .../admin/lib/lang/bg_system_config.lng | 15 + .../interface/admin/lib/lang/bg_users.lng | 28 + .../admin/lib/lang/bg_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/br.lng | 40 + .../interface/admin/lib/lang/br_firewall.lng | 11 + .../admin/lib/lang/br_firewall_list.lng | 8 + .../interface/admin/lib/lang/br_groups.lng | 5 + .../admin/lib/lang/br_groups_list.lng | 7 + .../admin/lib/lang/br_language_add.lng | 8 + .../admin/lib/lang/br_language_complete.lng | 7 + .../admin/lib/lang/br_language_edit.lng | 8 + .../admin/lib/lang/br_language_export.lng | 6 + .../admin/lib/lang/br_language_import.lng | 8 + .../admin/lib/lang/br_language_list.lng | 7 + .../admin/lib/lang/br_remote_user.lng | 42 + .../admin/lib/lang/br_remote_user_list.lng | 7 + .../interface/admin/lib/lang/br_server.lng | 13 + .../admin/lib/lang/br_server_config.lng | 68 + .../admin/lib/lang/br_server_config_list.lng | 4 + .../interface/admin/lib/lang/br_server_ip.lng | 7 + .../admin/lib/lang/br_server_ip_list.lng | 6 + .../admin/lib/lang/br_server_list.lng | 11 + .../lib/lang/br_software_package_list.lng | 7 + .../admin/lib/lang/br_software_repo.lng | 7 + .../admin/lib/lang/br_software_repo_list.lng | 6 + .../lib/lang/br_software_update_list.lng | 8 + .../admin/lib/lang/br_system_config.lng | 15 + .../interface/admin/lib/lang/br_users.lng | 28 + .../admin/lib/lang/br_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/de.lng | 40 + .../interface/admin/lib/lang/de_firewall.lng | 11 + .../admin/lib/lang/de_firewall_list.lng | 8 + .../interface/admin/lib/lang/de_groups.lng | 5 + .../admin/lib/lang/de_groups_list.lng | 7 + .../admin/lib/lang/de_language_add.lng | 8 + .../admin/lib/lang/de_language_complete.lng | 7 + .../admin/lib/lang/de_language_edit.lng | 8 + .../admin/lib/lang/de_language_export.lng | 6 + .../admin/lib/lang/de_language_import.lng | 8 + .../admin/lib/lang/de_language_list.lng | 7 + .../admin/lib/lang/de_remote_user.lng | 42 + .../admin/lib/lang/de_remote_user_list.lng | 7 + .../interface/admin/lib/lang/de_server.lng | 13 + .../admin/lib/lang/de_server_config.lng | 68 + .../admin/lib/lang/de_server_config_list.lng | 4 + .../interface/admin/lib/lang/de_server_ip.lng | 7 + .../admin/lib/lang/de_server_ip_list.lng | 6 + .../admin/lib/lang/de_server_list.lng | 11 + .../lib/lang/de_software_package_list.lng | 7 + .../admin/lib/lang/de_software_repo.lng | 7 + .../admin/lib/lang/de_software_repo_list.lng | 6 + .../lib/lang/de_software_update_list.lng | 8 + .../admin/lib/lang/de_system_config.lng | 15 + .../interface/admin/lib/lang/de_users.lng | 28 + .../admin/lib/lang/de_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/en.lng | 42 + .../interface/admin/lib/lang/en_firewall.lng | 12 + .../admin/lib/lang/en_firewall_list.lng | 8 + .../interface/admin/lib/lang/en_groups.lng | 5 + .../admin/lib/lang/en_groups_list.lng | 7 + .../admin/lib/lang/en_language_add.lng | 8 + .../admin/lib/lang/en_language_complete.lng | 7 + .../admin/lib/lang/en_language_edit.lng | 8 + .../admin/lib/lang/en_language_export.lng | 6 + .../admin/lib/lang/en_language_import.lng | 8 + .../admin/lib/lang/en_language_list.lng | 7 + .../admin/lib/lang/en_remote_user.lng | 42 + .../admin/lib/lang/en_remote_user_list.lng | 8 + .../interface/admin/lib/lang/en_server.lng | 13 + .../admin/lib/lang/en_server_config.lng | 68 + .../admin/lib/lang/en_server_config_list.lng | 4 + .../interface/admin/lib/lang/en_server_ip.lng | 7 + .../admin/lib/lang/en_server_ip_list.lng | 6 + .../admin/lib/lang/en_server_list.lng | 11 + .../lib/lang/en_software_package_list.lng | 7 + .../admin/lib/lang/en_software_repo.lng | 7 + .../admin/lib/lang/en_software_repo_list.lng | 6 + .../lib/lang/en_software_update_list.lng | 8 + .../admin/lib/lang/en_system_config.lng | 17 + .../interface/admin/lib/lang/en_users.lng | 28 + .../admin/lib/lang/en_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/es.lng | 40 + .../interface/admin/lib/lang/es_firewall.lng | 11 + .../admin/lib/lang/es_firewall_list.lng | 8 + .../interface/admin/lib/lang/es_groups.lng | 5 + .../admin/lib/lang/es_groups_list.lng | 7 + .../admin/lib/lang/es_language_add.lng | 8 + .../admin/lib/lang/es_language_complete.lng | 7 + .../admin/lib/lang/es_language_edit.lng | 8 + .../admin/lib/lang/es_language_export.lng | 6 + .../admin/lib/lang/es_language_import.lng | 8 + .../admin/lib/lang/es_language_list.lng | 7 + .../admin/lib/lang/es_remote_user.lng | 42 + .../admin/lib/lang/es_remote_user_list.lng | 7 + .../interface/admin/lib/lang/es_server.lng | 13 + .../admin/lib/lang/es_server_config.lng | 68 + .../admin/lib/lang/es_server_config_list.lng | 4 + .../interface/admin/lib/lang/es_server_ip.lng | 7 + .../admin/lib/lang/es_server_ip_list.lng | 6 + .../admin/lib/lang/es_server_list.lng | 11 + .../lib/lang/es_software_package_list.lng | 7 + .../admin/lib/lang/es_software_repo.lng | 7 + .../admin/lib/lang/es_software_repo_list.lng | 6 + .../lib/lang/es_software_update_list.lng | 8 + .../admin/lib/lang/es_system_config.lng | 15 + .../interface/admin/lib/lang/es_users.lng | 28 + .../admin/lib/lang/es_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/fi.lng | 40 + .../interface/admin/lib/lang/fi_firewall.lng | 11 + .../admin/lib/lang/fi_firewall_list.lng | 8 + .../interface/admin/lib/lang/fi_groups.lng | 5 + .../admin/lib/lang/fi_groups_list.lng | 7 + .../admin/lib/lang/fi_language_add.lng | 8 + .../admin/lib/lang/fi_language_complete.lng | 7 + .../admin/lib/lang/fi_language_edit.lng | 8 + .../admin/lib/lang/fi_language_export.lng | 6 + .../admin/lib/lang/fi_language_import.lng | 8 + .../admin/lib/lang/fi_language_list.lng | 7 + .../admin/lib/lang/fi_remote_user.lng | 42 + .../admin/lib/lang/fi_remote_user_list.lng | 7 + .../interface/admin/lib/lang/fi_server.lng | 13 + .../admin/lib/lang/fi_server_config.lng | 68 + .../admin/lib/lang/fi_server_config_list.lng | 4 + .../interface/admin/lib/lang/fi_server_ip.lng | 7 + .../admin/lib/lang/fi_server_ip_list.lng | 6 + .../admin/lib/lang/fi_server_list.lng | 11 + .../lib/lang/fi_software_package_list.lng | 7 + .../admin/lib/lang/fi_software_repo.lng | 7 + .../admin/lib/lang/fi_software_repo_list.lng | 6 + .../lib/lang/fi_software_update_list.lng | 8 + .../admin/lib/lang/fi_system_config.lng | 15 + .../interface/admin/lib/lang/fi_users.lng | 28 + .../admin/lib/lang/fi_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/fr.lng | 40 + .../interface/admin/lib/lang/fr_firewall.lng | 11 + .../admin/lib/lang/fr_firewall_list.lng | 8 + .../interface/admin/lib/lang/fr_groups.lng | 5 + .../admin/lib/lang/fr_groups_list.lng | 7 + .../admin/lib/lang/fr_language_add.lng | 8 + .../admin/lib/lang/fr_language_complete.lng | 7 + .../admin/lib/lang/fr_language_edit.lng | 8 + .../admin/lib/lang/fr_language_export.lng | 6 + .../admin/lib/lang/fr_language_import.lng | 8 + .../admin/lib/lang/fr_language_list.lng | 7 + .../admin/lib/lang/fr_remote_user.lng | 42 + .../admin/lib/lang/fr_remote_user_list.lng | 7 + .../interface/admin/lib/lang/fr_server.lng | 13 + .../admin/lib/lang/fr_server_config.lng | 68 + .../admin/lib/lang/fr_server_config_list.lng | 4 + .../interface/admin/lib/lang/fr_server_ip.lng | 7 + .../admin/lib/lang/fr_server_ip_list.lng | 6 + .../admin/lib/lang/fr_server_list.lng | 11 + .../lib/lang/fr_software_package_list.lng | 7 + .../admin/lib/lang/fr_software_repo.lng | 7 + .../admin/lib/lang/fr_software_repo_list.lng | 6 + .../lib/lang/fr_software_update_list.lng | 8 + .../admin/lib/lang/fr_system_config.lng | 15 + .../interface/admin/lib/lang/fr_users.lng | 28 + .../admin/lib/lang/fr_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/hu.lng | 40 + .../interface/admin/lib/lang/hu_firewall.lng | 11 + .../admin/lib/lang/hu_firewall_list.lng | 8 + .../interface/admin/lib/lang/hu_groups.lng | 5 + .../admin/lib/lang/hu_groups_list.lng | 7 + .../admin/lib/lang/hu_language_add.lng | 8 + .../admin/lib/lang/hu_language_complete.lng | 7 + .../admin/lib/lang/hu_language_edit.lng | 8 + .../admin/lib/lang/hu_language_export.lng | 6 + .../admin/lib/lang/hu_language_import.lng | 8 + .../admin/lib/lang/hu_language_list.lng | 7 + .../admin/lib/lang/hu_remote_user.lng | 42 + .../admin/lib/lang/hu_remote_user_list.lng | 7 + .../interface/admin/lib/lang/hu_server.lng | 13 + .../admin/lib/lang/hu_server_config.lng | 68 + .../admin/lib/lang/hu_server_config_list.lng | 4 + .../interface/admin/lib/lang/hu_server_ip.lng | 7 + .../admin/lib/lang/hu_server_ip_list.lng | 6 + .../admin/lib/lang/hu_server_list.lng | 11 + .../lib/lang/hu_software_package_list.lng | 7 + .../admin/lib/lang/hu_software_repo.lng | 7 + .../admin/lib/lang/hu_software_repo_list.lng | 6 + .../lib/lang/hu_software_update_list.lng | 8 + .../admin/lib/lang/hu_system_config.lng | 15 + .../interface/admin/lib/lang/hu_users.lng | 28 + .../admin/lib/lang/hu_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/it.lng | 40 + .../interface/admin/lib/lang/it_firewall.lng | 11 + .../admin/lib/lang/it_firewall_list.lng | 8 + .../interface/admin/lib/lang/it_groups.lng | 5 + .../admin/lib/lang/it_groups_list.lng | 7 + .../admin/lib/lang/it_language_add.lng | 8 + .../admin/lib/lang/it_language_complete.lng | 7 + .../admin/lib/lang/it_language_edit.lng | 8 + .../admin/lib/lang/it_language_export.lng | 6 + .../admin/lib/lang/it_language_import.lng | 8 + .../admin/lib/lang/it_language_list.lng | 7 + .../admin/lib/lang/it_remote_user.lng | 42 + .../admin/lib/lang/it_remote_user_list.lng | 7 + .../interface/admin/lib/lang/it_server.lng | 13 + .../admin/lib/lang/it_server_config.lng | 68 + .../admin/lib/lang/it_server_config_list.lng | 4 + .../interface/admin/lib/lang/it_server_ip.lng | 7 + .../admin/lib/lang/it_server_ip_list.lng | 6 + .../admin/lib/lang/it_server_list.lng | 11 + .../lib/lang/it_software_package_list.lng | 7 + .../admin/lib/lang/it_software_repo.lng | 7 + .../admin/lib/lang/it_software_repo_list.lng | 6 + .../lib/lang/it_software_update_list.lng | 8 + .../admin/lib/lang/it_system_config.lng | 15 + .../interface/admin/lib/lang/it_users.lng | 28 + .../admin/lib/lang/it_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/ja.lng | 40 + .../interface/admin/lib/lang/ja_firewall.lng | 11 + .../admin/lib/lang/ja_firewall_list.lng | 8 + .../interface/admin/lib/lang/ja_groups.lng | 5 + .../admin/lib/lang/ja_groups_list.lng | 7 + .../admin/lib/lang/ja_language_add.lng | 8 + .../admin/lib/lang/ja_language_complete.lng | 7 + .../admin/lib/lang/ja_language_edit.lng | 8 + .../admin/lib/lang/ja_language_export.lng | 6 + .../admin/lib/lang/ja_language_import.lng | 8 + .../admin/lib/lang/ja_language_list.lng | 7 + .../admin/lib/lang/ja_remote_user.lng | 42 + .../admin/lib/lang/ja_remote_user_list.lng | 7 + .../interface/admin/lib/lang/ja_server.lng | 13 + .../admin/lib/lang/ja_server_config.lng | 68 + .../admin/lib/lang/ja_server_config_list.lng | 4 + .../interface/admin/lib/lang/ja_server_ip.lng | 7 + .../admin/lib/lang/ja_server_ip_list.lng | 6 + .../admin/lib/lang/ja_server_list.lng | 11 + .../lib/lang/ja_software_package_list.lng | 7 + .../admin/lib/lang/ja_software_repo.lng | 7 + .../admin/lib/lang/ja_software_repo_list.lng | 6 + .../lib/lang/ja_software_update_list.lng | 8 + .../admin/lib/lang/ja_system_config.lng | 15 + .../interface/admin/lib/lang/ja_users.lng | 28 + .../admin/lib/lang/ja_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/nl.lng | 40 + .../interface/admin/lib/lang/nl_firewall.lng | 11 + .../admin/lib/lang/nl_firewall_list.lng | 8 + .../interface/admin/lib/lang/nl_groups.lng | 5 + .../admin/lib/lang/nl_groups_list.lng | 7 + .../admin/lib/lang/nl_language_add.lng | 8 + .../admin/lib/lang/nl_language_complete.lng | 7 + .../admin/lib/lang/nl_language_edit.lng | 8 + .../admin/lib/lang/nl_language_export.lng | 6 + .../admin/lib/lang/nl_language_import.lng | 8 + .../admin/lib/lang/nl_language_list.lng | 7 + .../admin/lib/lang/nl_remote_user.lng | 42 + .../admin/lib/lang/nl_remote_user_list.lng | 7 + .../interface/admin/lib/lang/nl_server.lng | 13 + .../admin/lib/lang/nl_server_config.lng | 68 + .../admin/lib/lang/nl_server_config_list.lng | 4 + .../interface/admin/lib/lang/nl_server_ip.lng | 7 + .../admin/lib/lang/nl_server_ip_list.lng | 6 + .../admin/lib/lang/nl_server_list.lng | 11 + .../lib/lang/nl_software_package_list.lng | 7 + .../admin/lib/lang/nl_software_repo.lng | 7 + .../admin/lib/lang/nl_software_repo_list.lng | 6 + .../lib/lang/nl_software_update_list.lng | 8 + .../admin/lib/lang/nl_system_config.lng | 15 + .../interface/admin/lib/lang/nl_users.lng | 28 + .../admin/lib/lang/nl_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/pl.lng | 40 + .../interface/admin/lib/lang/pl_firewall.lng | 11 + .../admin/lib/lang/pl_firewall_list.lng | 8 + .../interface/admin/lib/lang/pl_groups.lng | 5 + .../admin/lib/lang/pl_groups_list.lng | 7 + .../admin/lib/lang/pl_language_add.lng | 8 + .../admin/lib/lang/pl_language_complete.lng | 7 + .../admin/lib/lang/pl_language_edit.lng | 8 + .../admin/lib/lang/pl_language_export.lng | 6 + .../admin/lib/lang/pl_language_import.lng | 8 + .../admin/lib/lang/pl_language_list.lng | 7 + .../admin/lib/lang/pl_remote_user.lng | 42 + .../admin/lib/lang/pl_remote_user_list.lng | 7 + .../interface/admin/lib/lang/pl_server.lng | 13 + .../admin/lib/lang/pl_server_config.lng | 68 + .../admin/lib/lang/pl_server_config_list.lng | 4 + .../interface/admin/lib/lang/pl_server_ip.lng | 7 + .../admin/lib/lang/pl_server_ip_list.lng | 6 + .../admin/lib/lang/pl_server_list.lng | 11 + .../lib/lang/pl_software_package_list.lng | 7 + .../admin/lib/lang/pl_software_repo.lng | 7 + .../admin/lib/lang/pl_software_repo_list.lng | 6 + .../lib/lang/pl_software_update_list.lng | 8 + .../admin/lib/lang/pl_system_config.lng | 15 + .../interface/admin/lib/lang/pl_users.lng | 28 + .../admin/lib/lang/pl_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/pt.lng | 41 + .../interface/admin/lib/lang/pt_firewall.lng | 12 + .../admin/lib/lang/pt_firewall_list.lng | 9 + .../interface/admin/lib/lang/pt_groups.lng | 6 + .../admin/lib/lang/pt_groups_list.lng | 8 + .../admin/lib/lang/pt_language_add.lng | 9 + .../admin/lib/lang/pt_language_complete.lng | 8 + .../admin/lib/lang/pt_language_edit.lng | 9 + .../admin/lib/lang/pt_language_export.lng | 7 + .../admin/lib/lang/pt_language_import.lng | 9 + .../admin/lib/lang/pt_language_list.lng | 8 + .../admin/lib/lang/pt_remote_user.lng | 43 + .../admin/lib/lang/pt_remote_user_list.lng | 8 + .../interface/admin/lib/lang/pt_server.lng | 14 + .../admin/lib/lang/pt_server_config.lng | 69 + .../admin/lib/lang/pt_server_config_list.lng | 5 + .../interface/admin/lib/lang/pt_server_ip.lng | 8 + .../admin/lib/lang/pt_server_ip_list.lng | 7 + .../admin/lib/lang/pt_server_list.lng | 12 + .../lib/lang/pt_software_package_list.lng | 8 + .../admin/lib/lang/pt_software_repo.lng | 8 + .../admin/lib/lang/pt_software_repo_list.lng | 7 + .../lib/lang/pt_software_update_list.lng | 9 + .../admin/lib/lang/pt_system_config.lng | 16 + .../interface/admin/lib/lang/pt_users.lng | 29 + .../admin/lib/lang/pt_users_list.lng | 10 + .../ispconfig/interface/admin/lib/lang/ro.lng | 40 + .../interface/admin/lib/lang/ro_firewall.lng | 11 + .../admin/lib/lang/ro_firewall_list.lng | 8 + .../interface/admin/lib/lang/ro_groups.lng | 5 + .../admin/lib/lang/ro_groups_list.lng | 7 + .../admin/lib/lang/ro_language_add.lng | 8 + .../admin/lib/lang/ro_language_complete.lng | 7 + .../admin/lib/lang/ro_language_edit.lng | 8 + .../admin/lib/lang/ro_language_export.lng | 6 + .../admin/lib/lang/ro_language_import.lng | 8 + .../admin/lib/lang/ro_language_list.lng | 7 + .../admin/lib/lang/ro_remote_user.lng | 42 + .../admin/lib/lang/ro_remote_user_list.lng | 8 + .../interface/admin/lib/lang/ro_server.lng | 13 + .../admin/lib/lang/ro_server_config.lng | 68 + .../admin/lib/lang/ro_server_config_list.lng | 4 + .../interface/admin/lib/lang/ro_server_ip.lng | 7 + .../admin/lib/lang/ro_server_ip_list.lng | 6 + .../admin/lib/lang/ro_server_list.lng | 11 + .../lib/lang/ro_software_package_list.lng | 7 + .../admin/lib/lang/ro_software_repo.lng | 7 + .../admin/lib/lang/ro_software_repo_list.lng | 6 + .../lib/lang/ro_software_update_list.lng | 8 + .../admin/lib/lang/ro_system_config.lng | 15 + .../interface/admin/lib/lang/ro_users.lng | 28 + .../admin/lib/lang/ro_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/ru.lng | 41 + .../interface/admin/lib/lang/ru_firewall.lng | 12 + .../admin/lib/lang/ru_firewall_list.lng | 9 + .../interface/admin/lib/lang/ru_groups.lng | 6 + .../admin/lib/lang/ru_groups_list.lng | 8 + .../admin/lib/lang/ru_language_add.lng | 9 + .../admin/lib/lang/ru_language_complete.lng | 8 + .../admin/lib/lang/ru_language_edit.lng | 9 + .../admin/lib/lang/ru_language_export.lng | 7 + .../admin/lib/lang/ru_language_import.lng | 9 + .../admin/lib/lang/ru_language_list.lng | 8 + .../admin/lib/lang/ru_remote_user.lng | 43 + .../admin/lib/lang/ru_remote_user_list.lng | 8 + .../interface/admin/lib/lang/ru_server.lng | 14 + .../admin/lib/lang/ru_server_config.lng | 69 + .../admin/lib/lang/ru_server_config_list.lng | 5 + .../interface/admin/lib/lang/ru_server_ip.lng | 8 + .../admin/lib/lang/ru_server_ip_list.lng | 7 + .../admin/lib/lang/ru_server_list.lng | 12 + .../lib/lang/ru_software_package_list.lng | 8 + .../admin/lib/lang/ru_software_repo.lng | 8 + .../admin/lib/lang/ru_software_repo_list.lng | 7 + .../lib/lang/ru_software_update_list.lng | 9 + .../admin/lib/lang/ru_system_config.lng | 16 + .../interface/admin/lib/lang/ru_users.lng | 29 + .../admin/lib/lang/ru_users_list.lng | 10 + .../ispconfig/interface/admin/lib/lang/se.lng | 40 + .../interface/admin/lib/lang/se_firewall.lng | 11 + .../admin/lib/lang/se_firewall_list.lng | 8 + .../interface/admin/lib/lang/se_groups.lng | 5 + .../admin/lib/lang/se_groups_list.lng | 7 + .../admin/lib/lang/se_language_add.lng | 8 + .../admin/lib/lang/se_language_complete.lng | 7 + .../admin/lib/lang/se_language_edit.lng | 8 + .../admin/lib/lang/se_language_export.lng | 6 + .../admin/lib/lang/se_language_import.lng | 8 + .../admin/lib/lang/se_language_list.lng | 7 + .../admin/lib/lang/se_remote_user.lng | 42 + .../admin/lib/lang/se_remote_user_list.lng | 7 + .../interface/admin/lib/lang/se_server.lng | 13 + .../admin/lib/lang/se_server_config.lng | 68 + .../admin/lib/lang/se_server_config_list.lng | 4 + .../interface/admin/lib/lang/se_server_ip.lng | 7 + .../admin/lib/lang/se_server_ip_list.lng | 6 + .../admin/lib/lang/se_server_list.lng | 11 + .../lib/lang/se_software_package_list.lng | 7 + .../admin/lib/lang/se_software_repo.lng | 7 + .../admin/lib/lang/se_software_repo_list.lng | 6 + .../lib/lang/se_software_update_list.lng | 8 + .../admin/lib/lang/se_system_config.lng | 15 + .../interface/admin/lib/lang/se_users.lng | 28 + .../admin/lib/lang/se_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/sk.lng | 40 + .../interface/admin/lib/lang/sk_firewall.lng | 11 + .../admin/lib/lang/sk_firewall_list.lng | 8 + .../interface/admin/lib/lang/sk_groups.lng | 5 + .../admin/lib/lang/sk_groups_list.lng | 7 + .../admin/lib/lang/sk_language_add.lng | 8 + .../admin/lib/lang/sk_language_complete.lng | 7 + .../admin/lib/lang/sk_language_edit.lng | 8 + .../admin/lib/lang/sk_language_export.lng | 6 + .../admin/lib/lang/sk_language_import.lng | 8 + .../admin/lib/lang/sk_language_list.lng | 7 + .../admin/lib/lang/sk_remote_user.lng | 42 + .../admin/lib/lang/sk_remote_user_list.lng | 7 + .../interface/admin/lib/lang/sk_server.lng | 13 + .../admin/lib/lang/sk_server_config.lng | 68 + .../admin/lib/lang/sk_server_config_list.lng | 4 + .../interface/admin/lib/lang/sk_server_ip.lng | 7 + .../admin/lib/lang/sk_server_ip_list.lng | 6 + .../admin/lib/lang/sk_server_list.lng | 11 + .../lib/lang/sk_software_package_list.lng | 7 + .../admin/lib/lang/sk_software_repo.lng | 7 + .../admin/lib/lang/sk_software_repo_list.lng | 6 + .../lib/lang/sk_software_update_list.lng | 8 + .../admin/lib/lang/sk_system_config.lng | 15 + .../interface/admin/lib/lang/sk_users.lng | 28 + .../admin/lib/lang/sk_users_list.lng | 9 + .../ispconfig/interface/admin/lib/lang/tr.lng | 40 + .../interface/admin/lib/lang/tr_firewall.lng | 11 + .../admin/lib/lang/tr_firewall_list.lng | 8 + .../interface/admin/lib/lang/tr_groups.lng | 5 + .../admin/lib/lang/tr_groups_list.lng | 7 + .../admin/lib/lang/tr_language_add.lng | 8 + .../admin/lib/lang/tr_language_complete.lng | 7 + .../admin/lib/lang/tr_language_edit.lng | 8 + .../admin/lib/lang/tr_language_export.lng | 6 + .../admin/lib/lang/tr_language_import.lng | 8 + .../admin/lib/lang/tr_language_list.lng | 7 + .../admin/lib/lang/tr_remote_user.lng | 42 + .../admin/lib/lang/tr_remote_user_list.lng | 7 + .../interface/admin/lib/lang/tr_server.lng | 13 + .../admin/lib/lang/tr_server_config.lng | 68 + .../admin/lib/lang/tr_server_config_list.lng | 4 + .../interface/admin/lib/lang/tr_server_ip.lng | 7 + .../admin/lib/lang/tr_server_ip_list.lng | 6 + .../admin/lib/lang/tr_server_list.lng | 11 + .../lib/lang/tr_software_package_list.lng | 7 + .../admin/lib/lang/tr_software_repo.lng | 7 + .../admin/lib/lang/tr_software_repo_list.lng | 6 + .../lib/lang/tr_software_update_list.lng | 8 + .../admin/lib/lang/tr_system_config.lng | 15 + .../interface/admin/lib/lang/tr_users.lng | 28 + .../admin/lib/lang/tr_users_list.lng | 9 + .../interface/admin/lib/module.conf.php | 174 + .../interface/admin/list/firewall.list.php | 93 + .../interface/admin/list/groups.list.php | 61 + .../interface/admin/list/remote_user.list.php | 65 + .../interface/admin/list/server.list.php | 110 + .../admin/list/server_config.list.php | 60 + .../interface/admin/list/server_ip.list.php | 68 + .../admin/list/software_repo.list.php | 78 + .../interface/admin/list/users.list.php | 75 + .../ispconfig/interface/admin/login_as.php | 84 + .../interface/admin/remote_user_del.php | 62 + .../interface/admin/remote_user_edit.php | 43 + .../interface/admin/remote_user_list.php | 24 + .../interface/admin/server_config_del.php | 51 + .../interface/admin/server_config_edit.php | 95 + .../interface/admin/server_config_list.php | 53 + .../ispconfig/interface/admin/server_del.php | 51 + .../ispconfig/interface/admin/server_edit.php | 86 + .../interface/admin/server_ip_del.php | 51 + .../interface/admin/server_ip_edit.php | 73 + .../interface/admin/server_ip_list.php | 54 + .../ispconfig/interface/admin/server_list.php | 51 + .../interface/admin/software_package_list.php | 169 + .../interface/admin/software_repo_del.php | 51 + .../interface/admin/software_repo_edit.php | 58 + .../interface/admin/software_repo_list.php | 52 + .../interface/admin/software_update_list.php | 222 + .../interface/admin/system_config_edit.php | 97 + .../admin/templates/firewall_edit.htm | 38 + .../admin/templates/firewall_list.htm | 60 + .../interface/admin/templates/groups_edit.htm | 26 + .../interface/admin/templates/groups_list.htm | 55 + .../admin/templates/language_add.htm | 29 + .../admin/templates/language_complete.htm | 29 + .../admin/templates/language_edit.htm | 29 + .../admin/templates/language_export.htm | 28 + .../admin/templates/language_import.htm | 41 + .../admin/templates/language_list.htm | 47 + .../admin/templates/remote_user_edit.htm | 41 + .../admin/templates/remote_user_list.htm | 54 + .../templates/server_config_cron_edit.htm | 30 + .../templates/server_config_dns_edit.htm | 38 + .../templates/server_config_fastcgi_edit.htm | 46 + .../templates/server_config_getmail_edit.htm | 22 + .../templates/server_config_jailkit_edit.htm | 34 + .../admin/templates/server_config_list.htm | 40 + .../templates/server_config_mail_edit.htm | 84 + .../templates/server_config_server_edit.htm | 51 + .../templates/server_config_vlogger_edit.htm | 22 + .../templates/server_config_web_edit.htm | 74 + .../admin/templates/server_edit_config.htm | 22 + .../admin/templates/server_edit_services.htm | 70 + .../admin/templates/server_ip_edit.htm | 34 + .../admin/templates/server_ip_list.htm | 53 + .../interface/admin/templates/server_list.htm | 58 + .../admin/templates/software_package_list.htm | 34 + .../admin/templates/software_repo_edit.htm | 40 + .../admin/templates/software_repo_list.htm | 56 + .../admin/templates/software_update_list.htm | 49 + .../templates/system_config_mail_edit.htm | 28 + .../templates/system_config_sites_edit.htm | 44 + .../admin/templates/users_groups_edit.htm | 30 + .../interface/admin/templates/users_list.htm | 61 + .../admin/templates/users_user_edit.htm | 67 + .../ispconfig/interface/admin/users_del.php | 51 + .../ispconfig/interface/admin/users_edit.php | 74 + .../ispconfig/interface/admin/users_list.php | 52 + interface/ispconfig/interface/capp.php | 56 + .../ispconfig/interface/client/client_del.php | 166 + .../interface/client/client_edit.php | 228 + .../interface/client/client_list.php | 25 + .../interface/client/client_template_del.php | 67 + .../interface/client/client_template_edit.php | 97 + .../interface/client/client_template_list.php | 21 + .../interface/client/form/client.tform.php | 785 ++ .../client/form/client_template.tform.php | 482 + .../interface/client/form/reseller.tform.php | 761 ++ .../interface/client/lib/admin.conf.php | 2 + .../interface/client/lib/lang/bg.lng | 13 + .../interface/client/lib/lang/bg_client.lng | 94 + .../client/lib/lang/bg_client_del.lng | 6 + .../client/lib/lang/bg_client_template.lng | 57 + .../lib/lang/bg_client_template_list.lng | 5 + .../client/lib/lang/bg_clients_list.lng | 9 + .../interface/client/lib/lang/bg_reseller.lng | 93 + .../client/lib/lang/bg_resellers_list.lng | 9 + .../interface/client/lib/lang/br.lng | 13 + .../interface/client/lib/lang/br_client.lng | 94 + .../client/lib/lang/br_client_del.lng | 6 + .../client/lib/lang/br_client_template.lng | 57 + .../lib/lang/br_client_template_list.lng | 5 + .../client/lib/lang/br_clients_list.lng | 9 + .../interface/client/lib/lang/br_reseller.lng | 93 + .../client/lib/lang/br_resellers_list.lng | 9 + .../interface/client/lib/lang/de.lng | 13 + .../interface/client/lib/lang/de_client.lng | 94 + .../client/lib/lang/de_client_del.lng | 6 + .../client/lib/lang/de_client_template.lng | 57 + .../lib/lang/de_client_template_list.lng | 5 + .../client/lib/lang/de_clients_list.lng | 9 + .../interface/client/lib/lang/de_reseller.lng | 93 + .../client/lib/lang/de_resellers_list.lng | 9 + .../interface/client/lib/lang/en.lng | 14 + .../interface/client/lib/lang/en_client.lng | 97 + .../client/lib/lang/en_client_del.lng | 6 + .../client/lib/lang/en_client_template.lng | 61 + .../lib/lang/en_client_template_list.lng | 5 + .../client/lib/lang/en_clients_list.lng | 9 + .../interface/client/lib/lang/en_reseller.lng | 96 + .../client/lib/lang/en_resellers_list.lng | 9 + .../interface/client/lib/lang/es.lng | 13 + .../interface/client/lib/lang/es_client.lng | 94 + .../client/lib/lang/es_client_del.lng | 6 + .../client/lib/lang/es_client_template.lng | 57 + .../lib/lang/es_client_template_list.lng | 5 + .../client/lib/lang/es_clients_list.lng | 9 + .../interface/client/lib/lang/es_reseller.lng | 93 + .../client/lib/lang/es_resellers_list.lng | 9 + .../interface/client/lib/lang/fi.lng | 13 + .../interface/client/lib/lang/fi_client.lng | 94 + .../client/lib/lang/fi_client_del.lng | 6 + .../client/lib/lang/fi_client_template.lng | 57 + .../lib/lang/fi_client_template_list.lng | 5 + .../client/lib/lang/fi_clients_list.lng | 9 + .../interface/client/lib/lang/fi_reseller.lng | 93 + .../client/lib/lang/fi_resellers_list.lng | 9 + .../interface/client/lib/lang/fr.lng | 13 + .../interface/client/lib/lang/fr_client.lng | 94 + .../client/lib/lang/fr_client_del.lng | 6 + .../client/lib/lang/fr_client_template.lng | 57 + .../lib/lang/fr_client_template_list.lng | 5 + .../client/lib/lang/fr_clients_list.lng | 9 + .../interface/client/lib/lang/fr_reseller.lng | 93 + .../client/lib/lang/fr_resellers_list.lng | 9 + .../interface/client/lib/lang/hu.lng | 13 + .../interface/client/lib/lang/hu_client.lng | 94 + .../client/lib/lang/hu_client_del.lng | 6 + .../client/lib/lang/hu_client_template.lng | 57 + .../lib/lang/hu_client_template_list.lng | 5 + .../client/lib/lang/hu_clients_list.lng | 9 + .../interface/client/lib/lang/hu_reseller.lng | 93 + .../client/lib/lang/hu_resellers_list.lng | 9 + .../interface/client/lib/lang/it.lng | 13 + .../interface/client/lib/lang/it_client.lng | 94 + .../client/lib/lang/it_client_del.lng | 6 + .../client/lib/lang/it_client_template.lng | 57 + .../lib/lang/it_client_template_list.lng | 5 + .../client/lib/lang/it_clients_list.lng | 9 + .../interface/client/lib/lang/it_reseller.lng | 93 + .../client/lib/lang/it_resellers_list.lng | 9 + .../interface/client/lib/lang/ja.lng | 13 + .../interface/client/lib/lang/ja_client.lng | 94 + .../client/lib/lang/ja_client_del.lng | 6 + .../client/lib/lang/ja_client_template.lng | 57 + .../lib/lang/ja_client_template_list.lng | 5 + .../client/lib/lang/ja_clients_list.lng | 9 + .../interface/client/lib/lang/ja_reseller.lng | 93 + .../client/lib/lang/ja_resellers_list.lng | 9 + .../interface/client/lib/lang/nl.lng | 13 + .../interface/client/lib/lang/nl_client.lng | 94 + .../client/lib/lang/nl_client_del.lng | 6 + .../client/lib/lang/nl_client_template.lng | 57 + .../lib/lang/nl_client_template_list.lng | 5 + .../client/lib/lang/nl_clients_list.lng | 9 + .../interface/client/lib/lang/nl_reseller.lng | 93 + .../client/lib/lang/nl_resellers_list.lng | 9 + .../interface/client/lib/lang/pl.lng | 13 + .../interface/client/lib/lang/pl_client.lng | 94 + .../client/lib/lang/pl_client_del.lng | 6 + .../client/lib/lang/pl_client_template.lng | 57 + .../lib/lang/pl_client_template_list.lng | 5 + .../client/lib/lang/pl_clients_list.lng | 9 + .../interface/client/lib/lang/pl_reseller.lng | 93 + .../client/lib/lang/pl_resellers_list.lng | 9 + .../interface/client/lib/lang/pt.lng | 14 + .../interface/client/lib/lang/pt_client.lng | 95 + .../client/lib/lang/pt_client_del.lng | 7 + .../client/lib/lang/pt_client_template.lng | 58 + .../lib/lang/pt_client_template_list.lng | 6 + .../client/lib/lang/pt_clients_list.lng | 10 + .../interface/client/lib/lang/pt_reseller.lng | 94 + .../client/lib/lang/pt_resellers_list.lng | 10 + .../interface/client/lib/lang/ro.lng | 13 + .../interface/client/lib/lang/ro_client.lng | 94 + .../client/lib/lang/ro_client_del.lng | 6 + .../client/lib/lang/ro_client_template.lng | 57 + .../lib/lang/ro_client_template_list.lng | 5 + .../client/lib/lang/ro_clients_list.lng | 9 + .../interface/client/lib/lang/ro_reseller.lng | 96 + .../client/lib/lang/ro_resellers_list.lng | 9 + .../interface/client/lib/lang/ru.lng | 14 + .../interface/client/lib/lang/ru_client.lng | 95 + .../client/lib/lang/ru_client_del.lng | 7 + .../client/lib/lang/ru_client_template.lng | 58 + .../lib/lang/ru_client_template_list.lng | 6 + .../client/lib/lang/ru_clients_list.lng | 10 + .../interface/client/lib/lang/ru_reseller.lng | 94 + .../client/lib/lang/ru_resellers_list.lng | 10 + .../interface/client/lib/lang/se.lng | 13 + .../interface/client/lib/lang/se_client.lng | 94 + .../client/lib/lang/se_client_del.lng | 6 + .../client/lib/lang/se_client_template.lng | 57 + .../lib/lang/se_client_template_list.lng | 5 + .../client/lib/lang/se_clients_list.lng | 9 + .../interface/client/lib/lang/se_reseller.lng | 93 + .../client/lib/lang/se_resellers_list.lng | 9 + .../interface/client/lib/lang/sk.lng | 13 + .../interface/client/lib/lang/sk_client.lng | 94 + .../client/lib/lang/sk_client_del.lng | 6 + .../client/lib/lang/sk_client_template.lng | 57 + .../lib/lang/sk_client_template_list.lng | 5 + .../client/lib/lang/sk_clients_list.lng | 9 + .../interface/client/lib/lang/sk_reseller.lng | 93 + .../client/lib/lang/sk_resellers_list.lng | 9 + .../interface/client/lib/lang/tr.lng | 13 + .../interface/client/lib/lang/tr_client.lng | 94 + .../client/lib/lang/tr_client_del.lng | 6 + .../client/lib/lang/tr_client_template.lng | 57 + .../lib/lang/tr_client_template_list.lng | 5 + .../client/lib/lang/tr_clients_list.lng | 9 + .../interface/client/lib/lang/tr_reseller.lng | 93 + .../client/lib/lang/tr_resellers_list.lng | 9 + .../interface/client/lib/module.conf.php | 63 + .../interface/client/list/client.list.php | 87 + .../client/list/client_template.list.php | 65 + .../interface/client/list/reseller.list.php | 87 + .../interface/client/reseller_del.php | 92 + .../interface/client/reseller_edit.php | 222 + .../interface/client/reseller_list.php | 55 + .../interface/client/templates/client_del.htm | 25 + .../client/templates/client_edit_address.htm | 101 + .../client/templates/client_edit_limits.htm | 190 + .../templates/client_template_edit_limits.htm | 124 + .../client_template_edit_template.htm | 28 + .../client/templates/client_template_list.htm | 53 + .../client/templates/clients_list.htm | 63 + .../templates/reseller_edit_address.htm | 101 + .../client/templates/reseller_edit_limits.htm | 179 + .../client/templates/resellers_list.htm | 63 + .../ispconfig/interface/client/tools.inc.php | 88 + interface/ispconfig/interface/content.php | 83 + .../interface/designer/form_edit.php | 152 + .../interface/designer/form_list.php | 89 + .../interface/designer/form_show.php | 119 + .../ispconfig/interface/designer/index.php | 0 .../interface/designer/lib/admin.conf.php | 4 + .../interface/designer/lib/lang/bg.lng | 2 + .../designer/lib/lang/bg_form_edit.lng | 24 + .../designer/lib/lang/bg_form_list.lng | 7 + .../designer/lib/lang/bg_form_show.lng | 18 + .../designer/lib/lang/bg_module_edit.lng | 12 + .../designer/lib/lang/bg_module_list.lng | 5 + .../designer/lib/lang/bg_module_nav_edit.lng | 6 + .../lib/lang/bg_module_nav_item_edit.lng | 8 + .../designer/lib/lang/bg_module_show.lng | 16 + .../interface/designer/lib/lang/br.lng | 2 + .../designer/lib/lang/br_form_edit.lng | 24 + .../designer/lib/lang/br_form_list.lng | 7 + .../designer/lib/lang/br_form_show.lng | 18 + .../designer/lib/lang/br_module_edit.lng | 22 + .../designer/lib/lang/br_module_list.lng | 5 + .../designer/lib/lang/br_module_nav_edit.lng | 6 + .../lib/lang/br_module_nav_item_edit.lng | 8 + .../designer/lib/lang/br_module_show.lng | 16 + .../interface/designer/lib/lang/de.lng | 2 + .../designer/lib/lang/de_form_edit.lng | 24 + .../designer/lib/lang/de_form_list.lng | 7 + .../designer/lib/lang/de_form_show.lng | 18 + .../designer/lib/lang/de_module_edit.lng | 12 + .../designer/lib/lang/de_module_list.lng | 5 + .../designer/lib/lang/de_module_nav_edit.lng | 6 + .../lib/lang/de_module_nav_item_edit.lng | 8 + .../designer/lib/lang/de_module_show.lng | 16 + .../interface/designer/lib/lang/en.lng | 3 + .../designer/lib/lang/en_form_edit.lng | 26 + .../designer/lib/lang/en_form_list.lng | 7 + .../designer/lib/lang/en_form_show.lng | 18 + .../designer/lib/lang/en_module_edit.lng | 23 + .../designer/lib/lang/en_module_list.lng | 5 + .../designer/lib/lang/en_module_nav_edit.lng | 6 + .../lib/lang/en_module_nav_item_edit.lng | 8 + .../designer/lib/lang/en_module_show.lng | 17 + .../interface/designer/lib/lang/es.lng | 2 + .../designer/lib/lang/es_form_edit.lng | 24 + .../designer/lib/lang/es_form_list.lng | 7 + .../designer/lib/lang/es_form_show.lng | 18 + .../designer/lib/lang/es_module_edit.lng | 12 + .../designer/lib/lang/es_module_list.lng | 5 + .../designer/lib/lang/es_module_nav_edit.lng | 6 + .../lib/lang/es_module_nav_item_edit.lng | 8 + .../designer/lib/lang/es_module_show.lng | 16 + .../interface/designer/lib/lang/fi.lng | 2 + .../designer/lib/lang/fi_form_edit.lng | 24 + .../designer/lib/lang/fi_form_list.lng | 7 + .../designer/lib/lang/fi_form_show.lng | 18 + .../designer/lib/lang/fi_module_edit.lng | 22 + .../designer/lib/lang/fi_module_list.lng | 5 + .../designer/lib/lang/fi_module_nav_edit.lng | 6 + .../lib/lang/fi_module_nav_item_edit.lng | 8 + .../designer/lib/lang/fi_module_show.lng | 16 + .../interface/designer/lib/lang/fr.lng | 2 + .../designer/lib/lang/fr_form_edit.lng | 24 + .../designer/lib/lang/fr_form_list.lng | 7 + .../designer/lib/lang/fr_form_show.lng | 18 + .../designer/lib/lang/fr_module_edit.lng | 14 + .../designer/lib/lang/fr_module_list.lng | 5 + .../designer/lib/lang/fr_module_nav_edit.lng | 6 + .../lib/lang/fr_module_nav_item_edit.lng | 8 + .../designer/lib/lang/fr_module_show.lng | 16 + .../interface/designer/lib/lang/hu.lng | 2 + .../designer/lib/lang/hu_form_edit.lng | 24 + .../designer/lib/lang/hu_form_list.lng | 7 + .../designer/lib/lang/hu_form_show.lng | 18 + .../designer/lib/lang/hu_module_edit.lng | 22 + .../designer/lib/lang/hu_module_list.lng | 5 + .../designer/lib/lang/hu_module_nav_edit.lng | 6 + .../lib/lang/hu_module_nav_item_edit.lng | 8 + .../designer/lib/lang/hu_module_show.lng | 16 + .../interface/designer/lib/lang/it.lng | 2 + .../designer/lib/lang/it_form_edit.lng | 24 + .../designer/lib/lang/it_form_list.lng | 7 + .../designer/lib/lang/it_form_show.lng | 18 + .../designer/lib/lang/it_module_edit.lng | 22 + .../designer/lib/lang/it_module_list.lng | 5 + .../designer/lib/lang/it_module_nav_edit.lng | 6 + .../lib/lang/it_module_nav_item_edit.lng | 8 + .../designer/lib/lang/it_module_show.lng | 16 + .../interface/designer/lib/lang/ja.lng | 2 + .../designer/lib/lang/ja_form_edit.lng | 24 + .../designer/lib/lang/ja_form_list.lng | 7 + .../designer/lib/lang/ja_form_show.lng | 18 + .../designer/lib/lang/ja_module_edit.lng | 22 + .../designer/lib/lang/ja_module_list.lng | 5 + .../designer/lib/lang/ja_module_nav_edit.lng | 6 + .../lib/lang/ja_module_nav_item_edit.lng | 8 + .../designer/lib/lang/ja_module_show.lng | 16 + .../interface/designer/lib/lang/nl.lng | 2 + .../designer/lib/lang/nl_form_edit.lng | 24 + .../designer/lib/lang/nl_form_list.lng | 7 + .../designer/lib/lang/nl_form_show.lng | 18 + .../designer/lib/lang/nl_module_edit.lng | 22 + .../designer/lib/lang/nl_module_list.lng | 5 + .../designer/lib/lang/nl_module_nav_edit.lng | 6 + .../lib/lang/nl_module_nav_item_edit.lng | 8 + .../designer/lib/lang/nl_module_show.lng | 16 + .../interface/designer/lib/lang/pl.lng | 2 + .../designer/lib/lang/pl_form_edit.lng | 24 + .../designer/lib/lang/pl_form_list.lng | 7 + .../designer/lib/lang/pl_form_show.lng | 18 + .../designer/lib/lang/pl_module_edit.lng | 22 + .../designer/lib/lang/pl_module_list.lng | 5 + .../designer/lib/lang/pl_module_nav_edit.lng | 6 + .../lib/lang/pl_module_nav_item_edit.lng | 8 + .../designer/lib/lang/pl_module_show.lng | 16 + .../interface/designer/lib/lang/pt.lng | 3 + .../designer/lib/lang/pt_form_edit.lng | 25 + .../designer/lib/lang/pt_form_list.lng | 8 + .../designer/lib/lang/pt_form_show.lng | 19 + .../designer/lib/lang/pt_module_edit.lng | 23 + .../designer/lib/lang/pt_module_list.lng | 6 + .../designer/lib/lang/pt_module_nav_edit.lng | 7 + .../lib/lang/pt_module_nav_item_edit.lng | 9 + .../designer/lib/lang/pt_module_show.lng | 17 + .../interface/designer/lib/lang/ro.lng | 2 + .../designer/lib/lang/ro_form_edit.lng | 24 + .../designer/lib/lang/ro_form_list.lng | 7 + .../designer/lib/lang/ro_form_show.lng | 18 + .../designer/lib/lang/ro_module_edit.lng | 12 + .../designer/lib/lang/ro_module_list.lng | 5 + .../designer/lib/lang/ro_module_nav_edit.lng | 6 + .../lib/lang/ro_module_nav_item_edit.lng | 8 + .../designer/lib/lang/ro_module_show.lng | 16 + .../interface/designer/lib/lang/ru.lng | 3 + .../designer/lib/lang/ru_form_edit.lng | 25 + .../designer/lib/lang/ru_form_list.lng | 8 + .../designer/lib/lang/ru_form_show.lng | 19 + .../designer/lib/lang/ru_module_edit.lng | 23 + .../designer/lib/lang/ru_module_list.lng | 6 + .../designer/lib/lang/ru_module_nav_edit.lng | 7 + .../lib/lang/ru_module_nav_item_edit.lng | 9 + .../designer/lib/lang/ru_module_show.lng | 17 + .../interface/designer/lib/lang/se.lng | 2 + .../designer/lib/lang/se_form_edit.lng | 24 + .../designer/lib/lang/se_form_list.lng | 7 + .../designer/lib/lang/se_form_show.lng | 18 + .../designer/lib/lang/se_module_edit.lng | 22 + .../designer/lib/lang/se_module_list.lng | 5 + .../designer/lib/lang/se_module_nav_edit.lng | 6 + .../lib/lang/se_module_nav_item_edit.lng | 8 + .../designer/lib/lang/se_module_show.lng | 16 + .../interface/designer/lib/lang/sk.lng | 2 + .../designer/lib/lang/sk_form_edit.lng | 24 + .../designer/lib/lang/sk_form_list.lng | 7 + .../designer/lib/lang/sk_form_show.lng | 18 + .../designer/lib/lang/sk_module_edit.lng | 12 + .../designer/lib/lang/sk_module_list.lng | 5 + .../designer/lib/lang/sk_module_nav_edit.lng | 6 + .../lib/lang/sk_module_nav_item_edit.lng | 8 + .../designer/lib/lang/sk_module_show.lng | 16 + .../interface/designer/lib/lang/tr.lng | 2 + .../designer/lib/lang/tr_form_edit.lng | 24 + .../designer/lib/lang/tr_form_list.lng | 7 + .../designer/lib/lang/tr_form_show.lng | 18 + .../designer/lib/lang/tr_module_edit.lng | 22 + .../designer/lib/lang/tr_module_list.lng | 5 + .../designer/lib/lang/tr_module_nav_edit.lng | 6 + .../lib/lang/tr_module_nav_item_edit.lng | 8 + .../designer/lib/lang/tr_module_show.lng | 16 + .../interface/designer/lib/module.conf.php | 95 + .../interface/designer/module_edit.php | 183 + .../interface/designer/module_list.php | 69 + .../interface/designer/module_nav_del.php | 80 + .../interface/designer/module_nav_edit.php | 146 + .../interface/designer/module_nav_flip.php | 91 + .../designer/module_nav_item_del.php | 82 + .../designer/module_nav_item_edit.php | 150 + .../designer/module_nav_item_flip.php | 93 + .../interface/designer/module_show.php | 113 + .../designer/templates/form_edit.htm | 79 + .../designer/templates/form_list.htm | 24 + .../designer/templates/form_show.htm | 61 + .../designer/templates/module_edit.htm | 43 + .../designer/templates/module_list.htm | 18 + .../designer/templates/module_nav_edit.htm | 24 + .../templates/module_nav_item_edit.htm | 33 + .../designer/templates/module_show.htm | 31 + .../designer/templates/paging.tpl.htm | 9 + .../ispconfig/interface/dns/dns_a_edit.php | 144 + .../ispconfig/interface/dns/dns_a_list.php | 24 + .../ispconfig/interface/dns/dns_aaaa_edit.php | 139 + .../interface/dns/dns_alias_edit.php | 138 + .../interface/dns/dns_cname_edit.php | 138 + .../interface/dns/dns_hinfo_edit.php | 138 + .../ispconfig/interface/dns/dns_mx_edit.php | 138 + .../ispconfig/interface/dns/dns_ns_edit.php | 138 + .../ispconfig/interface/dns/dns_ptr_edit.php | 138 + .../ispconfig/interface/dns/dns_rp_edit.php | 138 + .../ispconfig/interface/dns/dns_rr_del.php | 51 + .../ispconfig/interface/dns/dns_soa_del.php | 69 + .../ispconfig/interface/dns/dns_soa_edit.php | 222 + .../ispconfig/interface/dns/dns_soa_list.php | 25 + .../ispconfig/interface/dns/dns_srv_edit.php | 138 + .../interface/dns/dns_template_del.php | 58 + .../interface/dns/dns_template_edit.php | 60 + .../interface/dns/dns_template_list.php | 24 + .../ispconfig/interface/dns/dns_txt_edit.php | 138 + .../ispconfig/interface/dns/dns_wizard.php | 274 + .../interface/dns/form/dns_a.tform.php | 159 + .../interface/dns/form/dns_aaaa.tform.php | 159 + .../interface/dns/form/dns_alias.tform.php | 161 + .../interface/dns/form/dns_cname.tform.php | 159 + .../interface/dns/form/dns_hinfo.tform.php | 158 + .../interface/dns/form/dns_mx.tform.php | 159 + .../interface/dns/form/dns_ns.tform.php | 159 + .../interface/dns/form/dns_ptr.tform.php | 159 + .../interface/dns/form/dns_rp.tform.php | 159 + .../interface/dns/form/dns_soa.tform.php | 230 + .../interface/dns/form/dns_srv.tform.php | 159 + .../interface/dns/form/dns_template.tform.php | 101 + .../interface/dns/form/dns_txt.tform.php | 156 + .../interface/dns/lib/admin.conf.php | 2 + .../ispconfig/interface/dns/lib/lang/bg.lng | 20 + .../interface/dns/lib/lang/bg_dns_a.lng | 16 + .../interface/dns/lib/lang/bg_dns_a_list.lng | 14 + .../interface/dns/lib/lang/bg_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/bg_dns_alias.lng | 15 + .../interface/dns/lib/lang/bg_dns_cname.lng | 15 + .../interface/dns/lib/lang/bg_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/bg_dns_mx.lng | 16 + .../interface/dns/lib/lang/bg_dns_ns.lng | 15 + .../interface/dns/lib/lang/bg_dns_ptr.lng | 15 + .../interface/dns/lib/lang/bg_dns_rp.lng | 15 + .../interface/dns/lib/lang/bg_dns_soa.lng | 26 + .../dns/lib/lang/bg_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/bg_dns_srv.lng | 16 + .../dns/lib/lang/bg_dns_template.lng | 6 + .../dns/lib/lang/bg_dns_template_list.lng | 6 + .../interface/dns/lib/lang/bg_dns_txt.lng | 15 + .../interface/dns/lib/lang/bg_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/br.lng | 20 + .../interface/dns/lib/lang/br_dns_a.lng | 16 + .../interface/dns/lib/lang/br_dns_a_list.lng | 14 + .../interface/dns/lib/lang/br_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/br_dns_alias.lng | 15 + .../interface/dns/lib/lang/br_dns_cname.lng | 15 + .../interface/dns/lib/lang/br_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/br_dns_mx.lng | 16 + .../interface/dns/lib/lang/br_dns_ns.lng | 15 + .../interface/dns/lib/lang/br_dns_ptr.lng | 15 + .../interface/dns/lib/lang/br_dns_rp.lng | 15 + .../interface/dns/lib/lang/br_dns_soa.lng | 26 + .../dns/lib/lang/br_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/br_dns_srv.lng | 16 + .../dns/lib/lang/br_dns_template.lng | 6 + .../dns/lib/lang/br_dns_template_list.lng | 6 + .../interface/dns/lib/lang/br_dns_txt.lng | 15 + .../interface/dns/lib/lang/br_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/de.lng | 20 + .../interface/dns/lib/lang/de_dns_a.lng | 16 + .../interface/dns/lib/lang/de_dns_a_list.lng | 14 + .../interface/dns/lib/lang/de_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/de_dns_alias.lng | 15 + .../interface/dns/lib/lang/de_dns_cname.lng | 15 + .../interface/dns/lib/lang/de_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/de_dns_mx.lng | 16 + .../interface/dns/lib/lang/de_dns_ns.lng | 15 + .../interface/dns/lib/lang/de_dns_ptr.lng | 15 + .../interface/dns/lib/lang/de_dns_rp.lng | 15 + .../interface/dns/lib/lang/de_dns_soa.lng | 26 + .../dns/lib/lang/de_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/de_dns_srv.lng | 16 + .../dns/lib/lang/de_dns_template.lng | 6 + .../dns/lib/lang/de_dns_template_list.lng | 6 + .../interface/dns/lib/lang/de_dns_txt.lng | 15 + .../interface/dns/lib/lang/de_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/en.lng | 22 + .../interface/dns/lib/lang/en_dns_a.lng | 16 + .../interface/dns/lib/lang/en_dns_a_list.lng | 14 + .../interface/dns/lib/lang/en_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/en_dns_alias.lng | 15 + .../interface/dns/lib/lang/en_dns_cname.lng | 15 + .../interface/dns/lib/lang/en_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/en_dns_mx.lng | 16 + .../interface/dns/lib/lang/en_dns_ns.lng | 15 + .../interface/dns/lib/lang/en_dns_ptr.lng | 15 + .../interface/dns/lib/lang/en_dns_rp.lng | 15 + .../interface/dns/lib/lang/en_dns_soa.lng | 26 + .../dns/lib/lang/en_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/en_dns_srv.lng | 16 + .../dns/lib/lang/en_dns_template.lng | 6 + .../dns/lib/lang/en_dns_template_list.lng | 6 + .../interface/dns/lib/lang/en_dns_txt.lng | 15 + .../interface/dns/lib/lang/en_dns_wizard.lng | 30 + .../ispconfig/interface/dns/lib/lang/es.lng | 20 + .../interface/dns/lib/lang/es_dns_a.lng | 16 + .../interface/dns/lib/lang/es_dns_a_list.lng | 14 + .../interface/dns/lib/lang/es_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/es_dns_alias.lng | 15 + .../interface/dns/lib/lang/es_dns_cname.lng | 15 + .../interface/dns/lib/lang/es_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/es_dns_mx.lng | 16 + .../interface/dns/lib/lang/es_dns_ns.lng | 15 + .../interface/dns/lib/lang/es_dns_ptr.lng | 15 + .../interface/dns/lib/lang/es_dns_rp.lng | 15 + .../interface/dns/lib/lang/es_dns_soa.lng | 26 + .../dns/lib/lang/es_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/es_dns_srv.lng | 16 + .../dns/lib/lang/es_dns_template.lng | 6 + .../dns/lib/lang/es_dns_template_list.lng | 6 + .../interface/dns/lib/lang/es_dns_txt.lng | 15 + .../interface/dns/lib/lang/es_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/fi.lng | 20 + .../interface/dns/lib/lang/fi_dns_a.lng | 16 + .../interface/dns/lib/lang/fi_dns_a_list.lng | 14 + .../interface/dns/lib/lang/fi_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/fi_dns_alias.lng | 15 + .../interface/dns/lib/lang/fi_dns_cname.lng | 15 + .../interface/dns/lib/lang/fi_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/fi_dns_mx.lng | 16 + .../interface/dns/lib/lang/fi_dns_ns.lng | 15 + .../interface/dns/lib/lang/fi_dns_ptr.lng | 15 + .../interface/dns/lib/lang/fi_dns_rp.lng | 15 + .../interface/dns/lib/lang/fi_dns_soa.lng | 26 + .../dns/lib/lang/fi_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/fi_dns_srv.lng | 16 + .../dns/lib/lang/fi_dns_template.lng | 6 + .../dns/lib/lang/fi_dns_template_list.lng | 6 + .../interface/dns/lib/lang/fi_dns_txt.lng | 15 + .../interface/dns/lib/lang/fi_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/fr.lng | 20 + .../interface/dns/lib/lang/fr_dns_a.lng | 16 + .../interface/dns/lib/lang/fr_dns_a_list.lng | 14 + .../interface/dns/lib/lang/fr_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/fr_dns_alias.lng | 15 + .../interface/dns/lib/lang/fr_dns_cname.lng | 15 + .../interface/dns/lib/lang/fr_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/fr_dns_mx.lng | 16 + .../interface/dns/lib/lang/fr_dns_ns.lng | 15 + .../interface/dns/lib/lang/fr_dns_ptr.lng | 15 + .../interface/dns/lib/lang/fr_dns_rp.lng | 15 + .../interface/dns/lib/lang/fr_dns_soa.lng | 26 + .../dns/lib/lang/fr_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/fr_dns_srv.lng | 16 + .../dns/lib/lang/fr_dns_template.lng | 6 + .../dns/lib/lang/fr_dns_template_list.lng | 6 + .../interface/dns/lib/lang/fr_dns_txt.lng | 15 + .../interface/dns/lib/lang/fr_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/hu.lng | 20 + .../interface/dns/lib/lang/hu_dns_a.lng | 16 + .../interface/dns/lib/lang/hu_dns_a_list.lng | 14 + .../interface/dns/lib/lang/hu_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/hu_dns_alias.lng | 15 + .../interface/dns/lib/lang/hu_dns_cname.lng | 15 + .../interface/dns/lib/lang/hu_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/hu_dns_mx.lng | 16 + .../interface/dns/lib/lang/hu_dns_ns.lng | 15 + .../interface/dns/lib/lang/hu_dns_ptr.lng | 15 + .../interface/dns/lib/lang/hu_dns_rp.lng | 15 + .../interface/dns/lib/lang/hu_dns_soa.lng | 26 + .../dns/lib/lang/hu_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/hu_dns_srv.lng | 16 + .../dns/lib/lang/hu_dns_template.lng | 6 + .../dns/lib/lang/hu_dns_template_list.lng | 6 + .../interface/dns/lib/lang/hu_dns_txt.lng | 15 + .../interface/dns/lib/lang/hu_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/it.lng | 20 + .../interface/dns/lib/lang/it_dns_a.lng | 16 + .../interface/dns/lib/lang/it_dns_a_list.lng | 14 + .../interface/dns/lib/lang/it_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/it_dns_alias.lng | 15 + .../interface/dns/lib/lang/it_dns_cname.lng | 15 + .../interface/dns/lib/lang/it_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/it_dns_mx.lng | 16 + .../interface/dns/lib/lang/it_dns_ns.lng | 15 + .../interface/dns/lib/lang/it_dns_ptr.lng | 15 + .../interface/dns/lib/lang/it_dns_rp.lng | 15 + .../interface/dns/lib/lang/it_dns_soa.lng | 26 + .../dns/lib/lang/it_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/it_dns_srv.lng | 16 + .../dns/lib/lang/it_dns_template.lng | 6 + .../dns/lib/lang/it_dns_template_list.lng | 6 + .../interface/dns/lib/lang/it_dns_txt.lng | 15 + .../interface/dns/lib/lang/it_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/ja.lng | 20 + .../interface/dns/lib/lang/ja_dns_a.lng | 16 + .../interface/dns/lib/lang/ja_dns_a_list.lng | 14 + .../interface/dns/lib/lang/ja_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/ja_dns_alias.lng | 15 + .../interface/dns/lib/lang/ja_dns_cname.lng | 15 + .../interface/dns/lib/lang/ja_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/ja_dns_mx.lng | 16 + .../interface/dns/lib/lang/ja_dns_ns.lng | 15 + .../interface/dns/lib/lang/ja_dns_ptr.lng | 15 + .../interface/dns/lib/lang/ja_dns_rp.lng | 15 + .../interface/dns/lib/lang/ja_dns_soa.lng | 26 + .../dns/lib/lang/ja_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/ja_dns_srv.lng | 16 + .../dns/lib/lang/ja_dns_template.lng | 6 + .../dns/lib/lang/ja_dns_template_list.lng | 6 + .../interface/dns/lib/lang/ja_dns_txt.lng | 15 + .../interface/dns/lib/lang/ja_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/nl.lng | 20 + .../interface/dns/lib/lang/nl_dns_a.lng | 16 + .../interface/dns/lib/lang/nl_dns_a_list.lng | 14 + .../interface/dns/lib/lang/nl_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/nl_dns_alias.lng | 15 + .../interface/dns/lib/lang/nl_dns_cname.lng | 15 + .../interface/dns/lib/lang/nl_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/nl_dns_mx.lng | 16 + .../interface/dns/lib/lang/nl_dns_ns.lng | 15 + .../interface/dns/lib/lang/nl_dns_ptr.lng | 15 + .../interface/dns/lib/lang/nl_dns_rp.lng | 15 + .../interface/dns/lib/lang/nl_dns_soa.lng | 26 + .../dns/lib/lang/nl_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/nl_dns_srv.lng | 16 + .../dns/lib/lang/nl_dns_template.lng | 6 + .../dns/lib/lang/nl_dns_template_list.lng | 6 + .../interface/dns/lib/lang/nl_dns_txt.lng | 15 + .../interface/dns/lib/lang/nl_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/pl.lng | 20 + .../interface/dns/lib/lang/pl_dns_a.lng | 16 + .../interface/dns/lib/lang/pl_dns_a_list.lng | 14 + .../interface/dns/lib/lang/pl_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/pl_dns_alias.lng | 15 + .../interface/dns/lib/lang/pl_dns_cname.lng | 15 + .../interface/dns/lib/lang/pl_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/pl_dns_mx.lng | 16 + .../interface/dns/lib/lang/pl_dns_ns.lng | 15 + .../interface/dns/lib/lang/pl_dns_ptr.lng | 15 + .../interface/dns/lib/lang/pl_dns_rp.lng | 15 + .../interface/dns/lib/lang/pl_dns_soa.lng | 26 + .../dns/lib/lang/pl_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/pl_dns_srv.lng | 16 + .../dns/lib/lang/pl_dns_template.lng | 6 + .../dns/lib/lang/pl_dns_template_list.lng | 6 + .../interface/dns/lib/lang/pl_dns_txt.lng | 15 + .../interface/dns/lib/lang/pl_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/pt.lng | 21 + .../interface/dns/lib/lang/pt_dns_a.lng | 17 + .../interface/dns/lib/lang/pt_dns_a_list.lng | 15 + .../interface/dns/lib/lang/pt_dns_aaaa.lng | 16 + .../interface/dns/lib/lang/pt_dns_alias.lng | 16 + .../interface/dns/lib/lang/pt_dns_cname.lng | 16 + .../interface/dns/lib/lang/pt_dns_hinfo.lng | 16 + .../interface/dns/lib/lang/pt_dns_mx.lng | 17 + .../interface/dns/lib/lang/pt_dns_ns.lng | 16 + .../interface/dns/lib/lang/pt_dns_ptr.lng | 16 + .../interface/dns/lib/lang/pt_dns_rp.lng | 16 + .../interface/dns/lib/lang/pt_dns_soa.lng | 27 + .../dns/lib/lang/pt_dns_soa_list.lng | 10 + .../interface/dns/lib/lang/pt_dns_srv.lng | 17 + .../dns/lib/lang/pt_dns_template.lng | 7 + .../dns/lib/lang/pt_dns_template_list.lng | 7 + .../interface/dns/lib/lang/pt_dns_txt.lng | 16 + .../interface/dns/lib/lang/pt_dns_wizard.lng | 30 + .../ispconfig/interface/dns/lib/lang/ro.lng | 20 + .../interface/dns/lib/lang/ro_dns_a.lng | 16 + .../interface/dns/lib/lang/ro_dns_a_list.lng | 14 + .../interface/dns/lib/lang/ro_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/ro_dns_alias.lng | 15 + .../interface/dns/lib/lang/ro_dns_cname.lng | 15 + .../interface/dns/lib/lang/ro_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/ro_dns_mx.lng | 16 + .../interface/dns/lib/lang/ro_dns_ns.lng | 15 + .../interface/dns/lib/lang/ro_dns_ptr.lng | 15 + .../interface/dns/lib/lang/ro_dns_rp.lng | 15 + .../interface/dns/lib/lang/ro_dns_soa.lng | 26 + .../dns/lib/lang/ro_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/ro_dns_srv.lng | 16 + .../dns/lib/lang/ro_dns_template.lng | 6 + .../dns/lib/lang/ro_dns_template_list.lng | 6 + .../interface/dns/lib/lang/ro_dns_txt.lng | 15 + .../interface/dns/lib/lang/ro_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/ru.lng | 21 + .../interface/dns/lib/lang/ru_dns_a.lng | 17 + .../interface/dns/lib/lang/ru_dns_a_list.lng | 15 + .../interface/dns/lib/lang/ru_dns_aaaa.lng | 16 + .../interface/dns/lib/lang/ru_dns_alias.lng | 16 + .../interface/dns/lib/lang/ru_dns_cname.lng | 16 + .../interface/dns/lib/lang/ru_dns_hinfo.lng | 16 + .../interface/dns/lib/lang/ru_dns_mx.lng | 17 + .../interface/dns/lib/lang/ru_dns_ns.lng | 16 + .../interface/dns/lib/lang/ru_dns_ptr.lng | 16 + .../interface/dns/lib/lang/ru_dns_rp.lng | 16 + .../interface/dns/lib/lang/ru_dns_soa.lng | 27 + .../dns/lib/lang/ru_dns_soa_list.lng | 10 + .../interface/dns/lib/lang/ru_dns_srv.lng | 17 + .../dns/lib/lang/ru_dns_template.lng | 7 + .../dns/lib/lang/ru_dns_template_list.lng | 7 + .../interface/dns/lib/lang/ru_dns_txt.lng | 16 + .../interface/dns/lib/lang/ru_dns_wizard.lng | 30 + .../ispconfig/interface/dns/lib/lang/se.lng | 20 + .../interface/dns/lib/lang/se_dns_a.lng | 16 + .../interface/dns/lib/lang/se_dns_a_list.lng | 14 + .../interface/dns/lib/lang/se_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/se_dns_alias.lng | 15 + .../interface/dns/lib/lang/se_dns_cname.lng | 15 + .../interface/dns/lib/lang/se_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/se_dns_mx.lng | 16 + .../interface/dns/lib/lang/se_dns_ns.lng | 15 + .../interface/dns/lib/lang/se_dns_ptr.lng | 15 + .../interface/dns/lib/lang/se_dns_rp.lng | 15 + .../interface/dns/lib/lang/se_dns_soa.lng | 26 + .../dns/lib/lang/se_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/se_dns_srv.lng | 16 + .../dns/lib/lang/se_dns_template.lng | 6 + .../dns/lib/lang/se_dns_template_list.lng | 6 + .../interface/dns/lib/lang/se_dns_txt.lng | 15 + .../interface/dns/lib/lang/se_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/sk.lng | 20 + .../interface/dns/lib/lang/sk_dns_a.lng | 16 + .../interface/dns/lib/lang/sk_dns_a_list.lng | 14 + .../interface/dns/lib/lang/sk_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/sk_dns_alias.lng | 15 + .../interface/dns/lib/lang/sk_dns_cname.lng | 15 + .../interface/dns/lib/lang/sk_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/sk_dns_mx.lng | 16 + .../interface/dns/lib/lang/sk_dns_ns.lng | 15 + .../interface/dns/lib/lang/sk_dns_ptr.lng | 15 + .../interface/dns/lib/lang/sk_dns_rp.lng | 15 + .../interface/dns/lib/lang/sk_dns_soa.lng | 26 + .../dns/lib/lang/sk_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/sk_dns_srv.lng | 16 + .../dns/lib/lang/sk_dns_template.lng | 6 + .../dns/lib/lang/sk_dns_template_list.lng | 6 + .../interface/dns/lib/lang/sk_dns_txt.lng | 15 + .../interface/dns/lib/lang/sk_dns_wizard.lng | 29 + .../ispconfig/interface/dns/lib/lang/tr.lng | 20 + .../interface/dns/lib/lang/tr_dns_a.lng | 16 + .../interface/dns/lib/lang/tr_dns_a_list.lng | 14 + .../interface/dns/lib/lang/tr_dns_aaaa.lng | 15 + .../interface/dns/lib/lang/tr_dns_alias.lng | 15 + .../interface/dns/lib/lang/tr_dns_cname.lng | 15 + .../interface/dns/lib/lang/tr_dns_hinfo.lng | 15 + .../interface/dns/lib/lang/tr_dns_mx.lng | 16 + .../interface/dns/lib/lang/tr_dns_ns.lng | 15 + .../interface/dns/lib/lang/tr_dns_ptr.lng | 15 + .../interface/dns/lib/lang/tr_dns_rp.lng | 15 + .../interface/dns/lib/lang/tr_dns_soa.lng | 26 + .../dns/lib/lang/tr_dns_soa_list.lng | 9 + .../interface/dns/lib/lang/tr_dns_srv.lng | 16 + .../dns/lib/lang/tr_dns_template.lng | 6 + .../dns/lib/lang/tr_dns_template_list.lng | 6 + .../interface/dns/lib/lang/tr_dns_txt.lng | 15 + .../interface/dns/lib/lang/tr_dns_wizard.lng | 29 + .../interface/dns/lib/module.conf.php | 57 + .../interface/dns/list/dns_a.list.php | 127 + .../interface/dns/list/dns_soa.list.php | 111 + .../interface/dns/list/dns_template.list.php | 80 + .../interface/dns/templates/dns_a_edit.htm | 39 + .../interface/dns/templates/dns_a_list.htm | 85 + .../interface/dns/templates/dns_aaaa_edit.htm | 39 + .../dns/templates/dns_alias_edit.htm | 38 + .../dns/templates/dns_cname_edit.htm | 38 + .../dns/templates/dns_hinfo_edit.htm | 38 + .../interface/dns/templates/dns_mx_edit.htm | 42 + .../interface/dns/templates/dns_ns_edit.htm | 38 + .../interface/dns/templates/dns_ptr_edit.htm | 38 + .../dns/templates/dns_records_edit.htm | 12 + .../interface/dns/templates/dns_rp_edit.htm | 38 + .../interface/dns/templates/dns_soa_edit.htm | 95 + .../interface/dns/templates/dns_soa_list.htm | 62 + .../interface/dns/templates/dns_srv_edit.htm | 38 + .../dns/templates/dns_template_edit.htm | 38 + .../dns/templates/dns_template_list.htm | 53 + .../interface/dns/templates/dns_txt_edit.htm | 38 + .../interface/dns/templates/dns_wizard.htm | 80 + .../help/form/support_message.tform.php | 120 + interface/ispconfig/interface/help/index.php | 16 + .../interface/help/lib/admin.conf.php | 8 + .../ispconfig/interface/help/lib/lang/bg.lng | 9 + .../help/lib/lang/bg_support_message.lng | 7 + .../help/lib/lang/bg_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/br.lng | 9 + .../help/lib/lang/br_support_message.lng | 7 + .../help/lib/lang/br_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/de.lng | 9 + .../help/lib/lang/de_support_message.lng | 7 + .../help/lib/lang/de_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/en.lng | 10 + .../help/lib/lang/en_support_message.lng | 7 + .../help/lib/lang/en_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/es.lng | 9 + .../help/lib/lang/es_support_message.lng | 7 + .../help/lib/lang/es_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/fi.lng | 9 + .../help/lib/lang/fi_support_message.lng | 7 + .../help/lib/lang/fi_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/fr.lng | 9 + .../help/lib/lang/fr_support_message.lng | 7 + .../help/lib/lang/fr_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/hu.lng | 9 + .../help/lib/lang/hu_support_message.lng | 7 + .../help/lib/lang/hu_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/it.lng | 9 + .../help/lib/lang/it_support_message.lng | 7 + .../help/lib/lang/it_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/ja.lng | 9 + .../help/lib/lang/ja_support_message.lng | 7 + .../help/lib/lang/ja_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/nl.lng | 9 + .../help/lib/lang/nl_support_message.lng | 7 + .../help/lib/lang/nl_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/pl.lng | 9 + .../help/lib/lang/pl_support_message.lng | 7 + .../help/lib/lang/pl_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/pt.lng | 10 + .../help/lib/lang/pt_support_message.lng | 8 + .../help/lib/lang/pt_support_message_list.lng | 7 + .../ispconfig/interface/help/lib/lang/ro.lng | 9 + .../help/lib/lang/ro_support_message.lng | 7 + .../help/lib/lang/ro_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/ru.lng | 10 + .../help/lib/lang/ru_support_message.lng | 8 + .../help/lib/lang/ru_support_message_list.lng | 7 + .../ispconfig/interface/help/lib/lang/se.lng | 9 + .../help/lib/lang/se_support_message.lng | 7 + .../help/lib/lang/se_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/sk.lng | 9 + .../help/lib/lang/sk_support_message.lng | 7 + .../help/lib/lang/sk_support_message_list.lng | 6 + .../ispconfig/interface/help/lib/lang/tr.lng | 9 + .../help/lib/lang/tr_support_message.lng | 7 + .../help/lib/lang/tr_support_message_list.lng | 6 + .../interface/help/lib/module.conf.php | 60 + .../help/list/support_message.list.php | 62 + .../interface/help/support_message_del.php | 48 + .../interface/help/support_message_edit.php | 71 + .../interface/help/support_message_list.php | 20 + .../help/templates/support_message_edit.htm | 33 + .../help/templates/support_message_list.htm | 53 + .../help/templates/support_message_view.htm | 26 + .../ispconfig/interface/help/version.php | 50 + interface/ispconfig/interface/index.htm | 8 + interface/ispconfig/interface/index.php | 41 + .../ispconfig/interface/js/scrigo.js.php | 503 + .../ispconfig/interface/js/uni-form/jquery.js | 1 + .../interface/js/uni-form/uni-form.jquery.js | 106 + .../interface/js/yui/animation/README | 45 + .../js/yui/animation/animation-debug.js | 1361 +++ .../js/yui/animation/animation-min.js | 75 + .../interface/js/yui/animation/animation.js | 1358 +++ .../interface/js/yui/autocomplete/README | 77 + .../js/yui/autocomplete/autocomplete-debug.js | 3100 ++++++ .../js/yui/autocomplete/autocomplete-min.js | 183 + .../js/yui/autocomplete/autocomplete.js | 3071 ++++++ .../ispconfig/interface/js/yui/button/README | 3 + .../js/yui/button/assets/background.png | Bin 0 -> 185 bytes .../interface/js/yui/button/assets/button.css | 217 + .../js/yui/button/assets/menuarrow.gif | Bin 0 -> 67 bytes .../js/yui/button/assets/splitarrow.gif | Bin 0 -> 145 bytes .../yui/button/assets/splitarrow_active.gif | Bin 0 -> 145 bytes .../js/yui/button/button-beta-debug.js | 4061 ++++++++ .../js/yui/button/button-beta-min.js | 126 + .../interface/js/yui/button/button-beta.js | 3949 ++++++++ .../interface/js/yui/calendar/README | 88 + .../js/yui/calendar/assets/calendar.css | 197 + .../js/yui/calendar/assets/callt.gif | Bin 0 -> 93 bytes .../js/yui/calendar/assets/calrt.gif | Bin 0 -> 94 bytes .../interface/js/yui/calendar/assets/calx.gif | Bin 0 -> 88 bytes .../js/yui/calendar/calendar-debug.js | 4331 +++++++++ .../interface/js/yui/calendar/calendar-min.js | 116 + .../interface/js/yui/calendar/calendar.js | 4309 +++++++++ .../interface/js/yui/connection/README | 182 + .../js/yui/connection/connection-debug.js | 1082 +++ .../js/yui/connection/connection-min.js | 104 + .../interface/js/yui/connection/connection.js | 1054 +++ .../interface/js/yui/container/README | 207 + .../js/yui/container/assets/alrt16_1.gif | Bin 0 -> 971 bytes .../js/yui/container/assets/blck16_1.gif | Bin 0 -> 591 bytes .../js/yui/container/assets/close12_1.gif | Bin 0 -> 85 bytes .../js/yui/container/assets/container.css | 230 + .../js/yui/container/assets/hlp16_1.gif | Bin 0 -> 928 bytes .../js/yui/container/assets/info16_1.gif | Bin 0 -> 601 bytes .../js/yui/container/assets/tip16_1.gif | Bin 0 -> 552 bytes .../js/yui/container/assets/warn16_1.gif | Bin 0 -> 580 bytes .../js/yui/container/container-debug.js | 4752 ++++++++++ .../js/yui/container/container-min.js | 159 + .../interface/js/yui/container/container.js | 4727 ++++++++++ .../js/yui/container/container_core-debug.js | 2932 ++++++ .../js/yui/container/container_core-min.js | 109 + .../js/yui/container/container_core.js | 2919 ++++++ .../interface/js/yui/datasource/README | 5 + .../yui/datasource/datasource-beta-debug.js | 912 ++ .../js/yui/datasource/datasource-beta-min.js | 59 + .../js/yui/datasource/datasource-beta.js | 902 ++ .../interface/js/yui/datatable/README | 9 + .../js/yui/datatable/assets/datatable.css | 82 + .../js/yui/datatable/datatable-beta-debug.js | 4956 ++++++++++ .../js/yui/datatable/datatable-beta-min.js | 214 + .../js/yui/datatable/datatable-beta.js | 4930 ++++++++++ .../ispconfig/interface/js/yui/dom/README | 79 + .../interface/js/yui/dom/dom-debug.js | 935 ++ .../ispconfig/interface/js/yui/dom/dom-min.js | 59 + .../ispconfig/interface/js/yui/dom/dom.js | 901 ++ .../interface/js/yui/dragdrop/README | 118 + .../js/yui/dragdrop/dragdrop-debug.js | 3068 ++++++ .../interface/js/yui/dragdrop/dragdrop-min.js | 93 + .../interface/js/yui/dragdrop/dragdrop.js | 2958 ++++++ .../ispconfig/interface/js/yui/element/README | 7 + .../js/yui/element/element-beta-debug.js | 906 ++ .../js/yui/element/element-beta-min.js | 30 + .../interface/js/yui/element/element-beta.js | 896 ++ .../ispconfig/interface/js/yui/event/README | 161 + .../interface/js/yui/event/event-debug.js | 2076 ++++ .../interface/js/yui/event/event-min.js | 84 + .../ispconfig/interface/js/yui/event/event.js | 2054 ++++ .../ispconfig/interface/js/yui/fonts/README | 13 + .../interface/js/yui/fonts/fonts-min.css | 7 + .../interface/js/yui/fonts/fonts.css | 29 + .../ispconfig/interface/js/yui/grids/README | 48 + .../interface/js/yui/grids/grids-min.css | 7 + .../interface/js/yui/grids/grids.css | 129 + .../ispconfig/interface/js/yui/history/README | 11 + .../js/yui/history/assets/blank.html | 1 + .../yui/history/history-experimental-debug.js | 649 ++ .../yui/history/history-experimental-min.js | 44 + .../js/yui/history/history-experimental.js | 649 ++ .../ispconfig/interface/js/yui/logger/README | 51 + .../interface/js/yui/logger/assets/logger.css | 26 + .../interface/js/yui/logger/logger-debug.js | 1597 ++++ .../interface/js/yui/logger/logger-min.js | 63 + .../interface/js/yui/logger/logger.js | 1597 ++++ .../ispconfig/interface/js/yui/menu/README | 385 + .../interface/js/yui/menu/assets/map.gif | Bin 0 -> 264 bytes .../interface/js/yui/menu/assets/menu.css | 384 + .../js/yui/menu/assets/menuarodwn8_dim_1.gif | Bin 0 -> 53 bytes .../js/yui/menu/assets/menuarodwn8_hov_1.gif | Bin 0 -> 53 bytes .../js/yui/menu/assets/menuarodwn8_nrm_1.gif | Bin 0 -> 53 bytes .../js/yui/menu/assets/menuarorght8_dim_1.gif | Bin 0 -> 54 bytes .../js/yui/menu/assets/menuarorght8_hov_1.gif | Bin 0 -> 54 bytes .../js/yui/menu/assets/menuarorght8_nrm_1.gif | Bin 0 -> 54 bytes .../js/yui/menu/assets/menuaroup8_dim_1.gif | Bin 0 -> 53 bytes .../js/yui/menu/assets/menuaroup8_nrm_1.gif | Bin 0 -> 53 bytes .../js/yui/menu/assets/menuchk8_dim_1.gif | Bin 0 -> 65 bytes .../js/yui/menu/assets/menuchk8_hov_1.gif | Bin 0 -> 67 bytes .../js/yui/menu/assets/menuchk8_nrm_1.gif | Bin 0 -> 67 bytes .../interface/js/yui/menu/menu-debug.js | 8317 +++++++++++++++++ .../interface/js/yui/menu/menu-min.js | 260 + .../ispconfig/interface/js/yui/menu/menu.js | 8265 ++++++++++++++++ .../interface/js/yui/reset-fonts-grids/README | 24 + .../reset-fonts-grids/reset-fonts-grids.css | 9 + .../ispconfig/interface/js/yui/reset/README | 25 + .../interface/js/yui/reset/reset-min.css | 7 + .../interface/js/yui/reset/reset.css | 15 + .../ispconfig/interface/js/yui/slider/README | 69 + .../interface/js/yui/slider/slider-debug.js | 1259 +++ .../interface/js/yui/slider/slider-min.js | 36 + .../interface/js/yui/slider/slider.js | 1222 +++ .../ispconfig/interface/js/yui/tabview/README | 21 + .../js/yui/tabview/assets/border_tabs.css | 54 + .../js/yui/tabview/assets/tabview.css | 75 + .../interface/js/yui/tabview/tabview-debug.js | 1025 ++ .../interface/js/yui/tabview/tabview-min.js | 35 + .../interface/js/yui/tabview/tabview.js | 1021 ++ .../interface/js/yui/treeview/README | 147 + .../interface/js/yui/treeview/assets/lm.gif | Bin 0 -> 94 bytes .../interface/js/yui/treeview/assets/lmh.gif | Bin 0 -> 106 bytes .../interface/js/yui/treeview/assets/ln.gif | Bin 0 -> 142 bytes .../js/yui/treeview/assets/loading.gif | Bin 0 -> 2673 bytes .../interface/js/yui/treeview/assets/lp.gif | Bin 0 -> 130 bytes .../interface/js/yui/treeview/assets/lph.gif | Bin 0 -> 111 bytes .../interface/js/yui/treeview/assets/tm.gif | Bin 0 -> 545 bytes .../interface/js/yui/treeview/assets/tmh.gif | Bin 0 -> 563 bytes .../interface/js/yui/treeview/assets/tn.gif | Bin 0 -> 504 bytes .../interface/js/yui/treeview/assets/tp.gif | Bin 0 -> 539 bytes .../interface/js/yui/treeview/assets/tph.gif | Bin 0 -> 568 bytes .../interface/js/yui/treeview/assets/tree.css | 102 + .../js/yui/treeview/assets/vline.gif | Bin 0 -> 503 bytes .../js/yui/treeview/treeview-debug.js | 2287 +++++ .../interface/js/yui/treeview/treeview-min.js | 70 + .../interface/js/yui/treeview/treeview.js | 2248 +++++ .../interface/js/yui/utilities/README | 36 + .../interface/js/yui/utilities/utilities.js | 418 + .../interface/js/yui/yahoo-dom-event/README | 35 + .../js/yui/yahoo-dom-event/yahoo-dom-event.js | 144 + .../ispconfig/interface/js/yui/yahoo/README | 64 + .../interface/js/yui/yahoo/yahoo-debug.js | 433 + .../interface/js/yui/yahoo/yahoo-min.js | 15 + .../ispconfig/interface/js/yui/yahoo/yahoo.js | 433 + interface/ispconfig/interface/keepalive.php | 36 + interface/ispconfig/interface/login/index.php | 203 + .../ispconfig/interface/login/lib/lang/bg.lng | 17 + .../ispconfig/interface/login/lib/lang/br.lng | 17 + .../ispconfig/interface/login/lib/lang/de.lng | 17 + .../ispconfig/interface/login/lib/lang/en.lng | 22 + .../ispconfig/interface/login/lib/lang/es.lng | 17 + .../ispconfig/interface/login/lib/lang/fi.lng | 17 + .../ispconfig/interface/login/lib/lang/fr.lng | 17 + .../ispconfig/interface/login/lib/lang/hu.lng | 17 + .../ispconfig/interface/login/lib/lang/it.lng | 17 + .../ispconfig/interface/login/lib/lang/ja.lng | 17 + .../ispconfig/interface/login/lib/lang/nl.lng | 17 + .../ispconfig/interface/login/lib/lang/pl.lng | 17 + .../ispconfig/interface/login/lib/lang/pt.lng | 18 + .../ispconfig/interface/login/lib/lang/ro.lng | 17 + .../ispconfig/interface/login/lib/lang/ru.lng | 18 + .../ispconfig/interface/login/lib/lang/se.lng | 17 + .../ispconfig/interface/login/lib/lang/sk.lng | 17 + .../ispconfig/interface/login/lib/lang/tr.lng | 17 + .../interface/login/lib/module.conf.php | 6 + .../ispconfig/interface/login/logout.php | 80 + .../interface/login/password_reset.php | 92 + .../interface/login/templates/index.htm | 33 + .../login/templates/password_reset.htm | 33 + .../interface/mail/form/mail_alias.tform.php | 114 + .../mail/form/mail_aliasdomain.tform.php | 113 + .../mail/form/mail_blacklist.tform.php | 110 + .../mail/form/mail_content_filter.tform.php | 116 + .../interface/mail/form/mail_domain.tform.php | 101 + .../mail/form/mail_domain_catchall.tform.php | 119 + .../mail/form/mail_forward.tform.php | 108 + .../interface/mail/form/mail_get.tform.php | 148 + .../mail/form/mail_relay_recipient.tform.php | 104 + .../mail/form/mail_spamfilter.tform.php | 146 + .../mail/form/mail_transport.tform.php | 111 + .../interface/mail/form/mail_user.tform.php | 280 + .../mail/form/mail_user.tform.php.orig | 280 + .../mail/form/mail_user_filter.tform.php | 135 + .../mail/form/mail_user_filter.tform.php.orig | 135 + .../mail/form/mail_whitelist.tform.php | 110 + .../mail/form/spamfilter_blacklist.tform.php | 119 + .../mail/form/spamfilter_config.tform.php | 275 + .../mail/form/spamfilter_policy.tform.php | 382 + .../mail/form/spamfilter_users.tform.php | 125 + .../mail/form/spamfilter_whitelist.tform.php | 119 + .../interface/mail/lib/admin.conf.php | 2 + .../ispconfig/interface/mail/lib/lang/bg.lng | 47 + .../interface/mail/lib/lang/bg_mail_alias.lng | 11 + .../mail/lib/lang/bg_mail_alias_list.lng | 8 + .../mail/lib/lang/bg_mail_aliasdomain.lng | 11 + .../lib/lang/bg_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/bg_mail_blacklist.lng | 9 + .../mail/lib/lang/bg_mail_blacklist_list.lng | 10 + .../mail/lib/lang/bg_mail_content_filter.lng | 9 + .../lib/lang/bg_mail_content_filter_list.lng | 8 + .../mail/lib/lang/bg_mail_domain.lng | 13 + .../mail/lib/lang/bg_mail_domain_catchall.lng | 9 + .../lib/lang/bg_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/bg_mail_domain_list.lng | 7 + .../mail/lib/lang/bg_mail_forward.lng | 7 + .../mail/lib/lang/bg_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/bg_mail_get.lng | 16 + .../mail/lib/lang/bg_mail_get_list.lng | 9 + .../mail/lib/lang/bg_mail_relay_recipient.lng | 9 + .../lib/lang/bg_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/bg_mail_spamfilter.lng | 17 + .../mail/lib/lang/bg_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/bg_mail_transport.lng | 10 + .../mail/lib/lang/bg_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/bg_mail_user.lng | 41 + .../mail/lib/lang/bg_mail_user_filter.lng | 10 + .../lib/lang/bg_mail_user_filter_list.lng | 7 + .../mail/lib/lang/bg_mail_user_list.lng | 7 + .../mail/lib/lang/bg_mail_user_stats_list.lng | 8 + .../mail/lib/lang/bg_mail_whitelist.lng | 9 + .../mail/lib/lang/bg_mail_whitelist_list.lng | 10 + .../mail/lib/lang/bg_spamfilter_blacklist.lng | 9 + .../lib/lang/bg_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/bg_spamfilter_config.lng | 20 + .../lib/lang/bg_spamfilter_config_list.lng | 5 + .../mail/lib/lang/bg_spamfilter_policy.lng | 38 + .../lib/lang/bg_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/bg_spamfilter_users.lng | 8 + .../lib/lang/bg_spamfilter_users_list.lng | 10 + .../mail/lib/lang/bg_spamfilter_whitelist.lng | 9 + .../lib/lang/bg_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/br.lng | 47 + .../interface/mail/lib/lang/br_mail_alias.lng | 11 + .../mail/lib/lang/br_mail_alias_list.lng | 8 + .../mail/lib/lang/br_mail_aliasdomain.lng | 11 + .../lib/lang/br_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/br_mail_blacklist.lng | 9 + .../mail/lib/lang/br_mail_blacklist_list.lng | 10 + .../mail/lib/lang/br_mail_content_filter.lng | 9 + .../lib/lang/br_mail_content_filter_list.lng | 8 + .../mail/lib/lang/br_mail_domain.lng | 13 + .../mail/lib/lang/br_mail_domain_catchall.lng | 9 + .../lib/lang/br_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/br_mail_domain_list.lng | 7 + .../mail/lib/lang/br_mail_forward.lng | 7 + .../mail/lib/lang/br_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/br_mail_get.lng | 16 + .../mail/lib/lang/br_mail_get_list.lng | 9 + .../mail/lib/lang/br_mail_relay_recipient.lng | 9 + .../lib/lang/br_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/br_mail_spamfilter.lng | 17 + .../mail/lib/lang/br_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/br_mail_transport.lng | 10 + .../mail/lib/lang/br_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/br_mail_user.lng | 39 + .../mail/lib/lang/br_mail_user_filter.lng | 10 + .../lib/lang/br_mail_user_filter_list.lng | 7 + .../mail/lib/lang/br_mail_user_list.lng | 7 + .../mail/lib/lang/br_mail_user_stats_list.lng | 8 + .../mail/lib/lang/br_mail_whitelist.lng | 9 + .../mail/lib/lang/br_mail_whitelist_list.lng | 10 + .../mail/lib/lang/br_spamfilter_blacklist.lng | 9 + .../lib/lang/br_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/br_spamfilter_config.lng | 20 + .../lib/lang/br_spamfilter_config_list.lng | 5 + .../mail/lib/lang/br_spamfilter_policy.lng | 38 + .../lib/lang/br_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/br_spamfilter_users.lng | 8 + .../lib/lang/br_spamfilter_users_list.lng | 10 + .../mail/lib/lang/br_spamfilter_whitelist.lng | 9 + .../lib/lang/br_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/de.lng | 47 + .../interface/mail/lib/lang/de_mail_alias.lng | 11 + .../mail/lib/lang/de_mail_alias_list.lng | 8 + .../mail/lib/lang/de_mail_aliasdomain.lng | 11 + .../lib/lang/de_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/de_mail_blacklist.lng | 9 + .../mail/lib/lang/de_mail_blacklist_list.lng | 10 + .../mail/lib/lang/de_mail_content_filter.lng | 9 + .../lib/lang/de_mail_content_filter_list.lng | 8 + .../mail/lib/lang/de_mail_domain.lng | 13 + .../mail/lib/lang/de_mail_domain_catchall.lng | 9 + .../lib/lang/de_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/de_mail_domain_list.lng | 7 + .../mail/lib/lang/de_mail_forward.lng | 7 + .../mail/lib/lang/de_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/de_mail_get.lng | 16 + .../mail/lib/lang/de_mail_get_list.lng | 9 + .../mail/lib/lang/de_mail_relay_recipient.lng | 9 + .../lib/lang/de_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/de_mail_spamfilter.lng | 17 + .../mail/lib/lang/de_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/de_mail_transport.lng | 10 + .../mail/lib/lang/de_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/de_mail_user.lng | 39 + .../mail/lib/lang/de_mail_user_filter.lng | 10 + .../lib/lang/de_mail_user_filter_list.lng | 7 + .../mail/lib/lang/de_mail_user_list.lng | 7 + .../mail/lib/lang/de_mail_user_stats_list.lng | 8 + .../mail/lib/lang/de_mail_whitelist.lng | 9 + .../mail/lib/lang/de_mail_whitelist_list.lng | 10 + .../mail/lib/lang/de_spamfilter_blacklist.lng | 9 + .../lib/lang/de_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/de_spamfilter_config.lng | 20 + .../lib/lang/de_spamfilter_config_list.lng | 5 + .../mail/lib/lang/de_spamfilter_policy.lng | 38 + .../lib/lang/de_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/de_spamfilter_users.lng | 8 + .../lib/lang/de_spamfilter_users_list.lng | 10 + .../mail/lib/lang/de_spamfilter_whitelist.lng | 9 + .../lib/lang/de_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/en.lng | 51 + .../interface/mail/lib/lang/en_mail_alias.lng | 11 + .../mail/lib/lang/en_mail_alias_list.lng | 8 + .../mail/lib/lang/en_mail_aliasdomain.lng | 11 + .../lib/lang/en_mail_aliasdomain_list.lng | 8 + .../mail/lib/lang/en_mail_blacklist.lng | 9 + .../mail/lib/lang/en_mail_blacklist_list.lng | 10 + .../mail/lib/lang/en_mail_content_filter.lng | 9 + .../lib/lang/en_mail_content_filter_list.lng | 8 + .../mail/lib/lang/en_mail_domain.lng | 13 + .../mail/lib/lang/en_mail_domain_catchall.lng | 9 + .../lib/lang/en_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/en_mail_domain_list.lng | 7 + .../mail/lib/lang/en_mail_forward.lng | 7 + .../mail/lib/lang/en_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/en_mail_get.lng | 16 + .../mail/lib/lang/en_mail_get_list.lng | 9 + .../mail/lib/lang/en_mail_relay_recipient.lng | 9 + .../lib/lang/en_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/en_mail_spamfilter.lng | 17 + .../mail/lib/lang/en_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/en_mail_transport.lng | 10 + .../mail/lib/lang/en_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/en_mail_user.lng | 40 + .../mail/lib/lang/en_mail_user_filter.lng | 10 + .../lib/lang/en_mail_user_filter_list.lng | 7 + .../mail/lib/lang/en_mail_user_list.lng | 7 + .../mail/lib/lang/en_mail_user_stats_list.lng | 8 + .../mail/lib/lang/en_mail_whitelist.lng | 9 + .../mail/lib/lang/en_mail_whitelist_list.lng | 10 + .../mail/lib/lang/en_spamfilter_blacklist.lng | 9 + .../lib/lang/en_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/en_spamfilter_config.lng | 20 + .../lib/lang/en_spamfilter_config_list.lng | 5 + .../mail/lib/lang/en_spamfilter_policy.lng | 38 + .../lib/lang/en_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/en_spamfilter_users.lng | 8 + .../lib/lang/en_spamfilter_users_list.lng | 10 + .../mail/lib/lang/en_spamfilter_whitelist.lng | 9 + .../lib/lang/en_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/es.lng | 47 + .../interface/mail/lib/lang/es_mail_alias.lng | 11 + .../mail/lib/lang/es_mail_alias_list.lng | 8 + .../mail/lib/lang/es_mail_aliasdomain.lng | 11 + .../lib/lang/es_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/es_mail_blacklist.lng | 9 + .../mail/lib/lang/es_mail_blacklist_list.lng | 10 + .../mail/lib/lang/es_mail_content_filter.lng | 9 + .../lib/lang/es_mail_content_filter_list.lng | 8 + .../mail/lib/lang/es_mail_domain.lng | 13 + .../mail/lib/lang/es_mail_domain_catchall.lng | 9 + .../lib/lang/es_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/es_mail_domain_list.lng | 7 + .../mail/lib/lang/es_mail_forward.lng | 7 + .../mail/lib/lang/es_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/es_mail_get.lng | 16 + .../mail/lib/lang/es_mail_get_list.lng | 9 + .../mail/lib/lang/es_mail_relay_recipient.lng | 9 + .../lib/lang/es_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/es_mail_spamfilter.lng | 17 + .../mail/lib/lang/es_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/es_mail_transport.lng | 10 + .../mail/lib/lang/es_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/es_mail_user.lng | 39 + .../mail/lib/lang/es_mail_user_filter.lng | 10 + .../lib/lang/es_mail_user_filter_list.lng | 7 + .../mail/lib/lang/es_mail_user_list.lng | 7 + .../mail/lib/lang/es_mail_user_stats_list.lng | 8 + .../mail/lib/lang/es_mail_whitelist.lng | 9 + .../mail/lib/lang/es_mail_whitelist_list.lng | 10 + .../mail/lib/lang/es_spamfilter_blacklist.lng | 9 + .../lib/lang/es_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/es_spamfilter_config.lng | 20 + .../lib/lang/es_spamfilter_config_list.lng | 5 + .../mail/lib/lang/es_spamfilter_policy.lng | 38 + .../lib/lang/es_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/es_spamfilter_users.lng | 8 + .../lib/lang/es_spamfilter_users_list.lng | 10 + .../mail/lib/lang/es_spamfilter_whitelist.lng | 9 + .../lib/lang/es_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/fi.lng | 47 + .../interface/mail/lib/lang/fi_mail_alias.lng | 11 + .../mail/lib/lang/fi_mail_alias_list.lng | 8 + .../mail/lib/lang/fi_mail_aliasdomain.lng | 11 + .../lib/lang/fi_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/fi_mail_blacklist.lng | 9 + .../mail/lib/lang/fi_mail_blacklist_list.lng | 10 + .../mail/lib/lang/fi_mail_content_filter.lng | 9 + .../lib/lang/fi_mail_content_filter_list.lng | 8 + .../mail/lib/lang/fi_mail_domain.lng | 13 + .../mail/lib/lang/fi_mail_domain_catchall.lng | 9 + .../lib/lang/fi_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/fi_mail_domain_list.lng | 7 + .../mail/lib/lang/fi_mail_forward.lng | 7 + .../mail/lib/lang/fi_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/fi_mail_get.lng | 16 + .../mail/lib/lang/fi_mail_get_list.lng | 9 + .../mail/lib/lang/fi_mail_relay_recipient.lng | 9 + .../lib/lang/fi_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/fi_mail_spamfilter.lng | 17 + .../mail/lib/lang/fi_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/fi_mail_transport.lng | 10 + .../mail/lib/lang/fi_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/fi_mail_user.lng | 39 + .../mail/lib/lang/fi_mail_user_filter.lng | 10 + .../lib/lang/fi_mail_user_filter_list.lng | 7 + .../mail/lib/lang/fi_mail_user_list.lng | 7 + .../mail/lib/lang/fi_mail_user_stats_list.lng | 8 + .../mail/lib/lang/fi_mail_whitelist.lng | 9 + .../mail/lib/lang/fi_mail_whitelist_list.lng | 10 + .../mail/lib/lang/fi_spamfilter_blacklist.lng | 9 + .../lib/lang/fi_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/fi_spamfilter_config.lng | 20 + .../lib/lang/fi_spamfilter_config_list.lng | 5 + .../mail/lib/lang/fi_spamfilter_policy.lng | 38 + .../lib/lang/fi_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/fi_spamfilter_users.lng | 8 + .../lib/lang/fi_spamfilter_users_list.lng | 10 + .../mail/lib/lang/fi_spamfilter_whitelist.lng | 9 + .../lib/lang/fi_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/fr.lng | 47 + .../interface/mail/lib/lang/fr_mail_alias.lng | 11 + .../mail/lib/lang/fr_mail_alias_list.lng | 8 + .../mail/lib/lang/fr_mail_aliasdomain.lng | 11 + .../lib/lang/fr_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/fr_mail_blacklist.lng | 9 + .../mail/lib/lang/fr_mail_blacklist_list.lng | 10 + .../mail/lib/lang/fr_mail_content_filter.lng | 9 + .../lib/lang/fr_mail_content_filter_list.lng | 8 + .../mail/lib/lang/fr_mail_domain.lng | 13 + .../mail/lib/lang/fr_mail_domain_catchall.lng | 9 + .../lib/lang/fr_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/fr_mail_domain_list.lng | 7 + .../mail/lib/lang/fr_mail_forward.lng | 7 + .../mail/lib/lang/fr_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/fr_mail_get.lng | 16 + .../mail/lib/lang/fr_mail_get_list.lng | 9 + .../mail/lib/lang/fr_mail_relay_recipient.lng | 9 + .../lib/lang/fr_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/fr_mail_spamfilter.lng | 17 + .../mail/lib/lang/fr_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/fr_mail_transport.lng | 10 + .../mail/lib/lang/fr_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/fr_mail_user.lng | 41 + .../mail/lib/lang/fr_mail_user_filter.lng | 10 + .../lib/lang/fr_mail_user_filter_list.lng | 7 + .../mail/lib/lang/fr_mail_user_list.lng | 7 + .../mail/lib/lang/fr_mail_user_stats_list.lng | 8 + .../mail/lib/lang/fr_mail_whitelist.lng | 9 + .../mail/lib/lang/fr_mail_whitelist_list.lng | 10 + .../mail/lib/lang/fr_spamfilter_blacklist.lng | 9 + .../lib/lang/fr_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/fr_spamfilter_config.lng | 20 + .../lib/lang/fr_spamfilter_config_list.lng | 5 + .../mail/lib/lang/fr_spamfilter_policy.lng | 38 + .../lib/lang/fr_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/fr_spamfilter_users.lng | 8 + .../lib/lang/fr_spamfilter_users_list.lng | 10 + .../mail/lib/lang/fr_spamfilter_whitelist.lng | 9 + .../lib/lang/fr_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/hu.lng | 47 + .../interface/mail/lib/lang/hu_mail_alias.lng | 11 + .../mail/lib/lang/hu_mail_alias_list.lng | 8 + .../mail/lib/lang/hu_mail_aliasdomain.lng | 11 + .../lib/lang/hu_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/hu_mail_blacklist.lng | 9 + .../mail/lib/lang/hu_mail_blacklist_list.lng | 10 + .../mail/lib/lang/hu_mail_content_filter.lng | 9 + .../lib/lang/hu_mail_content_filter_list.lng | 8 + .../mail/lib/lang/hu_mail_domain.lng | 13 + .../mail/lib/lang/hu_mail_domain_catchall.lng | 9 + .../lib/lang/hu_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/hu_mail_domain_list.lng | 7 + .../mail/lib/lang/hu_mail_forward.lng | 7 + .../mail/lib/lang/hu_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/hu_mail_get.lng | 16 + .../mail/lib/lang/hu_mail_get_list.lng | 9 + .../mail/lib/lang/hu_mail_relay_recipient.lng | 9 + .../lib/lang/hu_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/hu_mail_spamfilter.lng | 17 + .../mail/lib/lang/hu_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/hu_mail_transport.lng | 10 + .../mail/lib/lang/hu_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/hu_mail_user.lng | 39 + .../mail/lib/lang/hu_mail_user_filter.lng | 10 + .../lib/lang/hu_mail_user_filter_list.lng | 7 + .../mail/lib/lang/hu_mail_user_list.lng | 7 + .../mail/lib/lang/hu_mail_user_stats_list.lng | 8 + .../mail/lib/lang/hu_mail_whitelist.lng | 9 + .../mail/lib/lang/hu_mail_whitelist_list.lng | 10 + .../mail/lib/lang/hu_spamfilter_blacklist.lng | 9 + .../lib/lang/hu_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/hu_spamfilter_config.lng | 20 + .../lib/lang/hu_spamfilter_config_list.lng | 5 + .../mail/lib/lang/hu_spamfilter_policy.lng | 38 + .../lib/lang/hu_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/hu_spamfilter_users.lng | 8 + .../lib/lang/hu_spamfilter_users_list.lng | 10 + .../mail/lib/lang/hu_spamfilter_whitelist.lng | 9 + .../lib/lang/hu_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/it.lng | 47 + .../interface/mail/lib/lang/it_mail_alias.lng | 11 + .../mail/lib/lang/it_mail_alias_list.lng | 8 + .../mail/lib/lang/it_mail_aliasdomain.lng | 11 + .../lib/lang/it_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/it_mail_blacklist.lng | 9 + .../mail/lib/lang/it_mail_blacklist_list.lng | 10 + .../mail/lib/lang/it_mail_content_filter.lng | 9 + .../lib/lang/it_mail_content_filter_list.lng | 8 + .../mail/lib/lang/it_mail_domain.lng | 13 + .../mail/lib/lang/it_mail_domain_catchall.lng | 9 + .../lib/lang/it_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/it_mail_domain_list.lng | 7 + .../mail/lib/lang/it_mail_forward.lng | 7 + .../mail/lib/lang/it_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/it_mail_get.lng | 16 + .../mail/lib/lang/it_mail_get_list.lng | 9 + .../mail/lib/lang/it_mail_relay_recipient.lng | 9 + .../lib/lang/it_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/it_mail_spamfilter.lng | 17 + .../mail/lib/lang/it_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/it_mail_transport.lng | 10 + .../mail/lib/lang/it_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/it_mail_user.lng | 41 + .../mail/lib/lang/it_mail_user_filter.lng | 10 + .../lib/lang/it_mail_user_filter_list.lng | 7 + .../mail/lib/lang/it_mail_user_list.lng | 7 + .../mail/lib/lang/it_mail_user_stats_list.lng | 8 + .../mail/lib/lang/it_mail_whitelist.lng | 9 + .../mail/lib/lang/it_mail_whitelist_list.lng | 10 + .../mail/lib/lang/it_spamfilter_blacklist.lng | 9 + .../lib/lang/it_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/it_spamfilter_config.lng | 20 + .../lib/lang/it_spamfilter_config_list.lng | 5 + .../mail/lib/lang/it_spamfilter_policy.lng | 38 + .../lib/lang/it_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/it_spamfilter_users.lng | 8 + .../lib/lang/it_spamfilter_users_list.lng | 10 + .../mail/lib/lang/it_spamfilter_whitelist.lng | 9 + .../lib/lang/it_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/ja.lng | 47 + .../interface/mail/lib/lang/ja_mail_alias.lng | 11 + .../mail/lib/lang/ja_mail_alias_list.lng | 8 + .../mail/lib/lang/ja_mail_aliasdomain.lng | 11 + .../lib/lang/ja_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/ja_mail_blacklist.lng | 9 + .../mail/lib/lang/ja_mail_blacklist_list.lng | 10 + .../mail/lib/lang/ja_mail_content_filter.lng | 9 + .../lib/lang/ja_mail_content_filter_list.lng | 8 + .../mail/lib/lang/ja_mail_domain.lng | 13 + .../mail/lib/lang/ja_mail_domain_catchall.lng | 9 + .../lib/lang/ja_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/ja_mail_domain_list.lng | 7 + .../mail/lib/lang/ja_mail_forward.lng | 7 + .../mail/lib/lang/ja_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/ja_mail_get.lng | 16 + .../mail/lib/lang/ja_mail_get_list.lng | 9 + .../mail/lib/lang/ja_mail_relay_recipient.lng | 9 + .../lib/lang/ja_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/ja_mail_spamfilter.lng | 17 + .../mail/lib/lang/ja_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/ja_mail_transport.lng | 10 + .../mail/lib/lang/ja_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/ja_mail_user.lng | 39 + .../mail/lib/lang/ja_mail_user_filter.lng | 10 + .../lib/lang/ja_mail_user_filter_list.lng | 7 + .../mail/lib/lang/ja_mail_user_list.lng | 7 + .../mail/lib/lang/ja_mail_user_stats_list.lng | 8 + .../mail/lib/lang/ja_mail_whitelist.lng | 9 + .../mail/lib/lang/ja_mail_whitelist_list.lng | 10 + .../mail/lib/lang/ja_spamfilter_blacklist.lng | 9 + .../lib/lang/ja_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/ja_spamfilter_config.lng | 20 + .../lib/lang/ja_spamfilter_config_list.lng | 5 + .../mail/lib/lang/ja_spamfilter_policy.lng | 38 + .../lib/lang/ja_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/ja_spamfilter_users.lng | 8 + .../lib/lang/ja_spamfilter_users_list.lng | 10 + .../mail/lib/lang/ja_spamfilter_whitelist.lng | 9 + .../lib/lang/ja_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/nl.lng | 47 + .../interface/mail/lib/lang/nl_mail_alias.lng | 11 + .../mail/lib/lang/nl_mail_alias_list.lng | 8 + .../mail/lib/lang/nl_mail_aliasdomain.lng | 11 + .../lib/lang/nl_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/nl_mail_blacklist.lng | 9 + .../mail/lib/lang/nl_mail_blacklist_list.lng | 10 + .../mail/lib/lang/nl_mail_content_filter.lng | 9 + .../lib/lang/nl_mail_content_filter_list.lng | 8 + .../mail/lib/lang/nl_mail_domain.lng | 13 + .../mail/lib/lang/nl_mail_domain_catchall.lng | 9 + .../lib/lang/nl_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/nl_mail_domain_list.lng | 7 + .../mail/lib/lang/nl_mail_forward.lng | 7 + .../mail/lib/lang/nl_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/nl_mail_get.lng | 16 + .../mail/lib/lang/nl_mail_get_list.lng | 9 + .../mail/lib/lang/nl_mail_relay_recipient.lng | 9 + .../lib/lang/nl_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/nl_mail_spamfilter.lng | 17 + .../mail/lib/lang/nl_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/nl_mail_transport.lng | 10 + .../mail/lib/lang/nl_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/nl_mail_user.lng | 39 + .../mail/lib/lang/nl_mail_user_filter.lng | 10 + .../lib/lang/nl_mail_user_filter_list.lng | 7 + .../mail/lib/lang/nl_mail_user_list.lng | 7 + .../mail/lib/lang/nl_mail_user_stats_list.lng | 8 + .../mail/lib/lang/nl_mail_whitelist.lng | 9 + .../mail/lib/lang/nl_mail_whitelist_list.lng | 10 + .../mail/lib/lang/nl_spamfilter_blacklist.lng | 9 + .../lib/lang/nl_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/nl_spamfilter_config.lng | 20 + .../lib/lang/nl_spamfilter_config_list.lng | 5 + .../mail/lib/lang/nl_spamfilter_policy.lng | 38 + .../lib/lang/nl_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/nl_spamfilter_users.lng | 8 + .../lib/lang/nl_spamfilter_users_list.lng | 10 + .../mail/lib/lang/nl_spamfilter_whitelist.lng | 9 + .../lib/lang/nl_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/pl.lng | 47 + .../interface/mail/lib/lang/pl_mail_alias.lng | 11 + .../mail/lib/lang/pl_mail_alias_list.lng | 8 + .../mail/lib/lang/pl_mail_aliasdomain.lng | 11 + .../lib/lang/pl_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/pl_mail_blacklist.lng | 9 + .../mail/lib/lang/pl_mail_blacklist_list.lng | 10 + .../mail/lib/lang/pl_mail_content_filter.lng | 9 + .../lib/lang/pl_mail_content_filter_list.lng | 8 + .../mail/lib/lang/pl_mail_domain.lng | 13 + .../mail/lib/lang/pl_mail_domain_catchall.lng | 9 + .../lib/lang/pl_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/pl_mail_domain_list.lng | 7 + .../mail/lib/lang/pl_mail_forward.lng | 7 + .../mail/lib/lang/pl_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/pl_mail_get.lng | 16 + .../mail/lib/lang/pl_mail_get_list.lng | 9 + .../mail/lib/lang/pl_mail_relay_recipient.lng | 9 + .../lib/lang/pl_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/pl_mail_spamfilter.lng | 17 + .../mail/lib/lang/pl_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/pl_mail_transport.lng | 10 + .../mail/lib/lang/pl_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/pl_mail_user.lng | 39 + .../mail/lib/lang/pl_mail_user_filter.lng | 10 + .../lib/lang/pl_mail_user_filter_list.lng | 7 + .../mail/lib/lang/pl_mail_user_list.lng | 7 + .../mail/lib/lang/pl_mail_user_stats_list.lng | 8 + .../mail/lib/lang/pl_mail_whitelist.lng | 9 + .../mail/lib/lang/pl_mail_whitelist_list.lng | 10 + .../mail/lib/lang/pl_spamfilter_blacklist.lng | 9 + .../lib/lang/pl_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/pl_spamfilter_config.lng | 20 + .../lib/lang/pl_spamfilter_config_list.lng | 5 + .../mail/lib/lang/pl_spamfilter_policy.lng | 38 + .../lib/lang/pl_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/pl_spamfilter_users.lng | 8 + .../lib/lang/pl_spamfilter_users_list.lng | 10 + .../mail/lib/lang/pl_spamfilter_whitelist.lng | 9 + .../lib/lang/pl_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/pt.lng | 48 + .../interface/mail/lib/lang/pt_mail_alias.lng | 12 + .../mail/lib/lang/pt_mail_alias_list.lng | 9 + .../mail/lib/lang/pt_mail_aliasdomain.lng | 12 + .../lib/lang/pt_mail_aliasdomain_list.lng | 8 + .../mail/lib/lang/pt_mail_blacklist.lng | 10 + .../mail/lib/lang/pt_mail_blacklist_list.lng | 11 + .../mail/lib/lang/pt_mail_content_filter.lng | 10 + .../lib/lang/pt_mail_content_filter_list.lng | 9 + .../mail/lib/lang/pt_mail_domain.lng | 14 + .../mail/lib/lang/pt_mail_domain_catchall.lng | 10 + .../lib/lang/pt_mail_domain_catchall_list.lng | 10 + .../mail/lib/lang/pt_mail_domain_list.lng | 8 + .../mail/lib/lang/pt_mail_forward.lng | 8 + .../mail/lib/lang/pt_mail_forward_list.lng | 9 + .../interface/mail/lib/lang/pt_mail_get.lng | 17 + .../mail/lib/lang/pt_mail_get_list.lng | 10 + .../mail/lib/lang/pt_mail_relay_recipient.lng | 10 + .../lib/lang/pt_mail_relay_recipient_list.lng | 10 + .../mail/lib/lang/pt_mail_spamfilter.lng | 18 + .../mail/lib/lang/pt_mail_spamfilter_list.lng | 9 + .../mail/lib/lang/pt_mail_transport.lng | 11 + .../mail/lib/lang/pt_mail_transport_list.lng | 10 + .../interface/mail/lib/lang/pt_mail_user.lng | 40 + .../mail/lib/lang/pt_mail_user_filter.lng | 11 + .../lib/lang/pt_mail_user_filter_list.lng | 8 + .../mail/lib/lang/pt_mail_user_list.lng | 8 + .../mail/lib/lang/pt_mail_user_stats_list.lng | 9 + .../mail/lib/lang/pt_mail_whitelist.lng | 10 + .../mail/lib/lang/pt_mail_whitelist_list.lng | 11 + .../mail/lib/lang/pt_spamfilter_blacklist.lng | 10 + .../lib/lang/pt_spamfilter_blacklist_list.lng | 10 + .../mail/lib/lang/pt_spamfilter_config.lng | 21 + .../lib/lang/pt_spamfilter_config_list.lng | 6 + .../mail/lib/lang/pt_spamfilter_policy.lng | 39 + .../lib/lang/pt_spamfilter_policy_list.lng | 10 + .../mail/lib/lang/pt_spamfilter_users.lng | 9 + .../lib/lang/pt_spamfilter_users_list.lng | 11 + .../mail/lib/lang/pt_spamfilter_whitelist.lng | 10 + .../lib/lang/pt_spamfilter_whitelist_list.lng | 10 + .../ispconfig/interface/mail/lib/lang/ro.lng | 47 + .../interface/mail/lib/lang/ro_mail_alias.lng | 11 + .../mail/lib/lang/ro_mail_alias_list.lng | 8 + .../mail/lib/lang/ro_mail_aliasdomain.lng | 11 + .../lib/lang/ro_mail_aliasdomain_list.lng | 8 + .../mail/lib/lang/ro_mail_blacklist.lng | 9 + .../mail/lib/lang/ro_mail_blacklist_list.lng | 10 + .../mail/lib/lang/ro_mail_content_filter.lng | 9 + .../lib/lang/ro_mail_content_filter_list.lng | 8 + .../mail/lib/lang/ro_mail_domain.lng | 13 + .../mail/lib/lang/ro_mail_domain_catchall.lng | 9 + .../lib/lang/ro_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/ro_mail_domain_list.lng | 7 + .../mail/lib/lang/ro_mail_forward.lng | 7 + .../mail/lib/lang/ro_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/ro_mail_get.lng | 16 + .../mail/lib/lang/ro_mail_get_list.lng | 9 + .../mail/lib/lang/ro_mail_relay_recipient.lng | 9 + .../lib/lang/ro_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/ro_mail_spamfilter.lng | 17 + .../mail/lib/lang/ro_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/ro_mail_transport.lng | 10 + .../mail/lib/lang/ro_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/ro_mail_user.lng | 39 + .../mail/lib/lang/ro_mail_user_filter.lng | 10 + .../lib/lang/ro_mail_user_filter_list.lng | 7 + .../mail/lib/lang/ro_mail_user_list.lng | 7 + .../mail/lib/lang/ro_mail_user_stats_list.lng | 8 + .../mail/lib/lang/ro_mail_whitelist.lng | 9 + .../mail/lib/lang/ro_mail_whitelist_list.lng | 10 + .../mail/lib/lang/ro_spamfilter_blacklist.lng | 9 + .../lib/lang/ro_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/ro_spamfilter_config.lng | 20 + .../lib/lang/ro_spamfilter_config_list.lng | 5 + .../mail/lib/lang/ro_spamfilter_policy.lng | 38 + .../lib/lang/ro_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/ro_spamfilter_users.lng | 8 + .../lib/lang/ro_spamfilter_users_list.lng | 10 + .../mail/lib/lang/ro_spamfilter_whitelist.lng | 9 + .../lib/lang/ro_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/ru.lng | 48 + .../interface/mail/lib/lang/ru_mail_alias.lng | 12 + .../mail/lib/lang/ru_mail_alias_list.lng | 9 + .../mail/lib/lang/ru_mail_aliasdomain.lng | 12 + .../lib/lang/ru_mail_aliasdomain_list.lng | 8 + .../mail/lib/lang/ru_mail_blacklist.lng | 10 + .../mail/lib/lang/ru_mail_blacklist_list.lng | 11 + .../mail/lib/lang/ru_mail_content_filter.lng | 10 + .../lib/lang/ru_mail_content_filter_list.lng | 9 + .../mail/lib/lang/ru_mail_domain.lng | 14 + .../mail/lib/lang/ru_mail_domain_catchall.lng | 10 + .../lib/lang/ru_mail_domain_catchall_list.lng | 10 + .../mail/lib/lang/ru_mail_domain_list.lng | 8 + .../mail/lib/lang/ru_mail_forward.lng | 8 + .../mail/lib/lang/ru_mail_forward_list.lng | 9 + .../interface/mail/lib/lang/ru_mail_get.lng | 17 + .../mail/lib/lang/ru_mail_get_list.lng | 10 + .../mail/lib/lang/ru_mail_relay_recipient.lng | 10 + .../lib/lang/ru_mail_relay_recipient_list.lng | 10 + .../mail/lib/lang/ru_mail_spamfilter.lng | 18 + .../mail/lib/lang/ru_mail_spamfilter_list.lng | 9 + .../mail/lib/lang/ru_mail_transport.lng | 11 + .../mail/lib/lang/ru_mail_transport_list.lng | 10 + .../interface/mail/lib/lang/ru_mail_user.lng | 42 + .../mail/lib/lang/ru_mail_user_filter.lng | 11 + .../lib/lang/ru_mail_user_filter_list.lng | 8 + .../mail/lib/lang/ru_mail_user_list.lng | 8 + .../mail/lib/lang/ru_mail_user_stats_list.lng | 9 + .../mail/lib/lang/ru_mail_whitelist.lng | 10 + .../mail/lib/lang/ru_mail_whitelist_list.lng | 11 + .../mail/lib/lang/ru_spamfilter_blacklist.lng | 10 + .../lib/lang/ru_spamfilter_blacklist_list.lng | 10 + .../mail/lib/lang/ru_spamfilter_config.lng | 21 + .../lib/lang/ru_spamfilter_config_list.lng | 6 + .../mail/lib/lang/ru_spamfilter_policy.lng | 39 + .../lib/lang/ru_spamfilter_policy_list.lng | 10 + .../mail/lib/lang/ru_spamfilter_users.lng | 9 + .../lib/lang/ru_spamfilter_users_list.lng | 11 + .../mail/lib/lang/ru_spamfilter_whitelist.lng | 10 + .../lib/lang/ru_spamfilter_whitelist_list.lng | 10 + .../ispconfig/interface/mail/lib/lang/se.lng | 47 + .../interface/mail/lib/lang/se_mail_alias.lng | 11 + .../mail/lib/lang/se_mail_alias_list.lng | 8 + .../mail/lib/lang/se_mail_aliasdomain.lng | 11 + .../lib/lang/se_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/se_mail_blacklist.lng | 9 + .../mail/lib/lang/se_mail_blacklist_list.lng | 10 + .../mail/lib/lang/se_mail_content_filter.lng | 9 + .../lib/lang/se_mail_content_filter_list.lng | 8 + .../mail/lib/lang/se_mail_domain.lng | 13 + .../mail/lib/lang/se_mail_domain_catchall.lng | 9 + .../lib/lang/se_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/se_mail_domain_list.lng | 7 + .../mail/lib/lang/se_mail_forward.lng | 7 + .../mail/lib/lang/se_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/se_mail_get.lng | 16 + .../mail/lib/lang/se_mail_get_list.lng | 9 + .../mail/lib/lang/se_mail_relay_recipient.lng | 9 + .../lib/lang/se_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/se_mail_spamfilter.lng | 17 + .../mail/lib/lang/se_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/se_mail_transport.lng | 10 + .../mail/lib/lang/se_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/se_mail_user.lng | 41 + .../mail/lib/lang/se_mail_user_filter.lng | 10 + .../lib/lang/se_mail_user_filter_list.lng | 7 + .../mail/lib/lang/se_mail_user_list.lng | 7 + .../mail/lib/lang/se_mail_user_stats_list.lng | 8 + .../mail/lib/lang/se_mail_whitelist.lng | 9 + .../mail/lib/lang/se_mail_whitelist_list.lng | 10 + .../mail/lib/lang/se_spamfilter_blacklist.lng | 9 + .../lib/lang/se_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/se_spamfilter_config.lng | 20 + .../lib/lang/se_spamfilter_config_list.lng | 5 + .../mail/lib/lang/se_spamfilter_policy.lng | 38 + .../lib/lang/se_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/se_spamfilter_users.lng | 8 + .../lib/lang/se_spamfilter_users_list.lng | 10 + .../mail/lib/lang/se_spamfilter_whitelist.lng | 9 + .../lib/lang/se_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/sk.lng | 47 + .../interface/mail/lib/lang/sk_mail_alias.lng | 11 + .../mail/lib/lang/sk_mail_alias_list.lng | 8 + .../mail/lib/lang/sk_mail_aliasdomain.lng | 11 + .../lib/lang/sk_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/sk_mail_blacklist.lng | 9 + .../mail/lib/lang/sk_mail_blacklist_list.lng | 10 + .../mail/lib/lang/sk_mail_content_filter.lng | 9 + .../lib/lang/sk_mail_content_filter_list.lng | 8 + .../mail/lib/lang/sk_mail_domain.lng | 13 + .../mail/lib/lang/sk_mail_domain_catchall.lng | 9 + .../lib/lang/sk_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/sk_mail_domain_list.lng | 7 + .../mail/lib/lang/sk_mail_forward.lng | 7 + .../mail/lib/lang/sk_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/sk_mail_get.lng | 16 + .../mail/lib/lang/sk_mail_get_list.lng | 9 + .../mail/lib/lang/sk_mail_relay_recipient.lng | 9 + .../lib/lang/sk_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/sk_mail_spamfilter.lng | 17 + .../mail/lib/lang/sk_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/sk_mail_transport.lng | 10 + .../mail/lib/lang/sk_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/sk_mail_user.lng | 39 + .../mail/lib/lang/sk_mail_user_filter.lng | 10 + .../lib/lang/sk_mail_user_filter_list.lng | 7 + .../mail/lib/lang/sk_mail_user_list.lng | 7 + .../mail/lib/lang/sk_mail_user_stats_list.lng | 8 + .../mail/lib/lang/sk_mail_whitelist.lng | 9 + .../mail/lib/lang/sk_mail_whitelist_list.lng | 10 + .../mail/lib/lang/sk_spamfilter_blacklist.lng | 9 + .../lib/lang/sk_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/sk_spamfilter_config.lng | 20 + .../lib/lang/sk_spamfilter_config_list.lng | 5 + .../mail/lib/lang/sk_spamfilter_policy.lng | 38 + .../lib/lang/sk_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/sk_spamfilter_users.lng | 8 + .../lib/lang/sk_spamfilter_users_list.lng | 10 + .../mail/lib/lang/sk_spamfilter_whitelist.lng | 9 + .../lib/lang/sk_spamfilter_whitelist_list.lng | 9 + .../ispconfig/interface/mail/lib/lang/tr.lng | 47 + .../interface/mail/lib/lang/tr_mail_alias.lng | 11 + .../mail/lib/lang/tr_mail_alias_list.lng | 8 + .../mail/lib/lang/tr_mail_aliasdomain.lng | 11 + .../lib/lang/tr_mail_aliasdomain_list.lng | 7 + .../mail/lib/lang/tr_mail_blacklist.lng | 9 + .../mail/lib/lang/tr_mail_blacklist_list.lng | 10 + .../mail/lib/lang/tr_mail_content_filter.lng | 9 + .../lib/lang/tr_mail_content_filter_list.lng | 8 + .../mail/lib/lang/tr_mail_domain.lng | 13 + .../mail/lib/lang/tr_mail_domain_catchall.lng | 9 + .../lib/lang/tr_mail_domain_catchall_list.lng | 9 + .../mail/lib/lang/tr_mail_domain_list.lng | 7 + .../mail/lib/lang/tr_mail_forward.lng | 7 + .../mail/lib/lang/tr_mail_forward_list.lng | 8 + .../interface/mail/lib/lang/tr_mail_get.lng | 16 + .../mail/lib/lang/tr_mail_get_list.lng | 9 + .../mail/lib/lang/tr_mail_relay_recipient.lng | 9 + .../lib/lang/tr_mail_relay_recipient_list.lng | 9 + .../mail/lib/lang/tr_mail_spamfilter.lng | 17 + .../mail/lib/lang/tr_mail_spamfilter_list.lng | 8 + .../mail/lib/lang/tr_mail_transport.lng | 10 + .../mail/lib/lang/tr_mail_transport_list.lng | 9 + .../interface/mail/lib/lang/tr_mail_user.lng | 39 + .../mail/lib/lang/tr_mail_user_filter.lng | 10 + .../lib/lang/tr_mail_user_filter_list.lng | 7 + .../mail/lib/lang/tr_mail_user_list.lng | 7 + .../mail/lib/lang/tr_mail_user_stats_list.lng | 8 + .../mail/lib/lang/tr_mail_whitelist.lng | 9 + .../mail/lib/lang/tr_mail_whitelist_list.lng | 10 + .../mail/lib/lang/tr_spamfilter_blacklist.lng | 9 + .../lib/lang/tr_spamfilter_blacklist_list.lng | 9 + .../mail/lib/lang/tr_spamfilter_config.lng | 20 + .../lib/lang/tr_spamfilter_config_list.lng | 5 + .../mail/lib/lang/tr_spamfilter_policy.lng | 38 + .../lib/lang/tr_spamfilter_policy_list.lng | 9 + .../mail/lib/lang/tr_spamfilter_users.lng | 8 + .../lib/lang/tr_spamfilter_users_list.lng | 10 + .../mail/lib/lang/tr_spamfilter_whitelist.lng | 9 + .../lib/lang/tr_spamfilter_whitelist_list.lng | 9 + .../interface/mail/lib/module.conf.php | 125 + .../interface/mail/list/mail_alias.list.php | 79 + .../mail/list/mail_aliasdomain.list.php | 79 + .../mail/list/mail_blacklist.list.php | 95 + .../mail/list/mail_content_filter.list.php | 96 + .../interface/mail/list/mail_domain.list.php | 86 + .../mail/list/mail_domain_catchall.list.php | 79 + .../interface/mail/list/mail_forward.list.php | 79 + .../interface/mail/list/mail_get.list.php | 102 + .../mail/list/mail_relay_recipient.list.php | 85 + .../mail/list/mail_spamfilter.list.php | 85 + .../mail/list/mail_transport.list.php | 104 + .../interface/mail/list/mail_user.list.php | 78 + .../mail/list/mail_user_filter.list.php | 60 + .../mail/list/mail_user_stats.list.php | 60 + .../mail/list/mail_whitelist.list.php | 94 + .../mail/list/spamfilter_blacklist.list.php | 108 + .../mail/list/spamfilter_config.list.php | 60 + .../mail/list/spamfilter_policy.list.php | 116 + .../mail/list/spamfilter_users.list.php | 108 + .../mail/list/spamfilter_whitelist.list.php | 108 + .../interface/mail/mail_alias_del.php | 51 + .../interface/mail/mail_alias_edit.php | 145 + .../interface/mail/mail_alias_list.php | 26 + .../interface/mail/mail_aliasdomain_del.php | 51 + .../interface/mail/mail_aliasdomain_edit.php | 141 + .../interface/mail/mail_aliasdomain_list.php | 26 + .../interface/mail/mail_blacklist_del.php | 51 + .../interface/mail/mail_blacklist_edit.php | 114 + .../interface/mail/mail_blacklist_list.php | 24 + .../mail/mail_content_filter_del.php | 51 + .../mail/mail_content_filter_edit.php | 75 + .../mail/mail_content_filter_list.php | 26 + .../mail/mail_domain_catchall_del.php | 51 + .../mail/mail_domain_catchall_edit.php | 138 + .../mail/mail_domain_catchall_list.php | 26 + .../interface/mail/mail_domain_del.php | 92 + .../interface/mail/mail_domain_edit.php | 327 + .../interface/mail/mail_domain_list.php | 27 + .../interface/mail/mail_forward_del.php | 51 + .../interface/mail/mail_forward_edit.php | 141 + .../interface/mail/mail_forward_list.php | 26 + .../ispconfig/interface/mail/mail_get_del.php | 51 + .../interface/mail/mail_get_edit.php | 109 + .../interface/mail/mail_get_list.php | 26 + .../mail/mail_relay_recipient_del.php | 51 + .../mail/mail_relay_recipient_edit.php | 59 + .../mail/mail_relay_recipient_list.php | 24 + .../interface/mail/mail_spamfilter_del.php | 51 + .../interface/mail/mail_spamfilter_edit.php | 124 + .../interface/mail/mail_spamfilter_list.php | 23 + .../interface/mail/mail_transport_del.php | 51 + .../interface/mail/mail_transport_edit.php | 179 + .../interface/mail/mail_transport_list.php | 26 + .../interface/mail/mail_user_del.php | 66 + .../interface/mail/mail_user_edit.php | 328 + .../interface/mail/mail_user_filter_del.php | 83 + .../interface/mail/mail_user_filter_edit.php | 232 + .../interface/mail/mail_user_list.php | 44 + .../interface/mail/mail_user_stats.php | 63 + .../interface/mail/mail_whitelist_del.php | 51 + .../interface/mail/mail_whitelist_edit.php | 113 + .../interface/mail/mail_whitelist_list.php | 24 + .../mail/spamfilter_blacklist_del.php | 51 + .../mail/spamfilter_blacklist_edit.php | 118 + .../mail/spamfilter_blacklist_list.php | 24 + .../interface/mail/spamfilter_config_del.php | 51 + .../interface/mail/spamfilter_config_edit.php | 96 + .../interface/mail/spamfilter_config_list.php | 24 + .../interface/mail/spamfilter_policy_del.php | 51 + .../interface/mail/spamfilter_policy_edit.php | 95 + .../interface/mail/spamfilter_policy_list.php | 24 + .../interface/mail/spamfilter_users_del.php | 51 + .../interface/mail/spamfilter_users_edit.php | 111 + .../interface/mail/spamfilter_users_list.php | 24 + .../mail/spamfilter_whitelist_del.php | 51 + .../mail/spamfilter_whitelist_edit.php | 119 + .../mail/spamfilter_whitelist_list.php | 24 + .../mail/templates/mail_alias_edit.htm | 39 + .../mail/templates/mail_alias_list.htm | 57 + .../mail/templates/mail_aliasdomain_edit.htm | 37 + .../mail/templates/mail_aliasdomain_list.htm | 57 + .../mail/templates/mail_blacklist_edit.htm | 41 + .../mail/templates/mail_blacklist_list.htm | 60 + .../templates/mail_content_filter_edit.htm | 50 + .../templates/mail_content_filter_list.htm | 60 + .../templates/mail_domain_catchall_edit.htm | 38 + .../templates/mail_domain_catchall_list.htm | 57 + .../mail/templates/mail_domain_edit.htm | 67 + .../mail/templates/mail_domain_list.htm | 57 + .../mail/templates/mail_forward_edit.htm | 37 + .../mail/templates/mail_forward_list.htm | 57 + .../mail/templates/mail_get_edit.htm | 54 + .../mail/templates/mail_get_list.htm | 63 + .../templates/mail_relay_recipient_edit.htm | 35 + .../templates/mail_relay_recipient_list.htm | 55 + .../mail/templates/mail_transport_edit.htm | 56 + .../mail/templates/mail_transport_list.htm | 63 + .../mail_user_autoresponder_edit.htm | 37 + .../templates/mail_user_custom_rules_edit.htm | 22 + .../mail/templates/mail_user_filter_edit.htm | 38 + .../mail/templates/mail_user_filter_list.htm | 45 + .../mail/templates/mail_user_list.htm | 58 + .../mail/templates/mail_user_mailbox_edit.htm | 67 + .../templates/mail_user_mailfilter_edit.htm | 26 + .../mail/templates/mail_user_stats_list.htm | 52 + .../mail/templates/mail_whitelist_edit.htm | 41 + .../mail/templates/mail_whitelist_list.htm | 60 + .../templates/spamfilter_blacklist_edit.htm | 49 + .../templates/spamfilter_blacklist_list.htm | 63 + .../spamfilter_config_getmail_edit.htm | 22 + .../mail/templates/spamfilter_config_list.htm | 51 + .../templates/spamfilter_config_mail_edit.htm | 66 + .../spamfilter_config_server_edit.htm | 38 + .../mail/templates/spamfilter_other_edit.htm | 80 + .../mail/templates/spamfilter_policy_edit.htm | 64 + .../mail/templates/spamfilter_policy_list.htm | 63 + .../templates/spamfilter_quarantine_edit.htm | 44 + .../templates/spamfilter_taglevel_edit.htm | 52 + .../mail/templates/spamfilter_users_edit.htm | 50 + .../mail/templates/spamfilter_users_list.htm | 63 + .../templates/spamfilter_whitelist_edit.htm | 49 + .../templates/spamfilter_whitelist_list.htm | 63 + .../ispconfig/interface/mail/webmailer.php | 68 + .../interface/monitor/datalog_del.php | 51 + .../interface/monitor/datalog_list.php | 64 + .../interface/monitor/lib/admin.conf.php | 2 + .../interface/monitor/lib/lang/bg.lng | 138 + .../monitor/lib/lang/bg_datalog_list.lng | 8 + .../monitor/lib/lang/bg_syslog_list.lng | 7 + .../interface/monitor/lib/lang/br.lng | 138 + .../monitor/lib/lang/br_datalog_list.lng | 8 + .../monitor/lib/lang/br_syslog_list.lng | 7 + .../interface/monitor/lib/lang/de.lng | 138 + .../monitor/lib/lang/de_datalog_list.lng | 8 + .../monitor/lib/lang/de_syslog_list.lng | 7 + .../interface/monitor/lib/lang/en.lng | 138 + .../monitor/lib/lang/en_datalog_list.lng | 8 + .../monitor/lib/lang/en_syslog_list.lng | 7 + .../interface/monitor/lib/lang/es.lng | 138 + .../monitor/lib/lang/es_datalog_list.lng | 8 + .../monitor/lib/lang/es_syslog_list.lng | 7 + .../interface/monitor/lib/lang/fi.lng | 138 + .../monitor/lib/lang/fi_datalog_list.lng | 8 + .../monitor/lib/lang/fi_syslog_list.lng | 7 + .../interface/monitor/lib/lang/fr.lng | 138 + .../monitor/lib/lang/fr_datalog_list.lng | 8 + .../monitor/lib/lang/fr_syslog_list.lng | 7 + .../interface/monitor/lib/lang/hu.lng | 138 + .../monitor/lib/lang/hu_datalog_list.lng | 8 + .../monitor/lib/lang/hu_syslog_list.lng | 7 + .../interface/monitor/lib/lang/it.lng | 138 + .../monitor/lib/lang/it_datalog_list.lng | 8 + .../monitor/lib/lang/it_syslog_list.lng | 7 + .../interface/monitor/lib/lang/ja.lng | 138 + .../monitor/lib/lang/ja_datalog_list.lng | 8 + .../monitor/lib/lang/ja_syslog_list.lng | 7 + .../interface/monitor/lib/lang/nl.lng | 138 + .../monitor/lib/lang/nl_datalog_list.lng | 8 + .../monitor/lib/lang/nl_syslog_list.lng | 7 + .../interface/monitor/lib/lang/pl.lng | 138 + .../monitor/lib/lang/pl_datalog_list.lng | 8 + .../monitor/lib/lang/pl_syslog_list.lng | 7 + .../interface/monitor/lib/lang/pt.lng | 139 + .../monitor/lib/lang/pt_datalog_list.lng | 9 + .../monitor/lib/lang/pt_syslog_list.lng | 8 + .../interface/monitor/lib/lang/ro.lng | 138 + .../monitor/lib/lang/ro_datalog_list.lng | 8 + .../monitor/lib/lang/ro_syslog_list.lng | 7 + .../interface/monitor/lib/lang/ru.lng | 139 + .../monitor/lib/lang/ru_datalog_list.lng | 9 + .../monitor/lib/lang/ru_syslog_list.lng | 7 + .../interface/monitor/lib/lang/se.lng | 138 + .../monitor/lib/lang/se_datalog_list.lng | 8 + .../monitor/lib/lang/se_syslog_list.lng | 7 + .../interface/monitor/lib/lang/sk.lng | 138 + .../monitor/lib/lang/sk_datalog_list.lng | 8 + .../monitor/lib/lang/sk_syslog_list.lng | 7 + .../interface/monitor/lib/lang/tr.lng | 138 + .../monitor/lib/lang/tr_datalog_list.lng | 8 + .../monitor/lib/lang/tr_syslog_list.lng | 7 + .../interface/monitor/lib/module.conf.php | 160 + .../interface/monitor/list/datalog.list.php | 91 + .../interface/monitor/list/log.list.php | 90 + .../ispconfig/interface/monitor/log_del.php | 44 + .../ispconfig/interface/monitor/log_list.php | 55 + .../ispconfig/interface/monitor/show_data.php | 139 + .../ispconfig/interface/monitor/show_log.php | 143 + .../interface/monitor/show_sys_state.php | 508 + .../monitor/templates/datalog_list.htm | 49 + .../interface/monitor/templates/show_data.htm | 12 + .../interface/monitor/templates/show_log.htm | 25 + .../monitor/templates/show_sys_state.htm | 25 + .../monitor/templates/syslog_list.htm | 56 + .../ispconfig/interface/monitor/tools.inc.php | 456 + .../mymodule/form/support_message.tform.php | 132 + .../interface/mymodule/lib/admin.conf.php | 7 + .../mymodule/lib/mymodule.config.php | 47 + .../mymodule/list/support_message.list.php | 63 + .../mymodule/support_message_del.php | 21 + .../mymodule/support_message_edit.php | 33 + .../mymodule/support_message_list.php | 24 + .../templates/support_message_edit.html | 14 + .../templates/support_message_view.html | 14 + interface/ispconfig/interface/nav.php | 102 + .../ispconfig/interface/remote/index.php | 15 + interface/ispconfig/interface/robots.txt | 2 + .../ispconfig/interface/sites/ajax_get_ip.php | 56 + .../ispconfig/interface/sites/cron_del.php | 64 + .../ispconfig/interface/sites/cron_edit.php | 221 + .../ispconfig/interface/sites/cron_list.php | 23 + .../interface/sites/database_del.php | 51 + .../interface/sites/database_edit.php | 338 + .../interface/sites/database_list.php | 73 + .../interface/sites/database_phpmyadmin.php | 70 + .../interface/sites/form/cron.tform.php | 189 + .../interface/sites/form/database.tform.php | 155 + .../interface/sites/form/ftp_user.tform.php | 253 + .../interface/sites/form/shell_user.tform.php | 196 + .../sites/form/web_aliasdomain.tform.php | 142 + .../interface/sites/form/web_domain.tform.php | 463 + .../sites/form/web_subdomain.tform.php | 136 + .../interface/sites/ftp_user_del.php | 51 + .../interface/sites/ftp_user_edit.php | 209 + .../interface/sites/ftp_user_list.php | 55 + .../interface/sites/lib/admin.conf.php | 2 + .../ispconfig/interface/sites/lib/lang/bg.lng | 22 + .../interface/sites/lib/lang/bg_cron.lng | 21 + .../interface/sites/lib/lang/bg_cron_list.lng | 12 + .../interface/sites/lib/lang/bg_database.lng | 25 + .../sites/lib/lang/bg_database_list.lng | 8 + .../interface/sites/lib/lang/bg_ftp_user.lng | 27 + .../sites/lib/lang/bg_ftp_user_list.lng | 8 + .../sites/lib/lang/bg_shell_user.lng | 22 + .../sites/lib/lang/bg_shell_user_list.lng | 8 + .../lib/lang/bg_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/bg_web_domain.lng | 60 + .../sites/lib/lang/bg_web_domain_list.lng | 8 + .../lib/lang/bg_web_sites_stats_list.lng | 8 + .../sites/lib/lang/bg_web_subdomain.lng | 40 + .../sites/lib/lang/bg_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/br.lng | 22 + .../interface/sites/lib/lang/br_cron.lng | 21 + .../interface/sites/lib/lang/br_cron_list.lng | 12 + .../interface/sites/lib/lang/br_database.lng | 25 + .../sites/lib/lang/br_database_list.lng | 9 + .../interface/sites/lib/lang/br_ftp_user.lng | 27 + .../sites/lib/lang/br_ftp_user_list.lng | 8 + .../sites/lib/lang/br_shell_user.lng | 22 + .../sites/lib/lang/br_shell_user_list.lng | 8 + .../lib/lang/br_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/br_web_domain.lng | 60 + .../sites/lib/lang/br_web_domain_list.lng | 8 + .../lib/lang/br_web_sites_stats_list.lng | 8 + .../sites/lib/lang/br_web_subdomain.lng | 40 + .../sites/lib/lang/br_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/de.lng | 22 + .../interface/sites/lib/lang/de_cron.lng | 21 + .../interface/sites/lib/lang/de_cron_list.lng | 12 + .../interface/sites/lib/lang/de_database.lng | 25 + .../sites/lib/lang/de_database_list.lng | 8 + .../interface/sites/lib/lang/de_ftp_user.lng | 27 + .../sites/lib/lang/de_ftp_user_list.lng | 8 + .../sites/lib/lang/de_shell_user.lng | 22 + .../sites/lib/lang/de_shell_user_list.lng | 8 + .../lib/lang/de_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/de_web_domain.lng | 60 + .../sites/lib/lang/de_web_domain_list.lng | 8 + .../lib/lang/de_web_sites_stats_list.lng | 8 + .../sites/lib/lang/de_web_subdomain.lng | 40 + .../sites/lib/lang/de_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/en.lng | 22 + .../interface/sites/lib/lang/en_cron.lng | 21 + .../interface/sites/lib/lang/en_cron_list.lng | 12 + .../interface/sites/lib/lang/en_database.lng | 25 + .../sites/lib/lang/en_database_list.lng | 9 + .../interface/sites/lib/lang/en_ftp_user.lng | 28 + .../sites/lib/lang/en_ftp_user_list.lng | 8 + .../sites/lib/lang/en_shell_user.lng | 23 + .../sites/lib/lang/en_shell_user_list.lng | 8 + .../lib/lang/en_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/en_web_domain.lng | 61 + .../sites/lib/lang/en_web_domain_list.lng | 8 + .../lib/lang/en_web_sites_stats_list.lng | 8 + .../sites/lib/lang/en_web_subdomain.lng | 40 + .../sites/lib/lang/en_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/es.lng | 22 + .../interface/sites/lib/lang/es_cron.lng | 21 + .../interface/sites/lib/lang/es_cron_list.lng | 12 + .../interface/sites/lib/lang/es_database.lng | 25 + .../sites/lib/lang/es_database_list.lng | 8 + .../interface/sites/lib/lang/es_ftp_user.lng | 27 + .../sites/lib/lang/es_ftp_user_list.lng | 8 + .../sites/lib/lang/es_shell_user.lng | 22 + .../sites/lib/lang/es_shell_user_list.lng | 8 + .../lib/lang/es_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/es_web_domain.lng | 60 + .../sites/lib/lang/es_web_domain_list.lng | 8 + .../lib/lang/es_web_sites_stats_list.lng | 8 + .../sites/lib/lang/es_web_subdomain.lng | 40 + .../sites/lib/lang/es_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/fi.lng | 22 + .../interface/sites/lib/lang/fi_cron.lng | 21 + .../interface/sites/lib/lang/fi_cron_list.lng | 12 + .../interface/sites/lib/lang/fi_database.lng | 25 + .../sites/lib/lang/fi_database_list.lng | 8 + .../interface/sites/lib/lang/fi_ftp_user.lng | 27 + .../sites/lib/lang/fi_ftp_user_list.lng | 8 + .../sites/lib/lang/fi_shell_user.lng | 22 + .../sites/lib/lang/fi_shell_user_list.lng | 8 + .../lib/lang/fi_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/fi_web_domain.lng | 60 + .../sites/lib/lang/fi_web_domain_list.lng | 8 + .../lib/lang/fi_web_sites_stats_list.lng | 8 + .../sites/lib/lang/fi_web_subdomain.lng | 40 + .../sites/lib/lang/fi_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/fr.lng | 22 + .../interface/sites/lib/lang/fr_cron.lng | 21 + .../interface/sites/lib/lang/fr_cron_list.lng | 12 + .../interface/sites/lib/lang/fr_database.lng | 25 + .../sites/lib/lang/fr_database_list.lng | 8 + .../interface/sites/lib/lang/fr_ftp_user.lng | 27 + .../sites/lib/lang/fr_ftp_user_list.lng | 8 + .../sites/lib/lang/fr_shell_user.lng | 22 + .../sites/lib/lang/fr_shell_user_list.lng | 8 + .../lib/lang/fr_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/fr_web_domain.lng | 60 + .../sites/lib/lang/fr_web_domain_list.lng | 8 + .../lib/lang/fr_web_sites_stats_list.lng | 8 + .../sites/lib/lang/fr_web_subdomain.lng | 40 + .../sites/lib/lang/fr_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/hu.lng | 22 + .../interface/sites/lib/lang/hu_cron.lng | 21 + .../interface/sites/lib/lang/hu_cron_list.lng | 12 + .../interface/sites/lib/lang/hu_database.lng | 25 + .../sites/lib/lang/hu_database_list.lng | 8 + .../interface/sites/lib/lang/hu_ftp_user.lng | 27 + .../sites/lib/lang/hu_ftp_user_list.lng | 8 + .../sites/lib/lang/hu_shell_user.lng | 22 + .../sites/lib/lang/hu_shell_user_list.lng | 8 + .../lib/lang/hu_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/hu_web_domain.lng | 60 + .../sites/lib/lang/hu_web_domain_list.lng | 8 + .../lib/lang/hu_web_sites_stats_list.lng | 8 + .../sites/lib/lang/hu_web_subdomain.lng | 40 + .../sites/lib/lang/hu_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/it.lng | 22 + .../interface/sites/lib/lang/it_cron.lng | 21 + .../interface/sites/lib/lang/it_cron_list.lng | 12 + .../interface/sites/lib/lang/it_database.lng | 25 + .../sites/lib/lang/it_database_list.lng | 8 + .../interface/sites/lib/lang/it_ftp_user.lng | 27 + .../sites/lib/lang/it_ftp_user_list.lng | 8 + .../sites/lib/lang/it_shell_user.lng | 22 + .../sites/lib/lang/it_shell_user_list.lng | 8 + .../lib/lang/it_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/it_web_domain.lng | 60 + .../sites/lib/lang/it_web_domain_list.lng | 8 + .../lib/lang/it_web_sites_stats_list.lng | 8 + .../sites/lib/lang/it_web_subdomain.lng | 40 + .../sites/lib/lang/it_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/ja.lng | 22 + .../interface/sites/lib/lang/ja_cron.lng | 21 + .../interface/sites/lib/lang/ja_cron_list.lng | 12 + .../interface/sites/lib/lang/ja_database.lng | 25 + .../sites/lib/lang/ja_database_list.lng | 8 + .../interface/sites/lib/lang/ja_ftp_user.lng | 27 + .../sites/lib/lang/ja_ftp_user_list.lng | 8 + .../sites/lib/lang/ja_shell_user.lng | 22 + .../sites/lib/lang/ja_shell_user_list.lng | 8 + .../lib/lang/ja_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/ja_web_domain.lng | 60 + .../sites/lib/lang/ja_web_domain_list.lng | 8 + .../lib/lang/ja_web_sites_stats_list.lng | 8 + .../sites/lib/lang/ja_web_subdomain.lng | 40 + .../sites/lib/lang/ja_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/nl.lng | 22 + .../interface/sites/lib/lang/nl_cron.lng | 21 + .../interface/sites/lib/lang/nl_cron_list.lng | 12 + .../interface/sites/lib/lang/nl_database.lng | 25 + .../sites/lib/lang/nl_database_list.lng | 8 + .../interface/sites/lib/lang/nl_ftp_user.lng | 27 + .../sites/lib/lang/nl_ftp_user_list.lng | 8 + .../sites/lib/lang/nl_shell_user.lng | 22 + .../sites/lib/lang/nl_shell_user_list.lng | 8 + .../lib/lang/nl_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/nl_web_domain.lng | 60 + .../sites/lib/lang/nl_web_domain_list.lng | 8 + .../lib/lang/nl_web_sites_stats_list.lng | 8 + .../sites/lib/lang/nl_web_subdomain.lng | 40 + .../sites/lib/lang/nl_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/pl.lng | 22 + .../interface/sites/lib/lang/pl_cron.lng | 21 + .../interface/sites/lib/lang/pl_cron_list.lng | 12 + .../interface/sites/lib/lang/pl_database.lng | 25 + .../sites/lib/lang/pl_database_list.lng | 8 + .../interface/sites/lib/lang/pl_ftp_user.lng | 27 + .../sites/lib/lang/pl_ftp_user_list.lng | 8 + .../sites/lib/lang/pl_shell_user.lng | 22 + .../sites/lib/lang/pl_shell_user_list.lng | 8 + .../lib/lang/pl_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/pl_web_domain.lng | 60 + .../sites/lib/lang/pl_web_domain_list.lng | 8 + .../lib/lang/pl_web_sites_stats_list.lng | 8 + .../sites/lib/lang/pl_web_subdomain.lng | 40 + .../sites/lib/lang/pl_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/pt.lng | 23 + .../interface/sites/lib/lang/pt_cron.lng | 22 + .../interface/sites/lib/lang/pt_cron_list.lng | 13 + .../interface/sites/lib/lang/pt_database.lng | 26 + .../sites/lib/lang/pt_database_list.lng | 9 + .../interface/sites/lib/lang/pt_ftp_user.lng | 28 + .../sites/lib/lang/pt_ftp_user_list.lng | 9 + .../sites/lib/lang/pt_shell_user.lng | 23 + .../sites/lib/lang/pt_shell_user_list.lng | 9 + .../lib/lang/pt_web_aliasdomain_list.lng | 12 + .../sites/lib/lang/pt_web_domain.lng | 61 + .../sites/lib/lang/pt_web_domain_list.lng | 9 + .../lib/lang/pt_web_sites_stats_list.lng | 9 + .../sites/lib/lang/pt_web_subdomain.lng | 41 + .../sites/lib/lang/pt_web_subdomain_list.lng | 9 + .../ispconfig/interface/sites/lib/lang/ro.lng | 22 + .../interface/sites/lib/lang/ro_cron.lng | 21 + .../interface/sites/lib/lang/ro_cron_list.lng | 12 + .../interface/sites/lib/lang/ro_database.lng | 25 + .../sites/lib/lang/ro_database_list.lng | 8 + .../interface/sites/lib/lang/ro_ftp_user.lng | 27 + .../sites/lib/lang/ro_ftp_user_list.lng | 8 + .../sites/lib/lang/ro_shell_user.lng | 22 + .../sites/lib/lang/ro_shell_user_list.lng | 8 + .../lib/lang/ro_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/ro_web_domain.lng | 60 + .../sites/lib/lang/ro_web_domain_list.lng | 8 + .../lib/lang/ro_web_sites_stats_list.lng | 8 + .../sites/lib/lang/ro_web_subdomain.lng | 40 + .../sites/lib/lang/ro_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/ru.lng | 23 + .../interface/sites/lib/lang/ru_cron.lng | 22 + .../interface/sites/lib/lang/ru_cron_list.lng | 13 + .../interface/sites/lib/lang/ru_database.lng | 26 + .../sites/lib/lang/ru_database_list.lng | 9 + .../interface/sites/lib/lang/ru_ftp_user.lng | 28 + .../sites/lib/lang/ru_ftp_user_list.lng | 9 + .../sites/lib/lang/ru_shell_user.lng | 23 + .../sites/lib/lang/ru_shell_user_list.lng | 9 + .../lib/lang/ru_web_aliasdomain_list.lng | 12 + .../sites/lib/lang/ru_web_domain.lng | 61 + .../sites/lib/lang/ru_web_domain_list.lng | 9 + .../lib/lang/ru_web_sites_stats_list.lng | 9 + .../sites/lib/lang/ru_web_subdomain.lng | 41 + .../sites/lib/lang/ru_web_subdomain_list.lng | 9 + .../ispconfig/interface/sites/lib/lang/se.lng | 22 + .../interface/sites/lib/lang/se_cron.lng | 21 + .../interface/sites/lib/lang/se_cron_list.lng | 12 + .../interface/sites/lib/lang/se_database.lng | 25 + .../sites/lib/lang/se_database_list.lng | 8 + .../interface/sites/lib/lang/se_ftp_user.lng | 27 + .../sites/lib/lang/se_ftp_user_list.lng | 8 + .../sites/lib/lang/se_shell_user.lng | 22 + .../sites/lib/lang/se_shell_user_list.lng | 8 + .../lib/lang/se_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/se_web_domain.lng | 60 + .../sites/lib/lang/se_web_domain_list.lng | 8 + .../lib/lang/se_web_sites_stats_list.lng | 8 + .../sites/lib/lang/se_web_subdomain.lng | 40 + .../sites/lib/lang/se_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/sk.lng | 22 + .../interface/sites/lib/lang/sk_cron.lng | 21 + .../interface/sites/lib/lang/sk_cron_list.lng | 12 + .../interface/sites/lib/lang/sk_database.lng | 25 + .../sites/lib/lang/sk_database_list.lng | 8 + .../interface/sites/lib/lang/sk_ftp_user.lng | 27 + .../sites/lib/lang/sk_ftp_user_list.lng | 8 + .../sites/lib/lang/sk_shell_user.lng | 22 + .../sites/lib/lang/sk_shell_user_list.lng | 8 + .../lib/lang/sk_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/sk_web_domain.lng | 60 + .../sites/lib/lang/sk_web_domain_list.lng | 8 + .../lib/lang/sk_web_sites_stats_list.lng | 8 + .../sites/lib/lang/sk_web_subdomain.lng | 40 + .../sites/lib/lang/sk_web_subdomain_list.lng | 8 + .../ispconfig/interface/sites/lib/lang/tr.lng | 22 + .../interface/sites/lib/lang/tr_cron.lng | 21 + .../interface/sites/lib/lang/tr_cron_list.lng | 12 + .../interface/sites/lib/lang/tr_database.lng | 25 + .../sites/lib/lang/tr_database_list.lng | 8 + .../interface/sites/lib/lang/tr_ftp_user.lng | 27 + .../sites/lib/lang/tr_ftp_user_list.lng | 8 + .../sites/lib/lang/tr_shell_user.lng | 22 + .../sites/lib/lang/tr_shell_user_list.lng | 8 + .../lib/lang/tr_web_aliasdomain_list.lng | 11 + .../sites/lib/lang/tr_web_domain.lng | 60 + .../sites/lib/lang/tr_web_domain_list.lng | 8 + .../lib/lang/tr_web_sites_stats_list.lng | 8 + .../sites/lib/lang/tr_web_subdomain.lng | 40 + .../sites/lib/lang/tr_web_subdomain_list.lng | 8 + .../interface/sites/lib/module.conf.php | 113 + .../interface/sites/list/cron.list.php | 152 + .../interface/sites/list/database.list.php | 101 + .../interface/sites/list/ftp_user.list.php | 99 + .../interface/sites/list/shell_user.list.php | 99 + .../sites/list/web_aliasdomain.list.php | 99 + .../interface/sites/list/web_domain.list.php | 94 + .../sites/list/web_sites_stats.list.php | 60 + .../sites/list/web_subdomain.list.php | 99 + .../interface/sites/shell_user_del.php | 51 + .../interface/sites/shell_user_edit.php | 224 + .../interface/sites/shell_user_list.php | 55 + .../interface/sites/templates/cron_edit.htm | 68 + .../interface/sites/templates/cron_list.htm | 71 + .../sites/templates/database_edit.htm | 108 + .../sites/templates/database_list.htm | 64 + .../sites/templates/ftp_user_advanced.htm | 50 + .../templates/ftp_user_advanced_client.htm | 22 + .../sites/templates/ftp_user_edit.htm | 48 + .../sites/templates/ftp_user_list.htm | 59 + .../sites/templates/shell_user_advanced.htm | 34 + .../sites/templates/shell_user_edit.htm | 62 + .../sites/templates/shell_user_list.htm | 59 + .../sites/templates/web_aliasdomain_edit.htm | 50 + .../sites/templates/web_aliasdomain_list.htm | 59 + .../sites/templates/web_domain_advanced.htm | 41 + .../sites/templates/web_domain_edit.htm | 120 + .../sites/templates/web_domain_list.htm | 59 + .../sites/templates/web_domain_redirect.htm | 28 + .../sites/templates/web_domain_ssl.htm | 62 + .../sites/templates/web_domain_stats.htm | 22 + .../sites/templates/web_sites_stats_list.htm | 52 + .../sites/templates/web_subdomain_edit.htm | 42 + .../sites/templates/web_subdomain_list.htm | 60 + .../ispconfig/interface/sites/tools.inc.php | 126 + .../interface/sites/web_aliasdomain_del.php | 51 + .../interface/sites/web_aliasdomain_edit.php | 114 + .../interface/sites/web_aliasdomain_list.php | 55 + .../interface/sites/web_domain_del.php | 87 + .../interface/sites/web_domain_edit.php | 477 + .../interface/sites/web_domain_list.php | 59 + .../interface/sites/web_sites_stats.php | 64 + .../interface/sites/web_subdomain_del.php | 51 + .../interface/sites/web_subdomain_edit.php | 114 + .../interface/sites/web_subdomain_list.php | 55 + .../lib/lang/bg_strengthmeter.lng | 8 + .../lib/lang/br_strengthmeter.lng | 8 + .../lib/lang/de_strengthmeter.lng | 8 + .../lib/lang/en_strengthmeter.lng | 8 + .../lib/lang/es_strengthmeter.lng | 8 + .../lib/lang/fi_strengthmeter.lng | 8 + .../lib/lang/fr_strengthmeter.lng | 8 + .../lib/lang/hu_strengthmeter.lng | 8 + .../lib/lang/it_strengthmeter.lng | 8 + .../lib/lang/ja_strengthmeter.lng | 8 + .../lib/lang/nl_strengthmeter.lng | 8 + .../lib/lang/pl_strengthmeter.lng | 8 + .../lib/lang/ro_strengthmeter.lng | 8 + .../lib/lang/ru_strengthmeter.lng | 9 + .../lib/lang/se_strengthmeter.lng | 8 + .../lib/lang/sk_strengthmeter.lng | 8 + .../lib/lang/tr_strengthmeter.lng | 8 + interface/ispconfig/interface/temp/en.lng | 2131 +++++ .../interface/themes/default/css/central.css | 32 + .../default/css/navigation/nav_side.css | 125 + .../themes/default/css/navigation/nav_top.css | 52 + .../themes/default/css/patches/central.css | 37 + .../themes/default/css/print/print_100.css | 31 + .../themes/default/css/screen/basemod.css | 118 + .../css/screen/basemod_2col_left_seo.css | 48 + .../themes/default/css/screen/content.css | 188 + .../default/css/screen/content_ispc.css | 822 ++ .../default/css/screen/uni-form-generic.css | 136 + .../themes/default/css/screen/uni-form.css | 130 + .../interface/themes/default/header_logo.png | Bin 0 -> 36266 bytes .../themes/default/icons/flags/ad.png | Bin 0 -> 643 bytes .../themes/default/icons/flags/ae.png | Bin 0 -> 408 bytes .../themes/default/icons/flags/af.png | Bin 0 -> 604 bytes .../themes/default/icons/flags/ag.png | Bin 0 -> 591 bytes .../themes/default/icons/flags/ai.png | Bin 0 -> 643 bytes .../themes/default/icons/flags/al.png | Bin 0 -> 600 bytes .../themes/default/icons/flags/am.png | Bin 0 -> 497 bytes .../themes/default/icons/flags/an.png | Bin 0 -> 488 bytes .../themes/default/icons/flags/ao.png | Bin 0 -> 428 bytes .../themes/default/icons/flags/aq.png | Bin 0 -> 575 bytes .../themes/default/icons/flags/ar.png | Bin 0 -> 506 bytes .../themes/default/icons/flags/as.png | Bin 0 -> 647 bytes .../themes/default/icons/flags/at.png | Bin 0 -> 403 bytes .../themes/default/icons/flags/au.png | Bin 0 -> 673 bytes .../themes/default/icons/flags/aw.png | Bin 0 -> 524 bytes .../themes/default/icons/flags/ax.png | Bin 0 -> 663 bytes .../themes/default/icons/flags/az.png | Bin 0 -> 589 bytes .../themes/default/icons/flags/ba.png | Bin 0 -> 593 bytes .../themes/default/icons/flags/bb.png | Bin 0 -> 585 bytes .../themes/default/icons/flags/bd.png | Bin 0 -> 504 bytes .../themes/default/icons/flags/be.png | Bin 0 -> 449 bytes .../themes/default/icons/flags/bf.png | Bin 0 -> 497 bytes .../themes/default/icons/flags/bg.png | Bin 0 -> 462 bytes .../themes/default/icons/flags/bh.png | Bin 0 -> 457 bytes .../themes/default/icons/flags/bi.png | Bin 0 -> 675 bytes .../themes/default/icons/flags/bj.png | Bin 0 -> 486 bytes .../themes/default/icons/flags/bm.png | Bin 0 -> 611 bytes .../themes/default/icons/flags/bn.png | Bin 0 -> 639 bytes .../themes/default/icons/flags/bo.png | Bin 0 -> 500 bytes .../themes/default/icons/flags/br.png | Bin 0 -> 593 bytes .../themes/default/icons/flags/bs.png | Bin 0 -> 526 bytes .../themes/default/icons/flags/bt.png | Bin 0 -> 631 bytes .../themes/default/icons/flags/bv.png | Bin 0 -> 512 bytes .../themes/default/icons/flags/bw.png | Bin 0 -> 443 bytes .../themes/default/icons/flags/by.png | Bin 0 -> 514 bytes .../themes/default/icons/flags/bz.png | Bin 0 -> 600 bytes .../themes/default/icons/flags/ca.png | Bin 0 -> 628 bytes .../themes/default/icons/flags/catalonia.png | Bin 0 -> 398 bytes .../themes/default/icons/flags/cc.png | Bin 0 -> 625 bytes .../themes/default/icons/flags/cd.png | Bin 0 -> 528 bytes .../themes/default/icons/flags/cf.png | Bin 0 -> 614 bytes .../themes/default/icons/flags/cg.png | Bin 0 -> 521 bytes .../themes/default/icons/flags/ch.png | Bin 0 -> 367 bytes .../themes/default/icons/flags/ci.png | Bin 0 -> 453 bytes .../themes/default/icons/flags/ck.png | Bin 0 -> 586 bytes .../themes/default/icons/flags/cl.png | Bin 0 -> 450 bytes .../themes/default/icons/flags/cm.png | Bin 0 -> 525 bytes .../themes/default/icons/flags/cn.png | Bin 0 -> 472 bytes .../themes/default/icons/flags/co.png | Bin 0 -> 483 bytes .../themes/default/icons/flags/cr.png | Bin 0 -> 477 bytes .../themes/default/icons/flags/cs.png | Bin 0 -> 439 bytes .../themes/default/icons/flags/cu.png | Bin 0 -> 563 bytes .../themes/default/icons/flags/cv.png | Bin 0 -> 529 bytes .../themes/default/icons/flags/cx.png | Bin 0 -> 608 bytes .../themes/default/icons/flags/cy.png | Bin 0 -> 428 bytes .../themes/default/icons/flags/cz.png | Bin 0 -> 476 bytes .../themes/default/icons/flags/de.png | Bin 0 -> 545 bytes .../themes/default/icons/flags/dj.png | Bin 0 -> 572 bytes .../themes/default/icons/flags/dk.png | Bin 0 -> 495 bytes .../themes/default/icons/flags/dm.png | Bin 0 -> 620 bytes .../themes/default/icons/flags/do.png | Bin 0 -> 508 bytes .../themes/default/icons/flags/dz.png | Bin 0 -> 582 bytes .../themes/default/icons/flags/ec.png | Bin 0 -> 500 bytes .../themes/default/icons/flags/ee.png | Bin 0 -> 429 bytes .../themes/default/icons/flags/eg.png | Bin 0 -> 465 bytes .../themes/default/icons/flags/eh.png | Bin 0 -> 508 bytes .../themes/default/icons/flags/england.png | Bin 0 -> 496 bytes .../themes/default/icons/flags/er.png | Bin 0 -> 653 bytes .../themes/default/icons/flags/es.png | Bin 0 -> 469 bytes .../themes/default/icons/flags/et.png | Bin 0 -> 592 bytes .../default/icons/flags/europeanunion.png | Bin 0 -> 479 bytes .../themes/default/icons/flags/fam.png | Bin 0 -> 532 bytes .../themes/default/icons/flags/fi.png | Bin 0 -> 489 bytes .../themes/default/icons/flags/fj.png | Bin 0 -> 610 bytes .../themes/default/icons/flags/fk.png | Bin 0 -> 648 bytes .../themes/default/icons/flags/fm.png | Bin 0 -> 552 bytes .../themes/default/icons/flags/fo.png | Bin 0 -> 474 bytes .../themes/default/icons/flags/fr.png | Bin 0 -> 545 bytes .../themes/default/icons/flags/ga.png | Bin 0 -> 489 bytes .../themes/default/icons/flags/gb.png | Bin 0 -> 599 bytes .../themes/default/icons/flags/gd.png | Bin 0 -> 637 bytes .../themes/default/icons/flags/ge.png | Bin 0 -> 594 bytes .../themes/default/icons/flags/gf.png | Bin 0 -> 545 bytes .../themes/default/icons/flags/gh.png | Bin 0 -> 490 bytes .../themes/default/icons/flags/gi.png | Bin 0 -> 463 bytes .../themes/default/icons/flags/gl.png | Bin 0 -> 470 bytes .../themes/default/icons/flags/gm.png | Bin 0 -> 493 bytes .../themes/default/icons/flags/gn.png | Bin 0 -> 480 bytes .../themes/default/icons/flags/gp.png | Bin 0 -> 488 bytes .../themes/default/icons/flags/gq.png | Bin 0 -> 537 bytes .../themes/default/icons/flags/gr.png | Bin 0 -> 487 bytes .../themes/default/icons/flags/gs.png | Bin 0 -> 630 bytes .../themes/default/icons/flags/gt.png | Bin 0 -> 493 bytes .../themes/default/icons/flags/gu.png | Bin 0 -> 509 bytes .../themes/default/icons/flags/gw.png | Bin 0 -> 516 bytes .../themes/default/icons/flags/gy.png | Bin 0 -> 645 bytes .../themes/default/icons/flags/hk.png | Bin 0 -> 527 bytes .../themes/default/icons/flags/hm.png | Bin 0 -> 673 bytes .../themes/default/icons/flags/hn.png | Bin 0 -> 537 bytes .../themes/default/icons/flags/hr.png | Bin 0 -> 524 bytes .../themes/default/icons/flags/ht.png | Bin 0 -> 487 bytes .../themes/default/icons/flags/hu.png | Bin 0 -> 432 bytes .../themes/default/icons/flags/id.png | Bin 0 -> 430 bytes .../themes/default/icons/flags/ie.png | Bin 0 -> 481 bytes .../themes/default/icons/flags/il.png | Bin 0 -> 431 bytes .../themes/default/icons/flags/in.png | Bin 0 -> 503 bytes .../themes/default/icons/flags/io.png | Bin 0 -> 658 bytes .../themes/default/icons/flags/iq.png | Bin 0 -> 515 bytes .../themes/default/icons/flags/ir.png | Bin 0 -> 512 bytes .../themes/default/icons/flags/is.png | Bin 0 -> 532 bytes .../themes/default/icons/flags/it.png | Bin 0 -> 420 bytes .../themes/default/icons/flags/jm.png | Bin 0 -> 637 bytes .../themes/default/icons/flags/jo.png | Bin 0 -> 473 bytes .../themes/default/icons/flags/jp.png | Bin 0 -> 420 bytes .../themes/default/icons/flags/ke.png | Bin 0 -> 569 bytes .../themes/default/icons/flags/kg.png | Bin 0 -> 510 bytes .../themes/default/icons/flags/kh.png | Bin 0 -> 549 bytes .../themes/default/icons/flags/ki.png | Bin 0 -> 656 bytes .../themes/default/icons/flags/km.png | Bin 0 -> 577 bytes .../themes/default/icons/flags/kn.png | Bin 0 -> 604 bytes .../themes/default/icons/flags/kp.png | Bin 0 -> 561 bytes .../themes/default/icons/flags/kr.png | Bin 0 -> 592 bytes .../themes/default/icons/flags/kw.png | Bin 0 -> 486 bytes .../themes/default/icons/flags/ky.png | Bin 0 -> 643 bytes .../themes/default/icons/flags/kz.png | Bin 0 -> 616 bytes .../themes/default/icons/flags/la.png | Bin 0 -> 563 bytes .../themes/default/icons/flags/lb.png | Bin 0 -> 517 bytes .../themes/default/icons/flags/lc.png | Bin 0 -> 520 bytes .../themes/default/icons/flags/li.png | Bin 0 -> 537 bytes .../themes/default/icons/flags/lk.png | Bin 0 -> 627 bytes .../themes/default/icons/flags/lr.png | Bin 0 -> 466 bytes .../themes/default/icons/flags/ls.png | Bin 0 -> 628 bytes .../themes/default/icons/flags/lt.png | Bin 0 -> 508 bytes .../themes/default/icons/flags/lu.png | Bin 0 -> 481 bytes .../themes/default/icons/flags/lv.png | Bin 0 -> 465 bytes .../themes/default/icons/flags/ly.png | Bin 0 -> 419 bytes .../themes/default/icons/flags/ma.png | Bin 0 -> 432 bytes .../themes/default/icons/flags/mc.png | Bin 0 -> 380 bytes .../themes/default/icons/flags/md.png | Bin 0 -> 566 bytes .../themes/default/icons/flags/me.png | Bin 0 -> 448 bytes .../themes/default/icons/flags/mg.png | Bin 0 -> 453 bytes .../themes/default/icons/flags/mh.png | Bin 0 -> 628 bytes .../themes/default/icons/flags/mk.png | Bin 0 -> 664 bytes .../themes/default/icons/flags/ml.png | Bin 0 -> 474 bytes .../themes/default/icons/flags/mm.png | Bin 0 -> 483 bytes .../themes/default/icons/flags/mn.png | Bin 0 -> 492 bytes .../themes/default/icons/flags/mo.png | Bin 0 -> 588 bytes .../themes/default/icons/flags/mp.png | Bin 0 -> 597 bytes .../themes/default/icons/flags/mq.png | Bin 0 -> 655 bytes .../themes/default/icons/flags/mr.png | Bin 0 -> 569 bytes .../themes/default/icons/flags/ms.png | Bin 0 -> 614 bytes .../themes/default/icons/flags/mt.png | Bin 0 -> 420 bytes .../themes/default/icons/flags/mu.png | Bin 0 -> 496 bytes .../themes/default/icons/flags/mv.png | Bin 0 -> 542 bytes .../themes/default/icons/flags/mw.png | Bin 0 -> 529 bytes .../themes/default/icons/flags/mx.png | Bin 0 -> 574 bytes .../themes/default/icons/flags/my.png | Bin 0 -> 571 bytes .../themes/default/icons/flags/mz.png | Bin 0 -> 584 bytes .../themes/default/icons/flags/na.png | Bin 0 -> 647 bytes .../themes/default/icons/flags/nc.png | Bin 0 -> 591 bytes .../themes/default/icons/flags/ne.png | Bin 0 -> 537 bytes .../themes/default/icons/flags/nf.png | Bin 0 -> 602 bytes .../themes/default/icons/flags/ng.png | Bin 0 -> 482 bytes .../themes/default/icons/flags/ni.png | Bin 0 -> 508 bytes .../themes/default/icons/flags/nl.png | Bin 0 -> 453 bytes .../themes/default/icons/flags/no.png | Bin 0 -> 512 bytes .../themes/default/icons/flags/np.png | Bin 0 -> 443 bytes .../themes/default/icons/flags/nr.png | Bin 0 -> 527 bytes .../themes/default/icons/flags/nu.png | Bin 0 -> 572 bytes .../themes/default/icons/flags/nz.png | Bin 0 -> 639 bytes .../themes/default/icons/flags/om.png | Bin 0 -> 478 bytes .../themes/default/icons/flags/pa.png | Bin 0 -> 519 bytes .../themes/default/icons/flags/pe.png | Bin 0 -> 397 bytes .../themes/default/icons/flags/pf.png | Bin 0 -> 498 bytes .../themes/default/icons/flags/pg.png | Bin 0 -> 593 bytes .../themes/default/icons/flags/ph.png | Bin 0 -> 538 bytes .../themes/default/icons/flags/pk.png | Bin 0 -> 569 bytes .../themes/default/icons/flags/pl.png | Bin 0 -> 374 bytes .../themes/default/icons/flags/pm.png | Bin 0 -> 689 bytes .../themes/default/icons/flags/pn.png | Bin 0 -> 657 bytes .../themes/default/icons/flags/pr.png | Bin 0 -> 556 bytes .../themes/default/icons/flags/ps.png | Bin 0 -> 472 bytes .../themes/default/icons/flags/pt.png | Bin 0 -> 554 bytes .../themes/default/icons/flags/pw.png | Bin 0 -> 550 bytes .../themes/default/icons/flags/py.png | Bin 0 -> 473 bytes .../themes/default/icons/flags/qa.png | Bin 0 -> 450 bytes .../themes/default/icons/flags/re.png | Bin 0 -> 545 bytes .../themes/default/icons/flags/ro.png | Bin 0 -> 495 bytes .../themes/default/icons/flags/rs.png | Bin 0 -> 423 bytes .../themes/default/icons/flags/ru.png | Bin 0 -> 420 bytes .../themes/default/icons/flags/rw.png | Bin 0 -> 533 bytes .../themes/default/icons/flags/sa.png | Bin 0 -> 551 bytes .../themes/default/icons/flags/sb.png | Bin 0 -> 624 bytes .../themes/default/icons/flags/sc.png | Bin 0 -> 608 bytes .../themes/default/icons/flags/scotland.png | Bin 0 -> 649 bytes .../themes/default/icons/flags/sd.png | Bin 0 -> 492 bytes .../themes/default/icons/flags/se.png | Bin 0 -> 542 bytes .../themes/default/icons/flags/sg.png | Bin 0 -> 468 bytes .../themes/default/icons/flags/sh.png | Bin 0 -> 645 bytes .../themes/default/icons/flags/si.png | Bin 0 -> 510 bytes .../themes/default/icons/flags/sj.png | Bin 0 -> 512 bytes .../themes/default/icons/flags/sk.png | Bin 0 -> 562 bytes .../themes/default/icons/flags/sl.png | Bin 0 -> 436 bytes .../themes/default/icons/flags/sm.png | Bin 0 -> 502 bytes .../themes/default/icons/flags/sn.png | Bin 0 -> 532 bytes .../themes/default/icons/flags/so.png | Bin 0 -> 527 bytes .../themes/default/icons/flags/sr.png | Bin 0 -> 513 bytes .../themes/default/icons/flags/st.png | Bin 0 -> 584 bytes .../themes/default/icons/flags/sv.png | Bin 0 -> 501 bytes .../themes/default/icons/flags/sy.png | Bin 0 -> 422 bytes .../themes/default/icons/flags/sz.png | Bin 0 -> 643 bytes .../themes/default/icons/flags/tc.png | Bin 0 -> 624 bytes .../themes/default/icons/flags/td.png | Bin 0 -> 570 bytes .../themes/default/icons/flags/tf.png | Bin 0 -> 527 bytes .../themes/default/icons/flags/tg.png | Bin 0 -> 562 bytes .../themes/default/icons/flags/th.png | Bin 0 -> 452 bytes .../themes/default/icons/flags/tj.png | Bin 0 -> 496 bytes .../themes/default/icons/flags/tk.png | Bin 0 -> 638 bytes .../themes/default/icons/flags/tl.png | Bin 0 -> 514 bytes .../themes/default/icons/flags/tm.png | Bin 0 -> 593 bytes .../themes/default/icons/flags/tn.png | Bin 0 -> 495 bytes .../themes/default/icons/flags/to.png | Bin 0 -> 426 bytes .../themes/default/icons/flags/tr.png | Bin 0 -> 492 bytes .../themes/default/icons/flags/tt.png | Bin 0 -> 617 bytes .../themes/default/icons/flags/tv.png | Bin 0 -> 536 bytes .../themes/default/icons/flags/tw.png | Bin 0 -> 465 bytes .../themes/default/icons/flags/tz.png | Bin 0 -> 642 bytes .../themes/default/icons/flags/ua.png | Bin 0 -> 446 bytes .../themes/default/icons/flags/ug.png | Bin 0 -> 531 bytes .../themes/default/icons/flags/um.png | Bin 0 -> 571 bytes .../themes/default/icons/flags/us.png | Bin 0 -> 609 bytes .../themes/default/icons/flags/uy.png | Bin 0 -> 532 bytes .../themes/default/icons/flags/uz.png | Bin 0 -> 515 bytes .../themes/default/icons/flags/va.png | Bin 0 -> 553 bytes .../themes/default/icons/flags/vc.png | Bin 0 -> 577 bytes .../themes/default/icons/flags/ve.png | Bin 0 -> 528 bytes .../themes/default/icons/flags/vg.png | Bin 0 -> 630 bytes .../themes/default/icons/flags/vi.png | Bin 0 -> 616 bytes .../themes/default/icons/flags/vn.png | Bin 0 -> 474 bytes .../themes/default/icons/flags/vu.png | Bin 0 -> 604 bytes .../themes/default/icons/flags/wales.png | Bin 0 -> 652 bytes .../themes/default/icons/flags/wf.png | Bin 0 -> 554 bytes .../themes/default/icons/flags/ws.png | Bin 0 -> 476 bytes .../themes/default/icons/flags/ye.png | Bin 0 -> 413 bytes .../themes/default/icons/flags/yt.png | Bin 0 -> 593 bytes .../themes/default/icons/flags/za.png | Bin 0 -> 642 bytes .../themes/default/icons/flags/zm.png | Bin 0 -> 500 bytes .../themes/default/icons/flags/zw.png | Bin 0 -> 574 bytes .../themes/default/icons/x12/accept.png | Bin 0 -> 3071 bytes .../themes/default/icons/x12/accept_blue.png | Bin 0 -> 3318 bytes .../themes/default/icons/x12/accept_green.png | Bin 0 -> 3144 bytes .../default/icons/x12/arrow_2_left_round.png | Bin 0 -> 3173 bytes .../default/icons/x12/arrow_2_right_round.png | Bin 0 -> 3289 bytes .../icons/x12/arrow_left_blue_round.png | Bin 0 -> 3302 bytes .../icons/x12/arrow_right_blue_round.png | Bin 0 -> 3306 bytes .../themes/default/icons/x12/article.png | Bin 0 -> 3023 bytes .../themes/default/icons/x12/article_text.png | Bin 0 -> 2962 bytes .../themes/default/icons/x12/bar_graph.png | Bin 0 -> 2959 bytes .../themes/default/icons/x12/burst.png | Bin 0 -> 3204 bytes .../themes/default/icons/x12/calendar.png | Bin 0 -> 2916 bytes .../themes/default/icons/x12/calendar2.png | Bin 0 -> 3029 bytes .../themes/default/icons/x12/cancel.png | Bin 0 -> 3055 bytes .../themes/default/icons/x12/cancel_round.png | Bin 0 -> 3285 bytes .../themes/default/icons/x12/clock.png | Bin 0 -> 3288 bytes .../themes/default/icons/x12/code.png | Bin 0 -> 3176 bytes .../themes/default/icons/x12/comment_blue.png | Bin 0 -> 3196 bytes .../themes/default/icons/x12/dollar.png | Bin 0 -> 2893 bytes .../default/icons/x12/double_comment.png | Bin 0 -> 3147 bytes .../themes/default/icons/x12/download.png | Bin 0 -> 3145 bytes .../themes/default/icons/x12/envelope.png | Bin 0 -> 2942 bytes .../themes/default/icons/x12/flag_black.png | Bin 0 -> 3244 bytes .../themes/default/icons/x12/flag_blue.png | Bin 0 -> 3245 bytes .../themes/default/icons/x12/flag_green.png | Bin 0 -> 3242 bytes .../themes/default/icons/x12/flag_orange.png | Bin 0 -> 3235 bytes .../themes/default/icons/x12/flag_red.png | Bin 0 -> 3260 bytes .../themes/default/icons/x12/flag_yellow.png | Bin 0 -> 3261 bytes .../themes/default/icons/x12/folder.png | Bin 0 -> 3049 bytes .../themes/default/icons/x12/info.png | Bin 0 -> 3298 bytes .../themes/default/icons/x12/link.png | Bin 0 -> 2956 bytes .../themes/default/icons/x12/lock.png | Bin 0 -> 3000 bytes .../themes/default/icons/x12/magnify.png | Bin 0 -> 3231 bytes .../themes/default/icons/x12/minus.png | Bin 0 -> 2877 bytes .../themes/default/icons/x12/minus_round.png | Bin 0 -> 3274 bytes .../themes/default/icons/x12/money.png | Bin 0 -> 3112 bytes .../themes/default/icons/x12/new.png | Bin 0 -> 2874 bytes .../themes/default/icons/x12/pencil.png | Bin 0 -> 3095 bytes .../themes/default/icons/x12/pictures.png | Bin 0 -> 3026 bytes .../themes/default/icons/x12/plus.png | Bin 0 -> 2944 bytes .../themes/default/icons/x12/printer.png | Bin 0 -> 3058 bytes .../default/icons/x12/question_blue.png | Bin 0 -> 3314 bytes .../themes/default/icons/x12/refresh.png | Bin 0 -> 3050 bytes .../themes/default/icons/x12/rss.png | Bin 0 -> 3053 bytes .../themes/default/icons/x12/rss_round.png | Bin 0 -> 3282 bytes .../default/icons/x12/security_green.png | Bin 0 -> 3049 bytes .../default/icons/x12/security_orange.png | Bin 0 -> 3020 bytes .../themes/default/icons/x12/security_red.png | Bin 0 -> 3026 bytes .../themes/default/icons/x12/star.png | Bin 0 -> 3263 bytes .../themes/default/icons/x12/star_blue.png | Bin 0 -> 3316 bytes .../themes/default/icons/x12/stop.png | Bin 0 -> 3072 bytes .../themes/default/icons/x12/stop_round.png | Bin 0 -> 3272 bytes .../themes/default/icons/x12/upload.png | Bin 0 -> 3090 bytes .../themes/default/icons/x12/world.png | Bin 0 -> 3324 bytes .../themes/default/icons/x12/world2.png | Bin 0 -> 3344 bytes .../themes/default/icons/x16-list/accept.png | Bin 0 -> 2989 bytes .../default/icons/x16-list/accept_blue.png | Bin 0 -> 3415 bytes .../default/icons/x16-list/accept_green.png | Bin 0 -> 3264 bytes .../icons/x16-list/arrow_2_left_round.png | Bin 0 -> 3332 bytes .../icons/x16-list/arrow_2_right_round.png | Bin 0 -> 3333 bytes .../icons/x16-list/arrow_left_blue_round.png | Bin 0 -> 3375 bytes .../icons/x16-list/arrow_right_blue_round.png | Bin 0 -> 3375 bytes .../themes/default/icons/x16-list/article.png | Bin 0 -> 3094 bytes .../default/icons/x16-list/article_text.png | Bin 0 -> 3129 bytes .../default/icons/x16-list/bar_graph.png | Bin 0 -> 2994 bytes .../themes/default/icons/x16-list/burst.png | Bin 0 -> 3280 bytes .../default/icons/x16-list/calendar.png | Bin 0 -> 3124 bytes .../default/icons/x16-list/calendar2.png | Bin 0 -> 3081 bytes .../themes/default/icons/x16-list/cancel.png | Bin 0 -> 3073 bytes .../default/icons/x16-list/cancel_round.png | Bin 0 -> 3434 bytes .../themes/default/icons/x16-list/clock.png | Bin 0 -> 3351 bytes .../themes/default/icons/x16-list/code.png | Bin 0 -> 3333 bytes .../default/icons/x16-list/comment_blue.png | Bin 0 -> 3193 bytes .../themes/default/icons/x16-list/dollar.png | Bin 0 -> 2898 bytes .../default/icons/x16-list/double_comment.png | Bin 0 -> 3184 bytes .../default/icons/x16-list/download.png | Bin 0 -> 3123 bytes .../default/icons/x16-list/envelope.png | Bin 0 -> 3077 bytes .../default/icons/x16-list/flag_black.png | Bin 0 -> 3411 bytes .../default/icons/x16-list/flag_blue.png | Bin 0 -> 3443 bytes .../default/icons/x16-list/flag_green.png | Bin 0 -> 3451 bytes .../default/icons/x16-list/flag_orange.png | Bin 0 -> 3423 bytes .../default/icons/x16-list/flag_red.png | Bin 0 -> 3469 bytes .../default/icons/x16-list/flag_yellow.png | Bin 0 -> 3338 bytes .../themes/default/icons/x16-list/folder.png | Bin 0 -> 3117 bytes .../themes/default/icons/x16-list/info.png | Bin 0 -> 3355 bytes .../themes/default/icons/x16-list/link.png | Bin 0 -> 3060 bytes .../themes/default/icons/x16-list/lock.png | Bin 0 -> 3051 bytes .../themes/default/icons/x16-list/magnify.png | Bin 0 -> 3255 bytes .../themes/default/icons/x16-list/minus.png | Bin 0 -> 2883 bytes .../default/icons/x16-list/minus_round.png | Bin 0 -> 3269 bytes .../themes/default/icons/x16-list/money.png | Bin 0 -> 3228 bytes .../themes/default/icons/x16-list/new.png | Bin 0 -> 2975 bytes .../themes/default/icons/x16-list/pencil.png | Bin 0 -> 2996 bytes .../default/icons/x16-list/pictures.png | Bin 0 -> 3088 bytes .../themes/default/icons/x16-list/plus.png | Bin 0 -> 2963 bytes .../themes/default/icons/x16-list/printer.png | Bin 0 -> 3107 bytes .../default/icons/x16-list/question_blue.png | Bin 0 -> 3402 bytes .../themes/default/icons/x16-list/refresh.png | Bin 0 -> 2954 bytes .../themes/default/icons/x16-list/rss.png | Bin 0 -> 3072 bytes .../default/icons/x16-list/rss_round.png | Bin 0 -> 3352 bytes .../default/icons/x16-list/security_green.png | Bin 0 -> 3017 bytes .../icons/x16-list/security_orange.png | Bin 0 -> 3041 bytes .../default/icons/x16-list/security_red.png | Bin 0 -> 3058 bytes .../themes/default/icons/x16-list/star.png | Bin 0 -> 3323 bytes .../default/icons/x16-list/star_blue.png | Bin 0 -> 3414 bytes .../themes/default/icons/x16-list/stop.png | Bin 0 -> 3176 bytes .../default/icons/x16-list/stop_round.png | Bin 0 -> 3364 bytes .../themes/default/icons/x16-list/upload.png | Bin 0 -> 3129 bytes .../themes/default/icons/x16-list/world.png | Bin 0 -> 3435 bytes .../themes/default/icons/x16-list/world2.png | Bin 0 -> 3604 bytes .../themes/default/icons/x16/address_book.png | Bin 0 -> 712 bytes .../default/icons/x16/address_book__arrow.png | Bin 0 -> 772 bytes .../icons/x16/address_book__exclamation.png | Bin 0 -> 792 bytes .../default/icons/x16/address_book__minus.png | Bin 0 -> 735 bytes .../icons/x16/address_book__pencil.png | Bin 0 -> 799 bytes .../default/icons/x16/address_book__plus.png | Bin 0 -> 765 bytes .../default/icons/x16/address_book_blue.png | Bin 0 -> 708 bytes .../themes/default/icons/x16/arrow.png | Bin 0 -> 590 bytes .../default/icons/x16/arrow_000_small.png | Bin 0 -> 341 bytes .../themes/default/icons/x16/arrow_045.png | Bin 0 -> 585 bytes .../default/icons/x16/arrow_045_small.png | Bin 0 -> 336 bytes .../themes/default/icons/x16/arrow_090.png | Bin 0 -> 619 bytes .../default/icons/x16/arrow_090_small.png | Bin 0 -> 337 bytes .../themes/default/icons/x16/arrow_135.png | Bin 0 -> 592 bytes .../default/icons/x16/arrow_135_small.png | Bin 0 -> 336 bytes .../themes/default/icons/x16/arrow_180.png | Bin 0 -> 590 bytes .../default/icons/x16/arrow_180_small.png | Bin 0 -> 345 bytes .../themes/default/icons/x16/arrow_225.png | Bin 0 -> 605 bytes .../default/icons/x16/arrow_225_small.png | Bin 0 -> 338 bytes .../themes/default/icons/x16/arrow_270.png | Bin 0 -> 621 bytes .../default/icons/x16/arrow_270_small.png | Bin 0 -> 342 bytes .../themes/default/icons/x16/arrow_315.png | Bin 0 -> 600 bytes .../default/icons/x16/arrow_315_small.png | Bin 0 -> 337 bytes .../themes/default/icons/x16/arrow_circle.png | Bin 0 -> 799 bytes .../default/icons/x16/arrow_circle_135.png | Bin 0 -> 848 bytes .../default/icons/x16/arrow_circle_225.png | Bin 0 -> 830 bytes .../default/icons/x16/arrow_circle_315.png | Bin 0 -> 830 bytes .../default/icons/x16/arrow_circle_double.png | Bin 0 -> 832 bytes .../icons/x16/arrow_circle_double_135.png | Bin 0 -> 836 bytes .../themes/default/icons/x16/arrow_skip.png | Bin 0 -> 602 bytes .../default/icons/x16/arrow_skip_090.png | Bin 0 -> 619 bytes .../default/icons/x16/arrow_skip_180.png | Bin 0 -> 619 bytes .../default/icons/x16/arrow_skip_270.png | Bin 0 -> 613 bytes .../themes/default/icons/x16/arrow_stop.png | Bin 0 -> 661 bytes .../default/icons/x16/arrow_stop_090.png | Bin 0 -> 629 bytes .../default/icons/x16/arrow_stop_180.png | Bin 0 -> 656 bytes .../default/icons/x16/arrow_stop_270.png | Bin 0 -> 654 bytes .../default/icons/x16/auction_hammer.png | Bin 0 -> 707 bytes .../icons/x16/auction_hammer__arrow.png | Bin 0 -> 833 bytes .../icons/x16/auction_hammer__exclamation.png | Bin 0 -> 811 bytes .../icons/x16/auction_hammer__minus.png | Bin 0 -> 735 bytes .../icons/x16/auction_hammer__pencil.png | Bin 0 -> 796 bytes .../icons/x16/auction_hammer__plus.png | Bin 0 -> 783 bytes .../icons/x16/auction_hammer_gavel.png | Bin 0 -> 757 bytes .../themes/default/icons/x16/balloon.png | Bin 0 -> 670 bytes .../default/icons/x16/balloon__arrow.png | Bin 0 -> 772 bytes .../icons/x16/balloon__exclamation.png | Bin 0 -> 781 bytes .../default/icons/x16/balloon__minus.png | Bin 0 -> 706 bytes .../default/icons/x16/balloon__pencil.png | Bin 0 -> 780 bytes .../default/icons/x16/balloon__plus.png | Bin 0 -> 746 bytes .../themes/default/icons/x16/balloon_left.png | Bin 0 -> 670 bytes .../default/icons/x16/balloon_small.png | Bin 0 -> 426 bytes .../default/icons/x16/balloon_small_left.png | Bin 0 -> 433 bytes .../themes/default/icons/x16/balloons.png | Bin 0 -> 711 bytes .../default/icons/x16/balloons_arrow.png | Bin 0 -> 833 bytes .../icons/x16/balloons_exclamation.png | Bin 0 -> 851 bytes .../default/icons/x16/balloons_minus.png | Bin 0 -> 749 bytes .../default/icons/x16/balloons_pencil.png | Bin 0 -> 840 bytes .../default/icons/x16/balloons_plus.png | Bin 0 -> 811 bytes .../themes/default/icons/x16/bandaid.png | Bin 0 -> 778 bytes .../default/icons/x16/bandaid_arrow.png | Bin 0 -> 877 bytes .../default/icons/x16/bandaid_exclamation.png | Bin 0 -> 860 bytes .../default/icons/x16/bandaid_minus.png | Bin 0 -> 789 bytes .../default/icons/x16/bandaid_pencil.png | Bin 0 -> 851 bytes .../themes/default/icons/x16/bandaid_plus.png | Bin 0 -> 845 bytes .../default/icons/x16/bandaid_small.png | Bin 0 -> 435 bytes .../themes/default/icons/x16/bank.png | Bin 0 -> 664 bytes .../themes/default/icons/x16/bank_arrow.png | Bin 0 -> 781 bytes .../default/icons/x16/bank_exclamation.png | Bin 0 -> 835 bytes .../themes/default/icons/x16/bank_minus.png | Bin 0 -> 711 bytes .../themes/default/icons/x16/bank_pencil.png | Bin 0 -> 799 bytes .../themes/default/icons/x16/bank_plus.png | Bin 0 -> 762 bytes .../themes/default/icons/x16/bell.png | Bin 0 -> 741 bytes .../themes/default/icons/x16/bell__arrow.png | Bin 0 -> 855 bytes .../default/icons/x16/bell__exclamation.png | Bin 0 -> 844 bytes .../themes/default/icons/x16/bell__minus.png | Bin 0 -> 780 bytes .../themes/default/icons/x16/bell__pencil.png | Bin 0 -> 862 bytes .../themes/default/icons/x16/bell__plus.png | Bin 0 -> 826 bytes .../themes/default/icons/x16/bell_disable.png | Bin 0 -> 591 bytes .../themes/default/icons/x16/bin.png | Bin 0 -> 697 bytes .../themes/default/icons/x16/bin__arrow.png | Bin 0 -> 788 bytes .../default/icons/x16/bin__exclamation.png | Bin 0 -> 791 bytes .../themes/default/icons/x16/bin__minus.png | Bin 0 -> 739 bytes .../themes/default/icons/x16/bin__pencil.png | Bin 0 -> 837 bytes .../themes/default/icons/x16/bin__plus.png | Bin 0 -> 773 bytes .../themes/default/icons/x16/bin_full.png | Bin 0 -> 850 bytes .../themes/default/icons/x16/binocular.png | Bin 0 -> 516 bytes .../default/icons/x16/binocular_arrow.png | Bin 0 -> 693 bytes .../icons/x16/binocular_exclamation.png | Bin 0 -> 697 bytes .../default/icons/x16/binocular_minus.png | Bin 0 -> 599 bytes .../default/icons/x16/binocular_pencil.png | Bin 0 -> 690 bytes .../default/icons/x16/binocular_plus.png | Bin 0 -> 655 bytes .../themes/default/icons/x16/blog.png | Bin 0 -> 539 bytes .../themes/default/icons/x16/blog__arrow.png | Bin 0 -> 661 bytes .../default/icons/x16/blog__exclamation.png | Bin 0 -> 694 bytes .../themes/default/icons/x16/blog__minus.png | Bin 0 -> 596 bytes .../themes/default/icons/x16/blog__pencil.png | Bin 0 -> 708 bytes .../themes/default/icons/x16/blog__plus.png | Bin 0 -> 644 bytes .../themes/default/icons/x16/blog_blue.png | Bin 0 -> 534 bytes .../themes/default/icons/x16/blogs.png | Bin 0 -> 609 bytes .../themes/default/icons/x16/blogs_arrow.png | Bin 0 -> 706 bytes .../default/icons/x16/blogs_exclamation.png | Bin 0 -> 728 bytes .../themes/default/icons/x16/blogs_minus.png | Bin 0 -> 640 bytes .../themes/default/icons/x16/blogs_pencil.png | Bin 0 -> 726 bytes .../themes/default/icons/x16/blogs_plus.png | Bin 0 -> 686 bytes .../themes/default/icons/x16/blogs_stack.png | Bin 0 -> 603 bytes .../themes/default/icons/x16/book.png | Bin 0 -> 430 bytes .../themes/default/icons/x16/book__arrow.png | Bin 0 -> 569 bytes .../default/icons/x16/book__exclamation.png | Bin 0 -> 631 bytes .../themes/default/icons/x16/book__minus.png | Bin 0 -> 514 bytes .../themes/default/icons/x16/book__pencil.png | Bin 0 -> 635 bytes .../themes/default/icons/x16/book__plus.png | Bin 0 -> 537 bytes .../themes/default/icons/x16/book_brown.png | Bin 0 -> 416 bytes .../themes/default/icons/x16/book_small.png | Bin 0 -> 314 bytes .../default/icons/x16/book_small_brown.png | Bin 0 -> 301 bytes .../themes/default/icons/x16/bookmark.png | Bin 0 -> 634 bytes .../default/icons/x16/bookmark__arrow.png | Bin 0 -> 749 bytes .../icons/x16/bookmark__exclamation.png | Bin 0 -> 768 bytes .../default/icons/x16/bookmark__minus.png | Bin 0 -> 659 bytes .../default/icons/x16/bookmark__pencil.png | Bin 0 -> 745 bytes .../default/icons/x16/bookmark__plus.png | Bin 0 -> 720 bytes .../default/icons/x16/bookmark__small.png | Bin 0 -> 359 bytes .../default/icons/x16/bookmark_book.png | Bin 0 -> 564 bytes .../default/icons/x16/bookmark_book_arrow.png | Bin 0 -> 664 bytes .../icons/x16/bookmark_book_exclamation.png | Bin 0 -> 701 bytes .../default/icons/x16/bookmark_book_minus.png | Bin 0 -> 626 bytes .../icons/x16/bookmark_book_pencil.png | Bin 0 -> 723 bytes .../default/icons/x16/bookmark_book_plus.png | Bin 0 -> 651 bytes .../default/icons/x16/bookmark_document.png | Bin 0 -> 633 bytes .../icons/x16/bookmark_document_arrow.png | Bin 0 -> 721 bytes .../x16/bookmark_document_exclamation.png | Bin 0 -> 748 bytes .../icons/x16/bookmark_document_minus.png | Bin 0 -> 665 bytes .../icons/x16/bookmark_document_pencil.png | Bin 0 -> 775 bytes .../icons/x16/bookmark_document_plus.png | Bin 0 -> 706 bytes .../default/icons/x16/bookmark_folder.png | Bin 0 -> 636 bytes .../icons/x16/bookmark_folder_arrow.png | Bin 0 -> 759 bytes .../icons/x16/bookmark_folder_exclamation.png | Bin 0 -> 783 bytes .../icons/x16/bookmark_folder_minus.png | Bin 0 -> 693 bytes .../icons/x16/bookmark_folder_pencil.png | Bin 0 -> 779 bytes .../icons/x16/bookmark_folder_plus.png | Bin 0 -> 740 bytes .../themes/default/icons/x16/books.png | Bin 0 -> 534 bytes .../themes/default/icons/x16/books__arrow.png | Bin 0 -> 651 bytes .../default/icons/x16/books__exclamation.png | Bin 0 -> 692 bytes .../themes/default/icons/x16/books__minus.png | Bin 0 -> 586 bytes .../default/icons/x16/books__pencil.png | Bin 0 -> 681 bytes .../themes/default/icons/x16/books__plus.png | Bin 0 -> 625 bytes .../themes/default/icons/x16/books_brown.png | Bin 0 -> 537 bytes .../themes/default/icons/x16/books_stack.png | Bin 0 -> 495 bytes .../themes/default/icons/x16/box.png | Bin 0 -> 524 bytes .../themes/default/icons/x16/box__arrow.png | Bin 0 -> 656 bytes .../default/icons/x16/box__exclamation.png | Bin 0 -> 696 bytes .../themes/default/icons/x16/box__minus.png | Bin 0 -> 554 bytes .../themes/default/icons/x16/box__pencil.png | Bin 0 -> 677 bytes .../themes/default/icons/x16/box__plus.png | Bin 0 -> 634 bytes .../themes/default/icons/x16/box_label.png | Bin 0 -> 576 bytes .../themes/default/icons/x16/briefcase.png | Bin 0 -> 554 bytes .../default/icons/x16/briefcase_arrow.png | Bin 0 -> 674 bytes .../icons/x16/briefcase_exclamation.png | Bin 0 -> 713 bytes .../default/icons/x16/briefcase_minus.png | Bin 0 -> 599 bytes .../default/icons/x16/briefcase_pencil.png | Bin 0 -> 686 bytes .../default/icons/x16/briefcase_plus.png | Bin 0 -> 648 bytes .../themes/default/icons/x16/broom.png | Bin 0 -> 782 bytes .../themes/default/icons/x16/broom_arrow.png | Bin 0 -> 869 bytes .../default/icons/x16/broom_exclamation.png | Bin 0 -> 870 bytes .../themes/default/icons/x16/broom_minus.png | Bin 0 -> 799 bytes .../themes/default/icons/x16/broom_pencil.png | Bin 0 -> 892 bytes .../themes/default/icons/x16/broom_plus.png | Bin 0 -> 856 bytes .../themes/default/icons/x16/calculator.png | Bin 0 -> 454 bytes .../default/icons/x16/calculator_arrow.png | Bin 0 -> 625 bytes .../icons/x16/calculator_exclamation.png | Bin 0 -> 641 bytes .../default/icons/x16/calculator_minus.png | Bin 0 -> 543 bytes .../default/icons/x16/calculator_pencil.png | Bin 0 -> 647 bytes .../default/icons/x16/calculator_plus.png | Bin 0 -> 594 bytes .../themes/default/icons/x16/calendar.png | Bin 0 -> 488 bytes .../default/icons/x16/calendar__arrow.png | Bin 0 -> 632 bytes .../icons/x16/calendar__exclamation.png | Bin 0 -> 673 bytes .../default/icons/x16/calendar__minus.png | Bin 0 -> 539 bytes .../default/icons/x16/calendar__pencil.png | Bin 0 -> 661 bytes .../default/icons/x16/calendar__plus.png | Bin 0 -> 612 bytes .../themes/default/icons/x16/calendar_day.png | Bin 0 -> 620 bytes .../default/icons/x16/calendar_month.png | Bin 0 -> 590 bytes .../themes/default/icons/x16/camera.png | Bin 0 -> 649 bytes .../default/icons/x16/camera__arrow.png | Bin 0 -> 748 bytes .../default/icons/x16/camera__exclamation.png | Bin 0 -> 778 bytes .../default/icons/x16/camera__minus.png | Bin 0 -> 664 bytes .../default/icons/x16/camera__pencil.png | Bin 0 -> 737 bytes .../themes/default/icons/x16/camera__plus.png | Bin 0 -> 748 bytes .../themes/default/icons/x16/camera_black.png | Bin 0 -> 602 bytes .../themes/default/icons/x16/camera_small.png | Bin 0 -> 401 bytes .../default/icons/x16/camera_small_black.png | Bin 0 -> 351 bytes .../themes/default/icons/x16/card.png | Bin 0 -> 371 bytes .../themes/default/icons/x16/card__arrow.png | Bin 0 -> 558 bytes .../default/icons/x16/card__exclamation.png | Bin 0 -> 590 bytes .../themes/default/icons/x16/card__minus.png | Bin 0 -> 419 bytes .../themes/default/icons/x16/card__pencil.png | Bin 0 -> 574 bytes .../themes/default/icons/x16/card__plus.png | Bin 0 -> 518 bytes .../themes/default/icons/x16/card_address.png | Bin 0 -> 578 bytes .../themes/default/icons/x16/card_small.png | Bin 0 -> 298 bytes .../themes/default/icons/x16/cards.png | Bin 0 -> 478 bytes .../themes/default/icons/x16/cards__arrow.png | Bin 0 -> 643 bytes .../default/icons/x16/cards__exclamation.png | Bin 0 -> 690 bytes .../themes/default/icons/x16/cards__minus.png | Bin 0 -> 535 bytes .../default/icons/x16/cards__pencil.png | Bin 0 -> 675 bytes .../themes/default/icons/x16/cards__plus.png | Bin 0 -> 621 bytes .../default/icons/x16/cards_address.png | Bin 0 -> 668 bytes .../themes/default/icons/x16/cards_stack.png | Bin 0 -> 470 bytes .../themes/default/icons/x16/cassette.png | Bin 0 -> 447 bytes .../default/icons/x16/cassette_arrow.png | Bin 0 -> 584 bytes .../icons/x16/cassette_exclamation.png | Bin 0 -> 625 bytes .../default/icons/x16/cassette_minus.png | Bin 0 -> 467 bytes .../default/icons/x16/cassette_pencil.png | Bin 0 -> 593 bytes .../default/icons/x16/cassette_plus.png | Bin 0 -> 558 bytes .../default/icons/x16/cassette_small.png | Bin 0 -> 285 bytes .../themes/default/icons/x16/chain.png | Bin 0 -> 437 bytes .../themes/default/icons/x16/chain_arrow.png | Bin 0 -> 622 bytes .../default/icons/x16/chain_exclamation.png | Bin 0 -> 707 bytes .../themes/default/icons/x16/chain_minus.png | Bin 0 -> 490 bytes .../themes/default/icons/x16/chain_pencil.png | Bin 0 -> 624 bytes .../themes/default/icons/x16/chain_plus.png | Bin 0 -> 591 bytes .../themes/default/icons/x16/chain_small.png | Bin 0 -> 305 bytes .../default/icons/x16/chain_unchain.png | Bin 0 -> 722 bytes .../themes/default/icons/x16/clipboard.png | Bin 0 -> 505 bytes .../default/icons/x16/clipboard__arrow.png | Bin 0 -> 629 bytes .../icons/x16/clipboard__exclamation.png | Bin 0 -> 684 bytes .../default/icons/x16/clipboard__minus.png | Bin 0 -> 572 bytes .../default/icons/x16/clipboard__pencil.png | Bin 0 -> 683 bytes .../default/icons/x16/clipboard__plus.png | Bin 0 -> 608 bytes .../default/icons/x16/clipboard_empty.png | Bin 0 -> 521 bytes .../default/icons/x16/clipboard_text.png | Bin 0 -> 573 bytes .../themes/default/icons/x16/clock.png | Bin 0 -> 712 bytes .../themes/default/icons/x16/clock__arrow.png | Bin 0 -> 781 bytes .../default/icons/x16/clock__exclamation.png | Bin 0 -> 814 bytes .../themes/default/icons/x16/clock__minus.png | Bin 0 -> 731 bytes .../default/icons/x16/clock__pencil.png | Bin 0 -> 799 bytes .../themes/default/icons/x16/clock__plus.png | Bin 0 -> 759 bytes .../themes/default/icons/x16/clock_fill.png | Bin 0 -> 731 bytes .../themes/default/icons/x16/clock_frame.png | Bin 0 -> 862 bytes .../themes/default/icons/x16/clock_small.png | Bin 0 -> 387 bytes .../themes/default/icons/x16/color.png | Bin 0 -> 791 bytes .../themes/default/icons/x16/color_arrow.png | Bin 0 -> 839 bytes .../default/icons/x16/color_exclamation.png | Bin 0 -> 854 bytes .../themes/default/icons/x16/color_minus.png | Bin 0 -> 798 bytes .../themes/default/icons/x16/color_pencil.png | Bin 0 -> 892 bytes .../themes/default/icons/x16/color_plus.png | Bin 0 -> 823 bytes .../themes/default/icons/x16/color_small.png | Bin 0 -> 477 bytes .../themes/default/icons/x16/contrast.png | Bin 0 -> 672 bytes .../default/icons/x16/contrast__arrow.png | Bin 0 -> 750 bytes .../icons/x16/contrast__exclamation.png | Bin 0 -> 784 bytes .../default/icons/x16/contrast__minus.png | Bin 0 -> 692 bytes .../default/icons/x16/contrast__pencil.png | Bin 0 -> 786 bytes .../default/icons/x16/contrast__plus.png | Bin 0 -> 735 bytes .../themes/default/icons/x16/contrast_low.png | Bin 0 -> 678 bytes .../default/icons/x16/contrast_small.png | Bin 0 -> 391 bytes .../default/icons/x16/contrast_small_low.png | Bin 0 -> 392 bytes .../themes/default/icons/x16/cross.png | Bin 0 -> 540 bytes .../themes/default/icons/x16/cross_circle.png | Bin 0 -> 721 bytes .../default/icons/x16/cross_circle_frame.png | Bin 0 -> 893 bytes .../themes/default/icons/x16/cross_shield.png | Bin 0 -> 768 bytes .../themes/default/icons/x16/cross_small.png | Bin 0 -> 296 bytes .../default/icons/x16/cross_small_circle.png | Bin 0 -> 333 bytes .../themes/default/icons/x16/crown.png | Bin 0 -> 708 bytes .../themes/default/icons/x16/crown__arrow.png | Bin 0 -> 776 bytes .../default/icons/x16/crown__exclamation.png | Bin 0 -> 770 bytes .../themes/default/icons/x16/crown__minus.png | Bin 0 -> 719 bytes .../default/icons/x16/crown__pencil.png | Bin 0 -> 807 bytes .../themes/default/icons/x16/crown__plus.png | Bin 0 -> 758 bytes .../themes/default/icons/x16/crown_bronze.png | Bin 0 -> 708 bytes .../themes/default/icons/x16/crown_silver.png | Bin 0 -> 672 bytes .../themes/default/icons/x16/database.png | Bin 0 -> 463 bytes .../default/icons/x16/database_arrow.png | Bin 0 -> 630 bytes .../icons/x16/database_exclamation.png | Bin 0 -> 665 bytes .../default/icons/x16/database_minus.png | Bin 0 -> 531 bytes .../default/icons/x16/database_pencil.png | Bin 0 -> 675 bytes .../default/icons/x16/database_plus.png | Bin 0 -> 607 bytes .../default/icons/x16/database_small.png | Bin 0 -> 371 bytes .../themes/default/icons/x16/databases.png | Bin 0 -> 595 bytes .../default/icons/x16/databases_arrow.png | Bin 0 -> 700 bytes .../icons/x16/databases_exclamation.png | Bin 0 -> 748 bytes .../default/icons/x16/databases_minus.png | Bin 0 -> 627 bytes .../default/icons/x16/databases_pencil.png | Bin 0 -> 733 bytes .../default/icons/x16/databases_plus.png | Bin 0 -> 684 bytes .../themes/default/icons/x16/disc.png | Bin 0 -> 824 bytes .../themes/default/icons/x16/disc_arrow.png | Bin 0 -> 862 bytes .../default/icons/x16/disc_exclamation.png | Bin 0 -> 882 bytes .../themes/default/icons/x16/disc_minus.png | Bin 0 -> 829 bytes .../themes/default/icons/x16/disc_pencil.png | Bin 0 -> 888 bytes .../themes/default/icons/x16/disc_plus.png | Bin 0 -> 853 bytes .../themes/default/icons/x16/disc_small.png | Bin 0 -> 477 bytes .../themes/default/icons/x16/discs.png | Bin 0 -> 868 bytes .../themes/default/icons/x16/discs_arrow.png | Bin 0 -> 933 bytes .../default/icons/x16/discs_exclamation.png | Bin 0 -> 951 bytes .../themes/default/icons/x16/discs_minus.png | Bin 0 -> 878 bytes .../themes/default/icons/x16/discs_pencil.png | Bin 0 -> 908 bytes .../themes/default/icons/x16/discs_plus.png | Bin 0 -> 917 bytes .../themes/default/icons/x16/disk.png | Bin 0 -> 507 bytes .../themes/default/icons/x16/disk__arrow.png | Bin 0 -> 655 bytes .../default/icons/x16/disk__exclamation.png | Bin 0 -> 722 bytes .../themes/default/icons/x16/disk__minus.png | Bin 0 -> 576 bytes .../themes/default/icons/x16/disk__pencil.png | Bin 0 -> 680 bytes .../themes/default/icons/x16/disk__plus.png | Bin 0 -> 646 bytes .../themes/default/icons/x16/disk_black.png | Bin 0 -> 436 bytes .../themes/default/icons/x16/disk_small.png | Bin 0 -> 380 bytes .../default/icons/x16/disk_small_black.png | Bin 0 -> 350 bytes .../themes/default/icons/x16/disks.png | Bin 0 -> 622 bytes .../themes/default/icons/x16/disks__arrow.png | Bin 0 -> 731 bytes .../default/icons/x16/disks__exclamation.png | Bin 0 -> 731 bytes .../themes/default/icons/x16/disks__minus.png | Bin 0 -> 669 bytes .../default/icons/x16/disks__pencil.png | Bin 0 -> 713 bytes .../themes/default/icons/x16/disks__plus.png | Bin 0 -> 718 bytes .../themes/default/icons/x16/disks_black.png | Bin 0 -> 524 bytes .../themes/default/icons/x16/document.png | Bin 0 -> 495 bytes .../default/icons/x16/document__arrow.png | Bin 0 -> 645 bytes .../icons/x16/document__exclamation.png | Bin 0 -> 663 bytes .../default/icons/x16/document__minus.png | Bin 0 -> 554 bytes .../default/icons/x16/document__pencil.png | Bin 0 -> 684 bytes .../default/icons/x16/document__plus.png | Bin 0 -> 607 bytes .../default/icons/x16/document_horizontal.png | Bin 0 -> 435 bytes .../icons/x16/document_horizontal_text.png | Bin 0 -> 535 bytes .../default/icons/x16/document_music.png | Bin 0 -> 628 bytes .../icons/x16/document_music_playlist.png | Bin 0 -> 658 bytes .../default/icons/x16/document_shred.png | Bin 0 -> 634 bytes .../default/icons/x16/document_small.png | Bin 0 -> 356 bytes .../default/icons/x16/document_text.png | Bin 0 -> 590 bytes .../default/icons/x16/document_text_image.png | Bin 0 -> 646 bytes .../default/icons/x16/document_zipper.png | Bin 0 -> 643 bytes .../themes/default/icons/x16/documents.png | Bin 0 -> 600 bytes .../default/icons/x16/documents_arrow.png | Bin 0 -> 700 bytes .../icons/x16/documents_exclamation.png | Bin 0 -> 717 bytes .../default/icons/x16/documents_minus.png | Bin 0 -> 629 bytes .../default/icons/x16/documents_pencil.png | Bin 0 -> 724 bytes .../default/icons/x16/documents_plus.png | Bin 0 -> 683 bytes .../default/icons/x16/documents_stack.png | Bin 0 -> 592 bytes .../default/icons/x16/documents_text.png | Bin 0 -> 674 bytes .../themes/default/icons/x16/door.png | Bin 0 -> 503 bytes .../themes/default/icons/x16/door_arrow.png | Bin 0 -> 644 bytes .../default/icons/x16/door_exclamation.png | Bin 0 -> 650 bytes .../themes/default/icons/x16/door_minus.png | Bin 0 -> 573 bytes .../themes/default/icons/x16/door_pencil.png | Bin 0 -> 681 bytes .../themes/default/icons/x16/door_plus.png | Bin 0 -> 607 bytes .../themes/default/icons/x16/drawer.png | Bin 0 -> 650 bytes .../themes/default/icons/x16/drawer_arrow.png | Bin 0 -> 751 bytes .../default/icons/x16/drawer_exclamation.png | Bin 0 -> 756 bytes .../themes/default/icons/x16/drawer_minus.png | Bin 0 -> 682 bytes .../default/icons/x16/drawer_pencil.png | Bin 0 -> 767 bytes .../themes/default/icons/x16/drawer_plus.png | Bin 0 -> 727 bytes .../themes/default/icons/x16/drill.png | Bin 0 -> 729 bytes .../themes/default/icons/x16/drill_arrow.png | Bin 0 -> 846 bytes .../default/icons/x16/drill_exclamation.png | Bin 0 -> 901 bytes .../themes/default/icons/x16/drill_minus.png | Bin 0 -> 758 bytes .../themes/default/icons/x16/drill_pencil.png | Bin 0 -> 817 bytes .../themes/default/icons/x16/drill_plus.png | Bin 0 -> 818 bytes .../themes/default/icons/x16/envelope.png | Bin 0 -> 477 bytes .../default/icons/x16/envelope_arrow.png | Bin 0 -> 609 bytes .../icons/x16/envelope_exclamation.png | Bin 0 -> 633 bytes .../default/icons/x16/envelope_minus.png | Bin 0 -> 533 bytes .../default/icons/x16/envelope_pencil.png | Bin 0 -> 658 bytes .../default/icons/x16/envelope_plus.png | Bin 0 -> 585 bytes .../themes/default/icons/x16/equalizer.png | Bin 0 -> 466 bytes .../default/icons/x16/equalizer_arrow.png | Bin 0 -> 621 bytes .../icons/x16/equalizer_exclamation.png | Bin 0 -> 648 bytes .../default/icons/x16/equalizer_minus.png | Bin 0 -> 507 bytes .../default/icons/x16/equalizer_pencil.png | Bin 0 -> 629 bytes .../default/icons/x16/equalizer_plus.png | Bin 0 -> 602 bytes .../themes/default/icons/x16/eraser.png | Bin 0 -> 674 bytes .../themes/default/icons/x16/eraser_arrow.png | Bin 0 -> 762 bytes .../default/icons/x16/eraser_exclamation.png | Bin 0 -> 785 bytes .../themes/default/icons/x16/eraser_minus.png | Bin 0 -> 699 bytes .../default/icons/x16/eraser_pencil.png | Bin 0 -> 831 bytes .../themes/default/icons/x16/eraser_plus.png | Bin 0 -> 746 bytes .../themes/default/icons/x16/exclamation.png | Bin 0 -> 622 bytes .../default/icons/x16/exclamation_frame.png | Bin 0 -> 626 bytes .../default/icons/x16/exclamation_shield.png | Bin 0 -> 784 bytes .../default/icons/x16/exclamation_small.png | Bin 0 -> 380 bytes .../themes/default/icons/x16/feed.png | Bin 0 -> 688 bytes .../themes/default/icons/x16/feed__arrow.png | Bin 0 -> 754 bytes .../default/icons/x16/feed__exclamation.png | Bin 0 -> 761 bytes .../themes/default/icons/x16/feed__minus.png | Bin 0 -> 710 bytes .../themes/default/icons/x16/feed__pencil.png | Bin 0 -> 792 bytes .../themes/default/icons/x16/feed__plus.png | Bin 0 -> 737 bytes .../themes/default/icons/x16/feed_balloon.png | Bin 0 -> 724 bytes .../themes/default/icons/x16/feed_small.png | Bin 0 -> 425 bytes .../themes/default/icons/x16/film.png | Bin 0 -> 667 bytes .../themes/default/icons/x16/film_arrow.png | Bin 0 -> 764 bytes .../default/icons/x16/film_exclamation.png | Bin 0 -> 791 bytes .../themes/default/icons/x16/film_minus.png | Bin 0 -> 717 bytes .../themes/default/icons/x16/film_pencil.png | Bin 0 -> 770 bytes .../themes/default/icons/x16/film_plus.png | Bin 0 -> 736 bytes .../themes/default/icons/x16/film_small.png | Bin 0 -> 389 bytes .../themes/default/icons/x16/films.png | Bin 0 -> 741 bytes .../themes/default/icons/x16/films_arrow.png | Bin 0 -> 828 bytes .../default/icons/x16/films_exclamation.png | Bin 0 -> 841 bytes .../themes/default/icons/x16/films_minus.png | Bin 0 -> 769 bytes .../themes/default/icons/x16/films_pencil.png | Bin 0 -> 810 bytes .../themes/default/icons/x16/films_plus.png | Bin 0 -> 799 bytes .../themes/default/icons/x16/flag.png | Bin 0 -> 726 bytes .../themes/default/icons/x16/flag_arrow.png | Bin 0 -> 858 bytes .../default/icons/x16/flag_exclamation.png | Bin 0 -> 860 bytes .../themes/default/icons/x16/flag_minus.png | Bin 0 -> 751 bytes .../themes/default/icons/x16/flag_pencil.png | Bin 0 -> 810 bytes .../themes/default/icons/x16/flag_plus.png | Bin 0 -> 812 bytes .../themes/default/icons/x16/folder.png | Bin 0 -> 483 bytes .../default/icons/x16/folder__arrow.png | Bin 0 -> 647 bytes .../default/icons/x16/folder__exclamation.png | Bin 0 -> 642 bytes .../default/icons/x16/folder__minus.png | Bin 0 -> 557 bytes .../default/icons/x16/folder__pencil.png | Bin 0 -> 626 bytes .../themes/default/icons/x16/folder__plus.png | Bin 0 -> 592 bytes .../themes/default/icons/x16/folder_open.png | Bin 0 -> 683 bytes .../icons/x16/folder_open_document.png | Bin 0 -> 697 bytes .../icons/x16/folder_open_document_music.png | Bin 0 -> 762 bytes .../folder_open_document_music_playlist.png | Bin 0 -> 786 bytes .../icons/x16/folder_open_document_text.png | Bin 0 -> 749 bytes .../default/icons/x16/folder_open_film.png | Bin 0 -> 775 bytes .../default/icons/x16/folder_open_image.png | Bin 0 -> 802 bytes .../themes/default/icons/x16/folder_shred.png | Bin 0 -> 618 bytes .../themes/default/icons/x16/folder_small.png | Bin 0 -> 336 bytes .../default/icons/x16/folder_zipper.png | Bin 0 -> 651 bytes .../themes/default/icons/x16/folders.png | Bin 0 -> 574 bytes .../default/icons/x16/folders_arrow.png | Bin 0 -> 688 bytes .../default/icons/x16/folders_exclamation.png | Bin 0 -> 696 bytes .../default/icons/x16/folders_minus.png | Bin 0 -> 610 bytes .../default/icons/x16/folders_pencil.png | Bin 0 -> 692 bytes .../themes/default/icons/x16/folders_plus.png | Bin 0 -> 662 bytes .../default/icons/x16/folders_stack.png | Bin 0 -> 565 bytes .../themes/default/icons/x16/funnel.png | Bin 0 -> 586 bytes .../themes/default/icons/x16/funnel_arrow.png | Bin 0 -> 732 bytes .../default/icons/x16/funnel_exclamation.png | Bin 0 -> 743 bytes .../themes/default/icons/x16/funnel_minus.png | Bin 0 -> 636 bytes .../default/icons/x16/funnel_pencil.png | Bin 0 -> 710 bytes .../themes/default/icons/x16/funnel_plus.png | Bin 0 -> 694 bytes .../themes/default/icons/x16/funnel_small.png | Bin 0 -> 379 bytes .../themes/default/icons/x16/gear.png | Bin 0 -> 740 bytes .../themes/default/icons/x16/gear__arrow.png | Bin 0 -> 821 bytes .../default/icons/x16/gear__exclamation.png | Bin 0 -> 833 bytes .../themes/default/icons/x16/gear__minus.png | Bin 0 -> 772 bytes .../themes/default/icons/x16/gear__pencil.png | Bin 0 -> 808 bytes .../themes/default/icons/x16/gear__plus.png | Bin 0 -> 801 bytes .../themes/default/icons/x16/gear_disable.png | Bin 0 -> 663 bytes .../themes/default/icons/x16/gear_small.png | Bin 0 -> 445 bytes .../themes/default/icons/x16/hammer.png | Bin 0 -> 554 bytes .../default/icons/x16/hammer__arrow.png | Bin 0 -> 769 bytes .../default/icons/x16/hammer__exclamation.png | Bin 0 -> 779 bytes .../default/icons/x16/hammer__minus.png | Bin 0 -> 634 bytes .../default/icons/x16/hammer__pencil.png | Bin 0 -> 686 bytes .../themes/default/icons/x16/hammer__plus.png | Bin 0 -> 699 bytes .../themes/default/icons/x16/hammer_left.png | Bin 0 -> 620 bytes .../default/icons/x16/hammer_screwdriver.png | Bin 0 -> 780 bytes .../themes/default/icons/x16/heart.png | Bin 0 -> 747 bytes .../themes/default/icons/x16/heart__arrow.png | Bin 0 -> 821 bytes .../default/icons/x16/heart__exclamation.png | Bin 0 -> 829 bytes .../themes/default/icons/x16/heart__minus.png | Bin 0 -> 751 bytes .../default/icons/x16/heart__pencil.png | Bin 0 -> 837 bytes .../themes/default/icons/x16/heart__plus.png | Bin 0 -> 781 bytes .../themes/default/icons/x16/heart_break.png | Bin 0 -> 805 bytes .../themes/default/icons/x16/heart_empty.png | Bin 0 -> 626 bytes .../themes/default/icons/x16/heart_half.png | Bin 0 -> 759 bytes .../themes/default/icons/x16/heart_small.png | Bin 0 -> 369 bytes .../default/icons/x16/heart_small_empty.png | Bin 0 -> 325 bytes .../default/icons/x16/heart_small_half.png | Bin 0 -> 381 bytes .../themes/default/icons/x16/home.png | Bin 0 -> 753 bytes .../themes/default/icons/x16/home_arrow.png | Bin 0 -> 858 bytes .../default/icons/x16/home_exclamation.png | Bin 0 -> 883 bytes .../themes/default/icons/x16/home_minus.png | Bin 0 -> 797 bytes .../themes/default/icons/x16/home_pencil.png | Bin 0 -> 849 bytes .../themes/default/icons/x16/home_plus.png | Bin 0 -> 843 bytes .../themes/default/icons/x16/home_small.png | Bin 0 -> 412 bytes .../themes/default/icons/x16/image.png | Bin 0 -> 567 bytes .../themes/default/icons/x16/image_arrow.png | Bin 0 -> 666 bytes .../default/icons/x16/image_exclamation.png | Bin 0 -> 707 bytes .../themes/default/icons/x16/image_minus.png | Bin 0 -> 598 bytes .../themes/default/icons/x16/image_pencil.png | Bin 0 -> 691 bytes .../themes/default/icons/x16/image_plus.png | Bin 0 -> 651 bytes .../themes/default/icons/x16/image_resize.png | Bin 0 -> 595 bytes .../default/icons/x16/image_resize_actual.png | Bin 0 -> 635 bytes .../themes/default/icons/x16/image_small.png | Bin 0 -> 346 bytes .../default/icons/x16/image_small_sunset.png | Bin 0 -> 337 bytes .../themes/default/icons/x16/image_sunset.png | Bin 0 -> 532 bytes .../themes/default/icons/x16/images.png | Bin 0 -> 670 bytes .../themes/default/icons/x16/images_arrow.png | Bin 0 -> 725 bytes .../default/icons/x16/images_exclamation.png | Bin 0 -> 750 bytes .../themes/default/icons/x16/images_minus.png | Bin 0 -> 682 bytes .../default/icons/x16/images_pencil.png | Bin 0 -> 750 bytes .../themes/default/icons/x16/images_plus.png | Bin 0 -> 705 bytes .../themes/default/icons/x16/images_stack.png | Bin 0 -> 602 bytes .../themes/default/icons/x16/inbox.png | Bin 0 -> 482 bytes .../themes/default/icons/x16/inbox_arrow.png | Bin 0 -> 623 bytes .../default/icons/x16/inbox_exclamation.png | Bin 0 -> 655 bytes .../themes/default/icons/x16/inbox_minus.png | Bin 0 -> 516 bytes .../themes/default/icons/x16/inbox_pencil.png | Bin 0 -> 635 bytes .../themes/default/icons/x16/inbox_plus.png | Bin 0 -> 591 bytes .../themes/default/icons/x16/information.png | Bin 0 -> 725 bytes .../default/icons/x16/information_frame.png | Bin 0 -> 900 bytes .../default/icons/x16/information_shield.png | Bin 0 -> 775 bytes .../default/icons/x16/information_small.png | Bin 0 -> 328 bytes .../themes/default/icons/x16/key.png | Bin 0 -> 691 bytes .../themes/default/icons/x16/key__arrow.png | Bin 0 -> 819 bytes .../default/icons/x16/key__exclamation.png | Bin 0 -> 838 bytes .../themes/default/icons/x16/key__minus.png | Bin 0 -> 750 bytes .../themes/default/icons/x16/key__pencil.png | Bin 0 -> 816 bytes .../themes/default/icons/x16/key__plus.png | Bin 0 -> 811 bytes .../themes/default/icons/x16/key_disable.png | Bin 0 -> 580 bytes .../themes/default/icons/x16/layout.png | Bin 0 -> 278 bytes .../themes/default/icons/x16/layout_2.png | Bin 0 -> 329 bytes .../default/icons/x16/layout_2_equal.png | Bin 0 -> 325 bytes .../themes/default/icons/x16/layout_3.png | Bin 0 -> 306 bytes .../themes/default/icons/x16/layout_3_mix.png | Bin 0 -> 353 bytes .../default/icons/x16/layout_header.png | Bin 0 -> 286 bytes .../default/icons/x16/layout_header_2.png | Bin 0 -> 341 bytes .../icons/x16/layout_header_2_equal.png | Bin 0 -> 343 bytes .../default/icons/x16/layout_header_3.png | Bin 0 -> 319 bytes .../default/icons/x16/layout_header_3_mix.png | Bin 0 -> 364 bytes .../icons/x16/layout_header_footer.png | Bin 0 -> 297 bytes .../icons/x16/layout_header_footer_2.png | Bin 0 -> 336 bytes .../x16/layout_header_footer_2_equal.png | Bin 0 -> 348 bytes .../icons/x16/layout_header_footer_3.png | Bin 0 -> 319 bytes .../icons/x16/layout_header_footer_3_mix.png | Bin 0 -> 362 bytes .../themes/default/icons/x16/layout_join.png | Bin 0 -> 391 bytes .../themes/default/icons/x16/layout_split.png | Bin 0 -> 440 bytes .../themes/default/icons/x16/lifebuoy.png | Bin 0 -> 897 bytes .../default/icons/x16/lifebuoy_arrow.png | Bin 0 -> 985 bytes .../icons/x16/lifebuoy_exclamation.png | Bin 0 -> 960 bytes .../default/icons/x16/lifebuoy_minus.png | Bin 0 -> 885 bytes .../default/icons/x16/lifebuoy_pencil.png | Bin 0 -> 990 bytes .../default/icons/x16/lifebuoy_plus.png | Bin 0 -> 940 bytes .../themes/default/icons/x16/light_bulb.png | Bin 0 -> 716 bytes .../default/icons/x16/light_bulb__arrow.png | Bin 0 -> 797 bytes .../icons/x16/light_bulb__exclamation.png | Bin 0 -> 794 bytes .../default/icons/x16/light_bulb__minus.png | Bin 0 -> 755 bytes .../default/icons/x16/light_bulb__pencil.png | Bin 0 -> 802 bytes .../default/icons/x16/light_bulb__plus.png | Bin 0 -> 779 bytes .../default/icons/x16/light_bulb_off.png | Bin 0 -> 721 bytes .../default/icons/x16/light_bulb_small.png | Bin 0 -> 320 bytes .../icons/x16/light_bulb_small_off.png | Bin 0 -> 316 bytes .../themes/default/icons/x16/lightning.png | Bin 0 -> 671 bytes .../default/icons/x16/lightning__arrow.png | Bin 0 -> 770 bytes .../icons/x16/lightning__exclamation.png | Bin 0 -> 764 bytes .../default/icons/x16/lightning__minus.png | Bin 0 -> 693 bytes .../default/icons/x16/lightning__pencil.png | Bin 0 -> 784 bytes .../default/icons/x16/lightning__plus.png | Bin 0 -> 746 bytes .../default/icons/x16/lightning_disable.png | Bin 0 -> 618 bytes .../default/icons/x16/lightning_small.png | Bin 0 -> 363 bytes .../themes/default/icons/x16/lock.png | Bin 0 -> 637 bytes .../themes/default/icons/x16/lock__arrow.png | Bin 0 -> 756 bytes .../default/icons/x16/lock__exclamation.png | Bin 0 -> 758 bytes .../themes/default/icons/x16/lock__minus.png | Bin 0 -> 677 bytes .../themes/default/icons/x16/lock__pencil.png | Bin 0 -> 767 bytes .../themes/default/icons/x16/lock__plus.png | Bin 0 -> 737 bytes .../themes/default/icons/x16/lock_disable.png | Bin 0 -> 593 bytes .../themes/default/icons/x16/lock_small.png | Bin 0 -> 370 bytes .../themes/default/icons/x16/lock_unlock.png | Bin 0 -> 639 bytes .../themes/default/icons/x16/logout.png | Bin 0 -> 995 bytes .../themes/default/icons/x16/magnet.png | Bin 0 -> 685 bytes .../default/icons/x16/magnet__arrow.png | Bin 0 -> 784 bytes .../default/icons/x16/magnet__exclamation.png | Bin 0 -> 856 bytes .../default/icons/x16/magnet__minus.png | Bin 0 -> 709 bytes .../default/icons/x16/magnet__pencil.png | Bin 0 -> 839 bytes .../themes/default/icons/x16/magnet__plus.png | Bin 0 -> 761 bytes .../default/icons/x16/magnet_disable.png | Bin 0 -> 550 bytes .../themes/default/icons/x16/magnet_small.png | Bin 0 -> 380 bytes .../themes/default/icons/x16/magnifier.png | Bin 0 -> 706 bytes .../default/icons/x16/magnifier__arrow.png | Bin 0 -> 831 bytes .../icons/x16/magnifier__exclamation.png | Bin 0 -> 866 bytes .../default/icons/x16/magnifier__minus.png | Bin 0 -> 751 bytes .../default/icons/x16/magnifier__pencil.png | Bin 0 -> 821 bytes .../default/icons/x16/magnifier__plus.png | Bin 0 -> 794 bytes .../default/icons/x16/magnifier_left.png | Bin 0 -> 727 bytes .../default/icons/x16/magnifier_medium.png | Bin 0 -> 552 bytes .../icons/x16/magnifier_medium_left.png | Bin 0 -> 560 bytes .../default/icons/x16/magnifier_small.png | Bin 0 -> 395 bytes .../default/icons/x16/magnifier_zoom.png | Bin 0 -> 765 bytes .../icons/x16/magnifier_zoom_actual.png | Bin 0 -> 772 bytes .../default/icons/x16/magnifier_zoom_fit.png | Bin 0 -> 759 bytes .../default/icons/x16/magnifier_zoom_out.png | Bin 0 -> 742 bytes .../themes/default/icons/x16/mail.png | Bin 0 -> 501 bytes .../themes/default/icons/x16/mail__arrow.png | Bin 0 -> 621 bytes .../default/icons/x16/mail__exclamation.png | Bin 0 -> 661 bytes .../themes/default/icons/x16/mail__minus.png | Bin 0 -> 534 bytes .../themes/default/icons/x16/mail__pencil.png | Bin 0 -> 644 bytes .../themes/default/icons/x16/mail__plus.png | Bin 0 -> 602 bytes .../themes/default/icons/x16/mail_open.png | Bin 0 -> 712 bytes .../default/icons/x16/mail_open_document.png | Bin 0 -> 715 bytes .../default/icons/x16/mail_open_film.png | Bin 0 -> 772 bytes .../default/icons/x16/mail_open_image.png | Bin 0 -> 784 bytes .../themes/default/icons/x16/mail_small.png | Bin 0 -> 295 bytes .../themes/default/icons/x16/mails.png | Bin 0 -> 586 bytes .../themes/default/icons/x16/mails_arrow.png | Bin 0 -> 660 bytes .../default/icons/x16/mails_exclamation.png | Bin 0 -> 702 bytes .../themes/default/icons/x16/mails_minus.png | Bin 0 -> 612 bytes .../themes/default/icons/x16/mails_pencil.png | Bin 0 -> 691 bytes .../themes/default/icons/x16/mails_plus.png | Bin 0 -> 649 bytes .../themes/default/icons/x16/mails_stack.png | Bin 0 -> 529 bytes .../themes/default/icons/x16/media_player.png | Bin 0 -> 619 bytes .../default/icons/x16/media_player__arrow.png | Bin 0 -> 738 bytes .../icons/x16/media_player__exclamation.png | Bin 0 -> 756 bytes .../default/icons/x16/media_player__minus.png | Bin 0 -> 660 bytes .../icons/x16/media_player__pencil.png | Bin 0 -> 768 bytes .../default/icons/x16/media_player__plus.png | Bin 0 -> 709 bytes .../default/icons/x16/media_player_black.png | Bin 0 -> 548 bytes .../default/icons/x16/media_player_medium.png | Bin 0 -> 588 bytes .../icons/x16/media_player_medium_black.png | Bin 0 -> 568 bytes .../icons/x16/media_player_medium_blue.png | Bin 0 -> 644 bytes .../icons/x16/media_player_medium_green.png | Bin 0 -> 663 bytes .../icons/x16/media_player_medium_pink.png | Bin 0 -> 666 bytes .../icons/x16/media_player_medium_red.png | Bin 0 -> 638 bytes .../default/icons/x16/media_player_small.png | Bin 0 -> 434 bytes .../icons/x16/media_player_small_blue.png | Bin 0 -> 480 bytes .../icons/x16/media_player_small_green.png | Bin 0 -> 508 bytes .../icons/x16/media_player_small_purple.png | Bin 0 -> 488 bytes .../icons/x16/media_player_small_red.png | Bin 0 -> 499 bytes .../default/icons/x16/media_players.png | Bin 0 -> 679 bytes .../default/icons/x16/media_players_arrow.png | Bin 0 -> 779 bytes .../icons/x16/media_players_exclamation.png | Bin 0 -> 773 bytes .../default/icons/x16/media_players_minus.png | Bin 0 -> 702 bytes .../icons/x16/media_players_pencil.png | Bin 0 -> 793 bytes .../default/icons/x16/media_players_plus.png | Bin 0 -> 748 bytes .../themes/default/icons/x16/microphone.png | Bin 0 -> 732 bytes .../default/icons/x16/microphone_arrow.png | Bin 0 -> 827 bytes .../icons/x16/microphone_exclamation.png | Bin 0 -> 827 bytes .../default/icons/x16/microphone_minus.png | Bin 0 -> 781 bytes .../default/icons/x16/microphone_pencil.png | Bin 0 -> 829 bytes .../default/icons/x16/microphone_plus.png | Bin 0 -> 809 bytes .../themes/default/icons/x16/minus.png | Bin 0 -> 260 bytes .../themes/default/icons/x16/minus_circle.png | Bin 0 -> 656 bytes .../default/icons/x16/minus_circle_frame.png | Bin 0 -> 860 bytes .../themes/default/icons/x16/minus_shield.png | Bin 0 -> 710 bytes .../themes/default/icons/x16/minus_small.png | Bin 0 -> 176 bytes .../default/icons/x16/minus_small_circle.png | Bin 0 -> 328 bytes .../themes/default/icons/x16/music.png | Bin 0 -> 522 bytes .../themes/default/icons/x16/music_arrow.png | Bin 0 -> 679 bytes .../default/icons/x16/music_exclamation.png | Bin 0 -> 747 bytes .../themes/default/icons/x16/music_minus.png | Bin 0 -> 616 bytes .../themes/default/icons/x16/music_pencil.png | Bin 0 -> 668 bytes .../themes/default/icons/x16/music_plus.png | Bin 0 -> 657 bytes .../themes/default/icons/x16/music_small.png | Bin 0 -> 277 bytes .../themes/default/icons/x16/newspaper.png | Bin 0 -> 565 bytes .../default/icons/x16/newspaper_arrow.png | Bin 0 -> 698 bytes .../icons/x16/newspaper_exclamation.png | Bin 0 -> 729 bytes .../default/icons/x16/newspaper_minus.png | Bin 0 -> 616 bytes .../default/icons/x16/newspaper_pencil.png | Bin 0 -> 728 bytes .../default/icons/x16/newspaper_plus.png | Bin 0 -> 685 bytes .../themes/default/icons/x16/newspapers.png | Bin 0 -> 610 bytes .../default/icons/x16/newspapers_arrow.png | Bin 0 -> 717 bytes .../icons/x16/newspapers_exclamation.png | Bin 0 -> 754 bytes .../default/icons/x16/newspapers_minus.png | Bin 0 -> 655 bytes .../default/icons/x16/newspapers_pencil.png | Bin 0 -> 754 bytes .../default/icons/x16/newspapers_plus.png | Bin 0 -> 703 bytes .../themes/default/icons/x16/notebook.png | Bin 0 -> 572 bytes .../default/icons/x16/notebook_arrow.png | Bin 0 -> 700 bytes .../icons/x16/notebook_exclamation.png | Bin 0 -> 741 bytes .../default/icons/x16/notebook_minus.png | Bin 0 -> 634 bytes .../default/icons/x16/notebook_pencil.png | Bin 0 -> 744 bytes .../default/icons/x16/notebook_plus.png | Bin 0 -> 671 bytes .../themes/default/icons/x16/notebooks.png | Bin 0 -> 706 bytes .../default/icons/x16/notebooks_arrow.png | Bin 0 -> 787 bytes .../icons/x16/notebooks_exclamation.png | Bin 0 -> 808 bytes .../default/icons/x16/notebooks_minus.png | Bin 0 -> 726 bytes .../default/icons/x16/notebooks_pencil.png | Bin 0 -> 823 bytes .../default/icons/x16/notebooks_plus.png | Bin 0 -> 770 bytes .../themes/default/icons/x16/paint_can.png | Bin 0 -> 721 bytes .../default/icons/x16/paint_can_arrow.png | Bin 0 -> 814 bytes .../icons/x16/paint_can_exclamation.png | Bin 0 -> 831 bytes .../default/icons/x16/paint_can_minus.png | Bin 0 -> 761 bytes .../default/icons/x16/paint_can_pencil.png | Bin 0 -> 814 bytes .../default/icons/x16/paint_can_plus.png | Bin 0 -> 795 bytes .../themes/default/icons/x16/palette.png | Bin 0 -> 855 bytes .../default/icons/x16/palette_arrow.png | Bin 0 -> 906 bytes .../default/icons/x16/palette_exclamation.png | Bin 0 -> 940 bytes .../default/icons/x16/palette_minus.png | Bin 0 -> 845 bytes .../default/icons/x16/palette_pencil.png | Bin 0 -> 922 bytes .../themes/default/icons/x16/palette_plus.png | Bin 0 -> 909 bytes .../themes/default/icons/x16/paper_bag.png | Bin 0 -> 591 bytes .../default/icons/x16/paper_bag_arrow.png | Bin 0 -> 707 bytes .../icons/x16/paper_bag_exclamation.png | Bin 0 -> 725 bytes .../default/icons/x16/paper_bag_minus.png | Bin 0 -> 621 bytes .../default/icons/x16/paper_bag_pencil.png | Bin 0 -> 742 bytes .../default/icons/x16/paper_bag_plus.png | Bin 0 -> 681 bytes .../themes/default/icons/x16/pencil.png | Bin 0 -> 497 bytes .../themes/default/icons/x16/pencil_arrow.png | Bin 0 -> 671 bytes .../default/icons/x16/pencil_exclamation.png | Bin 0 -> 701 bytes .../themes/default/icons/x16/pencil_minus.png | Bin 0 -> 555 bytes .../themes/default/icons/x16/pencil_plus.png | Bin 0 -> 637 bytes .../themes/default/icons/x16/pencil_small.png | Bin 0 -> 309 bytes .../themes/default/icons/x16/photo_album.png | Bin 0 -> 739 bytes .../default/icons/x16/photo_album__arrow.png | Bin 0 -> 784 bytes .../icons/x16/photo_album__exclamation.png | Bin 0 -> 804 bytes .../default/icons/x16/photo_album__minus.png | Bin 0 -> 742 bytes .../default/icons/x16/photo_album__pencil.png | Bin 0 -> 802 bytes .../default/icons/x16/photo_album__plus.png | Bin 0 -> 762 bytes .../default/icons/x16/photo_album_blue.png | Bin 0 -> 738 bytes .../themes/default/icons/x16/piano.png | Bin 0 -> 370 bytes .../themes/default/icons/x16/piano_arrow.png | Bin 0 -> 541 bytes .../default/icons/x16/piano_exclamation.png | Bin 0 -> 594 bytes .../themes/default/icons/x16/piano_minus.png | Bin 0 -> 430 bytes .../themes/default/icons/x16/piano_pencil.png | Bin 0 -> 551 bytes .../themes/default/icons/x16/piano_plus.png | Bin 0 -> 504 bytes .../themes/default/icons/x16/picture.png | Bin 0 -> 531 bytes .../default/icons/x16/picture_arrow.png | Bin 0 -> 658 bytes .../default/icons/x16/picture_exclamation.png | Bin 0 -> 683 bytes .../default/icons/x16/picture_minus.png | Bin 0 -> 570 bytes .../default/icons/x16/picture_pencil.png | Bin 0 -> 670 bytes .../themes/default/icons/x16/picture_plus.png | Bin 0 -> 633 bytes .../default/icons/x16/picture_small.png | Bin 0 -> 332 bytes .../icons/x16/picture_small_sunset.png | Bin 0 -> 326 bytes .../default/icons/x16/picture_sunset.png | Bin 0 -> 509 bytes .../themes/default/icons/x16/pictures.png | Bin 0 -> 609 bytes .../default/icons/x16/pictures_arrow.png | Bin 0 -> 682 bytes .../icons/x16/pictures_exclamation.png | Bin 0 -> 713 bytes .../default/icons/x16/pictures_minus.png | Bin 0 -> 645 bytes .../default/icons/x16/pictures_pencil.png | Bin 0 -> 706 bytes .../default/icons/x16/pictures_plus.png | Bin 0 -> 661 bytes .../themes/default/icons/x16/pill.png | Bin 0 -> 603 bytes .../themes/default/icons/x16/pill_arrow.png | Bin 0 -> 727 bytes .../default/icons/x16/pill_exclamation.png | Bin 0 -> 750 bytes .../themes/default/icons/x16/pill_minus.png | Bin 0 -> 629 bytes .../themes/default/icons/x16/pill_pencil.png | Bin 0 -> 782 bytes .../themes/default/icons/x16/pill_plus.png | Bin 0 -> 704 bytes .../themes/default/icons/x16/pill_small.png | Bin 0 -> 404 bytes .../themes/default/icons/x16/pin.png | Bin 0 -> 645 bytes .../themes/default/icons/x16/pin_arrow.png | Bin 0 -> 778 bytes .../default/icons/x16/pin_exclamation.png | Bin 0 -> 784 bytes .../themes/default/icons/x16/pin_minus.png | Bin 0 -> 665 bytes .../themes/default/icons/x16/pin_pencil.png | Bin 0 -> 751 bytes .../themes/default/icons/x16/pin_plus.png | Bin 0 -> 741 bytes .../themes/default/icons/x16/pipette.png | Bin 0 -> 576 bytes .../default/icons/x16/pipette_arrow.png | Bin 0 -> 728 bytes .../default/icons/x16/pipette_exclamation.png | Bin 0 -> 745 bytes .../default/icons/x16/pipette_minus.png | Bin 0 -> 613 bytes .../default/icons/x16/pipette_pencil.png | Bin 0 -> 725 bytes .../themes/default/icons/x16/pipette_plus.png | Bin 0 -> 692 bytes .../themes/default/icons/x16/playing_card.png | Bin 0 -> 717 bytes .../default/icons/x16/playing_card_arrow.png | Bin 0 -> 796 bytes .../icons/x16/playing_card_exclamation.png | Bin 0 -> 819 bytes .../default/icons/x16/playing_card_minus.png | Bin 0 -> 752 bytes .../default/icons/x16/playing_card_pencil.png | Bin 0 -> 821 bytes .../default/icons/x16/playing_card_plus.png | Bin 0 -> 776 bytes .../themes/default/icons/x16/plug.png | Bin 0 -> 664 bytes .../themes/default/icons/x16/plug_arrow.png | Bin 0 -> 787 bytes .../default/icons/x16/plug_exclamation.png | Bin 0 -> 804 bytes .../themes/default/icons/x16/plug_minus.png | Bin 0 -> 708 bytes .../themes/default/icons/x16/plug_pencil.png | Bin 0 -> 820 bytes .../themes/default/icons/x16/plug_plus.png | Bin 0 -> 749 bytes .../themes/default/icons/x16/plus.png | Bin 0 -> 511 bytes .../themes/default/icons/x16/plus_circle.png | Bin 0 -> 694 bytes .../default/icons/x16/plus_circle_frame.png | Bin 0 -> 878 bytes .../themes/default/icons/x16/plus_shield.png | Bin 0 -> 758 bytes .../themes/default/icons/x16/plus_small.png | Bin 0 -> 296 bytes .../default/icons/x16/plus_small_circle.png | Bin 0 -> 332 bytes .../themes/default/icons/x16/printer.png | Bin 0 -> 736 bytes .../default/icons/x16/printer__arrow.png | Bin 0 -> 806 bytes .../icons/x16/printer__exclamation.png | Bin 0 -> 843 bytes .../default/icons/x16/printer__minus.png | Bin 0 -> 759 bytes .../default/icons/x16/printer__pencil.png | Bin 0 -> 827 bytes .../default/icons/x16/printer__plus.png | Bin 0 -> 788 bytes .../default/icons/x16/printer_empty.png | Bin 0 -> 544 bytes .../default/icons/x16/printer_small.png | Bin 0 -> 436 bytes .../themes/default/icons/x16/puzzle.png | Bin 0 -> 756 bytes .../default/icons/x16/puzzle__arrow.png | Bin 0 -> 916 bytes .../default/icons/x16/puzzle__exclamation.png | Bin 0 -> 897 bytes .../default/icons/x16/puzzle__minus.png | Bin 0 -> 811 bytes .../default/icons/x16/puzzle__pencil.png | Bin 0 -> 911 bytes .../themes/default/icons/x16/puzzle__plus.png | Bin 0 -> 844 bytes .../default/icons/x16/puzzle_disable.png | Bin 0 -> 715 bytes .../themes/default/icons/x16/question.png | Bin 0 -> 760 bytes .../default/icons/x16/question_frame.png | Bin 0 -> 937 bytes .../default/icons/x16/question_shield.png | Bin 0 -> 806 bytes .../default/icons/x16/question_small.png | Bin 0 -> 337 bytes .../themes/default/icons/x16/receipt.png | Bin 0 -> 428 bytes .../default/icons/x16/receipt_arrow.png | Bin 0 -> 568 bytes .../default/icons/x16/receipt_exclamation.png | Bin 0 -> 623 bytes .../default/icons/x16/receipt_minus.png | Bin 0 -> 501 bytes .../default/icons/x16/receipt_pencil.png | Bin 0 -> 633 bytes .../themes/default/icons/x16/receipt_plus.png | Bin 0 -> 530 bytes .../default/icons/x16/receipt_shred.png | Bin 0 -> 526 bytes .../themes/default/icons/x16/receipt_text.png | Bin 0 -> 500 bytes .../themes/default/icons/x16/receipts.png | Bin 0 -> 566 bytes .../default/icons/x16/receipts_arrow.png | Bin 0 -> 658 bytes .../icons/x16/receipts_exclamation.png | Bin 0 -> 677 bytes .../default/icons/x16/receipts_minus.png | Bin 0 -> 597 bytes .../default/icons/x16/receipts_pencil.png | Bin 0 -> 693 bytes .../default/icons/x16/receipts_plus.png | Bin 0 -> 644 bytes .../default/icons/x16/receipts_text.png | Bin 0 -> 648 bytes .../themes/default/icons/x16/report.png | Bin 0 -> 537 bytes .../themes/default/icons/x16/report_arrow.png | Bin 0 -> 658 bytes .../default/icons/x16/report_exclamation.png | Bin 0 -> 735 bytes .../themes/default/icons/x16/report_minus.png | Bin 0 -> 585 bytes .../default/icons/x16/report_pencil.png | Bin 0 -> 706 bytes .../themes/default/icons/x16/report_plus.png | Bin 0 -> 630 bytes .../themes/default/icons/x16/ruler.png | Bin 0 -> 633 bytes .../themes/default/icons/x16/ruler__arrow.png | Bin 0 -> 788 bytes .../default/icons/x16/ruler__exclamation.png | Bin 0 -> 808 bytes .../themes/default/icons/x16/ruler__minus.png | Bin 0 -> 658 bytes .../default/icons/x16/ruler__pencil.png | Bin 0 -> 761 bytes .../themes/default/icons/x16/ruler__plus.png | Bin 0 -> 746 bytes .../themes/default/icons/x16/ruler_crop.png | Bin 0 -> 747 bytes .../themes/default/icons/x16/safe.png | Bin 0 -> 609 bytes .../themes/default/icons/x16/safe_arrow.png | Bin 0 -> 707 bytes .../default/icons/x16/safe_exclamation.png | Bin 0 -> 732 bytes .../themes/default/icons/x16/safe_minus.png | Bin 0 -> 642 bytes .../themes/default/icons/x16/safe_pencil.png | Bin 0 -> 736 bytes .../themes/default/icons/x16/safe_plus.png | Bin 0 -> 687 bytes .../themes/default/icons/x16/screwdriver.png | Bin 0 -> 564 bytes .../default/icons/x16/screwdriver_arrow.png | Bin 0 -> 768 bytes .../icons/x16/screwdriver_exclamation.png | Bin 0 -> 772 bytes .../default/icons/x16/screwdriver_minus.png | Bin 0 -> 607 bytes .../default/icons/x16/screwdriver_pencil.png | Bin 0 -> 720 bytes .../default/icons/x16/screwdriver_plus.png | Bin 0 -> 703 bytes .../themes/default/icons/x16/script.png | Bin 0 -> 456 bytes .../default/icons/x16/script__arrow.png | Bin 0 -> 558 bytes .../default/icons/x16/script__exclamation.png | Bin 0 -> 627 bytes .../default/icons/x16/script__minus.png | Bin 0 -> 497 bytes .../default/icons/x16/script__pencil.png | Bin 0 -> 647 bytes .../themes/default/icons/x16/script__plus.png | Bin 0 -> 543 bytes .../themes/default/icons/x16/script_code.png | Bin 0 -> 512 bytes .../themes/default/icons/x16/scripts.png | Bin 0 -> 573 bytes .../default/icons/x16/scripts__arrow.png | Bin 0 -> 681 bytes .../icons/x16/scripts__exclamation.png | Bin 0 -> 700 bytes .../default/icons/x16/scripts__minus.png | Bin 0 -> 605 bytes .../default/icons/x16/scripts__pencil.png | Bin 0 -> 696 bytes .../default/icons/x16/scripts__plus.png | Bin 0 -> 656 bytes .../themes/default/icons/x16/scripts_code.png | Bin 0 -> 663 bytes .../themes/default/icons/x16/shield.png | Bin 0 -> 703 bytes .../default/icons/x16/shield__arrow.png | Bin 0 -> 797 bytes .../default/icons/x16/shield__exclamation.png | Bin 0 -> 815 bytes .../default/icons/x16/shield__minus.png | Bin 0 -> 744 bytes .../default/icons/x16/shield__pencil.png | Bin 0 -> 836 bytes .../themes/default/icons/x16/shield__plus.png | Bin 0 -> 785 bytes .../default/icons/x16/shield_disable.png | Bin 0 -> 589 bytes .../themes/default/icons/x16/slash.png | Bin 0 -> 751 bytes .../themes/default/icons/x16/slash_small.png | Bin 0 -> 294 bytes .../themes/default/icons/x16/socket.png | Bin 0 -> 546 bytes .../themes/default/icons/x16/socket_arrow.png | Bin 0 -> 669 bytes .../default/icons/x16/socket_exclamation.png | Bin 0 -> 708 bytes .../themes/default/icons/x16/socket_minus.png | Bin 0 -> 586 bytes .../default/icons/x16/socket_pencil.png | Bin 0 -> 708 bytes .../themes/default/icons/x16/socket_plus.png | Bin 0 -> 639 bytes .../themes/default/icons/x16/sort.png | Bin 0 -> 452 bytes .../themes/default/icons/x16/sort__arrow.png | Bin 0 -> 610 bytes .../default/icons/x16/sort__exclamation.png | Bin 0 -> 698 bytes .../themes/default/icons/x16/sort__minus.png | Bin 0 -> 497 bytes .../themes/default/icons/x16/sort__pencil.png | Bin 0 -> 650 bytes .../themes/default/icons/x16/sort__plus.png | Bin 0 -> 565 bytes .../default/icons/x16/sort_alphabet.png | Bin 0 -> 588 bytes .../icons/x16/sort_alphabet_descending.png | Bin 0 -> 587 bytes .../themes/default/icons/x16/sort_date.png | Bin 0 -> 558 bytes .../icons/x16/sort_date_descending.png | Bin 0 -> 520 bytes .../themes/default/icons/x16/sort_number.png | Bin 0 -> 566 bytes .../icons/x16/sort_number_descending.png | Bin 0 -> 564 bytes .../default/icons/x16/sort_quantity.png | Bin 0 -> 543 bytes .../icons/x16/sort_quantity_descending.png | Bin 0 -> 542 bytes .../themes/default/icons/x16/sort_small.png | Bin 0 -> 370 bytes .../themes/default/icons/x16/stamp.png | Bin 0 -> 667 bytes .../themes/default/icons/x16/stamp_arrow.png | Bin 0 -> 774 bytes .../default/icons/x16/stamp_exclamation.png | Bin 0 -> 822 bytes .../themes/default/icons/x16/stamp_minus.png | Bin 0 -> 721 bytes .../themes/default/icons/x16/stamp_pencil.png | Bin 0 -> 801 bytes .../themes/default/icons/x16/stamp_plus.png | Bin 0 -> 748 bytes .../themes/default/icons/x16/star.png | Bin 0 -> 750 bytes .../themes/default/icons/x16/star__arrow.png | Bin 0 -> 815 bytes .../default/icons/x16/star__exclamation.png | Bin 0 -> 811 bytes .../themes/default/icons/x16/star__minus.png | Bin 0 -> 767 bytes .../themes/default/icons/x16/star__pencil.png | Bin 0 -> 874 bytes .../themes/default/icons/x16/star__plus.png | Bin 0 -> 797 bytes .../themes/default/icons/x16/star_empty.png | Bin 0 -> 658 bytes .../themes/default/icons/x16/star_half.png | Bin 0 -> 793 bytes .../themes/default/icons/x16/star_small.png | Bin 0 -> 406 bytes .../default/icons/x16/star_small_empty.png | Bin 0 -> 388 bytes .../default/icons/x16/star_small_half.png | Bin 0 -> 418 bytes .../themes/default/icons/x16/sticky_note.png | Bin 0 -> 467 bytes .../default/icons/x16/sticky_note__arrow.png | Bin 0 -> 608 bytes .../icons/x16/sticky_note__exclamation.png | Bin 0 -> 647 bytes .../default/icons/x16/sticky_note__minus.png | Bin 0 -> 507 bytes .../default/icons/x16/sticky_note__pencil.png | Bin 0 -> 636 bytes .../default/icons/x16/sticky_note__plus.png | Bin 0 -> 575 bytes .../default/icons/x16/sticky_note_pin.png | Bin 0 -> 522 bytes .../default/icons/x16/sticky_note_shred.png | Bin 0 -> 592 bytes .../default/icons/x16/sticky_note_small.png | Bin 0 -> 334 bytes .../icons/x16/sticky_note_small_pin.png | Bin 0 -> 377 bytes .../default/icons/x16/sticky_note_text.png | Bin 0 -> 548 bytes .../themes/default/icons/x16/sticky_notes.png | Bin 0 -> 556 bytes .../default/icons/x16/sticky_notes__arrow.png | Bin 0 -> 668 bytes .../icons/x16/sticky_notes__exclamation.png | Bin 0 -> 669 bytes .../default/icons/x16/sticky_notes__minus.png | Bin 0 -> 590 bytes .../icons/x16/sticky_notes__pencil.png | Bin 0 -> 678 bytes .../default/icons/x16/sticky_notes__plus.png | Bin 0 -> 640 bytes .../default/icons/x16/sticky_notes_pin.png | Bin 0 -> 637 bytes .../default/icons/x16/sticky_notes_stack.png | Bin 0 -> 558 bytes .../default/icons/x16/sticky_notes_text.png | Bin 0 -> 631 bytes .../themes/default/icons/x16/switch.png | Bin 0 -> 542 bytes .../themes/default/icons/x16/switch_arrow.png | Bin 0 -> 652 bytes .../default/icons/x16/switch_exclamation.png | Bin 0 -> 677 bytes .../themes/default/icons/x16/switch_minus.png | Bin 0 -> 570 bytes .../default/icons/x16/switch_pencil.png | Bin 0 -> 687 bytes .../themes/default/icons/x16/switch_plus.png | Bin 0 -> 634 bytes .../themes/default/icons/x16/table.png | Bin 0 -> 521 bytes .../themes/default/icons/x16/table__arrow.png | Bin 0 -> 648 bytes .../default/icons/x16/table__exclamation.png | Bin 0 -> 693 bytes .../themes/default/icons/x16/table__minus.png | Bin 0 -> 560 bytes .../default/icons/x16/table__pencil.png | Bin 0 -> 683 bytes .../themes/default/icons/x16/table__plus.png | Bin 0 -> 634 bytes .../themes/default/icons/x16/table_delete.png | Bin 0 -> 634 bytes .../default/icons/x16/table_delete_column.png | Bin 0 -> 661 bytes .../themes/default/icons/x16/table_insert.png | Bin 0 -> 605 bytes .../default/icons/x16/table_insert_column.png | Bin 0 -> 652 bytes .../themes/default/icons/x16/tables.png | Bin 0 -> 666 bytes .../themes/default/icons/x16/tables_arrow.png | Bin 0 -> 743 bytes .../default/icons/x16/tables_exclamation.png | Bin 0 -> 763 bytes .../themes/default/icons/x16/tables_minus.png | Bin 0 -> 681 bytes .../default/icons/x16/tables_pencil.png | Bin 0 -> 762 bytes .../themes/default/icons/x16/tables_plus.png | Bin 0 -> 719 bytes .../default/icons/x16/tables_stacks.png | Bin 0 -> 580 bytes .../themes/default/icons/x16/tag.png | Bin 0 -> 703 bytes .../themes/default/icons/x16/tag__arrow.png | Bin 0 -> 795 bytes .../default/icons/x16/tag__exclamation.png | Bin 0 -> 804 bytes .../themes/default/icons/x16/tag__minus.png | Bin 0 -> 733 bytes .../themes/default/icons/x16/tag__pencil.png | Bin 0 -> 848 bytes .../themes/default/icons/x16/tag__plus.png | Bin 0 -> 767 bytes .../themes/default/icons/x16/tag_label.png | Bin 0 -> 760 bytes .../themes/default/icons/x16/tag_small.png | Bin 0 -> 392 bytes .../themes/default/icons/x16/tags.png | Bin 0 -> 710 bytes .../themes/default/icons/x16/tags__arrow.png | Bin 0 -> 801 bytes .../default/icons/x16/tags__exclamation.png | Bin 0 -> 825 bytes .../themes/default/icons/x16/tags__minus.png | Bin 0 -> 737 bytes .../themes/default/icons/x16/tags__pencil.png | Bin 0 -> 862 bytes .../themes/default/icons/x16/tags__plus.png | Bin 0 -> 791 bytes .../themes/default/icons/x16/tags_label.png | Bin 0 -> 762 bytes .../themes/default/icons/x16/tick.png | Bin 0 -> 640 bytes .../themes/default/icons/x16/tick_circle.png | Bin 0 -> 741 bytes .../default/icons/x16/tick_circle_frame.png | Bin 0 -> 933 bytes .../themes/default/icons/x16/tick_shield.png | Bin 0 -> 801 bytes .../themes/default/icons/x16/tick_small.png | Bin 0 -> 283 bytes .../default/icons/x16/tick_small_circle.png | Bin 0 -> 329 bytes .../themes/default/icons/x16/ticket.png | Bin 0 -> 730 bytes .../themes/default/icons/x16/ticket_arrow.png | Bin 0 -> 824 bytes .../default/icons/x16/ticket_exclamation.png | Bin 0 -> 817 bytes .../themes/default/icons/x16/ticket_minus.png | Bin 0 -> 763 bytes .../default/icons/x16/ticket_pencil.png | Bin 0 -> 904 bytes .../themes/default/icons/x16/ticket_plus.png | Bin 0 -> 799 bytes .../themes/default/icons/x16/ticket_small.png | Bin 0 -> 408 bytes .../themes/default/icons/x16/trophy.png | Bin 0 -> 882 bytes .../themes/default/icons/x16/trophy_arrow.png | Bin 0 -> 963 bytes .../default/icons/x16/trophy_exclamation.png | Bin 0 -> 953 bytes .../themes/default/icons/x16/trophy_minus.png | Bin 0 -> 887 bytes .../default/icons/x16/trophy_pencil.png | Bin 0 -> 976 bytes .../themes/default/icons/x16/trophy_plus.png | Bin 0 -> 920 bytes .../themes/default/icons/x16/tux.png | Bin 0 -> 696 bytes .../themes/default/icons/x16/user.png | Bin 0 -> 741 bytes .../themes/default/icons/x16/user_add.png | Bin 0 -> 746 bytes .../themes/default/icons/x16/user_comment.png | Bin 0 -> 743 bytes .../themes/default/icons/x16/user_delete.png | Bin 0 -> 767 bytes .../themes/default/icons/x16/user_edit.png | Bin 0 -> 833 bytes .../themes/default/icons/x16/user_female.png | Bin 0 -> 663 bytes .../themes/default/icons/x16/user_go.png | Bin 0 -> 793 bytes .../themes/default/icons/x16/user_gray.png | Bin 0 -> 706 bytes .../themes/default/icons/x16/user_green.png | Bin 0 -> 722 bytes .../themes/default/icons/x16/user_orange.png | Bin 0 -> 723 bytes .../themes/default/icons/x16/user_red.png | Bin 0 -> 717 bytes .../themes/default/icons/x16/user_suit.png | Bin 0 -> 748 bytes .../themes/default/icons/x16/vcard.png | Bin 0 -> 533 bytes .../themes/default/icons/x16/vcard_add.png | Bin 0 -> 661 bytes .../themes/default/icons/x16/vcard_delete.png | Bin 0 -> 651 bytes .../themes/default/icons/x16/vcard_edit.png | Bin 0 -> 775 bytes .../themes/default/icons/x16/wall.png | Bin 0 -> 547 bytes .../themes/default/icons/x16/wall__arrow.png | Bin 0 -> 675 bytes .../default/icons/x16/wall__exclamation.png | Bin 0 -> 712 bytes .../themes/default/icons/x16/wall__minus.png | Bin 0 -> 582 bytes .../themes/default/icons/x16/wall__pencil.png | Bin 0 -> 687 bytes .../themes/default/icons/x16/wall__plus.png | Bin 0 -> 654 bytes .../themes/default/icons/x16/wall_brick.png | Bin 0 -> 442 bytes .../themes/default/icons/x16/wall_disable.png | Bin 0 -> 415 bytes .../themes/default/icons/x16/wall_small.png | Bin 0 -> 420 bytes .../default/icons/x16/wall_small_brick.png | Bin 0 -> 360 bytes .../themes/default/icons/x16/wallet.png | Bin 0 -> 490 bytes .../themes/default/icons/x16/wallet_arrow.png | Bin 0 -> 638 bytes .../default/icons/x16/wallet_exclamation.png | Bin 0 -> 695 bytes .../themes/default/icons/x16/wallet_minus.png | Bin 0 -> 520 bytes .../default/icons/x16/wallet_pencil.png | Bin 0 -> 633 bytes .../themes/default/icons/x16/wallet_plus.png | Bin 0 -> 607 bytes .../themes/default/icons/x16/wand.png | Bin 0 -> 597 bytes .../themes/default/icons/x16/wand_arrow.png | Bin 0 -> 804 bytes .../default/icons/x16/wand_exclamation.png | Bin 0 -> 819 bytes .../themes/default/icons/x16/wand_minus.png | Bin 0 -> 665 bytes .../themes/default/icons/x16/wand_pencil.png | Bin 0 -> 706 bytes .../themes/default/icons/x16/wand_plus.png | Bin 0 -> 737 bytes .../themes/default/icons/x16/wrench.png | Bin 0 -> 687 bytes .../themes/default/icons/x16/wrench_arrow.png | Bin 0 -> 845 bytes .../default/icons/x16/wrench_exclamation.png | Bin 0 -> 889 bytes .../themes/default/icons/x16/wrench_minus.png | Bin 0 -> 733 bytes .../default/icons/x16/wrench_pencil.png | Bin 0 -> 824 bytes .../themes/default/icons/x16/wrench_plus.png | Bin 0 -> 805 bytes .../default/icons/x16/wrench_screwdriver.png | Bin 0 -> 913 bytes .../default/icons/x32/state_critical.png | Bin 0 -> 2409 bytes .../themes/default/icons/x32/state_error.png | Bin 0 -> 2212 bytes .../themes/default/icons/x32/state_info.png | Bin 0 -> 2184 bytes .../themes/default/icons/x32/state_ok.png | Bin 0 -> 1518 bytes .../default/icons/x32/state_unknown.png | Bin 0 -> 2832 bytes .../default/icons/x32/state_warning.png | Bin 0 -> 1931 bytes .../themes/default/icons/x64/network.png | Bin 0 -> 7481 bytes .../themes/default/icons/x64/server.png | Bin 0 -> 7475 bytes .../themes/default/images/buttonHolder_bg.gif | Bin 0 -> 609 bytes .../themes/default/images/favicon.ico | Bin 0 -> 1406 bytes .../themes/default/images/header_bg.png | Bin 0 -> 322 bytes .../themes/default/images/header_logo.png | Bin 0 -> 2452 bytes .../themes/default/images/header_logo.png.old | Bin 0 -> 36266 bytes .../themes/default/images/lists_tfoot_bg.png | Bin 0 -> 167 bytes .../themes/default/images/lists_thead_bg.png | Bin 0 -> 222 bytes .../themes/default/images/meter_bg.gif | Bin 0 -> 80 bytes .../themes/default/images/screen_bg.png | Bin 0 -> 206 bytes .../interface/themes/default/licences.txt | 8 + .../themes/default/templates/form.tpl.htm | 1 + .../themes/default/templates/listpage.tpl.htm | 1 + .../themes/default/templates/main.tpl.htm | 111 + .../themes/default/templates/module.tpl.htm | 37 + .../default/templates/module_tree.tpl.htm | 38 + .../themes/default/templates/sidenav.tpl.htm | 24 + .../default/templates/tabbed_form.tpl.htm | 28 + .../themes/default/templates/topnav.tpl.htm | 9 + .../themes/default/yaml/!important.txt | 4 + .../themes/default/yaml/core/base.css | 229 + .../themes/default/yaml/core/iehacks.css | 310 + .../themes/default/yaml/core/print_base.css | 120 + .../themes/default/yaml/core/slim_base.css | 50 + .../themes/default/yaml/core/slim_iehacks.css | 36 + .../default/yaml/core/slim_print_base.css | 21 + .../themes/default/yaml/debug/debug.css | 157 + .../yaml/debug/images/grid_pattern.png | Bin 0 -> 29833 bytes .../yaml/debug/images/warning_iehacks.gif | Bin 0 -> 2912 bytes .../default/yaml/debug/images/yaml_debug.gif | Bin 0 -> 2842 bytes .../default/yaml/navigation/nav_vlist.css | 109 + .../yaml/patches/patch_layout_draft.css | 29 + .../default/yaml/patches/patch_nav_vlist.css | 61 + .../default/yaml/print/print_003_draft.css | 32 + .../default/yaml/print/print_020_draft.css | 31 + .../default/yaml/print/print_023_draft.css | 40 + .../default/yaml/print/print_100_draft.css | 31 + .../default/yaml/print/print_103_draft.css | 38 + .../default/yaml/print/print_120_draft.css | 39 + .../default/yaml/print/print_123_draft.css | 40 + .../default/yaml/screen/basemod_draft.css | 70 + .../default/yaml/screen/content_default.css | 170 + .../web/tools/form/user_settings.tform.php | 144 + .../ispconfig/interface/web/tools/index.php | 50 + .../interface/web/tools/lib/lang/bg.lng | 6 + .../web/tools/lib/lang/bg_usersettings.lng | 8 + .../interface/web/tools/lib/lang/br.lng | 6 + .../web/tools/lib/lang/br_usersettings.lng | 8 + .../interface/web/tools/lib/lang/de.lng | 6 + .../web/tools/lib/lang/de_usersettings.lng | 8 + .../interface/web/tools/lib/lang/en.lng | 6 + .../web/tools/lib/lang/en_usersettings.lng | 8 + .../interface/web/tools/lib/lang/es.lng | 6 + .../web/tools/lib/lang/es_usersettings.lng | 8 + .../interface/web/tools/lib/lang/fi.lng | 6 + .../web/tools/lib/lang/fi_usersettings.lng | 8 + .../interface/web/tools/lib/lang/fr.lng | 6 + .../web/tools/lib/lang/fr_usersettings.lng | 8 + .../interface/web/tools/lib/lang/hu.lng | 6 + .../web/tools/lib/lang/hu_usersettings.lng | 8 + .../interface/web/tools/lib/lang/it.lng | 6 + .../web/tools/lib/lang/it_usersettings.lng | 8 + .../interface/web/tools/lib/lang/ja.lng | 6 + .../web/tools/lib/lang/ja_usersettings.lng | 8 + .../interface/web/tools/lib/lang/nl.lng | 6 + .../web/tools/lib/lang/nl_usersettings.lng | 8 + .../interface/web/tools/lib/lang/pl.lng | 6 + .../web/tools/lib/lang/pl_usersettings.lng | 8 + .../interface/web/tools/lib/lang/pt.lng | 7 + .../web/tools/lib/lang/pt_usersettings.lng | 9 + .../interface/web/tools/lib/lang/ro.lng | 6 + .../web/tools/lib/lang/ro_usersettings.lng | 8 + .../interface/web/tools/lib/lang/ru.lng | 7 + .../web/tools/lib/lang/ru_usersettings.lng | 9 + .../interface/web/tools/lib/lang/se.lng | 6 + .../web/tools/lib/lang/se_usersettings.lng | 8 + .../interface/web/tools/lib/lang/sk.lng | 6 + .../web/tools/lib/lang/sk_usersettings.lng | 8 + .../interface/web/tools/lib/lang/tr.lng | 6 + .../web/tools/lib/lang/tr_usersettings.lng | 8 + .../web/tools/lib/menu.d/statistics.menu.php | 25 + .../interface/web/tools/lib/module.conf.php | 38 + .../web/tools/templates/user_settings.htm | 36 + .../interface/web/tools/user_settings.php | 97 + .../ispconfig/nbproject/project.properties | 8 + interface/ispconfig/nbproject/project.xml | 9 + .../server/conf/apache_apps.vhost.master | 42 + .../server/conf/apache_ispconfig.conf.master | 43 + .../server/conf/autoresponder.master | 23 + .../ispconfig/server/conf/bash.bashrc.master | 65 + .../server/conf/bastille-firewall.cfg.master | 320 + .../server/conf/bind_named.conf.local.master | 9 + .../server/conf/bind_pri.domain.master | 48 + .../conf/debian_network_interfaces.master | 27 + .../ispconfig/server/conf/error/br/400.html | 63 + .../ispconfig/server/conf/error/br/401.html | 61 + .../ispconfig/server/conf/error/br/403.html | 61 + .../ispconfig/server/conf/error/br/404.html | 61 + .../ispconfig/server/conf/error/br/405.html | 61 + .../ispconfig/server/conf/error/br/500.html | 61 + .../ispconfig/server/conf/error/br/503.html | 61 + .../ispconfig/server/conf/error/cz/400.html | 61 + .../ispconfig/server/conf/error/cz/401.html | 61 + .../ispconfig/server/conf/error/cz/403.html | 61 + .../ispconfig/server/conf/error/cz/404.html | 61 + .../ispconfig/server/conf/error/cz/405.html | 61 + .../ispconfig/server/conf/error/cz/500.html | 61 + .../ispconfig/server/conf/error/cz/503.html | 61 + .../ispconfig/server/conf/error/de/400.html | 61 + .../ispconfig/server/conf/error/de/401.html | 61 + .../ispconfig/server/conf/error/de/403.html | 61 + .../ispconfig/server/conf/error/de/404.html | 61 + .../ispconfig/server/conf/error/de/405.html | 61 + .../ispconfig/server/conf/error/de/500.html | 61 + .../ispconfig/server/conf/error/de/503.html | 62 + .../ispconfig/server/conf/error/en/400.html | 61 + .../ispconfig/server/conf/error/en/401.html | 61 + .../ispconfig/server/conf/error/en/403.html | 61 + .../ispconfig/server/conf/error/en/404.html | 61 + .../ispconfig/server/conf/error/en/405.html | 61 + .../ispconfig/server/conf/error/en/500.html | 61 + .../ispconfig/server/conf/error/en/503.html | 61 + .../ispconfig/server/conf/error/es/400.html | 61 + .../ispconfig/server/conf/error/es/401.html | 61 + .../ispconfig/server/conf/error/es/403.html | 61 + .../ispconfig/server/conf/error/es/404.html | 61 + .../ispconfig/server/conf/error/es/405.html | 61 + .../ispconfig/server/conf/error/es/500.html | 61 + .../ispconfig/server/conf/error/es/503.html | 61 + .../ispconfig/server/conf/error/fi/400.html | 61 + .../ispconfig/server/conf/error/fi/401.html | 61 + .../ispconfig/server/conf/error/fi/403.html | 61 + .../ispconfig/server/conf/error/fi/404.html | 61 + .../ispconfig/server/conf/error/fi/405.html | 61 + .../ispconfig/server/conf/error/fi/500.html | 61 + .../ispconfig/server/conf/error/fi/503.html | 61 + .../ispconfig/server/conf/error/fr/400.html | 61 + .../ispconfig/server/conf/error/fr/401.html | 61 + .../ispconfig/server/conf/error/fr/403.html | 61 + .../ispconfig/server/conf/error/fr/404.html | 61 + .../ispconfig/server/conf/error/fr/405.html | 61 + .../ispconfig/server/conf/error/fr/500.html | 61 + .../ispconfig/server/conf/error/fr/503.html | 61 + .../ispconfig/server/conf/error/gr/400.html | 61 + .../ispconfig/server/conf/error/gr/401.html | 61 + .../ispconfig/server/conf/error/gr/403.html | 61 + .../ispconfig/server/conf/error/gr/404.html | 61 + .../ispconfig/server/conf/error/gr/405.html | 61 + .../ispconfig/server/conf/error/gr/500.html | 61 + .../ispconfig/server/conf/error/gr/503.html | 61 + .../ispconfig/server/conf/error/hu/400.html | 61 + .../ispconfig/server/conf/error/hu/401.html | 61 + .../ispconfig/server/conf/error/hu/403.html | 61 + .../ispconfig/server/conf/error/hu/404.html | 61 + .../ispconfig/server/conf/error/hu/405.html | 61 + .../ispconfig/server/conf/error/hu/500.html | 61 + .../ispconfig/server/conf/error/hu/503.html | 61 + .../ispconfig/server/conf/error/it/400.html | 61 + .../ispconfig/server/conf/error/it/401.html | 61 + .../ispconfig/server/conf/error/it/403.html | 61 + .../ispconfig/server/conf/error/it/404.html | 61 + .../ispconfig/server/conf/error/it/405.html | 61 + .../ispconfig/server/conf/error/it/500.html | 61 + .../ispconfig/server/conf/error/it/503.html | 61 + .../ispconfig/server/conf/error/nl/400.html | 61 + .../ispconfig/server/conf/error/nl/401.html | 61 + .../ispconfig/server/conf/error/nl/403.html | 61 + .../ispconfig/server/conf/error/nl/404.html | 61 + .../ispconfig/server/conf/error/nl/405.html | 61 + .../ispconfig/server/conf/error/nl/500.html | 61 + .../ispconfig/server/conf/error/nl/503.html | 61 + .../ispconfig/server/conf/error/pl/400.html | 61 + .../ispconfig/server/conf/error/pl/401.html | 61 + .../ispconfig/server/conf/error/pl/403.html | 61 + .../ispconfig/server/conf/error/pl/404.html | 61 + .../ispconfig/server/conf/error/pl/405.html | 61 + .../ispconfig/server/conf/error/pl/500.html | 61 + .../ispconfig/server/conf/error/pl/503.html | 61 + .../ispconfig/server/conf/error/se/400.html | 61 + .../ispconfig/server/conf/error/se/401.html | 61 + .../ispconfig/server/conf/error/se/403.html | 61 + .../ispconfig/server/conf/error/se/404.html | 61 + .../ispconfig/server/conf/error/se/405.html | 61 + .../ispconfig/server/conf/error/se/500.html | 61 + .../ispconfig/server/conf/error/se/503.html | 61 + .../ispconfig/server/conf/error/si/400.html | 61 + .../ispconfig/server/conf/error/si/401.html | 61 + .../ispconfig/server/conf/error/si/403.html | 61 + .../ispconfig/server/conf/error/si/404.html | 61 + .../ispconfig/server/conf/error/si/405.html | 61 + .../ispconfig/server/conf/error/si/500.html | 61 + .../ispconfig/server/conf/error/si/503.html | 61 + .../ispconfig/server/conf/error/sr/400.html | 61 + .../ispconfig/server/conf/error/sr/401.html | 61 + .../ispconfig/server/conf/error/sr/403.html | 61 + .../ispconfig/server/conf/error/sr/404.html | 61 + .../ispconfig/server/conf/error/sr/405.html | 61 + .../ispconfig/server/conf/error/sr/500.html | 61 + .../ispconfig/server/conf/error/sr/503.html | 61 + .../conf/gentoo_network_interfaces.master | 13 + .../ispconfig/server/conf/getmail.conf.master | 16 + .../ispconfig/server/conf/index/.htaccess | 0 .../ispconfig/server/conf/index/favicon.ico | Bin 0 -> 1406 bytes .../ispconfig/server/conf/index/robots.txt | 2 + .../server/conf/index/standard_index.html_br | 60 + .../server/conf/index/standard_index.html_cz | 60 + .../server/conf/index/standard_index.html_de | 60 + .../server/conf/index/standard_index.html_en | 60 + .../server/conf/index/standard_index.html_es | 60 + .../server/conf/index/standard_index.html_fi | 60 + .../server/conf/index/standard_index.html_fr | 60 + .../server/conf/index/standard_index.html_gr | 60 + .../server/conf/index/standard_index.html_hu | 60 + .../server/conf/index/standard_index.html_it | 60 + .../server/conf/index/standard_index.html_nl | 60 + .../server/conf/index/standard_index.html_pl | 60 + .../server/conf/index/standard_index.html_se | 60 + .../server/conf/index/standard_index.html_sr | 60 + .../conf/index/user_standard_index.html_br | 60 + .../conf/index/user_standard_index.html_cz | 60 + .../conf/index/user_standard_index.html_de | 60 + .../conf/index/user_standard_index.html_en | 60 + .../conf/index/user_standard_index.html_es | 60 + .../conf/index/user_standard_index.html_fi | 60 + .../conf/index/user_standard_index.html_fr | 60 + .../conf/index/user_standard_index.html_gr | 60 + .../conf/index/user_standard_index.html_hu | 60 + .../conf/index/user_standard_index.html_it | 60 + .../conf/index/user_standard_index.html_nl | 60 + .../conf/index/user_standard_index.html_pl | 60 + .../conf/index/user_standard_index.html_se | 60 + .../conf/index/user_standard_index.html_sr | 60 + .../server/conf/mailfilter_move_junk.master | 19 + interface/ispconfig/server/conf/motd.master | 4 + .../server/conf/php-cgi-starter.master | 7 + .../server/conf/php-fcgi-starter.master | 16 + .../ispconfig/server/conf/sieve_filter.master | 30 + .../ispconfig/server/conf/vhost.conf.master | 350 + interface/ispconfig/server/cron_daily.php | 303 + interface/ispconfig/server/cron_daily.sh | 5 + interface/ispconfig/server/lib/app.inc.php | 181 + .../server/lib/classes/db_mysql.inc.php | 612 ++ .../ispconfig/server/lib/classes/file.inc.php | 319 + .../server/lib/classes/getconf.inc.php | 65 + .../server/lib/classes/ini_parser.inc.php | 69 + .../server/lib/classes/mod_mail_base.inc.php | 76 + .../server/lib/classes/modules.inc.php | 250 + .../server/lib/classes/plugins.inc.php | 130 + .../server/lib/classes/services.inc.php | 80 + .../server/lib/classes/system.inc.php | 1232 +++ .../ispconfig/server/lib/classes/tpl.inc.php | 1501 +++ .../server/lib/classes/tpl_cache.inc.php | 186 + .../server/lib/classes/tpl_error.inc.php | 92 + .../server/lib/classes/tpl_ini.inc.php | 116 + interface/ispconfig/server/lib/config.inc.php | 154 + .../ispconfig/server/lib/mysql_clientdb.conf | 7 + .../mods-available/client_module.inc.php | 96 + .../server/mods-available/cron_module.inc.php | 97 + .../mods-available/database_module.inc.php | 103 + .../server/mods-available/dns_module.inc.php | 128 + .../server/mods-available/mail_module.inc.php | 153 + .../monitor_core_module.inc.php | 1465 +++ .../mods-available/server_module.inc.php | 137 + .../server/mods-available/web_module.inc.php | 140 + .../mods-core/monitor_core_module.inc.php | 1465 +++ .../server/mods-enabled/client_module.inc.php | 96 + .../server/mods-enabled/cron_module.inc.php | 97 + .../mods-enabled/database_module.inc.php | 103 + .../server/mods-enabled/dns_module.inc.php | 128 + .../server/mods-enabled/mail_module.inc.php | 153 + .../mods-enabled/monitor_core_module.inc.php | 1465 +++ .../server/mods-enabled/server_module.inc.php | 137 + .../server/mods-enabled/web_module.inc.php | 140 + .../plugins-available/apache2_plugin.inc.php | 987 ++ .../apps_vhost_plugin.inc.php | 114 + .../plugins-available/bind_dlz_plugin.inc.php | 352 + .../plugins-available/bind_plugin.inc.php | 224 + .../cron_jailkit_plugin.inc.php | 328 + .../plugins-available/cron_plugin.inc.php | 239 + .../plugins-available/firewall_plugin.inc.php | 145 + .../ftpuser_base_plugin.inc.php | 112 + .../plugins-available/getmail_plugin.inc.php | 163 + .../plugins-available/mail_plugin.inc.php | 311 + .../maildeliver_plugin.inc.php | 131 + .../plugins-available/maildrop_plugin.inc.php | 240 + .../mysql_clientdb_plugin.inc.php | 305 + .../network_settings_plugin.inc.php | 289 + .../pma_symlink_plugin.inc.php | 121 + .../postfix_filter_plugin.inc.php | 153 + .../postfix_server_plugin.inc.php | 116 + .../plugins-available/powerdns_plugin.inc.php | 345 + .../shelluser_base_plugin.inc.php | 189 + .../shelluser_jailkit_plugin.inc.php | 303 + .../software_update_plugin.inc.php | 178 + .../webmail_symlink_plugin.inc.php | 121 + .../plugins-enabled/apache2_plugin.inc.php | 987 ++ .../plugins-enabled/apps_vhost_plugin.inc.php | 114 + .../cron_jailkit_plugin.inc.php | 328 + .../plugins-enabled/cron_plugin.inc.php | 239 + .../plugins-enabled/firewall_plugin.inc.php | 145 + .../ftpuser_base_plugin.inc.php | 112 + .../plugins-enabled/getmail_plugin.inc.php | 163 + .../plugins-enabled/mail_plugin.inc.php | 311 + .../maildeliver_plugin.inc.php | 131 + .../mysql_clientdb_plugin.inc.php | 305 + .../network_settings_plugin.inc.php | 289 + .../postfix_filter_plugin.inc.php | 153 + .../postfix_server_plugin.inc.php | 116 + .../shelluser_base_plugin.inc.php | 189 + .../shelluser_jailkit_plugin.inc.php | 303 + .../software_update_plugin.inc.php | 178 + .../server/scripts/create_jailkit_chroot.sh | 43 + .../server/scripts/create_jailkit_programs.sh | 20 + .../server/scripts/create_jailkit_user.sh | 33 + .../server/scripts/ispconfig_update.php | 109 + .../server/scripts/ispconfig_update.sh | 3 + .../server/scripts/update_from_svn.sh | 10 + .../server/scripts/update_from_tgz.sh | 22 + interface/ispconfig/server/scripts/vlogger | 574 ++ interface/ispconfig/server/server.php | 148 + interface/ispconfig/server/server.sh | 7 + .../ispconfig/vpproject/ispconfig.vpppath | 1 + 4526 files changed, 221119 insertions(+) create mode 100644 interface/ispconfig/interface/admin/firewall_del.php create mode 100644 interface/ispconfig/interface/admin/firewall_edit.php create mode 100644 interface/ispconfig/interface/admin/firewall_list.php create mode 100644 interface/ispconfig/interface/admin/form/dbsync.tform.php create mode 100644 interface/ispconfig/interface/admin/form/filesync.tform.php create mode 100644 interface/ispconfig/interface/admin/form/firewall.tform.php create mode 100644 interface/ispconfig/interface/admin/form/groups.tform.php create mode 100644 interface/ispconfig/interface/admin/form/remote_user.tform.php create mode 100644 interface/ispconfig/interface/admin/form/server.tform.php create mode 100644 interface/ispconfig/interface/admin/form/server_config.tform.php create mode 100644 interface/ispconfig/interface/admin/form/server_ip.tform.php create mode 100644 interface/ispconfig/interface/admin/form/software_repo.tform.php create mode 100644 interface/ispconfig/interface/admin/form/system_config.tform.php create mode 100644 interface/ispconfig/interface/admin/form/users.tform.php create mode 100644 interface/ispconfig/interface/admin/groups_del.php create mode 100644 interface/ispconfig/interface/admin/groups_edit.php create mode 100644 interface/ispconfig/interface/admin/groups_list.php create mode 100644 interface/ispconfig/interface/admin/index.php create mode 100644 interface/ispconfig/interface/admin/language_add.php create mode 100644 interface/ispconfig/interface/admin/language_complete.php create mode 100644 interface/ispconfig/interface/admin/language_edit.php create mode 100644 interface/ispconfig/interface/admin/language_export.php create mode 100644 interface/ispconfig/interface/admin/language_import.php create mode 100644 interface/ispconfig/interface/admin/language_list.php create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/bg_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/br_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/de_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/en_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/es_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fi_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/fr_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/hu_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/it_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ja_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/nl_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pl_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/pt_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ro_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/ru_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/se_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/sk_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_firewall.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_firewall_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_groups.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_groups_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_language_add.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_language_complete.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_language_edit.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_language_export.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_language_import.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_language_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_remote_user.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_remote_user_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_server.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_server_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_server_config_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_server_ip.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_server_ip_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_server_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_software_package_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_software_repo.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_software_repo_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_software_update_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_system_config.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_users.lng create mode 100644 interface/ispconfig/interface/admin/lib/lang/tr_users_list.lng create mode 100644 interface/ispconfig/interface/admin/lib/module.conf.php create mode 100644 interface/ispconfig/interface/admin/list/firewall.list.php create mode 100644 interface/ispconfig/interface/admin/list/groups.list.php create mode 100644 interface/ispconfig/interface/admin/list/remote_user.list.php create mode 100644 interface/ispconfig/interface/admin/list/server.list.php create mode 100644 interface/ispconfig/interface/admin/list/server_config.list.php create mode 100644 interface/ispconfig/interface/admin/list/server_ip.list.php create mode 100644 interface/ispconfig/interface/admin/list/software_repo.list.php create mode 100644 interface/ispconfig/interface/admin/list/users.list.php create mode 100644 interface/ispconfig/interface/admin/login_as.php create mode 100644 interface/ispconfig/interface/admin/remote_user_del.php create mode 100644 interface/ispconfig/interface/admin/remote_user_edit.php create mode 100644 interface/ispconfig/interface/admin/remote_user_list.php create mode 100644 interface/ispconfig/interface/admin/server_config_del.php create mode 100644 interface/ispconfig/interface/admin/server_config_edit.php create mode 100644 interface/ispconfig/interface/admin/server_config_list.php create mode 100644 interface/ispconfig/interface/admin/server_del.php create mode 100644 interface/ispconfig/interface/admin/server_edit.php create mode 100644 interface/ispconfig/interface/admin/server_ip_del.php create mode 100644 interface/ispconfig/interface/admin/server_ip_edit.php create mode 100644 interface/ispconfig/interface/admin/server_ip_list.php create mode 100644 interface/ispconfig/interface/admin/server_list.php create mode 100644 interface/ispconfig/interface/admin/software_package_list.php create mode 100644 interface/ispconfig/interface/admin/software_repo_del.php create mode 100644 interface/ispconfig/interface/admin/software_repo_edit.php create mode 100644 interface/ispconfig/interface/admin/software_repo_list.php create mode 100644 interface/ispconfig/interface/admin/software_update_list.php create mode 100644 interface/ispconfig/interface/admin/system_config_edit.php create mode 100644 interface/ispconfig/interface/admin/templates/firewall_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/firewall_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/groups_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/groups_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/language_add.htm create mode 100644 interface/ispconfig/interface/admin/templates/language_complete.htm create mode 100644 interface/ispconfig/interface/admin/templates/language_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/language_export.htm create mode 100644 interface/ispconfig/interface/admin/templates/language_import.htm create mode 100644 interface/ispconfig/interface/admin/templates/language_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/remote_user_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/remote_user_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_config_cron_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_config_dns_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_config_fastcgi_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_config_getmail_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_config_jailkit_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_config_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_config_mail_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_config_server_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_config_vlogger_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_config_web_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_edit_config.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_edit_services.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_ip_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_ip_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/server_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/software_package_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/software_repo_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/software_repo_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/software_update_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/system_config_mail_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/system_config_sites_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/users_groups_edit.htm create mode 100644 interface/ispconfig/interface/admin/templates/users_list.htm create mode 100644 interface/ispconfig/interface/admin/templates/users_user_edit.htm create mode 100644 interface/ispconfig/interface/admin/users_del.php create mode 100644 interface/ispconfig/interface/admin/users_edit.php create mode 100644 interface/ispconfig/interface/admin/users_list.php create mode 100644 interface/ispconfig/interface/capp.php create mode 100644 interface/ispconfig/interface/client/client_del.php create mode 100644 interface/ispconfig/interface/client/client_edit.php create mode 100644 interface/ispconfig/interface/client/client_list.php create mode 100644 interface/ispconfig/interface/client/client_template_del.php create mode 100644 interface/ispconfig/interface/client/client_template_edit.php create mode 100644 interface/ispconfig/interface/client/client_template_list.php create mode 100644 interface/ispconfig/interface/client/form/client.tform.php create mode 100644 interface/ispconfig/interface/client/form/client_template.tform.php create mode 100644 interface/ispconfig/interface/client/form/reseller.tform.php create mode 100644 interface/ispconfig/interface/client/lib/admin.conf.php create mode 100644 interface/ispconfig/interface/client/lib/lang/bg.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/bg_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/bg_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/bg_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/bg_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/bg_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/bg_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/bg_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/br.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/br_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/br_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/br_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/br_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/br_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/br_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/br_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/de.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/de_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/de_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/de_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/de_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/de_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/de_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/de_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/en.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/en_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/en_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/en_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/en_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/en_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/en_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/en_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/es.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/es_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/es_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/es_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/es_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/es_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/es_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/es_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fi.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fi_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fi_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fi_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fi_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fi_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fi_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fi_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fr.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fr_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fr_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fr_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fr_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fr_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fr_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/fr_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/hu.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/hu_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/hu_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/hu_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/hu_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/hu_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/hu_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/hu_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/it.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/it_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/it_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/it_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/it_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/it_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/it_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/it_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ja.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ja_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ja_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ja_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ja_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ja_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ja_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ja_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/nl.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/nl_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/nl_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/nl_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/nl_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/nl_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/nl_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/nl_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pl.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pl_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pl_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pl_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pl_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pl_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pl_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pl_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pt.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pt_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pt_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pt_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pt_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pt_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pt_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/pt_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ro.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ro_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ro_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ro_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ro_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ro_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ro_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ro_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ru.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ru_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ru_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ru_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ru_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ru_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ru_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/ru_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/se.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/se_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/se_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/se_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/se_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/se_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/se_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/se_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/sk.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/sk_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/sk_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/sk_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/sk_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/sk_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/sk_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/sk_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/tr.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/tr_client.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/tr_client_del.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/tr_client_template.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/tr_client_template_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/tr_clients_list.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/tr_reseller.lng create mode 100644 interface/ispconfig/interface/client/lib/lang/tr_resellers_list.lng create mode 100644 interface/ispconfig/interface/client/lib/module.conf.php create mode 100644 interface/ispconfig/interface/client/list/client.list.php create mode 100644 interface/ispconfig/interface/client/list/client_template.list.php create mode 100644 interface/ispconfig/interface/client/list/reseller.list.php create mode 100644 interface/ispconfig/interface/client/reseller_del.php create mode 100644 interface/ispconfig/interface/client/reseller_edit.php create mode 100644 interface/ispconfig/interface/client/reseller_list.php create mode 100644 interface/ispconfig/interface/client/templates/client_del.htm create mode 100644 interface/ispconfig/interface/client/templates/client_edit_address.htm create mode 100644 interface/ispconfig/interface/client/templates/client_edit_limits.htm create mode 100644 interface/ispconfig/interface/client/templates/client_template_edit_limits.htm create mode 100644 interface/ispconfig/interface/client/templates/client_template_edit_template.htm create mode 100644 interface/ispconfig/interface/client/templates/client_template_list.htm create mode 100644 interface/ispconfig/interface/client/templates/clients_list.htm create mode 100644 interface/ispconfig/interface/client/templates/reseller_edit_address.htm create mode 100644 interface/ispconfig/interface/client/templates/reseller_edit_limits.htm create mode 100644 interface/ispconfig/interface/client/templates/resellers_list.htm create mode 100644 interface/ispconfig/interface/client/tools.inc.php create mode 100644 interface/ispconfig/interface/content.php create mode 100644 interface/ispconfig/interface/designer/form_edit.php create mode 100644 interface/ispconfig/interface/designer/form_list.php create mode 100644 interface/ispconfig/interface/designer/form_show.php create mode 100644 interface/ispconfig/interface/designer/index.php create mode 100644 interface/ispconfig/interface/designer/lib/admin.conf.php create mode 100644 interface/ispconfig/interface/designer/lib/lang/bg.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/bg_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/bg_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/bg_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/bg_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/bg_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/bg_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/bg_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/bg_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/br.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/br_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/br_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/br_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/br_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/br_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/br_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/br_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/br_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/de.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/de_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/de_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/de_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/de_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/de_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/de_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/de_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/de_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/en.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/en_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/en_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/en_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/en_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/en_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/en_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/en_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/en_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/es.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/es_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/es_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/es_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/es_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/es_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/es_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/es_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/es_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fi.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fi_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fi_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fi_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fi_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fi_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fi_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fi_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fi_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fr.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fr_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fr_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fr_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fr_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fr_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fr_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fr_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/fr_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/hu.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/hu_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/hu_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/hu_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/hu_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/hu_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/hu_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/hu_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/hu_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/it.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/it_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/it_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/it_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/it_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/it_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/it_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/it_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/it_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ja.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ja_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ja_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ja_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ja_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ja_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ja_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ja_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ja_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/nl.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/nl_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/nl_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/nl_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/nl_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/nl_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/nl_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/nl_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/nl_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pl.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pl_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pl_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pl_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pl_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pl_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pl_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pl_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pl_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pt.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pt_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pt_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pt_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pt_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pt_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pt_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pt_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/pt_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ro.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ro_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ro_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ro_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ro_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ro_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ro_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ro_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ro_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ru.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ru_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ru_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ru_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ru_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ru_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ru_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ru_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/ru_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/se.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/se_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/se_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/se_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/se_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/se_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/se_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/se_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/se_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/sk.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/sk_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/sk_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/sk_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/sk_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/sk_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/sk_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/sk_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/sk_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/tr.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/tr_form_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/tr_form_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/tr_form_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/tr_module_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/tr_module_list.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/tr_module_nav_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/tr_module_nav_item_edit.lng create mode 100644 interface/ispconfig/interface/designer/lib/lang/tr_module_show.lng create mode 100644 interface/ispconfig/interface/designer/lib/module.conf.php create mode 100644 interface/ispconfig/interface/designer/module_edit.php create mode 100644 interface/ispconfig/interface/designer/module_list.php create mode 100644 interface/ispconfig/interface/designer/module_nav_del.php create mode 100644 interface/ispconfig/interface/designer/module_nav_edit.php create mode 100644 interface/ispconfig/interface/designer/module_nav_flip.php create mode 100644 interface/ispconfig/interface/designer/module_nav_item_del.php create mode 100644 interface/ispconfig/interface/designer/module_nav_item_edit.php create mode 100644 interface/ispconfig/interface/designer/module_nav_item_flip.php create mode 100644 interface/ispconfig/interface/designer/module_show.php create mode 100644 interface/ispconfig/interface/designer/templates/form_edit.htm create mode 100644 interface/ispconfig/interface/designer/templates/form_list.htm create mode 100644 interface/ispconfig/interface/designer/templates/form_show.htm create mode 100644 interface/ispconfig/interface/designer/templates/module_edit.htm create mode 100644 interface/ispconfig/interface/designer/templates/module_list.htm create mode 100644 interface/ispconfig/interface/designer/templates/module_nav_edit.htm create mode 100644 interface/ispconfig/interface/designer/templates/module_nav_item_edit.htm create mode 100644 interface/ispconfig/interface/designer/templates/module_show.htm create mode 100644 interface/ispconfig/interface/designer/templates/paging.tpl.htm create mode 100644 interface/ispconfig/interface/dns/dns_a_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_a_list.php create mode 100644 interface/ispconfig/interface/dns/dns_aaaa_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_alias_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_cname_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_hinfo_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_mx_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_ns_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_ptr_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_rp_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_rr_del.php create mode 100644 interface/ispconfig/interface/dns/dns_soa_del.php create mode 100644 interface/ispconfig/interface/dns/dns_soa_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_soa_list.php create mode 100644 interface/ispconfig/interface/dns/dns_srv_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_template_del.php create mode 100644 interface/ispconfig/interface/dns/dns_template_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_template_list.php create mode 100644 interface/ispconfig/interface/dns/dns_txt_edit.php create mode 100644 interface/ispconfig/interface/dns/dns_wizard.php create mode 100644 interface/ispconfig/interface/dns/form/dns_a.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_aaaa.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_alias.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_cname.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_hinfo.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_mx.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_ns.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_ptr.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_rp.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_soa.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_srv.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_template.tform.php create mode 100644 interface/ispconfig/interface/dns/form/dns_txt.tform.php create mode 100644 interface/ispconfig/interface/dns/lib/admin.conf.php create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/bg_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/br_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/de_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/en_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/es_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fi_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/fr_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/hu_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/it_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ja_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/nl_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pl_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/pt_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ro_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/ru_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/se_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/sk_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_a.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_a_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_aaaa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_alias.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_cname.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_hinfo.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_mx.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_ns.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_ptr.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_rp.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_soa.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_soa_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_srv.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_template.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_template_list.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_txt.lng create mode 100644 interface/ispconfig/interface/dns/lib/lang/tr_dns_wizard.lng create mode 100644 interface/ispconfig/interface/dns/lib/module.conf.php create mode 100644 interface/ispconfig/interface/dns/list/dns_a.list.php create mode 100644 interface/ispconfig/interface/dns/list/dns_soa.list.php create mode 100644 interface/ispconfig/interface/dns/list/dns_template.list.php create mode 100644 interface/ispconfig/interface/dns/templates/dns_a_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_a_list.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_aaaa_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_alias_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_cname_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_hinfo_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_mx_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_ns_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_ptr_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_records_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_rp_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_soa_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_soa_list.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_srv_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_template_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_template_list.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_txt_edit.htm create mode 100644 interface/ispconfig/interface/dns/templates/dns_wizard.htm create mode 100644 interface/ispconfig/interface/help/form/support_message.tform.php create mode 100644 interface/ispconfig/interface/help/index.php create mode 100644 interface/ispconfig/interface/help/lib/admin.conf.php create mode 100644 interface/ispconfig/interface/help/lib/lang/bg.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/bg_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/bg_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/br.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/br_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/br_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/de.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/de_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/de_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/en.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/en_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/en_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/es.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/es_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/es_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/fi.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/fi_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/fi_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/fr.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/fr_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/fr_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/hu.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/hu_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/hu_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/it.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/it_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/it_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/ja.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/ja_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/ja_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/nl.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/nl_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/nl_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/pl.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/pl_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/pl_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/pt.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/pt_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/pt_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/ro.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/ro_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/ro_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/ru.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/ru_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/ru_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/se.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/se_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/se_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/sk.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/sk_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/sk_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/tr.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/tr_support_message.lng create mode 100644 interface/ispconfig/interface/help/lib/lang/tr_support_message_list.lng create mode 100644 interface/ispconfig/interface/help/lib/module.conf.php create mode 100644 interface/ispconfig/interface/help/list/support_message.list.php create mode 100644 interface/ispconfig/interface/help/support_message_del.php create mode 100644 interface/ispconfig/interface/help/support_message_edit.php create mode 100644 interface/ispconfig/interface/help/support_message_list.php create mode 100644 interface/ispconfig/interface/help/templates/support_message_edit.htm create mode 100644 interface/ispconfig/interface/help/templates/support_message_list.htm create mode 100644 interface/ispconfig/interface/help/templates/support_message_view.htm create mode 100644 interface/ispconfig/interface/help/version.php create mode 100644 interface/ispconfig/interface/index.htm create mode 100644 interface/ispconfig/interface/index.php create mode 100644 interface/ispconfig/interface/js/scrigo.js.php create mode 100644 interface/ispconfig/interface/js/uni-form/jquery.js create mode 100644 interface/ispconfig/interface/js/uni-form/uni-form.jquery.js create mode 100644 interface/ispconfig/interface/js/yui/animation/README create mode 100644 interface/ispconfig/interface/js/yui/animation/animation-debug.js create mode 100644 interface/ispconfig/interface/js/yui/animation/animation-min.js create mode 100644 interface/ispconfig/interface/js/yui/animation/animation.js create mode 100644 interface/ispconfig/interface/js/yui/autocomplete/README create mode 100644 interface/ispconfig/interface/js/yui/autocomplete/autocomplete-debug.js create mode 100644 interface/ispconfig/interface/js/yui/autocomplete/autocomplete-min.js create mode 100644 interface/ispconfig/interface/js/yui/autocomplete/autocomplete.js create mode 100644 interface/ispconfig/interface/js/yui/button/README create mode 100644 interface/ispconfig/interface/js/yui/button/assets/background.png create mode 100644 interface/ispconfig/interface/js/yui/button/assets/button.css create mode 100644 interface/ispconfig/interface/js/yui/button/assets/menuarrow.gif create mode 100644 interface/ispconfig/interface/js/yui/button/assets/splitarrow.gif create mode 100644 interface/ispconfig/interface/js/yui/button/assets/splitarrow_active.gif create mode 100644 interface/ispconfig/interface/js/yui/button/button-beta-debug.js create mode 100644 interface/ispconfig/interface/js/yui/button/button-beta-min.js create mode 100644 interface/ispconfig/interface/js/yui/button/button-beta.js create mode 100644 interface/ispconfig/interface/js/yui/calendar/README create mode 100644 interface/ispconfig/interface/js/yui/calendar/assets/calendar.css create mode 100644 interface/ispconfig/interface/js/yui/calendar/assets/callt.gif create mode 100644 interface/ispconfig/interface/js/yui/calendar/assets/calrt.gif create mode 100644 interface/ispconfig/interface/js/yui/calendar/assets/calx.gif create mode 100644 interface/ispconfig/interface/js/yui/calendar/calendar-debug.js create mode 100644 interface/ispconfig/interface/js/yui/calendar/calendar-min.js create mode 100644 interface/ispconfig/interface/js/yui/calendar/calendar.js create mode 100644 interface/ispconfig/interface/js/yui/connection/README create mode 100644 interface/ispconfig/interface/js/yui/connection/connection-debug.js create mode 100644 interface/ispconfig/interface/js/yui/connection/connection-min.js create mode 100644 interface/ispconfig/interface/js/yui/connection/connection.js create mode 100644 interface/ispconfig/interface/js/yui/container/README create mode 100644 interface/ispconfig/interface/js/yui/container/assets/alrt16_1.gif create mode 100644 interface/ispconfig/interface/js/yui/container/assets/blck16_1.gif create mode 100644 interface/ispconfig/interface/js/yui/container/assets/close12_1.gif create mode 100644 interface/ispconfig/interface/js/yui/container/assets/container.css create mode 100644 interface/ispconfig/interface/js/yui/container/assets/hlp16_1.gif create mode 100644 interface/ispconfig/interface/js/yui/container/assets/info16_1.gif create mode 100644 interface/ispconfig/interface/js/yui/container/assets/tip16_1.gif create mode 100644 interface/ispconfig/interface/js/yui/container/assets/warn16_1.gif create mode 100644 interface/ispconfig/interface/js/yui/container/container-debug.js create mode 100644 interface/ispconfig/interface/js/yui/container/container-min.js create mode 100644 interface/ispconfig/interface/js/yui/container/container.js create mode 100644 interface/ispconfig/interface/js/yui/container/container_core-debug.js create mode 100644 interface/ispconfig/interface/js/yui/container/container_core-min.js create mode 100644 interface/ispconfig/interface/js/yui/container/container_core.js create mode 100644 interface/ispconfig/interface/js/yui/datasource/README create mode 100644 interface/ispconfig/interface/js/yui/datasource/datasource-beta-debug.js create mode 100644 interface/ispconfig/interface/js/yui/datasource/datasource-beta-min.js create mode 100644 interface/ispconfig/interface/js/yui/datasource/datasource-beta.js create mode 100644 interface/ispconfig/interface/js/yui/datatable/README create mode 100644 interface/ispconfig/interface/js/yui/datatable/assets/datatable.css create mode 100644 interface/ispconfig/interface/js/yui/datatable/datatable-beta-debug.js create mode 100644 interface/ispconfig/interface/js/yui/datatable/datatable-beta-min.js create mode 100644 interface/ispconfig/interface/js/yui/datatable/datatable-beta.js create mode 100644 interface/ispconfig/interface/js/yui/dom/README create mode 100644 interface/ispconfig/interface/js/yui/dom/dom-debug.js create mode 100644 interface/ispconfig/interface/js/yui/dom/dom-min.js create mode 100644 interface/ispconfig/interface/js/yui/dom/dom.js create mode 100644 interface/ispconfig/interface/js/yui/dragdrop/README create mode 100644 interface/ispconfig/interface/js/yui/dragdrop/dragdrop-debug.js create mode 100644 interface/ispconfig/interface/js/yui/dragdrop/dragdrop-min.js create mode 100644 interface/ispconfig/interface/js/yui/dragdrop/dragdrop.js create mode 100644 interface/ispconfig/interface/js/yui/element/README create mode 100644 interface/ispconfig/interface/js/yui/element/element-beta-debug.js create mode 100644 interface/ispconfig/interface/js/yui/element/element-beta-min.js create mode 100644 interface/ispconfig/interface/js/yui/element/element-beta.js create mode 100644 interface/ispconfig/interface/js/yui/event/README create mode 100644 interface/ispconfig/interface/js/yui/event/event-debug.js create mode 100644 interface/ispconfig/interface/js/yui/event/event-min.js create mode 100644 interface/ispconfig/interface/js/yui/event/event.js create mode 100644 interface/ispconfig/interface/js/yui/fonts/README create mode 100644 interface/ispconfig/interface/js/yui/fonts/fonts-min.css create mode 100644 interface/ispconfig/interface/js/yui/fonts/fonts.css create mode 100644 interface/ispconfig/interface/js/yui/grids/README create mode 100644 interface/ispconfig/interface/js/yui/grids/grids-min.css create mode 100644 interface/ispconfig/interface/js/yui/grids/grids.css create mode 100644 interface/ispconfig/interface/js/yui/history/README create mode 100644 interface/ispconfig/interface/js/yui/history/assets/blank.html create mode 100644 interface/ispconfig/interface/js/yui/history/history-experimental-debug.js create mode 100644 interface/ispconfig/interface/js/yui/history/history-experimental-min.js create mode 100644 interface/ispconfig/interface/js/yui/history/history-experimental.js create mode 100644 interface/ispconfig/interface/js/yui/logger/README create mode 100644 interface/ispconfig/interface/js/yui/logger/assets/logger.css create mode 100644 interface/ispconfig/interface/js/yui/logger/logger-debug.js create mode 100644 interface/ispconfig/interface/js/yui/logger/logger-min.js create mode 100644 interface/ispconfig/interface/js/yui/logger/logger.js create mode 100644 interface/ispconfig/interface/js/yui/menu/README create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/map.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menu.css create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_dim_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_hov_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_nrm_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_dim_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_hov_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuarorght8_nrm_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuaroup8_dim_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuaroup8_nrm_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuchk8_dim_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuchk8_hov_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/assets/menuchk8_nrm_1.gif create mode 100644 interface/ispconfig/interface/js/yui/menu/menu-debug.js create mode 100644 interface/ispconfig/interface/js/yui/menu/menu-min.js create mode 100644 interface/ispconfig/interface/js/yui/menu/menu.js create mode 100644 interface/ispconfig/interface/js/yui/reset-fonts-grids/README create mode 100644 interface/ispconfig/interface/js/yui/reset-fonts-grids/reset-fonts-grids.css create mode 100644 interface/ispconfig/interface/js/yui/reset/README create mode 100644 interface/ispconfig/interface/js/yui/reset/reset-min.css create mode 100644 interface/ispconfig/interface/js/yui/reset/reset.css create mode 100644 interface/ispconfig/interface/js/yui/slider/README create mode 100644 interface/ispconfig/interface/js/yui/slider/slider-debug.js create mode 100644 interface/ispconfig/interface/js/yui/slider/slider-min.js create mode 100644 interface/ispconfig/interface/js/yui/slider/slider.js create mode 100644 interface/ispconfig/interface/js/yui/tabview/README create mode 100644 interface/ispconfig/interface/js/yui/tabview/assets/border_tabs.css create mode 100644 interface/ispconfig/interface/js/yui/tabview/assets/tabview.css create mode 100644 interface/ispconfig/interface/js/yui/tabview/tabview-debug.js create mode 100644 interface/ispconfig/interface/js/yui/tabview/tabview-min.js create mode 100644 interface/ispconfig/interface/js/yui/tabview/tabview.js create mode 100644 interface/ispconfig/interface/js/yui/treeview/README create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/lm.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/lmh.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/ln.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/loading.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/lp.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/lph.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/tm.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/tmh.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/tn.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/tp.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/tph.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/tree.css create mode 100644 interface/ispconfig/interface/js/yui/treeview/assets/vline.gif create mode 100644 interface/ispconfig/interface/js/yui/treeview/treeview-debug.js create mode 100644 interface/ispconfig/interface/js/yui/treeview/treeview-min.js create mode 100644 interface/ispconfig/interface/js/yui/treeview/treeview.js create mode 100644 interface/ispconfig/interface/js/yui/utilities/README create mode 100644 interface/ispconfig/interface/js/yui/utilities/utilities.js create mode 100644 interface/ispconfig/interface/js/yui/yahoo-dom-event/README create mode 100644 interface/ispconfig/interface/js/yui/yahoo-dom-event/yahoo-dom-event.js create mode 100644 interface/ispconfig/interface/js/yui/yahoo/README create mode 100644 interface/ispconfig/interface/js/yui/yahoo/yahoo-debug.js create mode 100644 interface/ispconfig/interface/js/yui/yahoo/yahoo-min.js create mode 100644 interface/ispconfig/interface/js/yui/yahoo/yahoo.js create mode 100644 interface/ispconfig/interface/keepalive.php create mode 100644 interface/ispconfig/interface/login/index.php create mode 100644 interface/ispconfig/interface/login/lib/lang/bg.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/br.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/de.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/en.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/es.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/fi.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/fr.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/hu.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/it.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/ja.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/nl.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/pl.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/pt.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/ro.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/ru.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/se.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/sk.lng create mode 100644 interface/ispconfig/interface/login/lib/lang/tr.lng create mode 100644 interface/ispconfig/interface/login/lib/module.conf.php create mode 100644 interface/ispconfig/interface/login/logout.php create mode 100644 interface/ispconfig/interface/login/password_reset.php create mode 100644 interface/ispconfig/interface/login/templates/index.htm create mode 100644 interface/ispconfig/interface/login/templates/password_reset.htm create mode 100644 interface/ispconfig/interface/mail/form/mail_alias.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_aliasdomain.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_blacklist.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_content_filter.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_domain.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_domain_catchall.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_forward.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_get.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_relay_recipient.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_spamfilter.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_transport.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_user.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_user.tform.php.orig create mode 100644 interface/ispconfig/interface/mail/form/mail_user_filter.tform.php create mode 100644 interface/ispconfig/interface/mail/form/mail_user_filter.tform.php.orig create mode 100644 interface/ispconfig/interface/mail/form/mail_whitelist.tform.php create mode 100644 interface/ispconfig/interface/mail/form/spamfilter_blacklist.tform.php create mode 100644 interface/ispconfig/interface/mail/form/spamfilter_config.tform.php create mode 100644 interface/ispconfig/interface/mail/form/spamfilter_policy.tform.php create mode 100644 interface/ispconfig/interface/mail/form/spamfilter_users.tform.php create mode 100644 interface/ispconfig/interface/mail/form/spamfilter_whitelist.tform.php create mode 100644 interface/ispconfig/interface/mail/lib/admin.conf.php create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_alias.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_alias_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_domain.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_forward.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_forward_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_get.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_get_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_transport.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_transport_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_user.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_user_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_user_stats_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist.lng create mode 100644 interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist_list.lng create mode 100644 interface/ispconfig/interface/mail/lib/module.conf.php create mode 100644 interface/ispconfig/interface/mail/list/mail_alias.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_aliasdomain.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_blacklist.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_content_filter.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_domain.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_domain_catchall.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_forward.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_get.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_relay_recipient.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_spamfilter.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_transport.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_user.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_user_filter.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_user_stats.list.php create mode 100644 interface/ispconfig/interface/mail/list/mail_whitelist.list.php create mode 100644 interface/ispconfig/interface/mail/list/spamfilter_blacklist.list.php create mode 100644 interface/ispconfig/interface/mail/list/spamfilter_config.list.php create mode 100644 interface/ispconfig/interface/mail/list/spamfilter_policy.list.php create mode 100644 interface/ispconfig/interface/mail/list/spamfilter_users.list.php create mode 100644 interface/ispconfig/interface/mail/list/spamfilter_whitelist.list.php create mode 100644 interface/ispconfig/interface/mail/mail_alias_del.php create mode 100644 interface/ispconfig/interface/mail/mail_alias_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_alias_list.php create mode 100644 interface/ispconfig/interface/mail/mail_aliasdomain_del.php create mode 100644 interface/ispconfig/interface/mail/mail_aliasdomain_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_aliasdomain_list.php create mode 100644 interface/ispconfig/interface/mail/mail_blacklist_del.php create mode 100644 interface/ispconfig/interface/mail/mail_blacklist_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_blacklist_list.php create mode 100644 interface/ispconfig/interface/mail/mail_content_filter_del.php create mode 100644 interface/ispconfig/interface/mail/mail_content_filter_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_content_filter_list.php create mode 100644 interface/ispconfig/interface/mail/mail_domain_catchall_del.php create mode 100644 interface/ispconfig/interface/mail/mail_domain_catchall_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_domain_catchall_list.php create mode 100644 interface/ispconfig/interface/mail/mail_domain_del.php create mode 100644 interface/ispconfig/interface/mail/mail_domain_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_domain_list.php create mode 100644 interface/ispconfig/interface/mail/mail_forward_del.php create mode 100644 interface/ispconfig/interface/mail/mail_forward_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_forward_list.php create mode 100644 interface/ispconfig/interface/mail/mail_get_del.php create mode 100644 interface/ispconfig/interface/mail/mail_get_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_get_list.php create mode 100644 interface/ispconfig/interface/mail/mail_relay_recipient_del.php create mode 100644 interface/ispconfig/interface/mail/mail_relay_recipient_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_relay_recipient_list.php create mode 100644 interface/ispconfig/interface/mail/mail_spamfilter_del.php create mode 100644 interface/ispconfig/interface/mail/mail_spamfilter_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_spamfilter_list.php create mode 100644 interface/ispconfig/interface/mail/mail_transport_del.php create mode 100644 interface/ispconfig/interface/mail/mail_transport_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_transport_list.php create mode 100644 interface/ispconfig/interface/mail/mail_user_del.php create mode 100644 interface/ispconfig/interface/mail/mail_user_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_user_filter_del.php create mode 100644 interface/ispconfig/interface/mail/mail_user_filter_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_user_list.php create mode 100644 interface/ispconfig/interface/mail/mail_user_stats.php create mode 100644 interface/ispconfig/interface/mail/mail_whitelist_del.php create mode 100644 interface/ispconfig/interface/mail/mail_whitelist_edit.php create mode 100644 interface/ispconfig/interface/mail/mail_whitelist_list.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_blacklist_del.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_blacklist_edit.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_blacklist_list.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_config_del.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_config_edit.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_config_list.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_policy_del.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_policy_edit.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_policy_list.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_users_del.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_users_edit.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_users_list.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_whitelist_del.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_whitelist_edit.php create mode 100644 interface/ispconfig/interface/mail/spamfilter_whitelist_list.php create mode 100644 interface/ispconfig/interface/mail/templates/mail_alias_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_alias_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_aliasdomain_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_aliasdomain_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_blacklist_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_blacklist_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_content_filter_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_content_filter_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_domain_catchall_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_domain_catchall_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_domain_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_domain_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_forward_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_forward_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_get_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_get_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_relay_recipient_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_relay_recipient_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_transport_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_transport_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_user_autoresponder_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_user_custom_rules_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_user_filter_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_user_filter_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_user_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_user_mailbox_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_user_mailfilter_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_user_stats_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_whitelist_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/mail_whitelist_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_blacklist_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_blacklist_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_config_getmail_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_config_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_config_mail_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_config_server_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_other_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_policy_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_policy_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_quarantine_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_taglevel_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_users_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_users_list.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_whitelist_edit.htm create mode 100644 interface/ispconfig/interface/mail/templates/spamfilter_whitelist_list.htm create mode 100644 interface/ispconfig/interface/mail/webmailer.php create mode 100644 interface/ispconfig/interface/monitor/datalog_del.php create mode 100644 interface/ispconfig/interface/monitor/datalog_list.php create mode 100644 interface/ispconfig/interface/monitor/lib/admin.conf.php create mode 100644 interface/ispconfig/interface/monitor/lib/lang/bg.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/bg_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/bg_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/br.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/br_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/br_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/de.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/de_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/de_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/en.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/en_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/en_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/es.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/es_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/es_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/fi.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/fi_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/fi_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/fr.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/fr_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/fr_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/hu.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/hu_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/hu_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/it.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/it_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/it_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/ja.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/ja_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/ja_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/nl.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/nl_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/nl_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/pl.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/pl_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/pl_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/pt.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/pt_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/pt_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/ro.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/ro_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/ro_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/ru.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/ru_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/ru_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/se.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/se_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/se_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/sk.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/sk_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/sk_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/tr.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/tr_datalog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/lang/tr_syslog_list.lng create mode 100644 interface/ispconfig/interface/monitor/lib/module.conf.php create mode 100644 interface/ispconfig/interface/monitor/list/datalog.list.php create mode 100644 interface/ispconfig/interface/monitor/list/log.list.php create mode 100644 interface/ispconfig/interface/monitor/log_del.php create mode 100644 interface/ispconfig/interface/monitor/log_list.php create mode 100644 interface/ispconfig/interface/monitor/show_data.php create mode 100644 interface/ispconfig/interface/monitor/show_log.php create mode 100644 interface/ispconfig/interface/monitor/show_sys_state.php create mode 100644 interface/ispconfig/interface/monitor/templates/datalog_list.htm create mode 100644 interface/ispconfig/interface/monitor/templates/show_data.htm create mode 100644 interface/ispconfig/interface/monitor/templates/show_log.htm create mode 100644 interface/ispconfig/interface/monitor/templates/show_sys_state.htm create mode 100644 interface/ispconfig/interface/monitor/templates/syslog_list.htm create mode 100644 interface/ispconfig/interface/monitor/tools.inc.php create mode 100644 interface/ispconfig/interface/mymodule/form/support_message.tform.php create mode 100644 interface/ispconfig/interface/mymodule/lib/admin.conf.php create mode 100644 interface/ispconfig/interface/mymodule/lib/mymodule.config.php create mode 100644 interface/ispconfig/interface/mymodule/list/support_message.list.php create mode 100644 interface/ispconfig/interface/mymodule/support_message_del.php create mode 100644 interface/ispconfig/interface/mymodule/support_message_edit.php create mode 100644 interface/ispconfig/interface/mymodule/support_message_list.php create mode 100644 interface/ispconfig/interface/mymodule/templates/support_message_edit.html create mode 100644 interface/ispconfig/interface/mymodule/templates/support_message_view.html create mode 100644 interface/ispconfig/interface/nav.php create mode 100644 interface/ispconfig/interface/remote/index.php create mode 100644 interface/ispconfig/interface/robots.txt create mode 100644 interface/ispconfig/interface/sites/ajax_get_ip.php create mode 100644 interface/ispconfig/interface/sites/cron_del.php create mode 100644 interface/ispconfig/interface/sites/cron_edit.php create mode 100644 interface/ispconfig/interface/sites/cron_list.php create mode 100644 interface/ispconfig/interface/sites/database_del.php create mode 100644 interface/ispconfig/interface/sites/database_edit.php create mode 100644 interface/ispconfig/interface/sites/database_list.php create mode 100644 interface/ispconfig/interface/sites/database_phpmyadmin.php create mode 100644 interface/ispconfig/interface/sites/form/cron.tform.php create mode 100644 interface/ispconfig/interface/sites/form/database.tform.php create mode 100644 interface/ispconfig/interface/sites/form/ftp_user.tform.php create mode 100644 interface/ispconfig/interface/sites/form/shell_user.tform.php create mode 100644 interface/ispconfig/interface/sites/form/web_aliasdomain.tform.php create mode 100644 interface/ispconfig/interface/sites/form/web_domain.tform.php create mode 100644 interface/ispconfig/interface/sites/form/web_subdomain.tform.php create mode 100644 interface/ispconfig/interface/sites/ftp_user_del.php create mode 100644 interface/ispconfig/interface/sites/ftp_user_edit.php create mode 100644 interface/ispconfig/interface/sites/ftp_user_list.php create mode 100644 interface/ispconfig/interface/sites/lib/admin.conf.php create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/br_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/de_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/en_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/es_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/it_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/se_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_cron.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_cron_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_database.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_database_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_ftp_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_ftp_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_shell_user.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_shell_user_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_web_aliasdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_web_domain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_web_domain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_web_sites_stats_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain.lng create mode 100644 interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain_list.lng create mode 100644 interface/ispconfig/interface/sites/lib/module.conf.php create mode 100644 interface/ispconfig/interface/sites/list/cron.list.php create mode 100644 interface/ispconfig/interface/sites/list/database.list.php create mode 100644 interface/ispconfig/interface/sites/list/ftp_user.list.php create mode 100644 interface/ispconfig/interface/sites/list/shell_user.list.php create mode 100644 interface/ispconfig/interface/sites/list/web_aliasdomain.list.php create mode 100644 interface/ispconfig/interface/sites/list/web_domain.list.php create mode 100644 interface/ispconfig/interface/sites/list/web_sites_stats.list.php create mode 100644 interface/ispconfig/interface/sites/list/web_subdomain.list.php create mode 100644 interface/ispconfig/interface/sites/shell_user_del.php create mode 100644 interface/ispconfig/interface/sites/shell_user_edit.php create mode 100644 interface/ispconfig/interface/sites/shell_user_list.php create mode 100644 interface/ispconfig/interface/sites/templates/cron_edit.htm create mode 100644 interface/ispconfig/interface/sites/templates/cron_list.htm create mode 100644 interface/ispconfig/interface/sites/templates/database_edit.htm create mode 100644 interface/ispconfig/interface/sites/templates/database_list.htm create mode 100644 interface/ispconfig/interface/sites/templates/ftp_user_advanced.htm create mode 100644 interface/ispconfig/interface/sites/templates/ftp_user_advanced_client.htm create mode 100644 interface/ispconfig/interface/sites/templates/ftp_user_edit.htm create mode 100644 interface/ispconfig/interface/sites/templates/ftp_user_list.htm create mode 100644 interface/ispconfig/interface/sites/templates/shell_user_advanced.htm create mode 100644 interface/ispconfig/interface/sites/templates/shell_user_edit.htm create mode 100644 interface/ispconfig/interface/sites/templates/shell_user_list.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_aliasdomain_edit.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_aliasdomain_list.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_domain_advanced.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_domain_edit.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_domain_list.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_domain_redirect.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_domain_ssl.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_domain_stats.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_sites_stats_list.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_subdomain_edit.htm create mode 100644 interface/ispconfig/interface/sites/templates/web_subdomain_list.htm create mode 100644 interface/ispconfig/interface/sites/tools.inc.php create mode 100644 interface/ispconfig/interface/sites/web_aliasdomain_del.php create mode 100644 interface/ispconfig/interface/sites/web_aliasdomain_edit.php create mode 100644 interface/ispconfig/interface/sites/web_aliasdomain_list.php create mode 100644 interface/ispconfig/interface/sites/web_domain_del.php create mode 100644 interface/ispconfig/interface/sites/web_domain_edit.php create mode 100644 interface/ispconfig/interface/sites/web_domain_list.php create mode 100644 interface/ispconfig/interface/sites/web_sites_stats.php create mode 100644 interface/ispconfig/interface/sites/web_subdomain_del.php create mode 100644 interface/ispconfig/interface/sites/web_subdomain_edit.php create mode 100644 interface/ispconfig/interface/sites/web_subdomain_list.php create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/bg_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/br_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/de_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/en_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/es_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/fi_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/fr_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/hu_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/it_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/ja_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/nl_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/pl_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/ro_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/ru_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/se_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/sk_strengthmeter.lng create mode 100644 interface/ispconfig/interface/strengthmeter/lib/lang/tr_strengthmeter.lng create mode 100644 interface/ispconfig/interface/temp/en.lng create mode 100644 interface/ispconfig/interface/themes/default/css/central.css create mode 100644 interface/ispconfig/interface/themes/default/css/navigation/nav_side.css create mode 100644 interface/ispconfig/interface/themes/default/css/navigation/nav_top.css create mode 100644 interface/ispconfig/interface/themes/default/css/patches/central.css create mode 100644 interface/ispconfig/interface/themes/default/css/print/print_100.css create mode 100644 interface/ispconfig/interface/themes/default/css/screen/basemod.css create mode 100644 interface/ispconfig/interface/themes/default/css/screen/basemod_2col_left_seo.css create mode 100644 interface/ispconfig/interface/themes/default/css/screen/content.css create mode 100644 interface/ispconfig/interface/themes/default/css/screen/content_ispc.css create mode 100644 interface/ispconfig/interface/themes/default/css/screen/uni-form-generic.css create mode 100644 interface/ispconfig/interface/themes/default/css/screen/uni-form.css create mode 100644 interface/ispconfig/interface/themes/default/header_logo.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ad.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ae.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/af.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ag.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ai.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/al.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/am.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/an.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ao.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/aq.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ar.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/as.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/at.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/au.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/aw.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ax.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/az.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ba.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bb.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bd.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/be.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bf.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bg.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bh.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bi.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bj.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bn.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bo.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/br.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bs.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bt.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bv.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bw.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/by.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/bz.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ca.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/catalonia.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cc.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cd.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cf.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cg.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ch.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ci.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ck.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cl.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cn.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/co.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cs.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cu.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cv.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cx.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cy.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/cz.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/de.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/dj.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/dk.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/dm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/do.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/dz.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ec.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ee.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/eg.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/eh.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/england.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/er.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/es.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/et.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/europeanunion.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/fam.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/fi.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/fj.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/fk.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/fm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/fo.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/fr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ga.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gb.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gd.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ge.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gf.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gh.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gi.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gl.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gn.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gp.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gq.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gs.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gt.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gu.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gw.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/gy.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/hk.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/hm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/hn.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/hr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ht.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/hu.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/id.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ie.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/il.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/in.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/io.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/iq.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ir.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/is.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/it.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/jm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/jo.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/jp.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ke.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/kg.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/kh.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ki.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/km.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/kn.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/kp.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/kr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/kw.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ky.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/kz.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/la.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/lb.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/lc.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/li.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/lk.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/lr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ls.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/lt.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/lu.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/lv.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ly.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ma.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mc.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/md.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/me.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mg.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mh.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mk.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ml.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mn.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mo.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mp.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mq.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ms.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mt.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mu.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mv.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mw.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mx.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/my.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/mz.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/na.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/nc.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ne.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/nf.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ng.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ni.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/nl.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/no.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/np.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/nr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/nu.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/nz.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/om.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pa.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pe.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pf.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pg.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ph.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pk.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pl.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pn.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ps.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pt.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/pw.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/py.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/qa.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/re.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ro.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/rs.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ru.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/rw.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sa.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sb.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sc.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/scotland.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sd.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/se.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sg.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sh.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/si.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sj.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sk.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sl.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sn.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/so.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/st.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sv.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sy.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/sz.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tc.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/td.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tf.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tg.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/th.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tj.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tk.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tl.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tn.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/to.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tr.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tt.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tv.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tw.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/tz.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ua.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ug.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/um.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/us.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/uy.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/uz.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/va.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/vc.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ve.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/vg.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/vi.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/vn.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/vu.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/wales.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/wf.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ws.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/ye.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/yt.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/za.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/zm.png create mode 100644 interface/ispconfig/interface/themes/default/icons/flags/zw.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/accept.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/accept_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/accept_green.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/arrow_2_left_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/arrow_2_right_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/arrow_left_blue_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/arrow_right_blue_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/article.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/article_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/bar_graph.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/burst.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/calendar.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/calendar2.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/cancel.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/cancel_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/clock.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/code.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/comment_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/dollar.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/double_comment.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/download.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/envelope.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/flag_black.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/flag_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/flag_green.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/flag_orange.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/flag_red.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/flag_yellow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/folder.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/info.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/link.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/lock.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/magnify.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/minus_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/money.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/new.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/pictures.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/printer.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/question_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/refresh.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/rss.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/rss_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/security_green.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/security_orange.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/security_red.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/star.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/star_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/stop.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/stop_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/upload.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/world.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x12/world2.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/accept.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/accept_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/accept_green.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/arrow_2_left_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/arrow_2_right_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/arrow_left_blue_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/arrow_right_blue_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/article.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/article_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/bar_graph.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/burst.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/calendar.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/calendar2.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/cancel.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/cancel_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/clock.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/code.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/comment_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/dollar.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/double_comment.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/download.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/envelope.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/flag_black.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/flag_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/flag_green.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/flag_orange.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/flag_red.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/flag_yellow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/folder.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/info.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/link.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/lock.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/magnify.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/minus_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/money.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/new.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/pictures.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/printer.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/question_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/refresh.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/rss.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/rss_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/security_green.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/security_orange.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/security_red.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/star.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/star_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/stop.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/stop_round.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/upload.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/world.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16-list/world2.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/address_book.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/address_book__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/address_book__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/address_book__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/address_book__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/address_book__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/address_book_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_000_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_045.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_045_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_090.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_090_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_135.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_135_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_180.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_180_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_225.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_225_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_270.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_270_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_315.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_315_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_circle.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_135.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_225.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_315.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_double.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_double_135.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_skip.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_090.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_180.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_270.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_stop.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_090.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_180.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/arrow_stop_270.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/auction_hammer.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/auction_hammer__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/auction_hammer_gavel.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloon.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloon__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloon__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloon__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloon__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloon__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloon_left.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloon_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloon_small_left.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloons.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloons_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloons_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloons_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloons_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/balloons_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bandaid.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bandaid_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bandaid_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bandaid_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bandaid_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bandaid_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bandaid_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bank.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bank_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bank_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bank_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bank_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bank_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bell.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bell__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bell__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bell__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bell__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bell__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bell_disable.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bin.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bin__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bin__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bin__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bin__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bin__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bin_full.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/binocular.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/binocular_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/binocular_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/binocular_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/binocular_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/binocular_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blog.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blog__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blog__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blog__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blog__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blog__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blog_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blogs.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blogs_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blogs_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blogs_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blogs_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blogs_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/blogs_stack.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/book.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/book__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/book__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/book__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/book__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/book__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/book_brown.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/book_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/book_small_brown.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark__small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_book.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_document.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/books.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/books__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/books__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/books__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/books__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/books__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/books_brown.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/books_stack.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/box.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/box__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/box__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/box__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/box__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/box__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/box_label.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/briefcase.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/briefcase_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/briefcase_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/briefcase_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/briefcase_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/briefcase_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/broom.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/broom_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/broom_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/broom_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/broom_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/broom_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calculator.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calculator_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calculator_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calculator_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calculator_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calculator_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calendar.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calendar__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calendar__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calendar__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calendar__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calendar__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calendar_day.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/calendar_month.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/camera.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/camera__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/camera__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/camera__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/camera__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/camera__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/camera_black.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/camera_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/camera_small_black.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/card.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/card__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/card__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/card__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/card__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/card__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/card_address.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/card_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cards.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cards__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cards__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cards__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cards__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cards__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cards_address.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cards_stack.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cassette.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cassette_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cassette_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cassette_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cassette_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cassette_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cassette_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/chain.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/chain_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/chain_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/chain_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/chain_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/chain_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/chain_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/chain_unchain.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clipboard.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clipboard__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clipboard__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clipboard__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clipboard__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clipboard__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clipboard_empty.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clipboard_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clock.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clock__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clock__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clock__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clock__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clock__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clock_fill.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clock_frame.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/clock_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/color.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/color_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/color_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/color_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/color_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/color_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/color_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/contrast.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/contrast__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/contrast__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/contrast__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/contrast__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/contrast__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/contrast_low.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/contrast_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/contrast_small_low.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cross.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cross_circle.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cross_circle_frame.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cross_shield.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cross_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/cross_small_circle.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/crown.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/crown__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/crown__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/crown__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/crown__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/crown__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/crown_bronze.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/crown_silver.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/database.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/database_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/database_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/database_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/database_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/database_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/database_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/databases.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/databases_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/databases_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/databases_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/databases_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/databases_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disc.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disc_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disc_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disc_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disc_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disc_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disc_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/discs.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/discs_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/discs_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/discs_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/discs_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/discs_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disk.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disk__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disk__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disk__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disk__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disk__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disk_black.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disk_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disk_small_black.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disks.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disks__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disks__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disks__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disks__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disks__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/disks_black.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document_horizontal.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document_horizontal_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document_music.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document_music_playlist.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document_shred.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document_text_image.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/document_zipper.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/documents.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/documents_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/documents_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/documents_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/documents_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/documents_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/documents_stack.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/documents_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/door.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/door_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/door_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/door_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/door_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/door_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drawer.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drawer_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drawer_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drawer_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drawer_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drawer_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drill.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drill_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drill_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drill_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drill_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/drill_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/envelope.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/envelope_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/envelope_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/envelope_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/envelope_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/envelope_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/equalizer.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/equalizer_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/equalizer_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/equalizer_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/equalizer_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/equalizer_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/eraser.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/eraser_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/eraser_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/eraser_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/eraser_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/eraser_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/exclamation_frame.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/exclamation_shield.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/exclamation_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/feed.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/feed__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/feed__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/feed__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/feed__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/feed__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/feed_balloon.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/feed_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/film.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/film_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/film_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/film_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/film_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/film_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/film_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/films.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/films_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/films_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/films_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/films_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/films_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/flag.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/flag_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/flag_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/flag_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/flag_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/flag_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder_open.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder_open_document.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_music.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_music_playlist.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder_open_film.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder_open_image.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder_shred.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folder_zipper.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folders.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folders_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folders_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folders_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folders_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folders_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/folders_stack.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/funnel.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/funnel_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/funnel_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/funnel_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/funnel_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/funnel_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/funnel_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/gear.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/gear__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/gear__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/gear__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/gear__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/gear__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/gear_disable.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/gear_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/hammer.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/hammer__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/hammer__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/hammer__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/hammer__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/hammer__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/hammer_left.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/hammer_screwdriver.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart_break.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart_empty.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart_half.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart_small_empty.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/heart_small_half.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/home.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/home_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/home_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/home_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/home_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/home_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/home_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image_resize.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image_resize_actual.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image_small_sunset.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/image_sunset.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/images.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/images_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/images_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/images_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/images_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/images_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/images_stack.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/inbox.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/inbox_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/inbox_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/inbox_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/inbox_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/inbox_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/information.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/information_frame.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/information_shield.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/information_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/key.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/key__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/key__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/key__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/key__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/key__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/key_disable.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_2.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_2_equal.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_3.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_3_mix.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_header.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_header_2.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_header_2_equal.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_header_3.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_header_3_mix.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_2.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_2_equal.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_3.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_3_mix.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_join.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/layout_split.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lifebuoy.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/light_bulb.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/light_bulb__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/light_bulb__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/light_bulb__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/light_bulb__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/light_bulb__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/light_bulb_off.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/light_bulb_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/light_bulb_small_off.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lightning.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lightning__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lightning__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lightning__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lightning__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lightning__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lightning_disable.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lightning_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lock.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lock__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lock__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lock__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lock__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lock__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lock_disable.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lock_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/lock_unlock.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/logout.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnet.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnet__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnet__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnet__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnet__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnet__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnet_disable.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnet_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier_left.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier_medium.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier_medium_left.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_actual.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_fit.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_out.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail_open.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail_open_document.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail_open_film.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail_open_image.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mail_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mails.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mails_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mails_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mails_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mails_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mails_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/mails_stack.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_black.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_medium.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_black.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_green.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_pink.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_red.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_small_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_small_green.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_small_purple.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_player_small_red.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_players.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_players_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_players_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_players_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_players_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/media_players_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/microphone.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/microphone_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/microphone_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/microphone_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/microphone_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/microphone_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/minus_circle.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/minus_circle_frame.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/minus_shield.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/minus_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/minus_small_circle.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/music.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/music_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/music_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/music_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/music_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/music_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/music_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspaper.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspaper_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspaper_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspaper_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspaper_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspaper_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspapers.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspapers_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspapers_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspapers_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspapers_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/newspapers_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebook.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebook_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebook_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebook_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebook_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebook_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebooks.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebooks_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebooks_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebooks_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebooks_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/notebooks_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paint_can.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paint_can_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paint_can_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paint_can_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paint_can_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paint_can_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/palette.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/palette_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/palette_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/palette_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/palette_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/palette_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paper_bag.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paper_bag_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paper_bag_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paper_bag_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paper_bag_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/paper_bag_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pencil_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pencil_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pencil_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pencil_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pencil_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/photo_album.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/photo_album__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/photo_album__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/photo_album__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/photo_album__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/photo_album__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/photo_album_blue.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/piano.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/piano_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/piano_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/piano_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/piano_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/piano_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/picture.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/picture_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/picture_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/picture_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/picture_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/picture_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/picture_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/picture_small_sunset.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/picture_sunset.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pictures.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pictures_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pictures_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pictures_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pictures_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pictures_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pill.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pill_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pill_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pill_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pill_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pill_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pill_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pin.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pin_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pin_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pin_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pin_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pin_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pipette.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pipette_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pipette_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pipette_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pipette_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/pipette_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/playing_card.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/playing_card_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/playing_card_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/playing_card_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/playing_card_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/playing_card_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plug.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plug_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plug_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plug_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plug_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plug_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plus_circle.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plus_circle_frame.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plus_shield.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plus_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/plus_small_circle.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/printer.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/printer__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/printer__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/printer__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/printer__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/printer__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/printer_empty.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/printer_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/puzzle.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/puzzle__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/puzzle__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/puzzle__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/puzzle__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/puzzle__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/puzzle_disable.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/question.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/question_frame.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/question_shield.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/question_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipt.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipt_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipt_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipt_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipt_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipt_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipt_shred.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipt_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipts.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipts_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipts_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipts_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipts_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipts_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/receipts_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/report.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/report_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/report_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/report_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/report_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/report_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ruler.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ruler__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ruler__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ruler__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ruler__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ruler__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ruler_crop.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/safe.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/safe_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/safe_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/safe_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/safe_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/safe_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/screwdriver.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/screwdriver_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/screwdriver_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/screwdriver_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/screwdriver_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/screwdriver_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/script.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/script__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/script__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/script__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/script__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/script__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/script_code.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/scripts.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/scripts__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/scripts__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/scripts__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/scripts__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/scripts__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/scripts_code.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/shield.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/shield__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/shield__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/shield__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/shield__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/shield__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/shield_disable.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/slash.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/slash_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/socket.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/socket_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/socket_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/socket_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/socket_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/socket_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort_alphabet.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort_alphabet_descending.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort_date.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort_date_descending.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort_number.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort_number_descending.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort_quantity.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort_quantity_descending.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sort_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/stamp.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/stamp_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/stamp_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/stamp_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/stamp_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/stamp_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star_empty.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star_half.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star_small_empty.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/star_small_half.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note_pin.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note_shred.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note_small_pin.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_note_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_notes.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_pin.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_stack.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_text.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/switch.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/switch_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/switch_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/switch_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/switch_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/switch_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/table.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/table__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/table__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/table__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/table__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/table__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/table_delete.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/table_delete_column.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/table_insert.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/table_insert_column.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tables.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tables_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tables_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tables_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tables_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tables_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tables_stacks.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tag.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tag__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tag__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tag__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tag__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tag__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tag_label.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tag_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tags.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tags__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tags__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tags__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tags__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tags__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tags_label.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tick.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tick_circle.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tick_circle_frame.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tick_shield.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tick_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tick_small_circle.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ticket.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ticket_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ticket_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ticket_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ticket_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ticket_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/ticket_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/trophy.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/trophy_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/trophy_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/trophy_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/trophy_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/trophy_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/tux.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_add.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_comment.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_delete.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_edit.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_female.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_go.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_gray.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_green.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_orange.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_red.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/user_suit.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/vcard.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/vcard_add.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/vcard_delete.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/vcard_edit.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wall.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wall__arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wall__exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wall__minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wall__pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wall__plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wall_brick.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wall_disable.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wall_small.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wall_small_brick.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wallet.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wallet_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wallet_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wallet_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wallet_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wallet_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wand.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wand_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wand_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wand_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wand_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wand_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wrench.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wrench_arrow.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wrench_exclamation.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wrench_minus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wrench_pencil.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wrench_plus.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x16/wrench_screwdriver.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x32/state_critical.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x32/state_error.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x32/state_info.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x32/state_ok.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x32/state_unknown.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x32/state_warning.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x64/network.png create mode 100644 interface/ispconfig/interface/themes/default/icons/x64/server.png create mode 100644 interface/ispconfig/interface/themes/default/images/buttonHolder_bg.gif create mode 100644 interface/ispconfig/interface/themes/default/images/favicon.ico create mode 100644 interface/ispconfig/interface/themes/default/images/header_bg.png create mode 100644 interface/ispconfig/interface/themes/default/images/header_logo.png create mode 100644 interface/ispconfig/interface/themes/default/images/header_logo.png.old create mode 100644 interface/ispconfig/interface/themes/default/images/lists_tfoot_bg.png create mode 100644 interface/ispconfig/interface/themes/default/images/lists_thead_bg.png create mode 100644 interface/ispconfig/interface/themes/default/images/meter_bg.gif create mode 100644 interface/ispconfig/interface/themes/default/images/screen_bg.png create mode 100644 interface/ispconfig/interface/themes/default/licences.txt create mode 100644 interface/ispconfig/interface/themes/default/templates/form.tpl.htm create mode 100644 interface/ispconfig/interface/themes/default/templates/listpage.tpl.htm create mode 100644 interface/ispconfig/interface/themes/default/templates/main.tpl.htm create mode 100644 interface/ispconfig/interface/themes/default/templates/module.tpl.htm create mode 100644 interface/ispconfig/interface/themes/default/templates/module_tree.tpl.htm create mode 100644 interface/ispconfig/interface/themes/default/templates/sidenav.tpl.htm create mode 100644 interface/ispconfig/interface/themes/default/templates/tabbed_form.tpl.htm create mode 100644 interface/ispconfig/interface/themes/default/templates/topnav.tpl.htm create mode 100644 interface/ispconfig/interface/themes/default/yaml/!important.txt create mode 100644 interface/ispconfig/interface/themes/default/yaml/core/base.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/core/iehacks.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/core/print_base.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/core/slim_base.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/core/slim_iehacks.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/core/slim_print_base.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/debug/debug.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/debug/images/grid_pattern.png create mode 100644 interface/ispconfig/interface/themes/default/yaml/debug/images/warning_iehacks.gif create mode 100644 interface/ispconfig/interface/themes/default/yaml/debug/images/yaml_debug.gif create mode 100644 interface/ispconfig/interface/themes/default/yaml/navigation/nav_vlist.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/patches/patch_layout_draft.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/patches/patch_nav_vlist.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/print/print_003_draft.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/print/print_020_draft.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/print/print_023_draft.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/print/print_100_draft.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/print/print_103_draft.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/print/print_120_draft.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/print/print_123_draft.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/screen/basemod_draft.css create mode 100644 interface/ispconfig/interface/themes/default/yaml/screen/content_default.css create mode 100644 interface/ispconfig/interface/web/tools/form/user_settings.tform.php create mode 100644 interface/ispconfig/interface/web/tools/index.php create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/bg.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/bg_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/br.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/br_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/de.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/de_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/en.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/en_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/es.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/es_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/fi.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/fi_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/fr.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/fr_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/hu.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/hu_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/it.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/it_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/ja.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/ja_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/nl.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/nl_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/pl.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/pl_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/pt.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/pt_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/ro.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/ro_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/ru.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/ru_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/se.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/se_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/sk.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/sk_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/tr.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/lang/tr_usersettings.lng create mode 100644 interface/ispconfig/interface/web/tools/lib/menu.d/statistics.menu.php create mode 100644 interface/ispconfig/interface/web/tools/lib/module.conf.php create mode 100644 interface/ispconfig/interface/web/tools/templates/user_settings.htm create mode 100644 interface/ispconfig/interface/web/tools/user_settings.php create mode 100644 interface/ispconfig/nbproject/project.properties create mode 100644 interface/ispconfig/nbproject/project.xml create mode 100644 interface/ispconfig/server/conf/apache_apps.vhost.master create mode 100644 interface/ispconfig/server/conf/apache_ispconfig.conf.master create mode 100644 interface/ispconfig/server/conf/autoresponder.master create mode 100644 interface/ispconfig/server/conf/bash.bashrc.master create mode 100644 interface/ispconfig/server/conf/bastille-firewall.cfg.master create mode 100644 interface/ispconfig/server/conf/bind_named.conf.local.master create mode 100644 interface/ispconfig/server/conf/bind_pri.domain.master create mode 100644 interface/ispconfig/server/conf/debian_network_interfaces.master create mode 100644 interface/ispconfig/server/conf/error/br/400.html create mode 100644 interface/ispconfig/server/conf/error/br/401.html create mode 100644 interface/ispconfig/server/conf/error/br/403.html create mode 100644 interface/ispconfig/server/conf/error/br/404.html create mode 100644 interface/ispconfig/server/conf/error/br/405.html create mode 100644 interface/ispconfig/server/conf/error/br/500.html create mode 100644 interface/ispconfig/server/conf/error/br/503.html create mode 100644 interface/ispconfig/server/conf/error/cz/400.html create mode 100644 interface/ispconfig/server/conf/error/cz/401.html create mode 100644 interface/ispconfig/server/conf/error/cz/403.html create mode 100644 interface/ispconfig/server/conf/error/cz/404.html create mode 100644 interface/ispconfig/server/conf/error/cz/405.html create mode 100644 interface/ispconfig/server/conf/error/cz/500.html create mode 100644 interface/ispconfig/server/conf/error/cz/503.html create mode 100644 interface/ispconfig/server/conf/error/de/400.html create mode 100644 interface/ispconfig/server/conf/error/de/401.html create mode 100644 interface/ispconfig/server/conf/error/de/403.html create mode 100644 interface/ispconfig/server/conf/error/de/404.html create mode 100644 interface/ispconfig/server/conf/error/de/405.html create mode 100644 interface/ispconfig/server/conf/error/de/500.html create mode 100644 interface/ispconfig/server/conf/error/de/503.html create mode 100644 interface/ispconfig/server/conf/error/en/400.html create mode 100644 interface/ispconfig/server/conf/error/en/401.html create mode 100644 interface/ispconfig/server/conf/error/en/403.html create mode 100644 interface/ispconfig/server/conf/error/en/404.html create mode 100644 interface/ispconfig/server/conf/error/en/405.html create mode 100644 interface/ispconfig/server/conf/error/en/500.html create mode 100644 interface/ispconfig/server/conf/error/en/503.html create mode 100644 interface/ispconfig/server/conf/error/es/400.html create mode 100644 interface/ispconfig/server/conf/error/es/401.html create mode 100644 interface/ispconfig/server/conf/error/es/403.html create mode 100644 interface/ispconfig/server/conf/error/es/404.html create mode 100644 interface/ispconfig/server/conf/error/es/405.html create mode 100644 interface/ispconfig/server/conf/error/es/500.html create mode 100644 interface/ispconfig/server/conf/error/es/503.html create mode 100644 interface/ispconfig/server/conf/error/fi/400.html create mode 100644 interface/ispconfig/server/conf/error/fi/401.html create mode 100644 interface/ispconfig/server/conf/error/fi/403.html create mode 100644 interface/ispconfig/server/conf/error/fi/404.html create mode 100644 interface/ispconfig/server/conf/error/fi/405.html create mode 100644 interface/ispconfig/server/conf/error/fi/500.html create mode 100644 interface/ispconfig/server/conf/error/fi/503.html create mode 100644 interface/ispconfig/server/conf/error/fr/400.html create mode 100644 interface/ispconfig/server/conf/error/fr/401.html create mode 100644 interface/ispconfig/server/conf/error/fr/403.html create mode 100644 interface/ispconfig/server/conf/error/fr/404.html create mode 100644 interface/ispconfig/server/conf/error/fr/405.html create mode 100644 interface/ispconfig/server/conf/error/fr/500.html create mode 100644 interface/ispconfig/server/conf/error/fr/503.html create mode 100644 interface/ispconfig/server/conf/error/gr/400.html create mode 100644 interface/ispconfig/server/conf/error/gr/401.html create mode 100644 interface/ispconfig/server/conf/error/gr/403.html create mode 100644 interface/ispconfig/server/conf/error/gr/404.html create mode 100644 interface/ispconfig/server/conf/error/gr/405.html create mode 100644 interface/ispconfig/server/conf/error/gr/500.html create mode 100644 interface/ispconfig/server/conf/error/gr/503.html create mode 100644 interface/ispconfig/server/conf/error/hu/400.html create mode 100644 interface/ispconfig/server/conf/error/hu/401.html create mode 100644 interface/ispconfig/server/conf/error/hu/403.html create mode 100644 interface/ispconfig/server/conf/error/hu/404.html create mode 100644 interface/ispconfig/server/conf/error/hu/405.html create mode 100644 interface/ispconfig/server/conf/error/hu/500.html create mode 100644 interface/ispconfig/server/conf/error/hu/503.html create mode 100644 interface/ispconfig/server/conf/error/it/400.html create mode 100644 interface/ispconfig/server/conf/error/it/401.html create mode 100644 interface/ispconfig/server/conf/error/it/403.html create mode 100644 interface/ispconfig/server/conf/error/it/404.html create mode 100644 interface/ispconfig/server/conf/error/it/405.html create mode 100644 interface/ispconfig/server/conf/error/it/500.html create mode 100644 interface/ispconfig/server/conf/error/it/503.html create mode 100644 interface/ispconfig/server/conf/error/nl/400.html create mode 100644 interface/ispconfig/server/conf/error/nl/401.html create mode 100644 interface/ispconfig/server/conf/error/nl/403.html create mode 100644 interface/ispconfig/server/conf/error/nl/404.html create mode 100644 interface/ispconfig/server/conf/error/nl/405.html create mode 100644 interface/ispconfig/server/conf/error/nl/500.html create mode 100644 interface/ispconfig/server/conf/error/nl/503.html create mode 100644 interface/ispconfig/server/conf/error/pl/400.html create mode 100644 interface/ispconfig/server/conf/error/pl/401.html create mode 100644 interface/ispconfig/server/conf/error/pl/403.html create mode 100644 interface/ispconfig/server/conf/error/pl/404.html create mode 100644 interface/ispconfig/server/conf/error/pl/405.html create mode 100644 interface/ispconfig/server/conf/error/pl/500.html create mode 100644 interface/ispconfig/server/conf/error/pl/503.html create mode 100644 interface/ispconfig/server/conf/error/se/400.html create mode 100644 interface/ispconfig/server/conf/error/se/401.html create mode 100644 interface/ispconfig/server/conf/error/se/403.html create mode 100644 interface/ispconfig/server/conf/error/se/404.html create mode 100644 interface/ispconfig/server/conf/error/se/405.html create mode 100644 interface/ispconfig/server/conf/error/se/500.html create mode 100644 interface/ispconfig/server/conf/error/se/503.html create mode 100644 interface/ispconfig/server/conf/error/si/400.html create mode 100644 interface/ispconfig/server/conf/error/si/401.html create mode 100644 interface/ispconfig/server/conf/error/si/403.html create mode 100644 interface/ispconfig/server/conf/error/si/404.html create mode 100644 interface/ispconfig/server/conf/error/si/405.html create mode 100644 interface/ispconfig/server/conf/error/si/500.html create mode 100644 interface/ispconfig/server/conf/error/si/503.html create mode 100644 interface/ispconfig/server/conf/error/sr/400.html create mode 100644 interface/ispconfig/server/conf/error/sr/401.html create mode 100644 interface/ispconfig/server/conf/error/sr/403.html create mode 100644 interface/ispconfig/server/conf/error/sr/404.html create mode 100644 interface/ispconfig/server/conf/error/sr/405.html create mode 100644 interface/ispconfig/server/conf/error/sr/500.html create mode 100644 interface/ispconfig/server/conf/error/sr/503.html create mode 100644 interface/ispconfig/server/conf/gentoo_network_interfaces.master create mode 100644 interface/ispconfig/server/conf/getmail.conf.master create mode 100644 interface/ispconfig/server/conf/index/.htaccess create mode 100644 interface/ispconfig/server/conf/index/favicon.ico create mode 100644 interface/ispconfig/server/conf/index/robots.txt create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_br create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_cz create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_de create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_en create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_es create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_fi create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_fr create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_gr create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_hu create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_it create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_nl create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_pl create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_se create mode 100644 interface/ispconfig/server/conf/index/standard_index.html_sr create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_br create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_cz create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_de create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_en create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_es create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_fi create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_fr create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_gr create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_hu create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_it create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_nl create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_pl create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_se create mode 100644 interface/ispconfig/server/conf/index/user_standard_index.html_sr create mode 100644 interface/ispconfig/server/conf/mailfilter_move_junk.master create mode 100644 interface/ispconfig/server/conf/motd.master create mode 100644 interface/ispconfig/server/conf/php-cgi-starter.master create mode 100644 interface/ispconfig/server/conf/php-fcgi-starter.master create mode 100644 interface/ispconfig/server/conf/sieve_filter.master create mode 100644 interface/ispconfig/server/conf/vhost.conf.master create mode 100644 interface/ispconfig/server/cron_daily.php create mode 100644 interface/ispconfig/server/cron_daily.sh create mode 100644 interface/ispconfig/server/lib/app.inc.php create mode 100644 interface/ispconfig/server/lib/classes/db_mysql.inc.php create mode 100644 interface/ispconfig/server/lib/classes/file.inc.php create mode 100644 interface/ispconfig/server/lib/classes/getconf.inc.php create mode 100644 interface/ispconfig/server/lib/classes/ini_parser.inc.php create mode 100644 interface/ispconfig/server/lib/classes/mod_mail_base.inc.php create mode 100644 interface/ispconfig/server/lib/classes/modules.inc.php create mode 100644 interface/ispconfig/server/lib/classes/plugins.inc.php create mode 100644 interface/ispconfig/server/lib/classes/services.inc.php create mode 100644 interface/ispconfig/server/lib/classes/system.inc.php create mode 100644 interface/ispconfig/server/lib/classes/tpl.inc.php create mode 100644 interface/ispconfig/server/lib/classes/tpl_cache.inc.php create mode 100644 interface/ispconfig/server/lib/classes/tpl_error.inc.php create mode 100644 interface/ispconfig/server/lib/classes/tpl_ini.inc.php create mode 100644 interface/ispconfig/server/lib/config.inc.php create mode 100644 interface/ispconfig/server/lib/mysql_clientdb.conf create mode 100644 interface/ispconfig/server/mods-available/client_module.inc.php create mode 100644 interface/ispconfig/server/mods-available/cron_module.inc.php create mode 100644 interface/ispconfig/server/mods-available/database_module.inc.php create mode 100644 interface/ispconfig/server/mods-available/dns_module.inc.php create mode 100644 interface/ispconfig/server/mods-available/mail_module.inc.php create mode 100644 interface/ispconfig/server/mods-available/monitor_core_module.inc.php create mode 100644 interface/ispconfig/server/mods-available/server_module.inc.php create mode 100644 interface/ispconfig/server/mods-available/web_module.inc.php create mode 100644 interface/ispconfig/server/mods-core/monitor_core_module.inc.php create mode 100644 interface/ispconfig/server/mods-enabled/client_module.inc.php create mode 100644 interface/ispconfig/server/mods-enabled/cron_module.inc.php create mode 100644 interface/ispconfig/server/mods-enabled/database_module.inc.php create mode 100644 interface/ispconfig/server/mods-enabled/dns_module.inc.php create mode 100644 interface/ispconfig/server/mods-enabled/mail_module.inc.php create mode 100644 interface/ispconfig/server/mods-enabled/monitor_core_module.inc.php create mode 100644 interface/ispconfig/server/mods-enabled/server_module.inc.php create mode 100644 interface/ispconfig/server/mods-enabled/web_module.inc.php create mode 100644 interface/ispconfig/server/plugins-available/apache2_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/apps_vhost_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/bind_dlz_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/bind_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/cron_jailkit_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/cron_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/firewall_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/ftpuser_base_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/getmail_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/mail_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/maildeliver_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/maildrop_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/mysql_clientdb_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/network_settings_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/pma_symlink_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/postfix_filter_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/postfix_server_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/powerdns_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/shelluser_base_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/shelluser_jailkit_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/software_update_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-available/webmail_symlink_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/apache2_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/apps_vhost_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/cron_jailkit_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/cron_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/firewall_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/ftpuser_base_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/getmail_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/mail_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/maildeliver_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/mysql_clientdb_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/network_settings_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/postfix_filter_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/postfix_server_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/shelluser_base_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/shelluser_jailkit_plugin.inc.php create mode 100644 interface/ispconfig/server/plugins-enabled/software_update_plugin.inc.php create mode 100644 interface/ispconfig/server/scripts/create_jailkit_chroot.sh create mode 100644 interface/ispconfig/server/scripts/create_jailkit_programs.sh create mode 100644 interface/ispconfig/server/scripts/create_jailkit_user.sh create mode 100644 interface/ispconfig/server/scripts/ispconfig_update.php create mode 100644 interface/ispconfig/server/scripts/ispconfig_update.sh create mode 100644 interface/ispconfig/server/scripts/update_from_svn.sh create mode 100644 interface/ispconfig/server/scripts/update_from_tgz.sh create mode 100644 interface/ispconfig/server/scripts/vlogger create mode 100644 interface/ispconfig/server/server.php create mode 100644 interface/ispconfig/server/server.sh create mode 100644 interface/ispconfig/vpproject/ispconfig.vpppath diff --git a/interface/ispconfig/interface/admin/firewall_del.php b/interface/ispconfig/interface/admin/firewall_del.php new file mode 100644 index 000000000..5f4dc9172 --- /dev/null +++ b/interface/ispconfig/interface/admin/firewall_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/firewall_edit.php b/interface/ispconfig/interface/admin/firewall_edit.php new file mode 100644 index 000000000..0401143dc --- /dev/null +++ b/interface/ispconfig/interface/admin/firewall_edit.php @@ -0,0 +1,72 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from firewall WHERE firewall_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/firewall_list.php b/interface/ispconfig/interface/admin/firewall_list.php new file mode 100644 index 000000000..f95c570c2 --- /dev/null +++ b/interface/ispconfig/interface/admin/firewall_list.php @@ -0,0 +1,52 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/dbsync.tform.php b/interface/ispconfig/interface/admin/form/dbsync.tform.php new file mode 100644 index 000000000..363c916f2 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/dbsync.tform.php @@ -0,0 +1,264 @@ + 'DB sync', + 'width' => 80, + 'template' => 'templates/dbsync_edit.htm', + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'jobname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '/^.{1,30}$/', + 'errmsg' => 'jobname_err', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'sync_interval_minutes' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => array('mysql' => 'mysql'), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_host' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'db_tables' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'regex' => '', + 'errmsg' => '', + 'default' => 'admin,forms', + 'value' => $db_tables, + 'separator' => ',', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'empty_datalog' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => array(0 => 0,1 => 1), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'sync_datalog_external' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => array(0 => 0,1 => 1), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'active' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'regex' => '', + 'errmsg' => '', + 'default' => '1', + 'value' => array(0 => 0,1 => 1), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ) + ################################## + # ENDE Datenbankfelder + ################################## + ) +); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/filesync.tform.php b/interface/ispconfig/interface/admin/form/filesync.tform.php new file mode 100644 index 000000000..c252b1a29 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/filesync.tform.php @@ -0,0 +1,205 @@ + "Datei sync", + 'width' => 80, + 'template' => "templates/filesync_edit.htm", + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'jobname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '/^.{1,30}$/', + 'errmsg' => 'jobname_err', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'sync_interval_minutes' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'ftp_host' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'ftp_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'ftp_username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'ftp_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'local_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'wput_options' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '--timestamping --dont-continue', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'active' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'regex' => '', + 'errmsg' => '', + 'default' => '1', + 'value' => array(0 => 0,1 => 1), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ) + ################################## + # ENDE Datenbankfelder + ################################## + ) +); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/firewall.tform.php b/interface/ispconfig/interface/admin/form/firewall.tform.php new file mode 100644 index 000000000..edbe89ce4 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/firewall.tform.php @@ -0,0 +1,112 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['firewall'] = array ( + 'title' => "Firewall", + 'width' => 100, + 'template' => "templates/firewall_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'firewall_error_unique'), + ), + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'tcp_port' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\s0-9\,\:]{0,255}$/', + 'errmsg'=> 'tcp_ports_error_regex'), + ), + 'default' => '20,21,22,25,53,80,110,143,443,3306,8080,10000', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'udp_port' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\s0-9\,\:]{0,255}$/', + 'errmsg'=> 'tcp_ports_error_regex'), + ), + 'default' => '53,3306', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/groups.tform.php b/interface/ispconfig/interface/admin/form/groups.tform.php new file mode 100644 index 000000000..c27cfad63 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/groups.tform.php @@ -0,0 +1,112 @@ + "Groups", + 'width' => 80, + 'template' => "templates/groups_edit.htm", + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '/^.{1,30}$/', + 'errmsg' => 'name_err', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'description' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '', + 'maxlength' => '', + 'rows' => '5', + 'cols' => '30' + ) + ################################## + # ENDE Datenbankfelder + ################################## + ) +); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/remote_user.tform.php b/interface/ispconfig/interface/admin/form/remote_user.tform.php new file mode 100644 index 000000000..265765624 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/remote_user.tform.php @@ -0,0 +1,160 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['remote_user'] = array ( + 'title' => "Remote User", + 'width' => 100, + 'template' => "templates/remote_user_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'remote_userid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT remote_userid,remote_username FROM remote_user WHERE {AUTHSQL} ORDER BY remote_username', + 'keyfield'=> 'remote_userid', + 'valuefield'=> 'remote_username' + ), + 'value' => '' + ), + + 'remote_username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'username_error_unique'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'username_error_regex'), +2 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'username_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'remote_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption' => 'MD5', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'remote_functions' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'CHECKBOXARRAY', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $function_list, + 'separator' => ';', + 'width' => '', + 'maxlength' => '', + 'rows' => '5', + 'cols' => '30' + ) + + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + + + +?> diff --git a/interface/ispconfig/interface/admin/form/server.tform.php b/interface/ispconfig/interface/admin/form/server.tform.php new file mode 100644 index 000000000..9c0138bb7 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/server.tform.php @@ -0,0 +1,157 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 1; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['services'] = array ( + 'title' => "Services", + 'width' => 100, + 'template' => "templates/server_edit_services.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'mail_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'web_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'dns_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'file_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'db_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'vserver_server' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '0', + 'value' => array(0 => 0,1 => 1) + ), + 'mirror_server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '' + ), + /* + 'update' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'value' => array(0 => 'No', 1 => 'Yes') + ), + */ + 'active' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'value' => array(0 => 'No', 1 => 'Yes') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +/* +$form["tabs"]['config'] = array ( + 'title' => "Config", + 'width' => 100, + 'template' => "templates/server_edit_config.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'config' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'width' => '', + 'cols' => '40', + 'rows' => '20', + 'maxlength' => '' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); +*/ + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/server_config.tform.php b/interface/ispconfig/interface/admin/form/server_config.tform.php new file mode 100644 index 000000000..b16f9234f --- /dev/null +++ b/interface/ispconfig/interface/admin/form/server_config.tform.php @@ -0,0 +1,750 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['server'] = array ( + 'title' => "Server", + 'width' => 70, + 'template' => "templates/server_config_server_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'auto_network_configuration' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'ip_address' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.105', + 'validators' => array ( 0 => array ( 'type' => 'ISIPV4', + 'errmsg'=> 'ip_address_error_wrong'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'netmask' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '255.255.255.0', + 'validators' => array ( 0 => array ( 'type' => 'ISIPV4', + 'errmsg'=> 'netmask_error_wrong'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'gateway' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.1', + 'validators' => array ( 0 => array ( 'type' => 'ISIPV4', + 'errmsg'=> 'gateway_error_wrong'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'hostname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'server1.domain.tld', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'hostname_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'nameservers' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.1,192.168.0.2', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'nameservers_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'loglevel' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '2', + 'value' => array('0' => 'Debug', '1' => 'Warnings', '2' => 'Errors'), + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['mail'] = array ( + 'title' => "Mail", + 'width' => 60, + 'template' => "templates/server_config_mail_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'module' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('postfix_mysql' => 'postfix_mysql') + ), + 'maildir_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/home/vmail/[domain]/[localpart]/', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'maildir_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'homedir_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/home/vmail/', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'homedir_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'pop3_imap_daemon' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '20', + 'value' => array('courier' => 'Courier', 'dovecot' => 'Dovecot') + ), + 'mail_filter_syntax' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '20', + 'value' => array('maildrop' => 'Maildrop', 'sieve' => 'Sieve') + ), + 'mailuser_uid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '5000', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_uid_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_gid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '5000', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_gid_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'vmail', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_name_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'vmail', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_group_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'relayhost' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'relayhost_user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'relayhost_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'mailbox_size_limit' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '15' + ), + 'message_size_limit' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '15' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['getmail'] = array ( + 'title' => "Getmail", + 'width' => 80, + 'template' => "templates/server_config_getmail_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'getmail_config_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'getmail_config_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['web'] = array ( + 'title' => "Web", + 'width' => 60, + 'template' => "templates/server_config_web_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'website_basedir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'website_basedir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'website_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'website_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'website_symlinks' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'website_symlinks_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'vhost_conf_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'vhost_conf_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'vhost_conf_enabled_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'vhost_conf_enabled_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'security_level' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '20', + 'value' => array('10' => 'Medium', '20' => 'High') + ), + 'user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'apache_user_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'apache_group_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'php_open_basedir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'php_open_basedir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'htaccess_allow_override' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'htaccess_allow_override_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'apps_vhost_port' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '8081', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'apps_vhost_port_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'apps_vhost_ip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '_default_', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'apps_vhost_ip_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'apps_vhost_servername' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['dns'] = array ( + 'title' => "DNS", + 'width' => 60, + 'template' => "templates/server_config_dns_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'bind_user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'bind_user_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'bind_group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'bind_group_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'bind_zonefiles_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'bind_zonefiles_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'named_conf_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'named_conf_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'named_conf_local_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'named_conf_local_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['fastcgi'] = array ( + 'title' => "FastCGI", + 'width' => 80, + 'template' => "templates/server_config_fastcgi_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'fastcgi_starter_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_starter_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_starter_script' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_starter_script_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_alias' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_alias_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_phpini_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_phpini_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_children' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_children_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_max_requests' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_max_requests_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fastcgi_bin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fastcgi_bin_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +$form["tabs"]['jailkit'] = array ( + 'title' => "Jailkit", + 'width' => 80, + 'template' => "templates/server_config_jailkit_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'jailkit_chroot_home' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'jailkit_chroot_home_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'jailkit_chroot_app_sections' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'jailkit_chroot_app_sections_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '1000' + ), + 'jailkit_chroot_app_programs' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'jailkit_chroot_app_programs_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '1000' + ), + 'jailkit_chroot_cron_programs' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'jailkit_chroot_cron_programs_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '1000' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +$form["tabs"]['vlogger'] = array ( + 'title' => "vlogger", + 'width' => 80, + 'template' => "templates/server_config_vlogger_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'config_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'vlogger_config_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +$form["tabs"]['cron'] = array ( + 'title' => "Cron", + 'width' => 80, + 'template' => "templates/server_config_cron_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'init_script' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'cron_init_script_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'crontab_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'crontab_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'wget' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'cron_wget_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/server_ip.tform.php b/interface/ispconfig/interface/admin/form/server_ip.tform.php new file mode 100644 index 000000000..d0f12dae8 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/server_ip.tform.php @@ -0,0 +1,125 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['server_ip'] = array ( + 'title' => "IP Address", + 'width' => 80, + 'template' => "templates/server_ip_edit.htm", + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'ip_address' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISIPV4', + 'errmsg'=> 'ip_error_wrong'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'ip_error_unique'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '15', + 'rows' => '', + 'cols' => '' + ), + 'virtualhost' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datenbankfelder + ################################## + ) +); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/software_repo.tform.php b/interface/ispconfig/interface/admin/form/software_repo.tform.php new file mode 100644 index 000000000..361d93c79 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/software_repo.tform.php @@ -0,0 +1,153 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['software_repo'] = array ( + 'title' => "Repository", + 'width' => 80, + 'template' => "templates/software_repo_edit.htm", + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'repo_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'repo_name_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'repo_name_unique'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '40', + 'maxlength' => '40', + 'rows' => '', + 'cols' => '' + ), + 'repo_url' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'repo_name_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'repo_name_unique'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '40', + 'maxlength' => '40', + 'rows' => '', + 'cols' => '' + ), + 'repo_username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '30', + 'rows' => '', + 'cols' => '' + ), + 'repo_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption' => 'CLEARTEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '30', + 'rows' => '', + 'cols' => '' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datenbankfelder + ################################## + ) +); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/system_config.tform.php b/interface/ispconfig/interface/admin/form/system_config.tform.php new file mode 100644 index 000000000..2ce24c52f --- /dev/null +++ b/interface/ispconfig/interface/admin/form/system_config.tform.php @@ -0,0 +1,167 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['sites'] = array ( + 'title' => "Sites", + 'width' => 70, + 'template' => "templates/system_config_sites_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'dbname_prefix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-0\-\_\[\]]{0,50}$/', + 'errmsg'=> 'dbname_prefix_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'dbuser_prefix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-0\-\_\[\]]{0,50}$/', + 'errmsg'=> 'dbuser_prefix_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ftpuser_prefix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-0\-\_\[\]]{0,50}$/', + 'errmsg'=> 'ftpuser_prefix_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'shelluser_prefix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-0\-\_\[\]]{0,50}$/', + 'errmsg'=> 'shelluser_prefix_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'dblist_phpmyadmin_link' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'phpmyadmin_url' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[0-9a-zA-Z\:\/\-\.]{0,255}$/', + 'errmsg'=> 'phpmyadmin_url_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['mail'] = array ( + 'title' => "Mail", + 'width' => 70, + 'template' => "templates/system_config_mail_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'mailboxlist_webmail_link' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'webmail_url' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[0-9a-zA-Z\:\/\-\.]{0,255}$/', + 'errmsg'=> 'webmail_url_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/form/users.tform.php b/interface/ispconfig/interface/admin/form/users.tform.php new file mode 100644 index 000000000..1edbb0cc4 --- /dev/null +++ b/interface/ispconfig/interface/admin/form/users.tform.php @@ -0,0 +1,456 @@ + 0 id must match with id of current user +$form['auth_preset']['userid'] = 0; +//* 0 = default groupid of the user, > 0 id must match with groupid of current user +$form['auth_preset']['groupid'] = 0; + +//** Permissions are: r = read, i = insert, u = update, d = delete +$form['auth_preset']['perm_user'] = 'riud'; +$form['auth_preset']['perm_group'] = 'riud'; +$form['auth_preset']['perm_other'] = ''; + +//* Pick out modules +$modules_list = array(); +$handle = @opendir(ISPC_WEB_PATH); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH."/$file")) { + if(is_file(ISPC_WEB_PATH."/$file/lib/module.conf.php") and $file != 'login' && $file != 'designer') { + $modules_list[$file] = $file; + } + } + } +} + +//* Load themes +$themes_list = array(); +$handle = @opendir(ISPC_THEMES_PATH); +while ($file = @readdir ($handle)) { + if (substr($file, 0, 1) != '.') { + if(@is_dir(ISPC_THEMES_PATH."/$file")) { + $themes_list[$file] = $file; + } + } +} + +//* Languages +$language_list = array(); +$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') { + $tmp = substr($file, 0, 2); + $language_list[$tmp] = $tmp; + } + } +} + +//* Pick out groups +$groups_list = array(); +$tmp_records = $app->db->queryAllRecords('SELECT groupid, name FROM sys_group ORDER BY name'); +if(is_array($tmp_records)) { + foreach($tmp_records as $tmp_rec) { + $groups_list[$tmp_rec['groupid']] = $tmp_rec['name']; + } +} + +$form['tabs']['users'] = array ( + 'title' => 'Users', + 'width' => 80, + 'template' => 'templates/users_user_edit.htm', + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'username_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'username_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\_]{0,64}$/', + 'errmsg'=> 'username_err'), + ), + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '30', + 'rows' => '', + 'cols' => '' + ), + 'passwort' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'CRYPT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '100', + 'rows' => '', + 'cols' => '' + ), + 'modules' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'regex' => '', + 'errmsg' => '', + 'default' => 'admin,forms', + 'value' => $modules_list, + 'separator' => ',', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'startmodule' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $modules_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'app_theme' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'RADIO', + 'regex' => '', + 'errmsg' => '', + 'default' => 'default', + 'value' => $themes_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'typ' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'RADIO', + 'regex' => '', + 'errmsg' => '', + 'default' => 'user', + 'value' => array ('user' => 'user', 'admin' => 'admin'), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'active' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => array(0 => 0,1 => 1), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'language' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $language_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '2', + 'rows' => '', + 'cols' => '' + ) + ################################## + # ENDE Datenbankfelder + ################################## + ) +); +/* +$form['tabs']['address'] = array ( + 'title' => 'Address', + 'width' => 80, + 'template' => 'templates/users_address_edit.htm', + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'vorname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'unternehmen' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'strasse' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'ort' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'plz' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'land' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'url' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'telefon' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'fax' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ) + + ################################## + # ENDE Datenbankfelder + ################################## + ) +); +*/ + +$form['tabs']['groups'] = array ( + 'title' => 'Groups', + 'width' => 80, + 'template' => 'templates/users_groups_edit.htm', + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'default_group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $groups_list, + 'separator' => ',', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'groups' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $groups_list, + 'separator' => ',', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ) + + ################################## + # ENDE Datenbankfelder + ################################## + ) +); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/groups_del.php b/interface/ispconfig/interface/admin/groups_del.php new file mode 100644 index 000000000..a7a804db5 --- /dev/null +++ b/interface/ispconfig/interface/admin/groups_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/groups_edit.php b/interface/ispconfig/interface/admin/groups_edit.php new file mode 100644 index 000000000..bee5976db --- /dev/null +++ b/interface/ispconfig/interface/admin/groups_edit.php @@ -0,0 +1,53 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); + +// let tform_actions handle the page +$app->tform_actions->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/groups_list.php b/interface/ispconfig/interface/admin/groups_list.php new file mode 100644 index 000000000..fee6a17bb --- /dev/null +++ b/interface/ispconfig/interface/admin/groups_list.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/index.php b/interface/ispconfig/interface/admin/index.php new file mode 100644 index 000000000..50afd7bca --- /dev/null +++ b/interface/ispconfig/interface/admin/index.php @@ -0,0 +1,78 @@ +uses('tpl'); + $app->tpl->newTemplate("form.tpl.htm"); + + $app->tpl->setVar('error',$error); + $app->tpl->setInclude('content_tpl','admin/templates/index.htm'); + return $app->tpl->grab(); + /* + $filename = 'test.txt'; +$somecontent = $app->tpl->grab(); + +// Sichergehen, dass die Datei existiert und beschreibbar ist + + + // Wir öffnen $filename im "Anhänge" - Modus. + // Der Dateizeiger befindet sich am Ende der Datei, und + // dort wird $somecontent später mit fwrite() geschrieben. + if (!$handle = fopen($filename, "w")) { + print "Kann die Datei $filename nicht öffnen"; + exit; + } + + // Schreibe $somecontent in die geöffnete Datei. + if (!fwrite($handle, $somecontent)) { + print "Kann in die Datei $filename nicht schreiben"; + exit; + } + + + fclose($handle); + + + + + return 'dd'; + */ + } +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/language_add.php b/interface/ispconfig/interface/admin/language_add.php new file mode 100644 index 000000000..9ab9adccc --- /dev/null +++ b/interface/ispconfig/interface/admin/language_add.php @@ -0,0 +1,104 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_add.htm'); + +//* reading languages +$language_option = ''; +$error = ''; +$msg = ''; +$selected_language = (isset($_REQUEST['lng_select']))?substr($_REQUEST['lng_select'],0,2):'en'; +if(!preg_match("/^[a-z]{2}$/i", $selected_language)) die('unallowed characters in selected language name.'); + +$handle = opendir(ISPC_ROOT_PATH.'/lib/lang/'); +while ($file = readdir ($handle)) { + if ($file != '.' && $file != '..') { + $tmp_lng = substr($file,0,-4); + if($tmp_lng !='') { + $selected = ($tmp_lng == $selected_language)?'SELECTED':''; + $language_option .= ""; + if(isset($_POST['lng_new']) && $_POST['lng_new'] == $tmp_lng) $error = 'Language exists already.'; + } + } +} +$app->tpl->setVar('language_option',$language_option); +$app->tpl->setVar('error',$error); + +if(isset($_POST['lng_new']) && strlen($_POST['lng_new']) == 2 && $error == '') { + $lng_new = $_POST['lng_new']; + if(!preg_match("/^[a-z]{2}$/i", $lng_new)) die('unallowed characters in language name.'); + + //* Copy the main language file + copy(ISPC_LIB_PATH."/lang/$selected_language.lng",ISPC_LIB_PATH."/lang/$lng_new.lng"); + + //* Make a copy of every language file + $bgcolor = '#FFFFFF'; + $language_files_list = array(); + $handle = @opendir(ISPC_WEB_PATH); + while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH.'/'.$file.'/lib/lang')) { + $handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang'); + while ($lang_file = @readdir ($handle2)) { + if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == $selected_language) { + $new_lang_file = $lng_new.substr($lang_file,2); + //echo ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file.' ## '.ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$new_lang_file; + copy(ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file,ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$new_lang_file); + $msg = 'Added new language '.$lng_new; + } + } + } + } + } +} + +$app->tpl->setVar('msg',$msg); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_add.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/language_complete.php b/interface/ispconfig/interface/admin/language_complete.php new file mode 100644 index 000000000..0906a52b5 --- /dev/null +++ b/interface/ispconfig/interface/admin/language_complete.php @@ -0,0 +1,167 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_complete.htm'); + +//* reading languages +$language_option = ''; +$error = ''; +$msg = ''; +$selected_language = (isset($_REQUEST['lng_select']))?substr($_REQUEST['lng_select'],0,2):'en'; +if(!preg_match("/^[a-z]{2}$/i", $selected_language)) die('unallowed characters in selected language name.'); + +$handle = opendir(ISPC_ROOT_PATH.'/lib/lang/'); +while ($file = readdir ($handle)) { + if ($file != '.' && $file != '..') { + $tmp_lng = substr($file,0,-4); + if($tmp_lng !='' && $tmp_lng != 'en') { + $selected = ($tmp_lng == $selected_language)?'SELECTED':''; + $language_option .= ""; + //if(isset($_POST['lng_new']) && $_POST['lng_new'] == $tmp_lng) $error = 'Language exists already.'; + } + } +} +$app->tpl->setVar('language_option',$language_option); +$app->tpl->setVar('error',$error); + +// Export the language file +if(isset($_POST['lng_select']) && $error == '') { + + // complete the global langauge file + merge_langfile(ISPC_LIB_PATH."/lang/".$selected_language.".lng",ISPC_LIB_PATH."/lang/en.lng"); + + // Go trough all language files + $bgcolor = '#FFFFFF'; + $language_files_list = array(); + $handle = @opendir(ISPC_WEB_PATH); + while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH.'/'.$file.'/lib/lang')) { + $handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang'); + while ($lang_file = @readdir ($handle2)) { + if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == 'en') { + $target_lang_file = $selected_language.substr($lang_file,2); + merge_langfile(ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$target_lang_file,ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file); + } + } + $handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang'); + while ($lang_file = @readdir ($handle2)) { + if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == $selected_language) { + $master_lang_file=ISPC_WEB_PATH.'/'.$file.'/lib/lang/en'.substr($lang_file,2); + $target_lang_file=ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file; + if(!file_exists($master_lang_file)){ + unlink($target_lang_file); + $msg.="File $target_lang_file removed because does not exist in master language
"; + } + } + }//Finish of remove the files how not exists in master language + } + } + } +if($msg=='') +$msg="No files created, removed or modified
"; +} + +function merge_langfile($langfile,$masterfile) { + global $msg; + + if(is_file($langfile)) { + + // Load the english language file + include($masterfile); + if(isset($wb) && is_array($wb)) { + $wb_master = $wb; + unset($wb); + } else { + $wb_master = array(); + } + + // Load the incomplete language file + $wb = array(); + include($langfile); + + $n = 0; + foreach($wb_master as $key => $val) { + if(!isset($wb[$key])) { + $wb[$key] = $val; + $n++; + } + } + + $r = 0; + foreach($wb as $key => $val) { + if(!isset($wb_master[$key])) { + unset($wb[$key]); + $r++; + } + } + + $file_content = " $val) { + $val = str_replace("'",'',$val); + $val = str_replace('"','',$val); + $file_content .= '$wb['."'$key'".'] = '."'$val';\n"; + } + $file_content .= "?>\n"; + + if($n!=0) + $msg .= "Added $n lines to the file $langfile
"; + if($r!=0) + $msg .= "Removed $r lines to the file $langfile
"; + file_put_contents($langfile ,$file_content); + } else { + $msg .= "File does not exist yet. Copied file $masterfile to $langfile
"; + copy($masterfile,$langfile); + } +} + +$app->tpl->setVar('msg',$msg); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_complete.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/language_edit.php b/interface/ispconfig/interface/admin/language_edit.php new file mode 100644 index 000000000..d76dc62a8 --- /dev/null +++ b/interface/ispconfig/interface/admin/language_edit.php @@ -0,0 +1,104 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_edit.htm'); + +$lang = $_REQUEST['lang']; +$module = $_REQUEST['module']; +$lang_file = $_REQUEST['lang_file']; + +if(!preg_match("/^[a-z]+$/i", $lang)) die('unallowed characters in language name.'); +if(!preg_match("/^[a-z_]+$/i", $module)) die('unallowed characters in module name.'); +if(!preg_match("/^[a-z\._]+$/i", $lang_file)) die('unallowed characters in language file name.'); + +$msg = ''; + +//* Save data +if(isset($_POST['records']) && is_array($_POST['records'])) { + $file_content = " $val) { + $val = stripslashes($val); + $val = str_replace('"','\"',$val); + $val = str_replace('$','',$val); + $file_content .= '$wb['."'$key'".'] = "'.$val.'";'."\n"; + $msg = 'File saved.'; + } + $file_content .= "?>\n"; + if($module == 'global') { + file_put_contents(ISPC_LIB_PATH."/lang/$lang_file" ,$file_content); + } else { + file_put_contents(ISPC_WEB_PATH."/$module/lib/lang/$lang_file" ,$file_content); + } +} + + +$app->tpl->setVar(array('module' => $module,'lang_file' => $lang_file, 'lang' => $lang, 'msg' => $msg)); + +if($module == 'global') { + include(ISPC_LIB_PATH."/lang/$lang_file"); + $file_path = ISPC_LIB_PATH."/lang/$lang_file"; +} else { + include(ISPC_WEB_PATH."/$module/lib/lang/$lang_file"); + $file_path = ISPC_WEB_PATH."/$module/lib/lang/$lang_file"; +} +$app->tpl->setVar("file_path", $file_path); + +$keyword_list = array(); +if(isset($wb) && is_array($wb)) { + foreach($wb as $key => $val) { + $keyword_list[] = array('key' => $key, 'val' => $val); + } + + $app->tpl->setLoop('records', $keyword_list); + unset($wb); +} + + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_edit.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> diff --git a/interface/ispconfig/interface/admin/language_export.php b/interface/ispconfig/interface/admin/language_export.php new file mode 100644 index 000000000..eb5790bf1 --- /dev/null +++ b/interface/ispconfig/interface/admin/language_export.php @@ -0,0 +1,120 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_export.htm'); + +//* reading languages +$language_option = ''; +$error = ''; +$msg = ''; +$selected_language = (isset($_REQUEST['lng_select']))?substr($_REQUEST['lng_select'],0,2):'en'; +if(!preg_match("/^[a-z]{2}$/i", $selected_language)) die('unallowed characters in selected language name.'); + +$handle = opendir(ISPC_ROOT_PATH.'/lib/lang/'); +while ($file = readdir ($handle)) { + if ($file != '.' && $file != '..') { + $tmp_lng = substr($file,0,-4); + if($tmp_lng !='') { + $selected = ($tmp_lng == $selected_language)?'SELECTED':''; + $language_option .= ""; + //if(isset($_POST['lng_new']) && $_POST['lng_new'] == $tmp_lng) $error = 'Language exists already.'; + } + } +} +$app->tpl->setVar('language_option',$language_option); +$app->tpl->setVar('error',$error); + +// Export the language file +if(isset($_POST['lng_select']) && $error == '') { + //$lng_select = $_POST['lng_select']; + //if(!preg_match("/^[a-z]{2}$/i", $lng_select)) die('unallowed characters in language name.'); + + // This variable contains the content of the language files + $content = ''; + $content .= "---|ISPConfig Language File|".$conf["app_version"]."|".$selected_language."\n"; + + //* get the global language file + $content .= "--|global|".$selected_language."|".$selected_language.".lng\n"; + $content .= file_get_contents(ISPC_LIB_PATH."/lang/".$selected_language.".lng")."\n"; + + //* Get the global file of the module + //$content .= "---|$module|$selected_language|\n"; + //copy(ISPC_WEB_PATH."/$module/lib/lang/$selected_language.lng",ISPC_WEB_PATH."/$module/lib/lang/$lng_new.lng"); + $bgcolor = '#FFFFFF'; + $language_files_list = array(); + $handle = @opendir(ISPC_WEB_PATH); + while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH.'/'.$file.'/lib/lang')) { + $handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang'); + while ($lang_file = @readdir ($handle2)) { + if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == $selected_language) { + $content .= "--|".$file."|".$selected_language."|".$lang_file."\n"; + $content .= file_get_contents(ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file)."\n"; + $msg .= 'Exported language file '.$lang_file.'
'; + } + } + } + } + } + + $content .= '---|EOF'; + + // Write the language file + file_put_contents(ISPC_WEB_TEMP_PATH.'/'.$selected_language.'.lng', $content); + + $msg = "Exported language file to: /temp/".$selected_language.'.lng'; + + //$msg = nl2br($content); +} + +$app->tpl->setVar('msg',$msg); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_export.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/language_import.php b/interface/ispconfig/interface/admin/language_import.php new file mode 100644 index 000000000..12eb86d4a --- /dev/null +++ b/interface/ispconfig/interface/admin/language_import.php @@ -0,0 +1,105 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_import.htm'); +$msg = ''; +$error = ''; + +// Export the language file +if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name'])) { + $lines = file($_FILES['file']['tmp_name']); + // initial check + $parts = explode('|',$lines[0]); + if($parts[0] == '---' && $parts[1] == 'ISPConfig Language File') { + if($_POST['ignore_version'] != 1 && $parts[2] != $conf["app_version"]) { + $error .= 'Application version does not match. Appversion: '.$conf["app_version"].' Lanfile version: '.$parts[2]; + } else { + unset($lines[0]); + + $buffer = ''; + $langfile_path = ''; + // all other lines + foreach($lines as $line) { + $parts = explode('|',$line); + if(is_array($parts) && count($parts) > 0 && $parts[0] == '--') { + // Write language file, if its not the first file + if($buffer != '' && $langfile_path != '') { + if(@$_REQUEST['overwrite'] != 1 && @is_file($langfile_path)) { + $error .= "File exists, not written: $langfile_path
"; + } else { + $msg .= "File written: $langfile_path
"; + file_put_contents($langfile_path,$buffer); + } + } + // empty buffer and set variables + $buffer = ''; + $module_name = trim($parts[1]); + $selected_language = trim($parts[2]); + $file_name = trim($parts[3]); + if(!preg_match("/^[a-z]{2}$/i", $selected_language)) die("unallowed characters in selected language name: $selected_language"); + if(!preg_match("/^[a-z_]+$/i", $module_name)) die('unallowed characters in module name.'); + if(!preg_match("/^[a-z\._]+$/i", $file_name) || stristr($file_name,'..')) die("unallowed characters in language file name: '$file_name'"); + if($module_name == 'global') { + $langfile_path = trim(ISPC_LIB_PATH."/lang/".$selected_language.".lng"); + } else { + $langfile_path = trim(ISPC_WEB_PATH.'/'.$module_name.'/lib/lang/'.$file_name); + } + } else { + $buffer .= $line; + } + } + } + } +} + +$app->tpl->setVar('msg',$msg); +$app->tpl->setVar('error',$error); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_import.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/language_list.php b/interface/ispconfig/interface/admin/language_list.php new file mode 100644 index 000000000..f423be4cc --- /dev/null +++ b/interface/ispconfig/interface/admin/language_list.php @@ -0,0 +1,108 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/language_list.htm'); + +$language_files_list = array(); +$bgcolor = '#FFFFFF'; + +//* reading languages +$language_option = ''; +$selected_language = (isset($_REQUEST['lng_select']))?substr($_REQUEST['lng_select'],0,2):$_SESSION['s']['language']; +$handle = opendir(ISPC_ROOT_PATH.'/lib/lang/'); +while ($file = readdir ($handle)) { + if ($file != '.' && $file != '..') { + $tmp_lng = substr($file,0,-4); + if($tmp_lng !='') { + $selected = ($tmp_lng == $selected_language)?'SELECTED':''; + $language_option .= ""; + + //$bgcolor = ($bgcolor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; + if($file == $selected_language.'.lng') { + $language_files_list[] = array( 'module' => 'global', + 'lang_file' => $file, + 'lang_file_date' => date("Y-m-d H:i:s", filectime(ISPC_ROOT_PATH.'/lib/lang/'.$file)), + 'bgcolor' => $bgcolor, + 'lang' => $selected_language); + } + + + } + } +} +$app->tpl->setVar('language_option',$language_option); +// $app->tpl->setLoop('records', $language_list); + +//* list all language files of the selected language +$handle = @opendir(ISPC_WEB_PATH); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH.'/'.$file.'/lib/lang')) { + $handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang'); + while ($lang_file = @readdir ($handle2)) { + if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == $selected_language) { + $bgcolor = ($bgcolor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; + $language_files_list[] = array( 'module' => $file, + 'lang_file' => $lang_file, + 'lang_file_date' => date("Y-m-d H:i:s", filectime(ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file)), + 'bgcolor' => $bgcolor, + 'lang' => $selected_language); + } + } + } + } +} + +$app->tpl->setLoop('records', $language_files_list); + + + + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_list.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/bg.lng b/interface/ispconfig/interface/admin/lib/lang/bg.lng new file mode 100644 index 000000000..8a1c30b48 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/bg_firewall.lng new file mode 100644 index 000000000..e626345d3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_firewall_list.lng new file mode 100644 index 000000000..24a34be1c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_groups.lng b/interface/ispconfig/interface/admin/lib/lang/bg_groups.lng new file mode 100644 index 000000000..b59c2102c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_groups_list.lng new file mode 100644 index 000000000..fcf73a118 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_add.lng new file mode 100644 index 000000000..2dd36894e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_complete.lng new file mode 100644 index 000000000..30c51c292 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_complete.lng @@ -0,0 +1,7 @@ +Към Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ ÐµÐ·Ð¸Ðº ще бъдат добавени файлове и отделни запиÑи, които липÑват в него, но ÑъщеÑтвуват в английÑкиÑ.'; +$wb['language_select_txt'] = 'Изберете език'; +$wb['btn_save_txt'] = 'Сливане'; +$wb['btn_cancel_txt'] = 'Отказ'; +$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file.
This adds missing strings from the english master language files to the selected language.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_edit.lng new file mode 100644 index 000000000..ce30b66fc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_export.lng new file mode 100644 index 000000000..d8e91de25 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_import.lng new file mode 100644 index 000000000..4d3922ed7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_language_list.lng new file mode 100644 index 000000000..2a096aa61 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/bg_remote_user.lng new file mode 100644 index 000000000..cc9335bc5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_remote_user_list.lng new file mode 100644 index 000000000..152a75fba --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server.lng new file mode 100644 index 000000000..1b42f22c8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server_config.lng new file mode 100644 index 000000000..16803a9f5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server_config_list.lng new file mode 100644 index 000000000..636c2e050 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server_ip.lng new file mode 100644 index 000000000..6d451f5b2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server_ip_list.lng new file mode 100644 index 000000000..81ae8f01d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_server_list.lng new file mode 100644 index 000000000..7b42c497e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_software_package_list.lng new file mode 100644 index 000000000..03917cabc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/bg_software_repo.lng new file mode 100644 index 000000000..574dd1162 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_software_repo_list.lng new file mode 100644 index 000000000..b7a219ffa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_software_update_list.lng new file mode 100644 index 000000000..ebf4e6fbc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/bg_system_config.lng new file mode 100644 index 000000000..e7f5d9365 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_users.lng b/interface/ispconfig/interface/admin/lib/lang/bg_users.lng new file mode 100644 index 000000000..8e70364aa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/bg_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/bg_users_list.lng new file mode 100644 index 000000000..0de8cdc3e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/bg_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/br.lng b/interface/ispconfig/interface/admin/lib/lang/br.lng new file mode 100644 index 000000000..9debee0b4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/br_firewall.lng new file mode 100644 index 000000000..40a7496af --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_firewall_list.lng new file mode 100644 index 000000000..d29995712 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_groups.lng b/interface/ispconfig/interface/admin/lib/lang/br_groups.lng new file mode 100644 index 000000000..41afadbfe --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_groups_list.lng new file mode 100644 index 000000000..73a6f438f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_groups_list.lng @@ -0,0 +1,7 @@ +AVISO: Não modifique ou edite qualquer configuração de usuário aqui. Use o módulo de cliente ou revendedor. Modificar ou alterar usuários e grupos aqui pode ocasionar perda de dados!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_add.lng new file mode 100644 index 000000000..064b9eaf0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_complete.lng new file mode 100644 index 000000000..c4c0b1453 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_complete.lng @@ -0,0 +1,7 @@ +Isto permite completar qualquer falha de tradução, com o arquivo principal original em inglês.'; +$wb['language_select_txt'] = 'Selecionar Idioma'; +$wb['btn_save_txt'] = 'Mesclar arquivos agora'; +$wb['btn_cancel_txt'] = 'Voltar'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_edit.lng new file mode 100644 index 000000000..2a3f572d1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_export.lng new file mode 100644 index 000000000..d48466138 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_import.lng new file mode 100644 index 000000000..290335b6f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_language_list.lng new file mode 100644 index 000000000..348b94aaf --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/br_remote_user.lng new file mode 100644 index 000000000..c87397978 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_remote_user_list.lng new file mode 100644 index 000000000..d84321ddb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server.lng b/interface/ispconfig/interface/admin/lib/lang/br_server.lng new file mode 100644 index 000000000..899104f61 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/br_server_config.lng new file mode 100644 index 000000000..6791ea1da --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_server_config_list.lng new file mode 100644 index 000000000..60047d5c1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/br_server_ip.lng new file mode 100644 index 000000000..b062dbbf1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_server_ip_list.lng new file mode 100644 index 000000000..864464e22 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_server_list.lng new file mode 100644 index 000000000..5a1266c64 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_software_package_list.lng new file mode 100644 index 000000000..893cc4cc3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/br_software_repo.lng new file mode 100644 index 000000000..5b54c3080 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_software_repo_list.lng new file mode 100644 index 000000000..6941c7f14 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_software_update_list.lng new file mode 100644 index 000000000..e6af8ec63 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/br_system_config.lng new file mode 100644 index 000000000..5fa32abd9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_users.lng b/interface/ispconfig/interface/admin/lib/lang/br_users.lng new file mode 100644 index 000000000..28369f7a6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/br_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/br_users_list.lng new file mode 100644 index 000000000..d21054a08 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/br_users_list.lng @@ -0,0 +1,9 @@ +AVISO: Não modifique ou edite qualquer configuração de usuário aqui. Use o módulo de cliente ou revendedor. Modificar ou alterar usuários e grupos aqui pode ocasionar perda de dados!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/de.lng b/interface/ispconfig/interface/admin/lib/lang/de.lng new file mode 100644 index 000000000..c5fd284ee --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/de_firewall.lng new file mode 100644 index 000000000..0f58d7c3d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_firewall_list.lng new file mode 100644 index 000000000..aefad619b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_groups.lng b/interface/ispconfig/interface/admin/lib/lang/de_groups.lng new file mode 100644 index 000000000..25f81b1f3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_groups_list.lng new file mode 100644 index 000000000..244743177 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_groups_list.lng @@ -0,0 +1,7 @@ +WARNUNG: Bitte hier keine Benutzereinstellungen verändern. Benutzen Sie die Kunden- und Resellereinstellungen im Kundenmodul. Modifizieren der Benutzer oder Gruppen hier könnte zum Datenverlust führen!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_add.lng new file mode 100644 index 000000000..118bdee04 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_complete.lng new file mode 100644 index 000000000..1376e0c8a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_complete.lng @@ -0,0 +1,7 @@ +Dies fügt fehlende Sätze aus der englischen Master Sprachdatei in der gewählten Sprache ein.'; +$wb['language_select_txt'] = 'Sprache auswählen'; +$wb['btn_save_txt'] = 'Dateien jetzt zusammenführen'; +$wb['btn_cancel_txt'] = 'Zurück'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_edit.lng new file mode 100644 index 000000000..30ab21b28 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_export.lng new file mode 100644 index 000000000..70eb466d4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_import.lng new file mode 100644 index 000000000..698213e43 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_language_list.lng new file mode 100644 index 000000000..074eab9e8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/de_remote_user.lng new file mode 100644 index 000000000..c6fddd9a6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_remote_user_list.lng new file mode 100644 index 000000000..163b7e847 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server.lng b/interface/ispconfig/interface/admin/lib/lang/de_server.lng new file mode 100644 index 000000000..f01116a58 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/de_server_config.lng new file mode 100644 index 000000000..f0caa43f2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_server_config_list.lng new file mode 100644 index 000000000..191b2c8d3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/de_server_ip.lng new file mode 100644 index 000000000..8210037c5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_server_ip_list.lng new file mode 100644 index 000000000..0d0727cd1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_server_list.lng new file mode 100644 index 000000000..332a603cc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_software_package_list.lng new file mode 100644 index 000000000..ca797d3cc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/de_software_repo.lng new file mode 100644 index 000000000..6e54c4a6b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_software_repo_list.lng new file mode 100644 index 000000000..db6f49fd4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_software_update_list.lng new file mode 100644 index 000000000..6f01c1f08 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/de_system_config.lng new file mode 100644 index 000000000..2c10f2567 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_users.lng b/interface/ispconfig/interface/admin/lib/lang/de_users.lng new file mode 100644 index 000000000..436cff547 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/de_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/de_users_list.lng new file mode 100644 index 000000000..73a619517 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/de_users_list.lng @@ -0,0 +1,9 @@ +WARNUNG: Bitte hier keine Benutzereinstellungen verändern. Benutzen Sie die Kunden- und Resellereinstellungen im Kundenmodul. Modifizieren der Benutzer oder Gruppen hier könnte zum Datenverlust führen!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/en.lng b/interface/ispconfig/interface/admin/lib/lang/en.lng new file mode 100644 index 000000000..06a3b45bf --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en.lng @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/en_firewall.lng new file mode 100644 index 000000000..025108beb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_firewall.lng @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_firewall_list.lng new file mode 100644 index 000000000..d16e1c7df --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_firewall_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_groups.lng b/interface/ispconfig/interface/admin/lib/lang/en_groups.lng new file mode 100644 index 000000000..a504f9913 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_groups.lng @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_groups_list.lng new file mode 100644 index 000000000..ba1831836 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_add.lng new file mode 100644 index 000000000..2b5e5a40f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_add.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_complete.lng new file mode 100644 index 000000000..15438775f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_complete.lng @@ -0,0 +1,7 @@ +This adds missing strings from the english master language files to the selected language.'; +$wb["language_select_txt"] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_edit.lng new file mode 100644 index 000000000..4c50e883e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_export.lng new file mode 100644 index 000000000..791fc894d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_export.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_import.lng new file mode 100644 index 000000000..a554c6c22 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_import.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_language_list.lng new file mode 100644 index 000000000..e70f09f8e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/en_remote_user.lng new file mode 100644 index 000000000..cc9335bc5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_remote_user_list.lng new file mode 100644 index 000000000..56c6fac4b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_remote_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server.lng b/interface/ispconfig/interface/admin/lib/lang/en_server.lng new file mode 100644 index 000000000..dcd46c582 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server.lng @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/en_server_config.lng new file mode 100644 index 000000000..603245d7d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server_config.lng @@ -0,0 +1,68 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_server_config_list.lng new file mode 100644 index 000000000..4d8a3f6a5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server_config_list.lng @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/en_server_ip.lng new file mode 100644 index 000000000..ae4717c53 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server_ip.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_server_ip_list.lng new file mode 100644 index 000000000..008dfc4e0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server_ip_list.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_server_list.lng new file mode 100644 index 000000000..d15701e80 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_server_list.lng @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_software_package_list.lng new file mode 100644 index 000000000..03917cabc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/en_software_repo.lng new file mode 100644 index 000000000..7968b000f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_software_repo.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_software_repo_list.lng new file mode 100644 index 000000000..f0a0b3092 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_software_repo_list.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_software_update_list.lng new file mode 100644 index 000000000..ec4af23a4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/en_system_config.lng new file mode 100644 index 000000000..450222722 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_system_config.lng @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/en_users.lng b/interface/ispconfig/interface/admin/lib/lang/en_users.lng new file mode 100644 index 000000000..0f9a1c5b5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/en_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/en_users_list.lng new file mode 100644 index 000000000..1042cd35b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/en_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/lib/lang/es.lng b/interface/ispconfig/interface/admin/lib/lang/es.lng new file mode 100644 index 000000000..3e3566f6e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/es_firewall.lng new file mode 100644 index 000000000..2b31cf5aa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_firewall_list.lng new file mode 100644 index 000000000..8332c413a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_groups.lng b/interface/ispconfig/interface/admin/lib/lang/es_groups.lng new file mode 100644 index 000000000..37e6cd8eb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_groups_list.lng new file mode 100644 index 000000000..f36c4d858 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_add.lng new file mode 100644 index 000000000..d0f057aef --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_complete.lng new file mode 100644 index 000000000..0e3e183f3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_complete.lng @@ -0,0 +1,7 @@ +Esto añade las cadenas perdidas desde el fichero maestro en inglés.'; +$wb['language_select_txt'] = 'Elegir idioma'; +$wb['btn_save_txt'] = 'Mezclar los ficheros ahora'; +$wb['btn_cancel_txt'] = 'Atrás'; +$wb['list_desc_txt'] = 'Mezclar el fichero de idioma seleccionado con el fichero de idioma maestro en inglés.
Esto añade cadenas perdidas desde el fichero de idioma maestro en inglés al idioma seleccionado.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_edit.lng new file mode 100644 index 000000000..f471c4d40 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_export.lng new file mode 100644 index 000000000..2883a7e20 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_import.lng new file mode 100644 index 000000000..87b465e14 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_language_list.lng new file mode 100644 index 000000000..dfa2caecc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/es_remote_user.lng new file mode 100644 index 000000000..f3d3a9a12 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_remote_user_list.lng new file mode 100644 index 000000000..e73f8002d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server.lng b/interface/ispconfig/interface/admin/lib/lang/es_server.lng new file mode 100644 index 000000000..e38ccfc92 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/es_server_config.lng new file mode 100644 index 000000000..a76a5cfe2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_server_config_list.lng new file mode 100644 index 000000000..6dd827ae0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/es_server_ip.lng new file mode 100644 index 000000000..6358c5d38 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_server_ip_list.lng new file mode 100644 index 000000000..9ae983415 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_server_list.lng new file mode 100644 index 000000000..11a8e6f10 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_software_package_list.lng new file mode 100644 index 000000000..d4482d59e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/es_software_repo.lng new file mode 100644 index 000000000..3b9a89e88 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_software_repo_list.lng new file mode 100644 index 000000000..59f97903e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_software_update_list.lng new file mode 100644 index 000000000..adbe6d8c9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/es_system_config.lng new file mode 100644 index 000000000..7ce9dbebe --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_users.lng b/interface/ispconfig/interface/admin/lib/lang/es_users.lng new file mode 100644 index 000000000..156106051 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/es_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/es_users_list.lng new file mode 100644 index 000000000..ec368916f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/es_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fi.lng b/interface/ispconfig/interface/admin/lib/lang/fi.lng new file mode 100644 index 000000000..545a3bfa8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/fi_firewall.lng new file mode 100644 index 000000000..63cc2f7e7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_firewall_list.lng new file mode 100644 index 000000000..96ff2dc63 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_groups.lng b/interface/ispconfig/interface/admin/lib/lang/fi_groups.lng new file mode 100644 index 000000000..141322bc0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_groups_list.lng new file mode 100644 index 000000000..71d938399 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_add.lng new file mode 100644 index 000000000..24efb7e4e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_complete.lng new file mode 100644 index 000000000..b1776c921 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_complete.lng @@ -0,0 +1,7 @@ +Tämä lisää puuttuvat käännöskohdat valittuun kielitiedostoon.'; +$wb['language_select_txt'] = 'Valitse täydennettävä kieli'; +$wb['btn_save_txt'] = 'Yhdistä kielitiedostot nyt'; +$wb['btn_cancel_txt'] = 'Keskeytä'; +$wb['list_desc_txt'] = 'Yhdistää valitun kielitiedoston englannin kielisen päätiedoston kanssa.
Tämä lisää puuttuvat käännöstiedot valittuun kielitiedostoon.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_edit.lng new file mode 100644 index 000000000..cdf73da64 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_export.lng new file mode 100644 index 000000000..b1ff06c4e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_import.lng new file mode 100644 index 000000000..ca60528e0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_language_list.lng new file mode 100644 index 000000000..85e7b70e1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/fi_remote_user.lng new file mode 100644 index 000000000..1876872ed --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_remote_user_list.lng new file mode 100644 index 000000000..6aa4bd775 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server.lng new file mode 100644 index 000000000..10058aa76 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server_config.lng new file mode 100644 index 000000000..3ef8fd691 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server_config_list.lng new file mode 100644 index 000000000..ed1cbed5b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server_ip.lng new file mode 100644 index 000000000..9c330fc45 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server_ip_list.lng new file mode 100644 index 000000000..a297a62bf --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_server_list.lng new file mode 100644 index 000000000..30863bdf2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_software_package_list.lng new file mode 100644 index 000000000..a8957cc9f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/fi_software_repo.lng new file mode 100644 index 000000000..c89969445 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_software_repo_list.lng new file mode 100644 index 000000000..bde844c99 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_software_update_list.lng new file mode 100644 index 000000000..9d9a2d2f7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/fi_system_config.lng new file mode 100644 index 000000000..254801e73 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_users.lng b/interface/ispconfig/interface/admin/lib/lang/fi_users.lng new file mode 100644 index 000000000..08bada037 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fi_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/fi_users_list.lng new file mode 100644 index 000000000..fe58f3b3b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fi_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fr.lng b/interface/ispconfig/interface/admin/lib/lang/fr.lng new file mode 100644 index 000000000..929c46ef1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/fr_firewall.lng new file mode 100644 index 000000000..128000a32 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_firewall_list.lng new file mode 100644 index 000000000..965eb0109 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_groups.lng b/interface/ispconfig/interface/admin/lib/lang/fr_groups.lng new file mode 100644 index 000000000..e0a92d734 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_groups_list.lng new file mode 100644 index 000000000..2ebbc365a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_add.lng new file mode 100644 index 000000000..7db36eb7c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_complete.lng new file mode 100644 index 000000000..ede6ca5d0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_complete.lng @@ -0,0 +1,7 @@ +Ceci ajoute les élements manquant en anglais au fichier sélectionné.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_edit.lng new file mode 100644 index 000000000..021acb440 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_export.lng new file mode 100644 index 000000000..b8196967c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_import.lng new file mode 100644 index 000000000..8f765458a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_language_list.lng new file mode 100644 index 000000000..8e9f26a7b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/fr_remote_user.lng new file mode 100644 index 000000000..cc9335bc5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_remote_user_list.lng new file mode 100644 index 000000000..152a75fba --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server.lng new file mode 100644 index 000000000..e8ab79753 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server_config.lng new file mode 100644 index 000000000..0c228902f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server_config_list.lng new file mode 100644 index 000000000..850cdd120 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server_ip.lng new file mode 100644 index 000000000..39ae21c60 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server_ip_list.lng new file mode 100644 index 000000000..6bef5a373 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_server_list.lng new file mode 100644 index 000000000..32637a350 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_software_package_list.lng new file mode 100644 index 000000000..f3d2c87b7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/fr_software_repo.lng new file mode 100644 index 000000000..7b3ec481a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_software_repo_list.lng new file mode 100644 index 000000000..56749896b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_software_update_list.lng new file mode 100644 index 000000000..e630b6741 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/fr_system_config.lng new file mode 100644 index 000000000..9c7f7d907 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_users.lng b/interface/ispconfig/interface/admin/lib/lang/fr_users.lng new file mode 100644 index 000000000..9bef687fb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/fr_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/fr_users_list.lng new file mode 100644 index 000000000..6d70fd85c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/fr_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/hu.lng b/interface/ispconfig/interface/admin/lib/lang/hu.lng new file mode 100644 index 000000000..d9e925f83 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/hu_firewall.lng new file mode 100644 index 000000000..e626345d3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_firewall_list.lng new file mode 100644 index 000000000..24a34be1c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_groups.lng b/interface/ispconfig/interface/admin/lib/lang/hu_groups.lng new file mode 100644 index 000000000..61c3dc538 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_groups_list.lng new file mode 100644 index 000000000..f1d8e2c1a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_add.lng new file mode 100644 index 000000000..8236c4851 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_complete.lng new file mode 100644 index 000000000..b5200ff9d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_complete.lng @@ -0,0 +1,7 @@ +This adds missing strings from the english master language files to the selected language.'; +$wb['language_select_txt'] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file.
This adds missing strings from the english master language files to the selected language.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_edit.lng new file mode 100644 index 000000000..06ec606b0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_export.lng new file mode 100644 index 000000000..64c537f60 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_import.lng new file mode 100644 index 000000000..811100182 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_language_list.lng new file mode 100644 index 000000000..658bd4125 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/hu_remote_user.lng new file mode 100644 index 000000000..cc9335bc5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_remote_user_list.lng new file mode 100644 index 000000000..152a75fba --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server.lng new file mode 100644 index 000000000..1d61a372b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server_config.lng new file mode 100644 index 000000000..39f006e6f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server_config_list.lng new file mode 100644 index 000000000..ade34c78c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server_ip.lng new file mode 100644 index 000000000..5ffcd04db --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server_ip_list.lng new file mode 100644 index 000000000..df533bca2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_server_list.lng new file mode 100644 index 000000000..e0e9d1384 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_software_package_list.lng new file mode 100644 index 000000000..6f71f7515 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/hu_software_repo.lng new file mode 100644 index 000000000..574dd1162 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_software_repo_list.lng new file mode 100644 index 000000000..8d2d43005 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_software_update_list.lng new file mode 100644 index 000000000..db6ade2c4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/hu_system_config.lng new file mode 100644 index 000000000..e7f5d9365 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_users.lng b/interface/ispconfig/interface/admin/lib/lang/hu_users.lng new file mode 100644 index 000000000..f9b525e99 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/hu_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/hu_users_list.lng new file mode 100644 index 000000000..1cfe243f7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/hu_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/it.lng b/interface/ispconfig/interface/admin/lib/lang/it.lng new file mode 100644 index 000000000..1628a4ef7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/it_firewall.lng new file mode 100644 index 000000000..c58341df8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_firewall_list.lng new file mode 100644 index 000000000..24a34be1c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_groups.lng b/interface/ispconfig/interface/admin/lib/lang/it_groups.lng new file mode 100644 index 000000000..61c3dc538 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_groups_list.lng new file mode 100644 index 000000000..f1d8e2c1a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_add.lng new file mode 100644 index 000000000..d157e08f6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_complete.lng new file mode 100644 index 000000000..b5200ff9d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_complete.lng @@ -0,0 +1,7 @@ +This adds missing strings from the english master language files to the selected language.'; +$wb['language_select_txt'] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file.
This adds missing strings from the english master language files to the selected language.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_edit.lng new file mode 100644 index 000000000..4c50e883e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_export.lng new file mode 100644 index 000000000..f45d47b17 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_import.lng new file mode 100644 index 000000000..4c31ec3de --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_language_list.lng new file mode 100644 index 000000000..c63fb0f57 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/it_remote_user.lng new file mode 100644 index 000000000..cc9335bc5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_remote_user_list.lng new file mode 100644 index 000000000..152a75fba --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server.lng b/interface/ispconfig/interface/admin/lib/lang/it_server.lng new file mode 100644 index 000000000..922eae179 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/it_server_config.lng new file mode 100644 index 000000000..dfe9ce657 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_server_config_list.lng new file mode 100644 index 000000000..10a3e1731 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/it_server_ip.lng new file mode 100644 index 000000000..6d451f5b2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_server_ip_list.lng new file mode 100644 index 000000000..c2c4ab9e0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_server_list.lng new file mode 100644 index 000000000..79ec28fbb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_software_package_list.lng new file mode 100644 index 000000000..03917cabc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/it_software_repo.lng new file mode 100644 index 000000000..574dd1162 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_software_repo_list.lng new file mode 100644 index 000000000..4db52118e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_software_update_list.lng new file mode 100644 index 000000000..d45ee9ac4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/it_system_config.lng new file mode 100644 index 000000000..e7f5d9365 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_users.lng b/interface/ispconfig/interface/admin/lib/lang/it_users.lng new file mode 100644 index 000000000..8e70364aa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/it_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/it_users_list.lng new file mode 100644 index 000000000..35598d33f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/it_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ja.lng b/interface/ispconfig/interface/admin/lib/lang/ja.lng new file mode 100644 index 000000000..338f02404 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/ja_firewall.lng new file mode 100644 index 000000000..1f567b6b0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_firewall_list.lng new file mode 100644 index 000000000..738c3e83f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_groups.lng b/interface/ispconfig/interface/admin/lib/lang/ja_groups.lng new file mode 100644 index 000000000..7fa2d9fa1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_groups_list.lng new file mode 100644 index 000000000..ced6ab2c4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_add.lng new file mode 100644 index 000000000..c704242c9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_complete.lng new file mode 100644 index 000000000..a5da8806f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_complete.lng @@ -0,0 +1,7 @@ +é¸ã‚“ã è¨€èªžãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬ ã‘ã¦ã„ã‚‹è¦ç´ ãŒã‚ã‚‹å ´åˆã€è‹±èªžç‰ˆã‹ã‚‰æŠœã出ã—ã¦è¿½åŠ ã—ã¾ã™ã€‚'; +$wb['language_select_txt'] = '言語をé¸ã‚“ã§ãã ã•ã„'; +$wb['btn_save_txt'] = 'ファイルをマージã™ã‚‹'; +$wb['btn_cancel_txt'] = '戻る'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_edit.lng new file mode 100644 index 000000000..f913997b9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_export.lng new file mode 100644 index 000000000..fc5d3845b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_import.lng new file mode 100644 index 000000000..4c5551495 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_language_list.lng new file mode 100644 index 000000000..7fe018edb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/ja_remote_user.lng new file mode 100644 index 000000000..4a01d4c56 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_remote_user_list.lng new file mode 100644 index 000000000..4631fbbdb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server.lng new file mode 100644 index 000000000..8eb0ef74d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server_config.lng new file mode 100644 index 000000000..5ef759a3a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server_config_list.lng new file mode 100644 index 000000000..c77cfc9bc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server_ip.lng new file mode 100644 index 000000000..db52f249d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server_ip_list.lng new file mode 100644 index 000000000..7879f5127 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_server_list.lng new file mode 100644 index 000000000..1fa42e8ef --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_software_package_list.lng new file mode 100644 index 000000000..5718b756e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/ja_software_repo.lng new file mode 100644 index 000000000..fba63e998 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_software_repo_list.lng new file mode 100644 index 000000000..a7d06d8fd --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_software_update_list.lng new file mode 100644 index 000000000..b37528035 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/ja_system_config.lng new file mode 100644 index 000000000..673ef189d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_users.lng b/interface/ispconfig/interface/admin/lib/lang/ja_users.lng new file mode 100644 index 000000000..040c2692a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ja_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/ja_users_list.lng new file mode 100644 index 000000000..2ab8d227f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ja_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/nl.lng b/interface/ispconfig/interface/admin/lib/lang/nl.lng new file mode 100644 index 000000000..41071ac33 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/nl_firewall.lng new file mode 100644 index 000000000..26001af2b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_firewall_list.lng new file mode 100644 index 000000000..37f78048c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_groups.lng b/interface/ispconfig/interface/admin/lib/lang/nl_groups.lng new file mode 100644 index 000000000..0454a672e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_groups_list.lng new file mode 100644 index 000000000..43e2729a0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_groups_list.lng @@ -0,0 +1,7 @@ +LET OP: Uitgevoerde wijzigingen in deze module kunnen gevolgen hebben voor gebruikers gekoppeld aan deze groepen!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_add.lng new file mode 100644 index 000000000..8a5c5db5f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_complete.lng new file mode 100644 index 000000000..611637131 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_complete.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_edit.lng new file mode 100644 index 000000000..9656b36a0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_export.lng new file mode 100644 index 000000000..2c1d78f7d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_import.lng new file mode 100644 index 000000000..f1d5fa51a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_language_list.lng new file mode 100644 index 000000000..dc5843af2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/nl_remote_user.lng new file mode 100644 index 000000000..4f9dc1de3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_remote_user_list.lng new file mode 100644 index 000000000..664ea756e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server.lng new file mode 100644 index 000000000..f348c7962 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server.lng @@ -0,0 +1,13 @@ +
Wijzigen? Zie: Server configuratie'; +$wb['server_name_txt'] = 'Servernaam'; +$wb['mail_server_txt'] = 'Mailserver'; +$wb['web_server_txt'] = 'Webserver'; +$wb['dns_server_txt'] = 'DNS server'; +$wb['file_server_txt'] = 'Fileserver'; +$wb['db_server_txt'] = 'Database server'; +$wb['vserver_server_txt'] = 'VServer-server'; +$wb['active_txt'] = 'Actief?'; +$wb['mirror_server_id_txt'] = 'Deze server is mirror van server'; +$wb['- None -'] = '- niet van toepassing -'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server_config.lng new file mode 100644 index 000000000..8293bb813 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server_config_list.lng new file mode 100644 index 000000000..3d376e5f1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server_ip.lng new file mode 100644 index 000000000..ef8079ada --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server_ip_list.lng new file mode 100644 index 000000000..acbd83e29 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_server_list.lng new file mode 100644 index 000000000..05e7aac6c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_software_package_list.lng new file mode 100644 index 000000000..177e1b82c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/nl_software_repo.lng new file mode 100644 index 000000000..bd4c93119 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_software_repo_list.lng new file mode 100644 index 000000000..737e5cf43 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_software_update_list.lng new file mode 100644 index 000000000..7c8dc7623 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/nl_system_config.lng new file mode 100644 index 000000000..6d6d4f9a1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_users.lng b/interface/ispconfig/interface/admin/lib/lang/nl_users.lng new file mode 100644 index 000000000..4ab27372c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/nl_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/nl_users_list.lng new file mode 100644 index 000000000..143593400 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/nl_users_list.lng @@ -0,0 +1,9 @@ +LET OP: Verander hier geen gegevens. Gebruik daarvoor de functie Wijzig klant/Wijzig reseller onder de Klanten-module van ISPConfig. Het veranderen van gebruikers in deze module kan dataverlies opleveren!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/pl.lng b/interface/ispconfig/interface/admin/lib/lang/pl.lng new file mode 100644 index 000000000..939bffb3d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/pl_firewall.lng new file mode 100644 index 000000000..a216af6b1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_firewall_list.lng new file mode 100644 index 000000000..f7e164040 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_groups.lng b/interface/ispconfig/interface/admin/lib/lang/pl_groups.lng new file mode 100644 index 000000000..b3c8b9ca7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_groups_list.lng new file mode 100644 index 000000000..14565b0c7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_add.lng new file mode 100644 index 000000000..82e42ef72 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_complete.lng new file mode 100644 index 000000000..0096c69ef --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_complete.lng @@ -0,0 +1,7 @@ +Ta opcja dodaje do wybranego jÄ™zyka brakujÄ…ce zmienne jÄ™zykowe z plików jÄ™zyka angielskiego.'; +$wb['language_select_txt'] = 'Wybierz jÄ™zyk'; +$wb['btn_save_txt'] = 'PoÅ‚Ä…cz pliki teraz'; +$wb['btn_cancel_txt'] = 'Wróć'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_edit.lng new file mode 100644 index 000000000..3a5e70693 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_export.lng new file mode 100644 index 000000000..82666fcb7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_import.lng new file mode 100644 index 000000000..83e988116 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_language_list.lng new file mode 100644 index 000000000..68f710be0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/pl_remote_user.lng new file mode 100644 index 000000000..cc9335bc5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_remote_user_list.lng new file mode 100644 index 000000000..152a75fba --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server.lng new file mode 100644 index 000000000..c027c0b31 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server_config.lng new file mode 100644 index 000000000..76c3589c7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server_config_list.lng new file mode 100644 index 000000000..f9e8dcf1b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server_ip.lng new file mode 100644 index 000000000..41e0b9416 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server_ip_list.lng new file mode 100644 index 000000000..6ab81c1e5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_server_list.lng new file mode 100644 index 000000000..f61ba5fc8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_software_package_list.lng new file mode 100644 index 000000000..9549333b1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/pl_software_repo.lng new file mode 100644 index 000000000..d11a1b3b3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_software_repo_list.lng new file mode 100644 index 000000000..7ca6af9f9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_software_update_list.lng new file mode 100644 index 000000000..e38bdf8a3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/pl_system_config.lng new file mode 100644 index 000000000..adaffcaa6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_users.lng b/interface/ispconfig/interface/admin/lib/lang/pl_users.lng new file mode 100644 index 000000000..3b2472dfe --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/pl_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/pl_users_list.lng new file mode 100644 index 000000000..b628eae87 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pl_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/pt.lng b/interface/ispconfig/interface/admin/lib/lang/pt.lng new file mode 100644 index 000000000..81bcba098 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt.lng @@ -0,0 +1,41 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/pt_firewall.lng new file mode 100644 index 000000000..9c1fb784b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_firewall.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_firewall_list.lng new file mode 100644 index 000000000..d1dd50b71 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_firewall_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_groups.lng b/interface/ispconfig/interface/admin/lib/lang/pt_groups.lng new file mode 100644 index 000000000..ee7577627 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_groups.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_groups_list.lng new file mode 100644 index 000000000..6e61aef91 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_groups_list.lng @@ -0,0 +1,8 @@ +AVISO: Não modifique ou edite qualquer configuração de utilizador aqui. Use o módulo de cliente ou revendedor. Modificar ou alterar utilizadors e grupos aqui pode ocasionar perda de dados!'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_add.lng new file mode 100644 index 000000000..fb1a41ad6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_add.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_complete.lng new file mode 100644 index 000000000..54f44d014 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_complete.lng @@ -0,0 +1,8 @@ +Isto permite completar qualquer falha de tradução, com o ficheiro principal original em inglês.'; +$wb['language_select_txt'] = 'Seleccionar Idioma'; +$wb['btn_save_txt'] = 'Mesclar ficheiros agora'; +$wb['btn_cancel_txt'] = 'Voltar'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_edit.lng new file mode 100644 index 000000000..0c6e29a33 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_edit.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_export.lng new file mode 100644 index 000000000..b4630e5e4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_export.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_import.lng new file mode 100644 index 000000000..0d0967b49 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_import.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_language_list.lng new file mode 100644 index 000000000..649cd9d2f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_language_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/pt_remote_user.lng new file mode 100644 index 000000000..1db840050 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_remote_user.lng @@ -0,0 +1,43 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_remote_user_list.lng new file mode 100644 index 000000000..850b5ed2e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_remote_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server.lng new file mode 100644 index 000000000..a7cc7cbfa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server_config.lng new file mode 100644 index 000000000..8c281b919 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server_config.lng @@ -0,0 +1,69 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server_config_list.lng new file mode 100644 index 000000000..551867db8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server_config_list.lng @@ -0,0 +1,5 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server_ip.lng new file mode 100644 index 000000000..3fab26386 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server_ip.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server_ip_list.lng new file mode 100644 index 000000000..a9c4ffe2c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server_ip_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_server_list.lng new file mode 100644 index 000000000..e3c3c8ad6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_server_list.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_software_package_list.lng new file mode 100644 index 000000000..cba1c698e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_software_package_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/pt_software_repo.lng new file mode 100644 index 000000000..257e0b5b8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_software_repo.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_software_repo_list.lng new file mode 100644 index 000000000..5b60ee24d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_software_repo_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_software_update_list.lng new file mode 100644 index 000000000..163731ba7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_software_update_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/pt_system_config.lng new file mode 100644 index 000000000..9a662a9a2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_system_config.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_users.lng b/interface/ispconfig/interface/admin/lib/lang/pt_users.lng new file mode 100644 index 000000000..fdf07aa3e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_users.lng @@ -0,0 +1,29 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/pt_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/pt_users_list.lng new file mode 100644 index 000000000..6ebec0a12 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/pt_users_list.lng @@ -0,0 +1,10 @@ +AVISO: Não modifique ou edite qualquer configuração de utilizador aqui. Use o módulo de cliente ou revendedor. Modificar ou alterar utilizadors e grupos aqui pode resultar na perda de dados!'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro.lng b/interface/ispconfig/interface/admin/lib/lang/ro.lng new file mode 100644 index 000000000..77d07ab2d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/ro_firewall.lng new file mode 100644 index 000000000..e626345d3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_firewall_list.lng new file mode 100644 index 000000000..24a34be1c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_groups.lng b/interface/ispconfig/interface/admin/lib/lang/ro_groups.lng new file mode 100644 index 000000000..61c3dc538 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_groups_list.lng new file mode 100644 index 000000000..f1d8e2c1a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_add.lng new file mode 100644 index 000000000..dc6b2d1b7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_complete.lng new file mode 100644 index 000000000..db7c05bb2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_complete.lng @@ -0,0 +1,7 @@ +This adds missing strings from the english master language files to the selected language.'; +$wb['language_select_txt'] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_edit.lng new file mode 100644 index 000000000..4c50e883e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_export.lng new file mode 100644 index 000000000..f45d47b17 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_import.lng new file mode 100644 index 000000000..fefae80d0 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_language_list.lng new file mode 100644 index 000000000..1c784edf6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/ro_remote_user.lng new file mode 100644 index 000000000..cc9335bc5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_remote_user_list.lng new file mode 100644 index 000000000..56c6fac4b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_remote_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server.lng new file mode 100644 index 000000000..1b42f22c8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server_config.lng new file mode 100644 index 000000000..36899fd02 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server_config_list.lng new file mode 100644 index 000000000..636c2e050 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server_ip.lng new file mode 100644 index 000000000..6d451f5b2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server_ip_list.lng new file mode 100644 index 000000000..4e9831666 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_server_list.lng new file mode 100644 index 000000000..5cea9d216 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_software_package_list.lng new file mode 100644 index 000000000..3bcf7bcea --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/ro_software_repo.lng new file mode 100644 index 000000000..574dd1162 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_software_repo_list.lng new file mode 100644 index 000000000..b7a219ffa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_software_update_list.lng new file mode 100644 index 000000000..fc96ffa18 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/ro_system_config.lng new file mode 100644 index 000000000..e7f5d9365 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_users.lng b/interface/ispconfig/interface/admin/lib/lang/ro_users.lng new file mode 100644 index 000000000..8e70364aa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/ro_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/ro_users_list.lng new file mode 100644 index 000000000..16d8179fa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ro_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/ru.lng b/interface/ispconfig/interface/admin/lib/lang/ru.lng new file mode 100644 index 000000000..19d632edf --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru.lng @@ -0,0 +1,41 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/ru_firewall.lng new file mode 100644 index 000000000..dfe0c10d1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_firewall.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_firewall_list.lng new file mode 100644 index 000000000..fc2fffad4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_firewall_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_groups.lng b/interface/ispconfig/interface/admin/lib/lang/ru_groups.lng new file mode 100644 index 000000000..d377f5f88 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_groups.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_groups_list.lng new file mode 100644 index 000000000..1495e6900 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_groups_list.lng @@ -0,0 +1,8 @@ +Ð’ÐИМÐÐИЕ:Ðе удалÑйте и не менÑйте никаких наÑтроек здеÑÑŒ. ИÑпользуйте наÑтройки клиента и реÑеллера в модуле КЛИЕÐТ. Изменение пользователей или групп здеÑÑŒ может вызвать потерю данных!'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_add.lng new file mode 100644 index 000000000..5d1d154c8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_add.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_complete.lng new file mode 100644 index 000000000..c7ade3cd7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_complete.lng @@ -0,0 +1,8 @@ +Это добавит пропущенные Ñтроки из маÑтер-Ñзыка.'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_edit.lng new file mode 100644 index 000000000..b5cbb1669 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_edit.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_export.lng new file mode 100644 index 000000000..9a4a929af --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_export.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_import.lng new file mode 100644 index 000000000..f0b767e4d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_import.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_language_list.lng new file mode 100644 index 000000000..72561a7af --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_language_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/ru_remote_user.lng new file mode 100644 index 000000000..ceee7b9ee --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_remote_user.lng @@ -0,0 +1,43 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_remote_user_list.lng new file mode 100644 index 000000000..f1bcdf968 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_remote_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server.lng new file mode 100644 index 000000000..5575e6582 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server_config.lng new file mode 100644 index 000000000..c0530b62c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server_config.lng @@ -0,0 +1,69 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server_config_list.lng new file mode 100644 index 000000000..351caaf57 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server_config_list.lng @@ -0,0 +1,5 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server_ip.lng new file mode 100644 index 000000000..a835da047 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server_ip.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server_ip_list.lng new file mode 100644 index 000000000..8e06c0a91 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server_ip_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_server_list.lng new file mode 100644 index 000000000..4290a6979 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_server_list.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_software_package_list.lng new file mode 100644 index 000000000..7c4fbd8ba --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_software_package_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/ru_software_repo.lng new file mode 100644 index 000000000..7d5abbcf9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_software_repo.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_software_repo_list.lng new file mode 100644 index 000000000..7989ba49e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_software_repo_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_software_update_list.lng new file mode 100644 index 000000000..41fcbd414 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_software_update_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/ru_system_config.lng new file mode 100644 index 000000000..823cb7445 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_system_config.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_users.lng b/interface/ispconfig/interface/admin/lib/lang/ru_users.lng new file mode 100644 index 000000000..b29c02035 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_users.lng @@ -0,0 +1,29 @@ + + diff --git a/interface/ispconfig/interface/admin/lib/lang/ru_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/ru_users_list.lng new file mode 100644 index 000000000..62f17c600 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/ru_users_list.lng @@ -0,0 +1,10 @@ +Ð’ÐИМÐÐИЕ:Ðе удалÑйте и не менÑйте никаких наÑтроек здеÑÑŒ. ИÑпользуйте наÑтройки клиента и реÑеллера в модуле КЛИЕÐТ. Изменение пользователей или групп здеÑÑŒ может вызвать потерю данных!'; +?> + diff --git a/interface/ispconfig/interface/admin/lib/lang/se.lng b/interface/ispconfig/interface/admin/lib/lang/se.lng new file mode 100644 index 000000000..4b86cbba6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/se_firewall.lng new file mode 100644 index 000000000..e626345d3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_firewall_list.lng new file mode 100644 index 000000000..24a34be1c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_groups.lng b/interface/ispconfig/interface/admin/lib/lang/se_groups.lng new file mode 100644 index 000000000..cfe856507 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_groups_list.lng new file mode 100644 index 000000000..5b025e08a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_add.lng new file mode 100644 index 000000000..27bb0eeb6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_complete.lng new file mode 100644 index 000000000..b5200ff9d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_complete.lng @@ -0,0 +1,7 @@ +This adds missing strings from the english master language files to the selected language.'; +$wb['language_select_txt'] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file.
This adds missing strings from the english master language files to the selected language.'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_edit.lng new file mode 100644 index 000000000..4c50e883e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_export.lng new file mode 100644 index 000000000..f45d47b17 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_import.lng new file mode 100644 index 000000000..4c31ec3de --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_language_list.lng new file mode 100644 index 000000000..1c784edf6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/se_remote_user.lng new file mode 100644 index 000000000..cc9335bc5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_remote_user_list.lng new file mode 100644 index 000000000..152a75fba --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server.lng b/interface/ispconfig/interface/admin/lib/lang/se_server.lng new file mode 100644 index 000000000..f1c044bb6 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/se_server_config.lng new file mode 100644 index 000000000..16803a9f5 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_server_config_list.lng new file mode 100644 index 000000000..636c2e050 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/se_server_ip.lng new file mode 100644 index 000000000..6d451f5b2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_server_ip_list.lng new file mode 100644 index 000000000..81ae8f01d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_server_list.lng new file mode 100644 index 000000000..ff7bd6e9d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_software_package_list.lng new file mode 100644 index 000000000..03917cabc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/se_software_repo.lng new file mode 100644 index 000000000..574dd1162 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_software_repo_list.lng new file mode 100644 index 000000000..b7a219ffa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_software_update_list.lng new file mode 100644 index 000000000..ebf4e6fbc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/se_system_config.lng new file mode 100644 index 000000000..e7f5d9365 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_users.lng b/interface/ispconfig/interface/admin/lib/lang/se_users.lng new file mode 100644 index 000000000..3708eff32 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/se_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/se_users_list.lng new file mode 100644 index 000000000..de5d63e2f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/se_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/sk.lng b/interface/ispconfig/interface/admin/lib/lang/sk.lng new file mode 100644 index 000000000..a4eab1490 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/sk_firewall.lng new file mode 100644 index 000000000..581b4384c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_firewall_list.lng new file mode 100644 index 000000000..657d6ca14 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_groups.lng b/interface/ispconfig/interface/admin/lib/lang/sk_groups.lng new file mode 100644 index 000000000..f43077cea --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_groups_list.lng new file mode 100644 index 000000000..1b067b7f8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_add.lng new file mode 100644 index 000000000..5b21d003d --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_complete.lng new file mode 100644 index 000000000..4b076136c --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_complete.lng @@ -0,0 +1,7 @@ + dop??a chýbajúce re?azce z anglického súboru jazyka do zvoleného jazyka.'; +$wb['language_select_txt'] = 'Vyber jazyk'; +$wb['btn_save_txt'] = 'Zlú?i? súbory teraz'; +$wb['btn_cancel_txt'] = 'Spä?'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_edit.lng new file mode 100644 index 000000000..51c2c0a40 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_export.lng new file mode 100644 index 000000000..6bdfbc194 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_import.lng new file mode 100644 index 000000000..94c708af3 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_language_list.lng new file mode 100644 index 000000000..034b23aa8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/sk_remote_user.lng new file mode 100644 index 000000000..fae2654b4 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_remote_user_list.lng new file mode 100644 index 000000000..7e4661d7a --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server.lng new file mode 100644 index 000000000..667996c8b --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server_config.lng new file mode 100644 index 000000000..2fc861857 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server_config_list.lng new file mode 100644 index 000000000..73e7bac4e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server_ip.lng new file mode 100644 index 000000000..f6dfa75fe --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server_ip_list.lng new file mode 100644 index 000000000..de065f707 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_server_list.lng new file mode 100644 index 000000000..aff432880 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_software_package_list.lng new file mode 100644 index 000000000..bcb6acbac --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/sk_software_repo.lng new file mode 100644 index 000000000..a3cb3feeb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_software_repo_list.lng new file mode 100644 index 000000000..52d468a16 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_software_update_list.lng new file mode 100644 index 000000000..01d07727f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/sk_system_config.lng new file mode 100644 index 000000000..90049de8e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_users.lng b/interface/ispconfig/interface/admin/lib/lang/sk_users.lng new file mode 100644 index 000000000..4376aa19f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/sk_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/sk_users_list.lng new file mode 100644 index 000000000..a04f71621 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/sk_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/tr.lng b/interface/ispconfig/interface/admin/lib/lang/tr.lng new file mode 100644 index 000000000..7e47b6c69 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_firewall.lng b/interface/ispconfig/interface/admin/lib/lang/tr_firewall.lng new file mode 100644 index 000000000..d379841b1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_firewall.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_firewall_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_firewall_list.lng new file mode 100644 index 000000000..5fcff6396 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_firewall_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_groups.lng b/interface/ispconfig/interface/admin/lib/lang/tr_groups.lng new file mode 100644 index 000000000..5bad5a7e7 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_groups.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_groups_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_groups_list.lng new file mode 100644 index 000000000..5e7f0ebc2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_groups_list.lng @@ -0,0 +1,7 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_add.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_add.lng new file mode 100644 index 000000000..fa712eba8 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_add.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_complete.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_complete.lng new file mode 100644 index 000000000..176d93b23 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_complete.lng @@ -0,0 +1,7 @@ +Bu olay kayıp metinleri ingilizce dil dosyasından seçili dil dosyasına ekler'; +$wb['language_select_txt'] = 'Dil seç'; +$wb['btn_save_txt'] = 'Dosyaları ÅŸimdi birleÅŸtir'; +$wb['btn_cancel_txt'] = 'Geri'; +?> diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_edit.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_edit.lng new file mode 100644 index 000000000..412b1b495 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_export.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_export.lng new file mode 100644 index 000000000..d0205cb94 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_export.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_import.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_import.lng new file mode 100644 index 000000000..2caaa0798 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_import.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_language_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_language_list.lng new file mode 100644 index 000000000..833ce5955 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_language_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_remote_user.lng b/interface/ispconfig/interface/admin/lib/lang/tr_remote_user.lng new file mode 100644 index 000000000..5d918effa --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_remote_user.lng @@ -0,0 +1,42 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_remote_user_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_remote_user_list.lng new file mode 100644 index 000000000..eec9ef59e --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_remote_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server.lng new file mode 100644 index 000000000..73ae1df70 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server_config.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server_config.lng new file mode 100644 index 000000000..40f08d527 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server_config.lng @@ -0,0 +1,68 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server_config_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server_config_list.lng new file mode 100644 index 000000000..b3c74bd5f --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server_config_list.lng @@ -0,0 +1,4 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server_ip.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server_ip.lng new file mode 100644 index 000000000..7112f4ef1 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server_ip.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server_ip_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server_ip_list.lng new file mode 100644 index 000000000..c931986bd --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server_ip_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_server_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_server_list.lng new file mode 100644 index 000000000..7d689ced9 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_server_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_software_package_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_software_package_list.lng new file mode 100644 index 000000000..46726f740 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_software_package_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_software_repo.lng b/interface/ispconfig/interface/admin/lib/lang/tr_software_repo.lng new file mode 100644 index 000000000..67ce387eb --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_software_repo.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_software_repo_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_software_repo_list.lng new file mode 100644 index 000000000..a37f2afe2 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_software_update_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_software_update_list.lng new file mode 100644 index 000000000..3f77e5486 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_software_update_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_system_config.lng b/interface/ispconfig/interface/admin/lib/lang/tr_system_config.lng new file mode 100644 index 000000000..980811dfc --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_system_config.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_users.lng b/interface/ispconfig/interface/admin/lib/lang/tr_users.lng new file mode 100644 index 000000000..3b8f05961 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_users.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/admin/lib/lang/tr_users_list.lng b/interface/ispconfig/interface/admin/lib/lang/tr_users_list.lng new file mode 100644 index 000000000..8d1e03850 --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/lang/tr_users_list.lng @@ -0,0 +1,9 @@ +WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> diff --git a/interface/ispconfig/interface/admin/lib/module.conf.php b/interface/ispconfig/interface/admin/lib/module.conf.php new file mode 100644 index 000000000..b6a6c57dd --- /dev/null +++ b/interface/ispconfig/interface/admin/lib/module.conf.php @@ -0,0 +1,174 @@ + 'Add user', + 'target' => 'content', + 'link' => 'admin/users_edit.php'); + +$items[] = array( 'title' => 'Edit user', + 'target' => 'content', + 'link' => 'admin/users_list.php'); + + +$module['nav'][] = array( 'title' => 'CP Users', + 'open' => 1, + 'items' => $items); + + +// cleanup +unset($items); +/* +$items[] = array( 'title' => 'Add group', + 'target' => 'content', + 'link' => 'admin/groups_edit.php'); + +$items[] = array( 'title' => 'Edit group', + 'target' => 'content', + 'link' => 'admin/groups_list.php'); + + +$module['nav'][] = array( 'title' => 'Groups', + 'open' => 1, + 'items' => $items); + + +// cleanup +unset($items); +*/ +/* +$items[] = array( 'title' => 'Add server', + 'target' => 'content', + 'link' => 'admin/server_edit.php'); +*/ +$items[] = array( 'title' => 'Server Services', + 'target' => 'content', + 'link' => 'admin/server_list.php'); + +$items[] = array( 'title' => 'Server Config', + 'target' => 'content', + 'link' => 'admin/server_config_list.php'); + +/* +$items[] = array( 'title' => 'Add Server IP', + 'target' => 'content', + 'link' => 'admin/server_ip_edit.php'); +*/ +$items[] = array( 'title' => 'Edit Server IP', + 'target' => 'content', + 'link' => 'admin/server_ip_list.php'); + + +$items[] = array( 'title' => 'Interface Config', + 'target' => 'content', + 'link' => 'admin/system_config_edit.php?id=1'); + +$module['nav'][] = array( 'title' => 'System', + 'open' => 1, + 'items' => $items); +// cleanup +unset($items); + + +$items[] = array( 'title' => 'Firewall', + 'target' => 'content', + 'link' => 'admin/firewall_list.php'); + + +$module['nav'][] = array( 'title' => 'Firewall', + 'open' => 1, + 'items' => $items); + + +// cleanup +unset($items); + + +$items[] = array( 'title' => 'Repositories', + 'target' => 'content', + 'link' => 'admin/software_repo_list.php'); + +$items[] = array( 'title' => 'Packages', + 'target' => 'content', + 'link' => 'admin/software_package_list.php'); + +$items[] = array( 'title' => 'Updates', + 'target' => 'content', + 'link' => 'admin/software_update_list.php'); + +$module['nav'][] = array( 'title' => 'Software', + 'open' => 1, + 'items' => $items); + + +// cleanup +unset($items); + +$items[] = array( 'title' => 'Languages', + 'target' => 'content', + 'link' => 'admin/language_list.php'); + +$items[] = array( 'title' => 'New Language', + 'target' => 'content', + 'link' => 'admin/language_add.php'); + +$items[] = array( 'title' => 'Merge', + 'target' => 'content', + 'link' => 'admin/language_complete.php'); + +$items[] = array( 'title' => 'Export', + 'target' => 'content', + 'link' => 'admin/language_export.php'); + +$items[] = array( 'title' => 'Import', + 'target' => 'content', + 'link' => 'admin/language_import.php'); + +$module['nav'][] = array( 'title' => 'Language Editor', + 'open' => 1, + 'items' => $items); + + +// cleanup +unset($items); + +$items[] = array( 'title' => 'Add user', + 'target' => 'content', + 'link' => 'admin/remote_user_edit.php'); + +$items[] = array( 'title' => 'Edit user', + 'target' => 'content', + 'link' => 'admin/remote_user_list.php'); + + +$module['nav'][] = array( 'title' => 'Remote Users', + 'open' => 1, + 'items' => $items); + +// cleanup +unset($items); + +// Getting the admin options from other modules +$modules = explode(',', $_SESSION['s']['user']['modules']); +if(is_array($modules)) { + foreach($modules as $mt) { + if(is_file($mt.'/lib/admin.conf.php')) { + $options = array(); + include_once(ISPC_WEB_PATH."/$mt/lib/admin.conf.php"); + if(is_array($options)) { + foreach($options as $opt) { + $module['nav'][] = $opt; + } + } + } + } +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/firewall.list.php b/interface/ispconfig/interface/admin/list/firewall.list.php new file mode 100644 index 000000000..ba3fb0633 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/firewall.list.php @@ -0,0 +1,93 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
Yes
",'n' => "
No
")); + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} AND db_server = 1 ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "tcp_port", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "udp_port", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/groups.list.php b/interface/ispconfig/interface/admin/list/groups.list.php new file mode 100644 index 000000000..c5e8c4d11 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/groups.list.php @@ -0,0 +1,61 @@ + 'name', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +$liste['item'][] = array( 'field' => 'description', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/remote_user.list.php b/interface/ispconfig/interface/admin/list/remote_user.list.php new file mode 100644 index 000000000..31ef652a9 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/remote_user.list.php @@ -0,0 +1,65 @@ + 'remote_userid', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => '=', + 'prefix' => '', + 'suffix' => '', + 'width' => '', + 'datasource' => array( + 'type' => 'SQL', + 'querystring' => 'SELECT remote_userid,remote_username FROM remote_user WHERE {AUTHSQL} ORDER BY remote_username', + 'keyfield' => 'remote_userid', + 'valuefield' => 'remote_userid' + ), + 'value' => '' + ); + +$liste['item'][] = array( + 'field' => 'remote_username', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => '' + ); + +?> + diff --git a/interface/ispconfig/interface/admin/list/server.list.php b/interface/ispconfig/interface/admin/list/server.list.php new file mode 100644 index 000000000..90bccf1ec --- /dev/null +++ b/interface/ispconfig/interface/admin/list/server.list.php @@ -0,0 +1,110 @@ + 'server_name', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => ''); + +$liste['item'][] = array( 'field' => 'mail_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +$liste['item'][] = array( 'field' => 'web_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +$liste['item'][] = array( 'field' => 'dns_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +$liste['item'][] = array( 'field' => 'file_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +$liste['item'][] = array( 'field' => 'db_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +$liste['item'][] = array( 'field' => 'vserver_server', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => array('1' => "
Yes
",'0' => "
No
")); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/server_config.list.php b/interface/ispconfig/interface/admin/list/server_config.list.php new file mode 100644 index 000000000..c0c20e500 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/server_config.list.php @@ -0,0 +1,60 @@ + "server_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/server_ip.list.php b/interface/ispconfig/interface/admin/list/server_ip.list.php new file mode 100644 index 000000000..aacebc0b7 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/server_ip.list.php @@ -0,0 +1,68 @@ + 'server_id', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => '', + 'value' => ''); + +$liste['item'][] = array( 'field' => 'ip_address', + 'datatype' => 'VARCHAR', + 'op' => '=', + 'prefix' => '', + 'suffix' => '', + 'width' => ''); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/software_repo.list.php b/interface/ispconfig/interface/admin/list/software_repo.list.php new file mode 100644 index 000000000..a9be62deb --- /dev/null +++ b/interface/ispconfig/interface/admin/list/software_repo.list.php @@ -0,0 +1,78 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
Yes
",'n' => "
No
")); + +$liste["item"][] = array( 'field' => "repo_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "repo_url", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/list/users.list.php b/interface/ispconfig/interface/admin/list/users.list.php new file mode 100644 index 000000000..f53e03be6 --- /dev/null +++ b/interface/ispconfig/interface/admin/list/users.list.php @@ -0,0 +1,75 @@ + 'username', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +$liste['item'][] = array( 'field' => 'vorname', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +$liste['item'][] = array( 'field' => 'name', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +$liste['item'][] = array( 'field' => 'ort', + 'datatype' => 'VARCHAR', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => ''); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/login_as.php b/interface/ispconfig/interface/admin/login_as.php new file mode 100644 index 000000000..0745c62cd --- /dev/null +++ b/interface/ispconfig/interface/admin/login_as.php @@ -0,0 +1,84 @@ +auth->check_module_permissions('admin'); + +/* for security reasons ONLY the admin can login as other user */ +if ($_SESSION["s"]["user"]["typ"] != 'admin') { + die ("You don't have the right to login as other user!"); +} + +/* get the id of the user (must be int!) */ +if (!isset($_GET['id']) && !isset($_GET['cid'])){ + die ("No user selected!"); +} + +if(isset($_GET['id'])) { + $userId = intval($_GET['id']); + $backlink = 'admin/users_list.php'; +} else { + $client_id = intval($_GET['cid']); + $tmp_client = $app->db->queryOneRecord("SELECT username FROM client WHERE client_id = $client_id"); + $tmp_sys_user = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE username = '".$app->db->quote($tmp_client['username'])."'"); + $userId = $tmp_sys_user['userid']; + unset($tmp_client); + unset($tmp_sys_user); + $backlink = 'client/client_list.php'; +} + +/* + * Get the data to login as user x + */ +$dbData = $app->db->queryOneRecord( + "SELECT username, passwort FROM sys_user WHERE userid = " . $userId); + +/* + * Now generate the login-Form + */ +echo ' +



+ Do you want to login as user ' . $dbData['username'] . '?
+ If you do so, you can "go back" by clicking at logout.
+
+ + +
+ + +
+ + +
+'; +?> diff --git a/interface/ispconfig/interface/admin/remote_user_del.php b/interface/ispconfig/interface/admin/remote_user_del.php new file mode 100644 index 000000000..74352ca6c --- /dev/null +++ b/interface/ispconfig/interface/admin/remote_user_del.php @@ -0,0 +1,62 @@ +auth->check_module_permissions('admin'); + +$app->uses('tpl,tform'); +$app->load('tform_actions'); + +// Create a class page_action that extends the tform_actions base class + +class page_action extends tform_actions { + + + // Customisations for the page actions will be defined here + +} +$page = new page_action; +$page->onDelete(); + +?> diff --git a/interface/ispconfig/interface/admin/remote_user_edit.php b/interface/ispconfig/interface/admin/remote_user_edit.php new file mode 100644 index 000000000..5a3fc7000 --- /dev/null +++ b/interface/ispconfig/interface/admin/remote_user_edit.php @@ -0,0 +1,43 @@ +uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +// Create a class page_action that extends the tform_actions base class +class page_action extends tform_actions { + + //* Customisations for the page actions will be defined here + function onShow() { + global $app; + + // Translate the items, very bad trick... :( because the language file is not loaded yet when the form file gets parsed + foreach($app->tform->formDef["tabs"]['remote_user']['fields']['remote_functions']['value'] as $key => $val) { + $app->tform->formDef["tabs"]['remote_user']['fields']['remote_functions']['value'][$key] = $app->tform->lng($val).'
'; + } + + parent::onShow(); + } + +} + +// Create the new page object +$page = new page_action(); + +// Start the page rendering and action handling +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/admin/remote_user_list.php b/interface/ispconfig/interface/admin/remote_user_list.php new file mode 100644 index 000000000..6976112af --- /dev/null +++ b/interface/ispconfig/interface/admin/remote_user_list.php @@ -0,0 +1,24 @@ +uses('listform_actions'); + +// Optional limit +// $app->listform_actions->SQLExtWhere = 'type = 'alias''; + +// Start the form rendering and action ahndling +$app->listform_actions->onLoad(); + +?> diff --git a/interface/ispconfig/interface/admin/server_config_del.php b/interface/ispconfig/interface/admin/server_config_del.php new file mode 100644 index 000000000..8c0d0ab77 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_config_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_config_edit.php b/interface/ispconfig/interface/admin/server_config_edit.php new file mode 100644 index 000000000..bb853b5e8 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_config_edit.php @@ -0,0 +1,95 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEdit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + + if($app->tform->errorMessage == '') { + $app->uses('ini_parser,getconf'); + + $section = $this->active_tab; + $server_id = $this->id; + + $this->dataRecord = $app->getconf->get_server_config($server_id,$section); + } + + $record = $app->tform->getHTML($this->dataRecord, $this->active_tab,'EDIT'); + + $record['id'] = $this->id; + $app->tpl->setVar($record); + } + + function onUpdateSave($sql) { + global $app; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + $app->uses('ini_parser,getconf'); + + $section = $app->tform->getCurrentTab(); + $server_id = $this->id; + + $server_config_array = $app->getconf->get_server_config($server_id); + $server_config_array[$section] = $app->tform->encode($this->dataRecord,$section); + $server_config_str = $app->ini_parser->get_ini_string($server_config_array); + + $app->db->datalogUpdate('server', "config = '".$app->db->quote($server_config_str)."'", 'server_id', $server_id); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_config_list.php b/interface/ispconfig/interface/admin/server_config_list.php new file mode 100644 index 000000000..5edfba4d4 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_config_list.php @@ -0,0 +1,53 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); +//$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_del.php b/interface/ispconfig/interface/admin/server_del.php new file mode 100644 index 000000000..373bb7d40 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_edit.php b/interface/ispconfig/interface/admin/server_edit.php new file mode 100644 index 000000000..376b0f026 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_edit.php @@ -0,0 +1,86 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEnd() { + global $app, $conf; + + // Getting Servers + $sql = "SELECT server_id,server_name FROM server WHERE 1 ORDER BY server_name"; + $mirror_servers = $app->db->queryAllRecords($sql); + $mirror_server_select = ''; + if(is_array($mirror_servers)) { + foreach( $mirror_servers as $mirror_server) { + $selected = ($mirror_server["server_id"] == $this->dataRecord['mirror_server_id'])?'SELECTED':''; + $mirror_server_select .= "\r\n"; + } + } + $app->tpl->setVar("mirror_server_id",$mirror_server_select); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app; + + //* We do not want to mirror the the server itself + if($this->id == $this->dataRecord['mirror_server_id']) $this->dataRecord['mirror_server_id'] = 0; + + parent::onSubmit(); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_ip_del.php b/interface/ispconfig/interface/admin/server_ip_del.php new file mode 100644 index 000000000..38da1706c --- /dev/null +++ b/interface/ispconfig/interface/admin/server_ip_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_ip_edit.php b/interface/ispconfig/interface/admin/server_ip_edit.php new file mode 100644 index 000000000..eee5b35a5 --- /dev/null +++ b/interface/ispconfig/interface/admin/server_ip_edit.php @@ -0,0 +1,73 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from server_ip WHERE server_ip_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_ip_list.php b/interface/ispconfig/interface/admin/server_ip_list.php new file mode 100644 index 000000000..28c3f85cb --- /dev/null +++ b/interface/ispconfig/interface/admin/server_ip_list.php @@ -0,0 +1,54 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); + +$app->listform_actions->SQLOrderBy = "ORDER BY server_id, ip_address"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/server_list.php b/interface/ispconfig/interface/admin/server_list.php new file mode 100644 index 000000000..458aee0ea --- /dev/null +++ b/interface/ispconfig/interface/admin/server_list.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/software_package_list.php b/interface/ispconfig/interface/admin/software_package_list.php new file mode 100644 index 000000000..a44463dd0 --- /dev/null +++ b/interface/ispconfig/interface/admin/software_package_list.php @@ -0,0 +1,169 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +//* Get the latest packages from the repositorys and insert them in the local database +$packages_added = 0; +$repos = $app->db->queryAllRecords("SELECT software_repo_id, repo_url, repo_username, repo_password FROM software_repo WHERE active = 'y'"); +if(is_array($repos)) { + foreach($repos as $repo) { + $client = new SoapClient(null, array('location' => $repo['repo_url'], + 'uri' => $repo['repo_url'])); + + $packages = $client->get_packages($repo['repo_username'], $repo['repo_password']); + if(is_array($packages)) { + foreach($packages as $p) { + $package_name = $app->db->quote($p['name']); + $tmp = $app->db->queryOneRecord("SELECT package_id FROM software_package WHERE package_name = '$package_name'"); + if(empty($tmp['package_id'])) { + + $package_title = $app->db->quote($p['title']); + $package_description = $app->db->quote($p['description']); + $software_repo_id = intval($repo['software_repo_id']); + $package_type = $app->db->quote($p['type']); + + $sql = "INSERT INTO software_package (software_repo_id, package_name, package_title, package_description,package_type) VALUES ($software_repo_id, '$package_name', '$package_title', '$package_description','$package_type')"; + $app->db->query($sql); + $packages_added++; + } + } + } + + $packages = $app->db->queryAllRecords("SELECT software_package.package_name, v1, v2, v3, v4 FROM software_package LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) GROUP BY package_name ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC"); + if(is_array($packages)) { + foreach($packages as $p) { + + $version = $p['v1'].'.'.$p['v2'].'.'.$p['v3'].'.'.$p['v4']; + $updates = $client->get_updates($p['package_name'], $version,$repo['repo_username'], $repo['repo_password']); + + if(is_array($updates)) { + foreach($updates as $u) { + + $version_array = explode('.',$u['version']); + $v1 = intval($version_array[0]); + $v2 = intval($version_array[1]); + $v3 = intval($version_array[2]); + $v4 = intval($version_array[3]); + + $package_name = $app->db->quote($u['package_name']); + $software_repo_id = intval($repo['software_repo_id']); + $update_url = $app->db->quote($u['url']); + $update_md5 = $app->db->quote($u['md5']); + $update_dependencies = (isset($u['dependencies']))?$app->db->quote($u['dependencies']):''; + $update_title = $app->db->quote($u['title']); + $type = $app->db->quote($u['type']); + + // Check that we do not have this update in the database yet + $sql = "SELECT * FROM software_update WHERE package_name = '$package_name' and v1 = '$v1' and v2 = '$v2' and v3 = '$v3' and v4 = '$v4'"; + $tmp = $app->db->queryOneRecord($sql); + if(!isset($tmp['software_update_id'])) { + // Insert the update in the datbase + $sql = "INSERT INTO software_update (software_repo_id, package_name, update_url, update_md5, update_dependencies, update_title, v1, v2, v3, v4, type) + VALUES ($software_repo_id, '$package_name', '$update_url', '$update_md5', '$update_dependencies', '$update_title', '$v1', '$v2', '$v3', '$v4', '$type')"; + //die($sql); + $app->db->query($sql); + } + + } + } + } + } + } +} + +//* Install packages, if GET Request +if(isset($_GET['action']) && $_GET['action'] == 'install' && $_GET['package'] != '' && $_GET['server_id'] > 0) { + $package_name = $app->db->quote($_GET['package']); + $server_id = intval($_GET['server_id']); + $sql = "SELECT software_update_id, package_name, update_title FROM software_update WHERE type = 'full' AND package_name = '$package_name' ORDER BY v1 DESC, v2 DESC, v3 DESC, v4 DESC LIMIT 0,1"; + $tmp = $app->db->queryOneRecord($sql); + $software_update_id = $tmp['software_update_id']; + + $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')"; + // $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')"; + $app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id'); + +} + + + +// Show the list in the interface +// Loading the template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/software_package_list.htm'); + + +$servers = $app->db->queryAllRecords('SELECT server_id, server_name FROM server ORDER BY server_name'); +$packages = $app->db->queryAllRecords('SELECT * FROM software_package'); +if(is_array($packages)) { + foreach($packages as $key => $p) { + $installed_txt = ''; + foreach($servers as $s) { + $inst = $app->db->queryOneRecord("SELECT * FROM software_update, software_update_inst WHERE software_update_inst.software_update_id = software_update.software_update_id AND software_update_inst.package_name = '".addslashes($p["package_name"])."' AND server_id = '".$s["server_id"]."'"); + $version = $inst['v1'].'.'.$inst['v2'].'.'.$inst['v3'].'.'.$inst['v4']; + + if($inst['status'] == 'installed') { + $installed_txt .= $s['server_name'].": Installed version $version
"; + } elseif ($inst['status'] == 'installing') { + $installed_txt .= $s['server_name'].": Installation in progress
"; + } elseif ($inst['status'] == 'failed') { + $installed_txt .= $s['server_name'].": Installation failed
"; + } elseif ($inst['status'] == 'deleting') { + $installed_txt .= $s['server_name'].": Deletion in progress
"; + } else { + $installed_txt .= $s['server_name'].": Install now
"; + } + } + $packages[$key]['installed'] = $installed_txt; + } +} + + + +$app->tpl->setLoop('records',$packages); + +include_once('lib/lang/en_software_package_list.lng'); +$app->tpl->setVar($wb); + + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/software_repo_del.php b/interface/ispconfig/interface/admin/software_repo_del.php new file mode 100644 index 000000000..6ee0e9d50 --- /dev/null +++ b/interface/ispconfig/interface/admin/software_repo_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/software_repo_edit.php b/interface/ispconfig/interface/admin/software_repo_edit.php new file mode 100644 index 000000000..4839812d8 --- /dev/null +++ b/interface/ispconfig/interface/admin/software_repo_edit.php @@ -0,0 +1,58 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/software_repo_list.php b/interface/ispconfig/interface/admin/software_repo_list.php new file mode 100644 index 000000000..0f7bd8ac7 --- /dev/null +++ b/interface/ispconfig/interface/admin/software_repo_list.php @@ -0,0 +1,52 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/software_update_list.php b/interface/ispconfig/interface/admin/software_update_list.php new file mode 100644 index 000000000..4c7da37e6 --- /dev/null +++ b/interface/ispconfig/interface/admin/software_update_list.php @@ -0,0 +1,222 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +//* Get the latest updates from the repositorys and insert them in the local database +$updates_added = 0; +$repos = $app->db->queryAllRecords("SELECT software_repo_id, repo_url, repo_username, repo_password FROM software_repo WHERE active = 'y'"); +if(is_array($repos)) { + foreach($repos as $repo) { + + /* + SELECT software_package.package_name, v1, v2, v3, v4 + FROM software_package + LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) + LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) + GROUP BY package_name + ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC + */ + + $client = new SoapClient(null, array('location' => $repo['repo_url'], + 'uri' => $repo['repo_url'])); + + $packages = $app->db->queryAllRecords("SELECT software_package.package_name, v1, v2, v3, v4 FROM software_package LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) GROUP BY package_name ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC"); + if(is_array($packages)) { + foreach($packages as $p) { + + $version = $p['v1'].'.'.$p['v2'].'.'.$p['v3'].'.'.$p['v4']; + $updates = $client->get_updates($p['package_name'], $version,$repo['repo_username'], $repo['repo_password']); + + if(is_array($updates)) { + foreach($updates as $u) { + + $version_array = explode('.',$u['version']); + $v1 = intval($version_array[0]); + $v2 = intval($version_array[1]); + $v3 = intval($version_array[2]); + $v4 = intval($version_array[3]); + + $package_name = $app->db->quote($u['package_name']); + $software_repo_id = intval($repo['software_repo_id']); + $update_url = $app->db->quote($u['url']); + $update_md5 = $app->db->quote($u['md5']); + $update_dependencies = (isset($u['dependencies']))?$app->db->quote($u['dependencies']):''; + $update_title = $app->db->quote($u['title']); + $type = $app->db->quote($u['type']); + + // Check that we do not have this update in the database yet + $sql = "SELECT * FROM software_update WHERE package_name = '$package_name' and v1 = '$v1' and v2 = '$v2' and v3 = '$v3' and v4 = '$v4'"; + $tmp = $app->db->queryOneRecord($sql); + if(!isset($tmp['software_update_id'])) { + // Insert the update in the datbase + $sql = "INSERT INTO software_update (software_repo_id, package_name, update_url, update_md5, update_dependencies, update_title, v1, v2, v3, v4, type) + VALUES ($software_repo_id, '$package_name', '$update_url', '$update_md5', '$update_dependencies', '$update_title', '$v1', '$v2', '$v3', '$v4', '$type')"; + //die($sql); + $app->db->query($sql); + } + + } + } + } + } + } +} + + +//* Install packages, if GET Request +if(isset($_GET['action']) && $_GET['action'] == 'install' && $_GET['package'] != '' && $_GET['server_id'] > 0) { + $package_name = $app->db->quote($_GET['package']); + $server_id = intval($_GET['server_id']); + $software_update_id = intval($_GET['id']); + + $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')"; + // $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')"; + $app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id'); + +} + + + +// Show the list in the interface +// Loading the template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/software_update_list.htm'); + +/* +SELECT software_package.package_name, software_package.package_title, software_update.update_title, v1, v2, v3, v4, software_update_inst.status + FROM software_package + LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) + LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) +GROUP BY software_update.software_update_id + ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC +*/ + + + +if(isset($_POST["server_id"]) && $_POST["server_id"] > 0) { + $server_id = intval($_POST["server_id"]); +} else { + $server_id = 1; +} + +$servers = $app->db->queryAllRecords('SELECT server_id, server_name FROM server ORDER BY server_name'); +foreach($servers as $key => $server) { + if($server['server_id'] == $server_id) { + $servers[$key]['selected'] = 'selected'; + } else { + $servers[$key]['selected'] = ''; + } +} + +$app->tpl->setLoop('servers',$servers); + +$sql = "SELECT v1, v2, v3, v4, software_update.update_title, software_update.software_update_id, software_update.package_name, v1, v2, v3, v4, software_update_inst.status + FROM software_update LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) + WHERE server_id = $server_id + GROUP BY software_update.package_name + ORDER BY software_update.package_name ASC, v1 DESC , v2 DESC , v3 DESC , v4 DESC"; + +$installed_packages = $app->db->queryAllRecords($sql); + + +$records_out = array(); + +if(is_array($installed_packages)) { + foreach($installed_packages as $ip) { + + // Get version number of the latest installed version + $sql = "SELECT v1, v2, v3, v4 FROM software_update, software_update_inst WHERE software_update.software_update_id = software_update_inst.software_update_id AND server_id = 1 ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC LIMIT 0,1"; + $lu = $app->db->queryOneRecord($sql); + + // Get all installable updates + $sql = "SELECT * FROM software_update WHERE v1 >= $lu[v1] AND v2 >= $lu[v2] AND v3 >= $lu[v3] AND v4 >= $lu[v4] AND package_name = '$ip[package_name]' ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC"; + $updates = $app->db->queryAllRecords($sql); + //die($sql); + + if(is_array($updates)) { + // Delete the last record as it is already installed + unset($updates[count($updates)-1]); + + foreach($updates as $key => $u) { + $version = $u['v1'].'.'.$u['v2'].'.'.$u['v3'].'.'.$u['v4']; + $installed_txt = "Install Update
"; + $records_out[] = array('version' => $version, 'update_title' => $u["update_title"], 'installed' => $installed_txt); + + } + } + } +} + +/* +$updates = $app->db->queryAllRecords('SELECT software_update.update_title, software_update.software_update_id, software_update.package_name, v1, v2, v3, v4, software_update_inst.status + FROM software_update LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) + WHERE server_id = '.$server_id.' + GROUP BY software_update.package_name + ORDER BY software_update.package_name ASC, v1 DESC , v2 DESC , v3 DESC , v4 DESC'); + +if(is_array($updates)) { + foreach($updates as $key => $u) { + $installed_txt = ''; + + $version = $u['v1'].'.'.$u['v2'].'.'.$u['v3'].'.'.$u['v4']; + $updates[$key]['version'] = $version; + if($u['status'] == 'installed' || $u['status'] == 'installing' || $u['status'] == 'deleting') { + $installed_txt .= "Installed version $version
"; + } else { + $installed_txt .= "Install now
"; + } + $updates[$key]['installed'] = $installed_txt; + + } +} +*/ + + + +$app->tpl->setLoop('records',$records_out); + +include_once('lib/lang/en_software_update_list.lng'); +$app->tpl->setVar($wb); + + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/system_config_edit.php b/interface/ispconfig/interface/admin/system_config_edit.php new file mode 100644 index 000000000..14b7fcbc0 --- /dev/null +++ b/interface/ispconfig/interface/admin/system_config_edit.php @@ -0,0 +1,97 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEdit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + + if($app->tform->errorMessage == '') { + $app->uses('ini_parser,getconf'); + + $section = $this->active_tab; + $server_id = $this->id; + + $this->dataRecord = $app->getconf->get_global_config($section); + + } + + $record = $app->tform->getHTML($this->dataRecord, $this->active_tab,'EDIT'); + + $record['warning'] = $app->tform->lng('warning'); + $record['id'] = $this->id; + $app->tpl->setVar($record); + } + + function onUpdateSave($sql) { + global $app; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + $app->uses('ini_parser,getconf'); + + $section = $app->tform->getCurrentTab(); + + $server_config_array = $app->getconf->get_global_config(); + $server_config_array[$section] = $app->tform->encode($this->dataRecord,$section); + $server_config_str = $app->ini_parser->get_ini_string($server_config_array); + + $sql = "UPDATE sys_ini SET config = '".$app->db->quote($server_config_str)."' WHERE sysini_id = 1"; + $app->db->query($sql); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/templates/firewall_edit.htm b/interface/ispconfig/interface/admin/templates/firewall_edit.htm new file mode 100644 index 000000000..554f7d0a0 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/firewall_edit.htm @@ -0,0 +1,38 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/firewall_list.htm b/interface/ispconfig/interface/admin/templates/firewall_list.htm new file mode 100644 index 000000000..53228c8af --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/firewall_list.htm @@ -0,0 +1,60 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="tcp_port"}{tmpl_var name="udp_port"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/groups_edit.htm b/interface/ispconfig/interface/admin/templates/groups_edit.htm new file mode 100644 index 000000000..6a3434714 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/groups_edit.htm @@ -0,0 +1,26 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/groups_list.htm b/interface/ispconfig/interface/admin/templates/groups_list.htm new file mode 100644 index 000000000..0ae6ccb75 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/groups_list.htm @@ -0,0 +1,55 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +

+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="name"}{tmpl_var name="description"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_add.htm b/interface/ispconfig/interface/admin/templates/language_add.htm new file mode 100644 index 000000000..d2254c289 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_add.htm @@ -0,0 +1,29 @@ +

+

+ +
+ +
+
Language Add +
+ + +
+
+ + +

{tmpl_var name='language_new_hint_txt'}

+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_complete.htm b/interface/ispconfig/interface/admin/templates/language_complete.htm new file mode 100644 index 000000000..f3492bb6e --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_complete.htm @@ -0,0 +1,29 @@ +

+

+ +
+ + +
+
+ +
+
+ +
+
Language Complete +
+ + +
+
+ +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_edit.htm b/interface/ispconfig/interface/admin/templates/language_edit.htm new file mode 100644 index 000000000..a0ef32ec7 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_edit.htm @@ -0,0 +1,29 @@ +

+

+ +
+ +
+
Language File Edit: {tmpl_var name="file_path"} + + + + + + + + +
+ + + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_export.htm b/interface/ispconfig/interface/admin/templates/language_export.htm new file mode 100644 index 000000000..95c05208e --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_export.htm @@ -0,0 +1,28 @@ +

+

+ +
+ +
+
Language Export +
+ + +
+
+ + +

+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_import.htm b/interface/ispconfig/interface/admin/templates/language_import.htm new file mode 100644 index 000000000..70f44ce2f --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_import.htm @@ -0,0 +1,41 @@ +

+

+ +
+ +
+
Language Import +
+ + +
+
+

{tmpl_var name='language_overwrite_txt'}

+
+ +
+
+
+

{tmpl_var name='ignore_version_txt'}

+
+ +
+
+
+ + +

+
+ +

ERROR

+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/language_list.htm b/interface/ispconfig/interface/admin/templates/language_list.htm new file mode 100644 index 000000000..9568bef10 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/language_list.htm @@ -0,0 +1,47 @@ +

+

+ +
+ +
+
Tools +
+
+ + +
+
+
+
+ + + +
diff --git a/interface/ispconfig/interface/admin/templates/remote_user_edit.htm b/interface/ispconfig/interface/admin/templates/remote_user_edit.htm new file mode 100644 index 000000000..5d2c4785c --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/remote_user_edit.htm @@ -0,0 +1,41 @@ +

+

+ +
+ +
+
+
+ +
{tmpl_var name='username_prefix'}
+ +
+ +
+ + +
+
+

{tmpl_var name='password_strength_txt'}

+
+

 

+
+
+

{tmpl_var name='function_txt'}

+
+   {tmpl_var name='remote_functions'} +
+
+ +
+ + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/remote_user_list.htm b/interface/ispconfig/interface/admin/templates/remote_user_list.htm new file mode 100644 index 000000000..972581f73 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/remote_user_list.htm @@ -0,0 +1,54 @@ +

+

+
+
+ +
+ +
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="remote_userid"}{tmpl_var name="remote_username"} + +
+
+
+ +
+ diff --git a/interface/ispconfig/interface/admin/templates/server_config_cron_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_cron_edit.htm new file mode 100644 index 000000000..066693ed8 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_cron_edit.htm @@ -0,0 +1,30 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_dns_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_dns_edit.htm new file mode 100644 index 000000000..63fae8a03 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_dns_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_fastcgi_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_fastcgi_edit.htm new file mode 100644 index 000000000..8551d87ab --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_fastcgi_edit.htm @@ -0,0 +1,46 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_getmail_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_getmail_edit.htm new file mode 100644 index 000000000..fc86eb4ca --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_getmail_edit.htm @@ -0,0 +1,22 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_jailkit_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_jailkit_edit.htm new file mode 100644 index 000000000..320fb8754 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_jailkit_edit.htm @@ -0,0 +1,34 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_list.htm b/interface/ispconfig/interface/admin/templates/server_config_list.htm new file mode 100644 index 000000000..487a39708 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_list.htm @@ -0,0 +1,40 @@ +

+

+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="server_name"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_mail_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_mail_edit.htm new file mode 100644 index 000000000..4f35abcc9 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_mail_edit.htm @@ -0,0 +1,84 @@ +

+

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

{tmpl_var name='pop3_imap_daemon_txt'}

+
+ +
+
+
+

{tmpl_var name='mail_filter_syntax_txt'}

+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_server_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_server_edit.htm new file mode 100644 index 000000000..361b2c7bd --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_server_edit.htm @@ -0,0 +1,51 @@ +

+

+ +
+ +
+
+
+

{tmpl_var name='auto_network_configuration_txt'}

+
+ {tmpl_var name='auto_network_configuration'} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +

{tmpl_var name='nameservers_hint_txt'}

+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_vlogger_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_vlogger_edit.htm new file mode 100644 index 000000000..bf6a82ab3 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_vlogger_edit.htm @@ -0,0 +1,22 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_config_web_edit.htm b/interface/ispconfig/interface/admin/templates/server_config_web_edit.htm new file mode 100644 index 000000000..6ab287b9f --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_config_web_edit.htm @@ -0,0 +1,74 @@ +

+

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

{tmpl_var name='security_level_txt'}

+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_edit_config.htm b/interface/ispconfig/interface/admin/templates/server_edit_config.htm new file mode 100644 index 000000000..02f6ef34d --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_edit_config.htm @@ -0,0 +1,22 @@ +

+

+ +
+ +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_edit_services.htm b/interface/ispconfig/interface/admin/templates/server_edit_services.htm new file mode 100644 index 000000000..470a10ef1 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_edit_services.htm @@ -0,0 +1,70 @@ +

+

+ +
+ +
+
+
+ + +
+
+

{tmpl_var name='mail_server_txt'}

+
+ {tmpl_var name='mail_server'} +
+
+
+

{tmpl_var name='web_server_txt'}

+
+ {tmpl_var name='web_server'} +
+
+
+

{tmpl_var name='dns_server_txt'}

+
+ {tmpl_var name='dns_server'} +
+
+
+

{tmpl_var name='file_server_txt'}

+
+ {tmpl_var name='file_server'} +
+
+
+

{tmpl_var name='db_server_txt'}

+
+ {tmpl_var name='db_server'} +
+
+
+

{tmpl_var name='vserver_server_txt'}

+
+ {tmpl_var name='vserver_server'} +
+
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_ip_edit.htm b/interface/ispconfig/interface/admin/templates/server_ip_edit.htm new file mode 100644 index 000000000..1ebe8bd91 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_ip_edit.htm @@ -0,0 +1,34 @@ +

+

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

{tmpl_var name='virtualhost_txt'}

+
+ {tmpl_var name='virtualhost'} +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_ip_list.htm b/interface/ispconfig/interface/admin/templates/server_ip_list.htm new file mode 100644 index 000000000..f35e84a06 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_ip_list.htm @@ -0,0 +1,53 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="server_id"}{tmpl_var name="ip_address"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/server_list.htm b/interface/ispconfig/interface/admin/templates/server_list.htm new file mode 100644 index 000000000..acfa54140 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/server_list.htm @@ -0,0 +1,58 @@ +

+

+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="server_name"}{tmpl_var name="mail_server"}{tmpl_var name="web_server"}{tmpl_var name="dns_server"}{tmpl_var name="file_server"}{tmpl_var name="db_server"}{tmpl_var name="vserver_server"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/software_package_list.htm b/interface/ispconfig/interface/admin/templates/software_package_list.htm new file mode 100644 index 000000000..dd465ac6b --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/software_package_list.htm @@ -0,0 +1,34 @@ +

+

+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
{tmpl_var name="installed"}{tmpl_var name="package_title"}{tmpl_var name="package_description"}
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/software_repo_edit.htm b/interface/ispconfig/interface/admin/templates/software_repo_edit.htm new file mode 100644 index 000000000..af335ecf5 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/software_repo_edit.htm @@ -0,0 +1,40 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/software_repo_list.htm b/interface/ispconfig/interface/admin/templates/software_repo_list.htm new file mode 100644 index 000000000..05adca9d9 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/software_repo_list.htm @@ -0,0 +1,56 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="active"}{tmpl_var name="repo_name"}{tmpl_var name="repo_url"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/software_update_list.htm b/interface/ispconfig/interface/admin/templates/software_update_list.htm new file mode 100644 index 000000000..10a0acf12 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/software_update_list.htm @@ -0,0 +1,49 @@ +

+

+ +
+ +
+
Tools +
+
+ + +
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
{tmpl_var name="installed"}{tmpl_var name="update_title"}{tmpl_var name="version"}
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/system_config_mail_edit.htm b/interface/ispconfig/interface/admin/templates/system_config_mail_edit.htm new file mode 100644 index 000000000..b905e2d08 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/system_config_mail_edit.htm @@ -0,0 +1,28 @@ +

+

+ +
+ +
+
+
+

{tmpl_var name='mailboxlist_webmail_link_txt'}

+
+ {tmpl_var name='mailboxlist_webmail_link'} +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/system_config_sites_edit.htm b/interface/ispconfig/interface/admin/templates/system_config_sites_edit.htm new file mode 100644 index 000000000..c81977652 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/system_config_sites_edit.htm @@ -0,0 +1,44 @@ +

+

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

{tmpl_var name='dblist_phpmyadmin_link_txt'}

+
+ {tmpl_var name='dblist_phpmyadmin_link'} +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/users_groups_edit.htm b/interface/ispconfig/interface/admin/templates/users_groups_edit.htm new file mode 100644 index 000000000..004c7dbd6 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/users_groups_edit.htm @@ -0,0 +1,30 @@ +

+

+ +
+ +
+
+
+ + +
+
+

{tmpl_var name='groups_txt'}

+
+ {tmpl_var name='groups'} +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/users_list.htm b/interface/ispconfig/interface/admin/templates/users_list.htm new file mode 100644 index 000000000..6634201a7 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/users_list.htm @@ -0,0 +1,61 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +

+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="username"}{tmpl_var name="vorname"}{tmpl_var name="name"}{tmpl_var name="ort"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/admin/templates/users_user_edit.htm b/interface/ispconfig/interface/admin/templates/users_user_edit.htm new file mode 100644 index 000000000..ce0017823 --- /dev/null +++ b/interface/ispconfig/interface/admin/templates/users_user_edit.htm @@ -0,0 +1,67 @@ +

+

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

{tmpl_var name='password_strength_txt'}

+
+

 

+
+
+

{tmpl_var name='modules_txt'}

+
+ {tmpl_var name='modules'} +
+
+
+ + +
+
+

{tmpl_var name='app_theme_txt'}

+
+ {tmpl_var name='app_theme'} +
+
+
+

{tmpl_var name='typ_txt'}

+
+ {tmpl_var name='typ'} +
+
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/admin/users_del.php b/interface/ispconfig/interface/admin/users_del.php new file mode 100644 index 000000000..97c3154c8 --- /dev/null +++ b/interface/ispconfig/interface/admin/users_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('admin'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/users_edit.php b/interface/ispconfig/interface/admin/users_edit.php new file mode 100644 index 000000000..4344e3c95 --- /dev/null +++ b/interface/ispconfig/interface/admin/users_edit.php @@ -0,0 +1,74 @@ +auth->check_module_permissions('admin'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeInsert() { + global $app, $conf; + + if(!in_array($this->dataRecord['startmodule'],$this->dataRecord['modules'])) { + $app->tform->errorMessage .= $app->tform->wordbook['startmodule_err']; + } + } + + function onBeforeUpdate() { + global $app, $conf; + + if(@is_array($this->dataRecord['modules']) && !in_array($this->dataRecord['startmodule'],$this->dataRecord['modules'])) { + $app->tform->errorMessage .= $app->tform->wordbook['startmodule_err']; + } + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/admin/users_list.php b/interface/ispconfig/interface/admin/users_list.php new file mode 100644 index 000000000..d2e2c8675 --- /dev/null +++ b/interface/ispconfig/interface/admin/users_list.php @@ -0,0 +1,52 @@ +auth->check_module_permissions('admin'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLOrderBy = 'ORDER BY username'; +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/capp.php b/interface/ispconfig/interface/capp.php new file mode 100644 index 000000000..354652ce3 --- /dev/null +++ b/interface/ispconfig/interface/capp.php @@ -0,0 +1,56 @@ +error($app->lng(301)); + +// lade Moduldaten in Session +if(is_file($mod."/lib/module.conf.php")) { + include_once($mod."/lib/module.conf.php"); + $_SESSION["s"]["module"] = $module; + echo "HEADER_REDIRECT:".$_SESSION["s"]["module"]["startpage"]; +} else { + $app->error($app->lng(302)); +} +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/client_del.php b/interface/ispconfig/interface/client/client_del.php new file mode 100644 index 000000000..db1790c06 --- /dev/null +++ b/interface/ispconfig/interface/client/client_del.php @@ -0,0 +1,166 @@ +auth->check_module_permissions('client'); + +$app->uses('tpl,tform'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onDelete() { + global $app, $conf,$list_def_file,$tform_def_file; + + if($_POST["confirm"] == 'yes') { + parent::onDelete(); + } else { + + $app->uses('tpl'); + $app->tpl->newTemplate("form.tpl.htm"); + $app->tpl->setInclude('content_tpl', 'templates/client_del.htm'); + + include_once($list_def_file); + + // Loading tform framework + if(!is_object($app->tform)) $app->uses('tform'); + + // Load table definition from file + $app->tform->loadFormDef($tform_def_file); + + $this->id = intval($_REQUEST["id"]); + + $this->dataRecord = $app->tform->getDataRecord($this->id); + $client_id = intval($this->dataRecord['client_id']); + //$parent_client_id = intval($this->dataRecord['parent_client_id']); + //$parent_user = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE client_id = $parent_client_id"); + $client_group = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = $client_id"); + + // Get all records (sub-clients, mail, web, etc....) of this client. + $tables = 'client,dns_rr,dns_soa,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_domain,web_traffic'; + $tables_array = explode(',',$tables); + $client_group_id = intval($client_group['groupid']); + $table_list = array(); + if($client_group_id > 1) { + foreach($tables_array as $table) { + if($table != '') { + $records = $app->db->queryAllRecords("SELECT * FROM $table WHERE sys_groupid = ".$client_group_id); + $number = count($records); + if($number > 0) $table_list[] = array('table' => $table."(".$number.")"); + } + } + } + + $app->tpl->setVar('id',$this->id); + $app->tpl->setLoop('records', $table_list); + + //* load language file + $lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_client_del.lng'; + include($lng_file); + $app->tpl->setVar($wb); + + $app->tpl_defaults(); + $app->tpl->pparse(); + } + } + + + + + function onAfterDelete() { + global $app, $conf; + + $client_id = intval($this->dataRecord['client_id']); + + if($client_id > 0) { + // remove the group of the client from the resellers group + $parent_client_id = intval($this->dataRecord['parent_client_id']); + $parent_user = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE client_id = $parent_client_id"); + $client_group = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = $client_id"); + $app->auth->remove_group_from_user($parent_user['userid'],$client_group['groupid']); + + // delete the group of the client + $app->db->query("DELETE FROM sys_group WHERE client_id = $client_id"); + + // delete the sys user(s) of the client + $app->db->query("DELETE FROM sys_user WHERE client_id = $client_id"); + + // Delete all records (sub-clients, mail, web, etc....) of this client. + $tables = 'client,dns_rr,dns_soa,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_domain,web_traffic'; + $tables_array = explode(',',$tables); + $client_group_id = intval($client_group['groupid']); + if($client_group_id > 1) { + foreach($tables_array as $table) { + if($table != '') { + $records = $app->db->queryAllRecords("SELECT * FROM $table WHERE sys_groupid = ".$client_group_id); + // find the primary ID of the table + $table_info = $app->db->tableInfo($table); + $index_field = ''; + foreach($table_info as $tmp) { + if($tmp['option'] == 'primary') $index_field = $tmp['name']; + } + // Delete the records + if($index_field != '') { + if(is_array($records)) { + foreach($records as $rec) { + $app->db->datalogDelete($table, $index_field, $rec[$index_field]); + } + } + } + + } + } + } + + + + } + + } +} + +$page = new page_action; +$page->onDelete() + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/client_edit.php b/interface/ispconfig/interface/client/client_edit.php new file mode 100644 index 000000000..9073ec9c2 --- /dev/null +++ b/interface/ispconfig/interface/client/client_edit.php @@ -0,0 +1,228 @@ +auth->check_module_permissions('client'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another website. + if($client["limit_client"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_client"]) { + $app->error($app->tform->wordbook["limit_client_txt"]); + } + } + } + + parent::onShowNew(); + } + + + function onSubmit() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user' && $this->id == 0) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another website. + if($client["limit_client"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_client"]) { + $app->error($app->tform->wordbook["limit_client_txt"]); + } + } + } + + parent::onSubmit(); + } + + + function onShowEnd() { + + global $app; + + $sql = "SELECT template_id,template_name FROM client_template WHERE template_type = 'a'"; + $tpls = $app->db->queryAllRecords($sql); + $option = ''; + $tpl = array(); + foreach($tpls as $item){ + $option .= ''; + $tpl[$item['template_id']] = $item['template_name']; + } + $app->tpl->setVar('tpl_add_select',$option); + + $sql = "SELECT template_additional FROM client WHERE client_id = " . $this->id; + $result = $app->db->queryOneRecord($sql); + $tplAdd = explode("/", $result['template_additional']); + $text = ''; + foreach($tplAdd as $item){ + if (trim($item) != ''){ + if ($text != '') $text .= '
'; + $text .= $tpl[$item]; + } + } + + $app->tpl->setVar('template_additional_list', $text); + + parent::onShowEnd(); + + } + + /* + This function is called automatically right after + the data was successful inserted in the database. + */ + function onAfterInsert() { + global $app; + // Create the group for the client + $groupid = $app->db->datalogInsert('sys_group', "(name,description,client_id) VALUES ('".mysql_real_escape_string($this->dataRecord["username"])."','',".$this->id.")", 'groupid'); + $groups = $groupid; + + $username = $app->db->quote($this->dataRecord["username"]); + $password = $app->db->quote($this->dataRecord["password"]); + $modules = ISPC_INTERFACE_MODULES_ENABLED; + if($this->dataRecord["limit_client"] > 0) $modules .= ',client'; + $startmodule = 'mail'; + $usertheme = $app->db->quote($this->dataRecord["usertheme"]); + $type = 'user'; + $active = 1; + $language = $app->db->quote($this->dataRecord["language"]); + + // Create the controlpaneluser for the client + $sql = "INSERT INTO sys_user (username,passwort,modules,startmodule,app_theme,typ,active,language,groups,default_group,client_id) + VALUES ('$username',md5('$password'),'$modules','$startmodule','$usertheme','$type','$active','$language',$groups,$groupid,".$this->id.")"; + $app->db->query($sql); + + //* If the user who inserted the client is a reseller (not admin), we will have to add this new client group + //* to his groups, so he can administrate the records of this client. + if($_SESSION['s']['user']['typ'] == 'user') { + $app->auth->add_group_to_user($_SESSION['s']['user']['userid'],$groupid); + $app->db->query("UPDATE client SET parent_client_id = ".intval($_SESSION['s']['user']['client_id'])." WHERE client_id = ".$this->id); + } + + $app->db->query("UPDATE client SET created_at = ".time()." WHERE client_id = ".$this->id); + + /* If there is a client-template, process it */ + applyClientTemplates($this->id); + + parent::onAfterInsert(); + } + + + /* + This function is called automatically right after + the data was successful updated in the database. + */ + function onAfterUpdate() { + global $app; + + // username changed + if(isset($this->dataRecord['username']) && $this->dataRecord['username'] != '' && $this->oldDataRecord['username'] != $this->dataRecord['username']) { + $username = $app->db->quote($this->dataRecord["username"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET username = '$username' WHERE client_id = $client_id"; + $app->db->query($sql); + + $tmp = $app->db->queryOneRecord("SELECT * FROM sys_group WHERE client_id = $client_id"); + $app->db->datalogUpdate("sys_group", "name = '$username'", 'groupid', $tmp['groupid']); + unset($tmp); + } + + // password changed + if(isset($this->dataRecord["password"]) && $this->dataRecord["password"] != '') { + $password = $app->db->quote($this->dataRecord["password"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET passwort = md5('$password') WHERE client_id = $client_id"; + $app->db->query($sql); + } + + // language changed + if(isset($this->dataRecord['language']) && $this->dataRecord['language'] != '' && $this->oldDataRecord['language'] != $this->dataRecord['language']) { + $language = $app->db->quote($this->dataRecord["language"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET language = '$language' WHERE client_id = $client_id"; + $app->db->query($sql); + } + + // reseller status changed + if(isset($this->dataRecord["limit_client"]) && $this->dataRecord["limit_client"] != $this->oldDataRecord["limit_client"]) { + $modules = ISPC_INTERFACE_MODULES_ENABLED; + if($this->dataRecord["limit_client"] > 0) $modules .= ',client'; + $modules = $app->db->quote($modules); + $client_id = $this->id; + $sql = "UPDATE sys_user SET modules = '$modules' WHERE client_id = $client_id"; + $app->db->query($sql); + } + /* + * If there is a client-template, process it */ + applyClientTemplates($this->id); + + parent::onAfterUpdate(); + } +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/client_list.php b/interface/ispconfig/interface/client/client_list.php new file mode 100644 index 000000000..dd98e29a1 --- /dev/null +++ b/interface/ispconfig/interface/client/client_list.php @@ -0,0 +1,25 @@ +auth->check_module_permissions('client'); + +$app->uses('listform_actions'); + +$app->listform_actions->SQLOrderBy = 'ORDER BY company_name, contact_name, client_id'; +$app->listform_actions->SQLExtWhere = "limit_client = 0"; +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/client_template_del.php b/interface/ispconfig/interface/client/client_template_del.php new file mode 100644 index 000000000..6d8e8348f --- /dev/null +++ b/interface/ispconfig/interface/client/client_template_del.php @@ -0,0 +1,67 @@ +auth->check_module_permissions('client'); +if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('Client-Templates are for Admins only.'); + +$app->uses('tpl,tform'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onBeforeDelete() { + global $app; + + $rec = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE template_master = ".$this->id." OR template_additional like '%/".$this->id."/%'"); + if($rec['number'] > 0) { + $app->error($app->tform->lng('template_del_aborted_txt')); + } + + } +} + +$page = new page_action; +$page->onDelete() + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/client_template_edit.php b/interface/ispconfig/interface/client/client_template_edit.php new file mode 100644 index 000000000..f032ded7c --- /dev/null +++ b/interface/ispconfig/interface/client/client_template_edit.php @@ -0,0 +1,97 @@ +auth->check_module_permissions('client'); +if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('Client-Templates are only for Admins.'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeUpdate() { + global $app; + + if(isset($this->dataRecord['template_type'])) { + //* Check if the template_type has been changed + $rec = $app->db->queryOneRecord("SELECT template_type from client_template WHERE template_id = ".$this->id); + if($rec['template_type'] != $this->dataRecord['template_type']) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The template type can not be changed.'); + $this->dataRecord['template_type'] = $rec['template_type']; + } + unset($rec); + } + } + + + /* + This function is called automatically right after + the data was successful updated in the database. + */ + function onAfterUpdate() { + global $app; + + /* + * the template has changed. apply the new data to all clients + */ + if ($this->dataRecord["template_type"] == 'm'){ + $sql = "SELECT client_id FROM client WHERE template_master = " . $this->id; + } else { + $sql = "SELECT client_id FROM client WHERE template_additional LIKE '%/" . $this->id . '/%"'; + } + $clients = $app->db->queryAllRecords($sql); + if (is_array($clients)){ + foreach ($clients as $client){ + applyClientTemplates($client['client_id']); + } + } + } +} + +$page = new page_action; +$page->onLoad(); +?> diff --git a/interface/ispconfig/interface/client/client_template_list.php b/interface/ispconfig/interface/client/client_template_list.php new file mode 100644 index 000000000..d9a916374 --- /dev/null +++ b/interface/ispconfig/interface/client/client_template_list.php @@ -0,0 +1,21 @@ +auth->check_module_permissions('client'); +if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('Client-Templates are only for Admins.'); + +$app->uses('listform_actions'); +$app->listform_actions->onLoad(); +?> diff --git a/interface/ispconfig/interface/client/form/client.tform.php b/interface/ispconfig/interface/client/form/client.tform.php new file mode 100644 index 000000000..01f616e53 --- /dev/null +++ b/interface/ispconfig/interface/client/form/client.tform.php @@ -0,0 +1,785 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +//* Languages +$language_list = array(); +$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') { + $tmp = substr($file, 0, 2); + $language_list[$tmp] = $tmp; + } + } +} + +//* Load themes +$themes_list = array(); +$handle = @opendir(ISPC_THEMES_PATH); +while ($file = @readdir ($handle)) { + if (substr($file, 0, 1) != '.') { + if(@is_dir(ISPC_THEMES_PATH."/$file")) { + $themes_list[$file] = $file; + } + } +} + +$form["tabs"]['address'] = array ( + 'title' => "Address", + 'width' => 100, + 'template' => "templates/client_edit_address.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'company_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'contact_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'contact_error_empty'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'username_error_empty'), + 1 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_client', + 'function' => 'username_unique', + 'errmsg'=> 'username_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\_]{0,64}$/', + 'errmsg'=> 'username_error_regex'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'CRYPT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'language' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => $conf["language"], + 'value' => $language_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'usertheme' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'default', + 'value' => $themes_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'street' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'zip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'city' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'state' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'country' => array ( + 'datatype' => 'VARCHAR', + + 'formtype' => 'SELECT', + 'default' => 'DE', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name', + 'keyfield'=> 'iso', + 'valuefield'=> 'printable_name' + ), + 'value' => '' + ), + 'telephone' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'mobile' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'fax' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'internet' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'http://', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'icq' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'notes' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '', + 'maxlength' => '', + 'rows' => '10', + 'cols' => '30' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +$form["tabs"]['limits'] = array ( + 'title' => "Limits", + 'width' => 80, + 'template' => "templates/client_edit_limits.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'template_master' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'master_templates' + ), + 'value' => '' + ), + 'template_additional' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + ), + 'default_mailserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'client_servers' + ), + 'value' => '', + 'name' => 'default_mailserver' + ), + 'limit_maildomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_maildomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailbox' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailbox_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailalias' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailalias_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailaliasdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailaliasdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailforward' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailforward_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailcatchall' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailcatchall_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailrouting' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailrouting_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailfilter' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfilter_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_fetchmail' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfetchmail_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailquota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailquota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_wblist' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_wblist_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_policy' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_policy_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'default_webserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'client_servers' + ), + 'value' => '', + 'name' => 'default_webserver' + ), + 'limit_web_domain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_domain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'web_php_options' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'separator' => ',', + 'valuelimit' => 'client:web_php_options', + 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP') + ), + 'limit_web_aliasdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_aliasdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_subdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_subdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_ftp_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_ftp_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_shell_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_shell_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'ssh_chroot' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'separator' => ',', + 'valuelimit' => 'client:ssh_chroot', + 'value' => array('no' => 'None', 'jailkit' => 'Jailkit') + ), + 'default_dnsserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'client_servers' + ), + 'value' => '', + 'name' => 'default_dnsserver' + ), + 'limit_dns_zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_zone_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_dns_record' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_record_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_client' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_client_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'default_dbserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'client_servers' + ), + 'value' => '', + 'name' => 'default_dbserver' + ), + 'limit_database' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_database_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron') + ), + 'limit_cron_frequency' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_frequency'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_traffic_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_traffic_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +/* +$form["tabs"]['ipaddress'] = array ( + 'title' => "IP Addresses", + 'width' => 100, + 'template' => "templates/client_edit_ipaddress.htm", + 'fields' => array ( + ################################## + # Beginn Datatable fields + ################################## + 'ip_address' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'value' => array('192.168.0.1' => '192.168.0.1', '192.168.0.2' => '192.168.0.2'), + 'separator' => ';' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); +*/ + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/form/client_template.tform.php b/interface/ispconfig/interface/client/form/client_template.tform.php new file mode 100644 index 000000000..d1db4bae0 --- /dev/null +++ b/interface/ispconfig/interface/client/form/client_template.tform.php @@ -0,0 +1,482 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +//* Languages +$language_list = array(); +$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') { + $tmp = substr($file, 0, 2); + $language_list[$tmp] = $tmp; + } + } +} + +$form["tabs"]['template'] = array ( + 'title' => "Template", + 'width' => 80, + 'template' => "templates/client_template_edit_template.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'template_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'm', + 'value' => array('m' => "Main Template",'a' => "Additional Template"), + ), + 'template_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'error_template_name_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +$form["tabs"]['limits'] = array ( + 'title' => "Limits", + 'width' => 80, + 'template' => "templates/client_template_edit_limits.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'limit_maildomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_maildomain_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailbox' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailbox_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailalias' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailalias_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailaliasdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailaliasdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailforward' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailforward_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailcatchall' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailcatchall_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailrouting' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailrouting_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailfilter' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfilter_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_fetchmail' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfetchmail_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailquota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailquota_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_wblist' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_wblist_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_user_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_policy' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_policy_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_domain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_domain_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_aliasdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_aliasdomain_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_subdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_subdomain_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_ftp_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_ftp_user_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_shell_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_shell_user_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_dns_zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_zone_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_dns_record' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_record_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + /* + 'limit_client' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_client_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + */ + 'limit_database' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_database_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron') + ), + 'limit_cron_frequency' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_frequency'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_traffic_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_traffic_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +?> diff --git a/interface/ispconfig/interface/client/form/reseller.tform.php b/interface/ispconfig/interface/client/form/reseller.tform.php new file mode 100644 index 000000000..a987a9f98 --- /dev/null +++ b/interface/ispconfig/interface/client/form/reseller.tform.php @@ -0,0 +1,761 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +//* Languages +$language_list = array(); +$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') { + $tmp = substr($file, 0, 2); + $language_list[$tmp] = $tmp; + } + } +} + +$form["tabs"]['address'] = array ( + 'title' => "Address", + 'width' => 100, + 'template' => "templates/reseller_edit_address.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'company_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'contact_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'contact_error_empty'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'username_error_empty'), + 1 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_client', + 'function' => 'username_unique', + 'errmsg'=> 'username_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\_]{0,64}$/', + 'errmsg'=> 'username_error_regex'), + ), + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'CRYPT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'language' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => $conf["language"], + 'value' => $language_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'usertheme' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'default', + 'value' => array('default' => 'default'), + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'street' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'zip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'city' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'state' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'country' => array ( + 'datatype' => 'VARCHAR', + + 'formtype' => 'SELECT', + 'default' => 'DE', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name', + 'keyfield'=> 'iso', + 'valuefield'=> 'printable_name' + ), + 'value' => '' + ), + 'telephone' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'mobile' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'fax' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'internet' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'http://', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'icq' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'notes' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '', + 'maxlength' => '', + 'rows' => '10', + 'cols' => '30' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +$form["tabs"]['limits'] = array ( + 'title' => "Limits", + 'width' => 80, + 'template' => "templates/reseller_edit_limits.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'template_master' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'master_templates' + ), + 'value' => '' + ), + 'template_additional' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + ), + 'default_mailserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'limit_maildomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_maildomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailbox' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailbox_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailalias' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailalias_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailforward' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailforward_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailcatchall' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailcatchall_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailrouting' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailrouting_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailfilter' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfilter_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_fetchmail' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailfetchmail_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_mailquota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mailquota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_wblist' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_wblist_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_spamfilter_policy' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_spamfilter_policy_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'default_webserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE web_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'limit_web_domain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_domain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'web_php_options' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'separator' => ',', + 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP') + ), + 'limit_web_aliasdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_aliasdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_web_subdomain' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_web_subdomain_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_ftp_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_ftp_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_shell_user' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_shell_user_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'ssh_chroot' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'separator' => ',', + 'value' => array('no' => 'None', 'jailkit' => 'Jailkit') + ), + 'default_dnsserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE dns_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'limit_dns_zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_zone_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_dns_record' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_dns_record_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_client' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_client_error_notint'), + 1 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_reseller', + 'function' => 'limit_client'), + ), + 'default' => '1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'default_dbserver' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '1', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE db_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'limit_database' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_database_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_notint'), + ), + 'default' => '0', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_cron_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron') + ), + 'limit_cron_frequency' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_cron_error_frequency'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + 'limit_traffic_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_traffic_quota_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), + ################################## + # END Datatable fields + ################################## + ) +); + +/* +$form["tabs"]['ipaddress'] = array ( + 'title' => "IP Addresses", + 'width' => 100, + 'template' => "templates/client_edit_ipaddress.htm", + 'fields' => array ( + ################################## + # Beginn Datatable fields + ################################## + 'ip_address' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'value' => array('192.168.0.1' => '192.168.0.1', '192.168.0.2' => '192.168.0.2'), + 'separator' => ';' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); +*/ + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/admin.conf.php b/interface/ispconfig/interface/client/lib/admin.conf.php new file mode 100644 index 000000000..a45d44034 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/admin.conf.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/bg.lng b/interface/ispconfig/interface/client/lib/lang/bg.lng new file mode 100644 index 000000000..f835dfd5f --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_client.lng b/interface/ispconfig/interface/client/lib/lang/bg_client.lng new file mode 100644 index 000000000..35b3519da --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_client_del.lng b/interface/ispconfig/interface/client/lib/lang/bg_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_client_template.lng b/interface/ispconfig/interface/client/lib/lang/bg_client_template.lng new file mode 100644 index 000000000..2f6e9ba30 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/bg_client_template_list.lng new file mode 100644 index 000000000..b93a5f97b --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/bg_clients_list.lng new file mode 100644 index 000000000..f412b7802 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/bg_reseller.lng b/interface/ispconfig/interface/client/lib/lang/bg_reseller.lng new file mode 100644 index 000000000..f0dc7ca05 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/bg_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/bg_resellers_list.lng new file mode 100644 index 000000000..34d089669 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/bg_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br.lng b/interface/ispconfig/interface/client/lib/lang/br.lng new file mode 100644 index 000000000..3dcb5e343 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_client.lng b/interface/ispconfig/interface/client/lib/lang/br_client.lng new file mode 100644 index 000000000..6e2b67cfa --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_client_del.lng b/interface/ispconfig/interface/client/lib/lang/br_client_del.lng new file mode 100644 index 000000000..57788b035 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_client_template.lng b/interface/ispconfig/interface/client/lib/lang/br_client_template.lng new file mode 100644 index 000000000..b3b15e250 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/br_client_template_list.lng new file mode 100644 index 000000000..231f7fdea --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/br_clients_list.lng new file mode 100644 index 000000000..a6d54ecc8 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/br_reseller.lng b/interface/ispconfig/interface/client/lib/lang/br_reseller.lng new file mode 100644 index 000000000..a9724bf48 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Cota Web'; +$wb['limit_traffic_quota_txt'] = 'Cota de Tráfego'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/br_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/br_resellers_list.lng new file mode 100644 index 000000000..053d7229d --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/br_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de.lng b/interface/ispconfig/interface/client/lib/lang/de.lng new file mode 100644 index 000000000..2ab45de2f --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_client.lng b/interface/ispconfig/interface/client/lib/lang/de_client.lng new file mode 100644 index 000000000..6237798fb --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_client_del.lng b/interface/ispconfig/interface/client/lib/lang/de_client_del.lng new file mode 100644 index 000000000..4fb2aacdb --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_client_template.lng b/interface/ispconfig/interface/client/lib/lang/de_client_template.lng new file mode 100644 index 000000000..1fcce0050 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/de_client_template_list.lng new file mode 100644 index 000000000..98195fed1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/de_clients_list.lng new file mode 100644 index 000000000..515d7dbe0 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/de_reseller.lng b/interface/ispconfig/interface/client/lib/lang/de_reseller.lng new file mode 100644 index 000000000..f3a3ec87b --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_reseller.lng @@ -0,0 +1,93 @@ + 0 sein'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota muss eine Zahl sein.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/de_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/de_resellers_list.lng new file mode 100644 index 000000000..f6f736cf3 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/de_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/en.lng b/interface/ispconfig/interface/client/lib/lang/en.lng new file mode 100644 index 000000000..2c598f3e2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en.lng @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/en_client.lng b/interface/ispconfig/interface/client/lib/lang/en_client.lng new file mode 100644 index 000000000..e87ba45e0 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_client.lng @@ -0,0 +1,97 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/en_client_del.lng b/interface/ispconfig/interface/client/lib/lang/en_client_del.lng new file mode 100644 index 000000000..4d16af6af --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/en_client_template.lng b/interface/ispconfig/interface/client/lib/lang/en_client_template.lng new file mode 100644 index 000000000..39726634e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_client_template.lng @@ -0,0 +1,61 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/en_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/en_client_template_list.lng new file mode 100644 index 000000000..ac5218686 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/en_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/en_clients_list.lng new file mode 100644 index 000000000..86671aef4 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_clients_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/en_reseller.lng b/interface/ispconfig/interface/client/lib/lang/en_reseller.lng new file mode 100644 index 000000000..2b06c33d3 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_reseller.lng @@ -0,0 +1,96 @@ + 0'; +$wb["limit_web_quota_txt"] = 'Web Quota'; +$wb["limit_traffic_quota_txt"] = 'Traffic Quota'; +$wb["limit_trafficquota_error_notint"] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/en_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/en_resellers_list.lng new file mode 100644 index 000000000..523a467c5 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/en_resellers_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/es.lng b/interface/ispconfig/interface/client/lib/lang/es.lng new file mode 100644 index 000000000..f1b1d758e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_client.lng b/interface/ispconfig/interface/client/lib/lang/es_client.lng new file mode 100644 index 000000000..e42a54818 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_client_del.lng b/interface/ispconfig/interface/client/lib/lang/es_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_client_template.lng b/interface/ispconfig/interface/client/lib/lang/es_client_template.lng new file mode 100644 index 000000000..3e51956c8 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/es_client_template_list.lng new file mode 100644 index 000000000..9bbe98d0f --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/es_clients_list.lng new file mode 100644 index 000000000..1b3999311 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/es_reseller.lng b/interface/ispconfig/interface/client/lib/lang/es_reseller.lng new file mode 100644 index 000000000..f0dc7ca05 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/es_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/es_resellers_list.lng new file mode 100644 index 000000000..797d9d07a --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/es_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi.lng b/interface/ispconfig/interface/client/lib/lang/fi.lng new file mode 100644 index 000000000..9b7a982f9 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_client.lng b/interface/ispconfig/interface/client/lib/lang/fi_client.lng new file mode 100644 index 000000000..87842b1c3 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_client_del.lng b/interface/ispconfig/interface/client/lib/lang/fi_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_client_template.lng b/interface/ispconfig/interface/client/lib/lang/fi_client_template.lng new file mode 100644 index 000000000..e3b55ddaf --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/fi_client_template_list.lng new file mode 100644 index 000000000..094c3c70c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/fi_clients_list.lng new file mode 100644 index 000000000..8b20cc4cc --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fi_reseller.lng b/interface/ispconfig/interface/client/lib/lang/fi_reseller.lng new file mode 100644 index 000000000..f0dc7ca05 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/fi_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/fi_resellers_list.lng new file mode 100644 index 000000000..34d089669 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fi_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr.lng b/interface/ispconfig/interface/client/lib/lang/fr.lng new file mode 100644 index 000000000..b8f4d8f50 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_client.lng b/interface/ispconfig/interface/client/lib/lang/fr_client.lng new file mode 100644 index 000000000..7afb6e0cf --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_client_del.lng b/interface/ispconfig/interface/client/lib/lang/fr_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_client_template.lng b/interface/ispconfig/interface/client/lib/lang/fr_client_template.lng new file mode 100644 index 000000000..d984acc14 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/fr_client_template_list.lng new file mode 100644 index 000000000..3405427d2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/fr_clients_list.lng new file mode 100644 index 000000000..e5a0c1727 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_reseller.lng b/interface/ispconfig/interface/client/lib/lang/fr_reseller.lng new file mode 100644 index 000000000..24926d454 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_reseller.lng @@ -0,0 +1,93 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/fr_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/fr_resellers_list.lng new file mode 100644 index 000000000..e5a0c1727 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/fr_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu.lng b/interface/ispconfig/interface/client/lib/lang/hu.lng new file mode 100644 index 000000000..74a7c722d --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_client.lng b/interface/ispconfig/interface/client/lib/lang/hu_client.lng new file mode 100644 index 000000000..35be91f2c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_client_del.lng b/interface/ispconfig/interface/client/lib/lang/hu_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_client_template.lng b/interface/ispconfig/interface/client/lib/lang/hu_client_template.lng new file mode 100644 index 000000000..45930a084 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/hu_client_template_list.lng new file mode 100644 index 000000000..b93a5f97b --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/hu_clients_list.lng new file mode 100644 index 000000000..09105a01a --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/hu_reseller.lng b/interface/ispconfig/interface/client/lib/lang/hu_reseller.lng new file mode 100644 index 000000000..f0dc7ca05 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/hu_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/hu_resellers_list.lng new file mode 100644 index 000000000..34d089669 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/hu_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it.lng b/interface/ispconfig/interface/client/lib/lang/it.lng new file mode 100644 index 000000000..17552563e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_client.lng b/interface/ispconfig/interface/client/lib/lang/it_client.lng new file mode 100644 index 000000000..7dbc06cd9 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_client_del.lng b/interface/ispconfig/interface/client/lib/lang/it_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_client_template.lng b/interface/ispconfig/interface/client/lib/lang/it_client_template.lng new file mode 100644 index 000000000..abc74f493 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/it_client_template_list.lng new file mode 100644 index 000000000..03aa10e5c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/it_clients_list.lng new file mode 100644 index 000000000..d3bd8cdb7 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/it_reseller.lng b/interface/ispconfig/interface/client/lib/lang/it_reseller.lng new file mode 100644 index 000000000..f0dc7ca05 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/it_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/it_resellers_list.lng new file mode 100644 index 000000000..34d089669 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/it_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja.lng b/interface/ispconfig/interface/client/lib/lang/ja.lng new file mode 100644 index 000000000..a6edbc168 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_client.lng b/interface/ispconfig/interface/client/lib/lang/ja_client.lng new file mode 100644 index 000000000..2289f94ac --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_client_del.lng b/interface/ispconfig/interface/client/lib/lang/ja_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_client_template.lng b/interface/ispconfig/interface/client/lib/lang/ja_client_template.lng new file mode 100644 index 000000000..0291b2e4a --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/ja_client_template_list.lng new file mode 100644 index 000000000..05d3358c4 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/ja_clients_list.lng new file mode 100644 index 000000000..f5b39e150 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_reseller.lng b/interface/ispconfig/interface/client/lib/lang/ja_reseller.lng new file mode 100644 index 000000000..fbb4380f8 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_reseller.lng @@ -0,0 +1,93 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ja_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/ja_resellers_list.lng new file mode 100644 index 000000000..2f6e6ec94 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ja_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl.lng b/interface/ispconfig/interface/client/lib/lang/nl.lng new file mode 100644 index 000000000..0071fa28f --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_client.lng b/interface/ispconfig/interface/client/lib/lang/nl_client.lng new file mode 100644 index 000000000..a50da4538 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_client_del.lng b/interface/ispconfig/interface/client/lib/lang/nl_client_del.lng new file mode 100644 index 000000000..a896cbd3c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_client_template.lng b/interface/ispconfig/interface/client/lib/lang/nl_client_template.lng new file mode 100644 index 000000000..2abcc0cf6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/nl_client_template_list.lng new file mode 100644 index 000000000..333aeb5bb --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/nl_clients_list.lng new file mode 100644 index 000000000..0309a475d --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_reseller.lng b/interface/ispconfig/interface/client/lib/lang/nl_reseller.lng new file mode 100644 index 000000000..4fa2bdcf6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_reseller.lng @@ -0,0 +1,93 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/nl_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/nl_resellers_list.lng new file mode 100644 index 000000000..dd5fd53db --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/nl_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl.lng b/interface/ispconfig/interface/client/lib/lang/pl.lng new file mode 100644 index 000000000..771c3b2c2 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_client.lng b/interface/ispconfig/interface/client/lib/lang/pl_client.lng new file mode 100644 index 000000000..42f73b83b --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_client_del.lng b/interface/ispconfig/interface/client/lib/lang/pl_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_client_template.lng b/interface/ispconfig/interface/client/lib/lang/pl_client_template.lng new file mode 100644 index 000000000..5c7c0f857 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/pl_client_template_list.lng new file mode 100644 index 000000000..06a39761f --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/pl_clients_list.lng new file mode 100644 index 000000000..81f0bd855 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pl_reseller.lng b/interface/ispconfig/interface/client/lib/lang/pl_reseller.lng new file mode 100644 index 000000000..f08ca1c9e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/pl_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/pl_resellers_list.lng new file mode 100644 index 000000000..51abc411a --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pl_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/pt.lng b/interface/ispconfig/interface/client/lib/lang/pt.lng new file mode 100644 index 000000000..e8313728e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_client.lng b/interface/ispconfig/interface/client/lib/lang/pt_client.lng new file mode 100644 index 000000000..0f7d32ab4 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_client.lng @@ -0,0 +1,95 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_client_del.lng b/interface/ispconfig/interface/client/lib/lang/pt_client_del.lng new file mode 100644 index 000000000..769975296 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_client_del.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_client_template.lng b/interface/ispconfig/interface/client/lib/lang/pt_client_template.lng new file mode 100644 index 000000000..153cc5bd0 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_client_template.lng @@ -0,0 +1,58 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/pt_client_template_list.lng new file mode 100644 index 000000000..0587b04f3 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_client_template_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/pt_clients_list.lng new file mode 100644 index 000000000..53ceab053 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_clients_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_reseller.lng b/interface/ispconfig/interface/client/lib/lang/pt_reseller.lng new file mode 100644 index 000000000..9aa64e0a7 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_reseller.lng @@ -0,0 +1,94 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Cota Web'; +$wb['limit_traffic_quota_txt'] = 'Cota de Tráfego'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> + diff --git a/interface/ispconfig/interface/client/lib/lang/pt_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/pt_resellers_list.lng new file mode 100644 index 000000000..8df917d4f --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/pt_resellers_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ro.lng b/interface/ispconfig/interface/client/lib/lang/ro.lng new file mode 100644 index 000000000..38bbbb501 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_client.lng b/interface/ispconfig/interface/client/lib/lang/ro_client.lng new file mode 100644 index 000000000..6dbfadb43 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_client_del.lng b/interface/ispconfig/interface/client/lib/lang/ro_client_del.lng new file mode 100644 index 000000000..4d16af6af --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_client_template.lng b/interface/ispconfig/interface/client/lib/lang/ro_client_template.lng new file mode 100644 index 000000000..276e0817c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/ro_client_template_list.lng new file mode 100644 index 000000000..b19f5d43c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/ro_clients_list.lng new file mode 100644 index 000000000..33bde68e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/ro_reseller.lng b/interface/ispconfig/interface/client/lib/lang/ro_reseller.lng new file mode 100644 index 000000000..2b06c33d3 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_reseller.lng @@ -0,0 +1,96 @@ + 0'; +$wb["limit_web_quota_txt"] = 'Web Quota'; +$wb["limit_traffic_quota_txt"] = 'Traffic Quota'; +$wb["limit_trafficquota_error_notint"] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/ro_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/ro_resellers_list.lng new file mode 100644 index 000000000..523a467c5 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ro_resellers_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/client/lib/lang/ru.lng b/interface/ispconfig/interface/client/lib/lang/ru.lng new file mode 100644 index 000000000..a2679b2a6 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_client.lng b/interface/ispconfig/interface/client/lib/lang/ru_client.lng new file mode 100644 index 000000000..e1a38d4e7 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_client.lng @@ -0,0 +1,95 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_client_del.lng b/interface/ispconfig/interface/client/lib/lang/ru_client_del.lng new file mode 100644 index 000000000..d79261720 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_client_del.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_client_template.lng b/interface/ispconfig/interface/client/lib/lang/ru_client_template.lng new file mode 100644 index 000000000..d630f3457 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_client_template.lng @@ -0,0 +1,58 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/ru_client_template_list.lng new file mode 100644 index 000000000..9aab2f589 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_client_template_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/ru_clients_list.lng new file mode 100644 index 000000000..3621300ae --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_clients_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_reseller.lng b/interface/ispconfig/interface/client/lib/lang/ru_reseller.lng new file mode 100644 index 000000000..097634481 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_reseller.lng @@ -0,0 +1,94 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Квота Web'; +$wb['limit_traffic_quota_txt'] = 'Квота трафика'; +$wb['limit_trafficquota_error_notint'] = 'Квота трафика должна быть чиÑлом.'; +?> + diff --git a/interface/ispconfig/interface/client/lib/lang/ru_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/ru_resellers_list.lng new file mode 100644 index 000000000..3d8976721 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/ru_resellers_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/client/lib/lang/se.lng b/interface/ispconfig/interface/client/lib/lang/se.lng new file mode 100644 index 000000000..38bbbb501 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_client.lng b/interface/ispconfig/interface/client/lib/lang/se_client.lng new file mode 100644 index 000000000..2bcea5cc4 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_client_del.lng b/interface/ispconfig/interface/client/lib/lang/se_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_client_template.lng b/interface/ispconfig/interface/client/lib/lang/se_client_template.lng new file mode 100644 index 000000000..2f6e9ba30 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/se_client_template_list.lng new file mode 100644 index 000000000..b93a5f97b --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/se_clients_list.lng new file mode 100644 index 000000000..81f0bd855 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/se_reseller.lng b/interface/ispconfig/interface/client/lib/lang/se_reseller.lng new file mode 100644 index 000000000..f0dc7ca05 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/se_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/se_resellers_list.lng new file mode 100644 index 000000000..34d089669 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/se_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk.lng b/interface/ispconfig/interface/client/lib/lang/sk.lng new file mode 100644 index 000000000..fea38589d --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_client.lng b/interface/ispconfig/interface/client/lib/lang/sk_client.lng new file mode 100644 index 000000000..6daf5769a --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_client_del.lng b/interface/ispconfig/interface/client/lib/lang/sk_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_client_template.lng b/interface/ispconfig/interface/client/lib/lang/sk_client_template.lng new file mode 100644 index 000000000..938c43646 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/sk_client_template_list.lng new file mode 100644 index 000000000..6160cc834 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/sk_clients_list.lng new file mode 100644 index 000000000..780be1c6e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/sk_reseller.lng b/interface/ispconfig/interface/client/lib/lang/sk_reseller.lng new file mode 100644 index 000000000..5b17a8067 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_reseller.lng @@ -0,0 +1,93 @@ + 0'; +$wb['limit_web_quota_txt'] = 'Web Quota'; +$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; +$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; +?> diff --git a/interface/ispconfig/interface/client/lib/lang/sk_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/sk_resellers_list.lng new file mode 100644 index 000000000..2fbaecd19 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/sk_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr.lng b/interface/ispconfig/interface/client/lib/lang/tr.lng new file mode 100644 index 000000000..f8f1e5072 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_client.lng b/interface/ispconfig/interface/client/lib/lang/tr_client.lng new file mode 100644 index 000000000..35e6cd57d --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_client.lng @@ -0,0 +1,94 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_client_del.lng b/interface/ispconfig/interface/client/lib/lang/tr_client_del.lng new file mode 100644 index 000000000..a826d64e1 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_client_del.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_client_template.lng b/interface/ispconfig/interface/client/lib/lang/tr_client_template.lng new file mode 100644 index 000000000..2d038e0bc --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_client_template.lng @@ -0,0 +1,57 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_client_template_list.lng b/interface/ispconfig/interface/client/lib/lang/tr_client_template_list.lng new file mode 100644 index 000000000..af5c1c74e --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_client_template_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_clients_list.lng b/interface/ispconfig/interface/client/lib/lang/tr_clients_list.lng new file mode 100644 index 000000000..9c0215a24 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_clients_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_reseller.lng b/interface/ispconfig/interface/client/lib/lang/tr_reseller.lng new file mode 100644 index 000000000..63077c02c --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_reseller.lng @@ -0,0 +1,93 @@ + diff --git a/interface/ispconfig/interface/client/lib/lang/tr_resellers_list.lng b/interface/ispconfig/interface/client/lib/lang/tr_resellers_list.lng new file mode 100644 index 000000000..ccb8fd154 --- /dev/null +++ b/interface/ispconfig/interface/client/lib/lang/tr_resellers_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/client/lib/module.conf.php b/interface/ispconfig/interface/client/lib/module.conf.php new file mode 100644 index 000000000..543fc892d --- /dev/null +++ b/interface/ispconfig/interface/client/lib/module.conf.php @@ -0,0 +1,63 @@ + "Add Client", + 'target' => 'content', + 'link' => 'client/client_edit.php'); + +$items[] = array( 'title' => "Edit Client", + 'target' => 'content', + 'link' => 'client/client_list.php'); + +if($_SESSION["s"]["user"]["typ"] == 'admin'){ + $items[] = array( 'title' => "Edit Client-Templates", + 'target' => 'content', + 'link' => 'client/client_template_list.php'); +} + +$module["nav"][] = array( 'title' => 'Clients', + 'open' => 1, + 'items' => $items); + +unset($items); + + +if($_SESSION["s"]["user"]["typ"] == 'admin'){ + +$items[] = array( 'title' => "Add Reseller", + 'target' => 'content', + 'link' => 'client/reseller_edit.php'); + +$items[] = array( 'title' => "Edit Reseller", + 'target' => 'content', + 'link' => 'client/reseller_list.php'); + +$module["nav"][] = array( 'title' => 'Resellers', + 'open' => 1, + 'items' => $items); +} + + + + + + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/list/client.list.php b/interface/ispconfig/interface/client/list/client.list.php new file mode 100644 index 000000000..3ace4fb18 --- /dev/null +++ b/interface/ispconfig/interface/client/list/client.list.php @@ -0,0 +1,87 @@ + "company_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "contact_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "city", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "country", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/list/client_template.list.php b/interface/ispconfig/interface/client/list/client_template.list.php new file mode 100644 index 000000000..679759e41 --- /dev/null +++ b/interface/ispconfig/interface/client/list/client_template.list.php @@ -0,0 +1,65 @@ + "template_type", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('m' => "Main Template",'a' => "Additional Template")); + +$liste["item"][] = array( 'field' => "template_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); +?> diff --git a/interface/ispconfig/interface/client/list/reseller.list.php b/interface/ispconfig/interface/client/list/reseller.list.php new file mode 100644 index 000000000..6d08cc8c8 --- /dev/null +++ b/interface/ispconfig/interface/client/list/reseller.list.php @@ -0,0 +1,87 @@ + "company_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "contact_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "city", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "country", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/reseller_del.php b/interface/ispconfig/interface/client/reseller_del.php new file mode 100644 index 000000000..855652a73 --- /dev/null +++ b/interface/ispconfig/interface/client/reseller_del.php @@ -0,0 +1,92 @@ +auth->check_module_permissions('client'); + +if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.'); + +$app->uses('tpl,tform'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app, $conf; + + $client_id = intval($this->dataRecord['client_id']); + + $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE parent_client_id = ".$client_id); + if($tmp["number"] > 0) $app->error($app->lng('error_has_clients')); + + } + + function onAfterDelete() { + global $app, $conf; + + $client_id = intval($this->dataRecord['client_id']); + + if($client_id > 0) { + // TODO: Delete all records (sub-clients, mail, web, etc....) of this client. + + // remove the group of the client from the resellers group + $parent_client_id = intval($this->dataRecord['parent_client_id']); + $parent_user = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE client_id = $parent_client_id"); + $client_group = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = $client_id"); + $app->auth->remove_group_from_user($parent_user['userid'],$client_group['groupid']); + + // delete the group of the client + $app->db->query("DELETE FROM sys_group WHERE client_id = $client_id"); + + // delete the sys user(s) of the client + $app->db->query("DELETE FROM sys_user WHERE client_id = $client_id"); + } + + } +} + +$page = new page_action; +$page->onDelete() + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/reseller_edit.php b/interface/ispconfig/interface/client/reseller_edit.php new file mode 100644 index 000000000..949baae29 --- /dev/null +++ b/interface/ispconfig/interface/client/reseller_edit.php @@ -0,0 +1,222 @@ +auth->check_module_permissions('client'); + +if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another website. + if($client["limit_client"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_client"]) { + $app->error($app->tform->wordbook["limit_client_txt"]); + } + } + } + + parent::onShowNew(); + } + + + function onSubmit() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user' && $this->id == 0) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another website. + if($client["limit_client"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_client"]) { + $app->error($app->tform->wordbook["limit_client_txt"]); + } + } + } + + parent::onSubmit(); + } + + + function onShowEnd() { + + global $app; + + $sql = "SELECT template_id,template_name FROM client_template WHERE template_type = 'a'"; + $tpls = $app->db->queryAllRecords($sql); + $option = ''; + $tpl = array(); + foreach($tpls as $item){ + $option .= ''; + $tpl[$item['template_id']] = $item['template_name']; + } + $app->tpl->setVar('tpl_add_select',$option); + + $sql = "SELECT template_additional FROM client WHERE client_id = " . $this->id; + $result = $app->db->queryOneRecord($sql); + $tplAdd = explode("/", $result['template_additional']); + $text = ''; + foreach($tplAdd as $item){ + if (trim($item) != ''){ + if ($text != '') $text .= '
'; + $text .= $tpl[$item]; + } + } + + $app->tpl->setVar('template_additional_list', $text); + + parent::onShowEnd(); + + } + + /* + This function is called automatically right after + the data was successful inserted in the database. + */ + function onAfterInsert() { + global $app; + // Create the group for the reseller + $groupid = $app->db->datalogInsert('sys_group', "(name,description,client_id) VALUES ('".mysql_real_escape_string($this->dataRecord["username"])."','',".$this->id.")", 'groupid'); + $groups = $groupid; + + $username = $app->db->quote($this->dataRecord["username"]); + $password = $app->db->quote($this->dataRecord["password"]); + $modules = ISPC_INTERFACE_MODULES_ENABLED.',client'; + $startmodule = 'client'; + $usertheme = $app->db->quote($this->dataRecord["usertheme"]); + $type = 'user'; + $active = 1; + $language = $app->db->quote($this->dataRecord["language"]); + + // Create the controlpaneluser for the reseller + $sql = "INSERT INTO sys_user (username,passwort,modules,startmodule,app_theme,typ,active,language,groups,default_group,client_id) + VALUES ('$username',md5('$password'),'$modules','$startmodule','$usertheme','$type','$active','$language',$groups,$groupid,".$this->id.")"; + $app->db->query($sql); + + //* set the number of clients to 1 + $app->db->query("UPDATE client SET limit_client = 1 WHERE client_id = ".$this->id); + + /* If there is a client-template, process it */ + applyClientTemplates($this->id); + + parent::onAfterInsert(); + } + + + /* + This function is called automatically right after + the data was successful updated in the database. + */ + function onAfterUpdate() { + global $app; + + // username changed + if(isset($this->dataRecord['username']) && $this->dataRecord['username'] != '' && $this->oldDataRecord['username'] != $this->dataRecord['username']) { + $username = $app->db->quote($this->dataRecord["username"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET username = '$username' WHERE client_id = $client_id"; + $app->db->query($sql); + + $tmp = $app->db->queryOneRecord("SELECT * FROM sys_group WHERE client_id = $client_id"); + $app->db->datalogUpdate("sys_group", "name = '$username'", 'groupid', $tmp['groupid']); + unset($tmp); + } + + // password changed + if(isset($this->dataRecord["password"]) && $this->dataRecord["password"] != '') { + $password = $app->db->quote($this->dataRecord["password"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET passwort = md5('$password') WHERE client_id = $client_id"; + $app->db->query($sql); + } + + // language changed + if(isset($this->dataRecord['language']) && $this->dataRecord['language'] != '' && $this->oldDataRecord['language'] != $this->dataRecord['language']) { + $language = $app->db->quote($this->dataRecord["language"]); + $client_id = $this->id; + $sql = "UPDATE sys_user SET language = '$language' WHERE client_id = $client_id"; + $app->db->query($sql); + } + + // reseller status changed + if(isset($this->dataRecord["limit_client"]) && $this->dataRecord["limit_client"] != $this->oldDataRecord["limit_client"]) { + $modules = ISPC_INTERFACE_MODULES_ENABLED.',client'; + $modules = $app->db->quote($modules); + $client_id = $this->id; + $sql = "UPDATE sys_user SET modules = '$modules' WHERE client_id = $client_id"; + $app->db->query($sql); + } + /* + * If there is a client-template, process it */ + applyClientTemplates($this->id); + + parent::onAfterUpdate(); + } +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/reseller_list.php b/interface/ispconfig/interface/client/reseller_list.php new file mode 100644 index 000000000..49a8c8516 --- /dev/null +++ b/interface/ispconfig/interface/client/reseller_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('client'); + +if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.'); + +$app->uses('listform_actions'); + +$app->listform_actions->SQLOrderBy = 'ORDER BY company_name, contact_name, client_id'; +$app->listform_actions->SQLExtWhere = "(limit_client > 0 or limit_client = -1)"; +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/client/templates/client_del.htm b/interface/ispconfig/interface/client/templates/client_del.htm new file mode 100644 index 000000000..1167b30e3 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_del.htm @@ -0,0 +1,25 @@ +

+

+ +
+ +
+ +
+ :

+ + , + +
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/client_edit_address.htm b/interface/ispconfig/interface/client/templates/client_edit_address.htm new file mode 100644 index 000000000..6d2625028 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_edit_address.htm @@ -0,0 +1,101 @@ +

+

+ +
+ +
+
Address +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='password_strength_txt'}

+
+

 

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/client_edit_limits.htm b/interface/ispconfig/interface/client/templates/client_edit_limits.htm new file mode 100644 index 000000000..200629eb3 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_edit_limits.htm @@ -0,0 +1,190 @@ +

+

+ +
+ + +
+
{tmpl_var name="toolsarea_head_txt"} +
+ + +
+
+
+
+ +
+
Limits + +
+ + +
+
+ + +


{tmpl_var name='template_additional_list'}
+ +
+
+   +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+

{tmpl_var name='web_php_options_txt'}

+
+ {tmpl_var name='web_php_options'} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='ssh_chroot_txt'}

+
+ {tmpl_var name='ssh_chroot'} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/client_template_edit_limits.htm b/interface/ispconfig/interface/client/templates/client_template_edit_limits.htm new file mode 100644 index 000000000..390f1f5b0 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_template_edit_limits.htm @@ -0,0 +1,124 @@ +

+

+ +
+ +
+
Limits +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/client_template_edit_template.htm b/interface/ispconfig/interface/client/templates/client_template_edit_template.htm new file mode 100644 index 000000000..6c9d90534 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_template_edit_template.htm @@ -0,0 +1,28 @@ +

+

+ +
+ +
+
Template +
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/client_template_list.htm b/interface/ispconfig/interface/client/templates/client_template_list.htm new file mode 100644 index 000000000..5892a9614 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/client_template_list.htm @@ -0,0 +1,53 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="template_type"}{tmpl_var name="template_name"} + +
+
+
+ +
\ No newline at end of file diff --git a/interface/ispconfig/interface/client/templates/clients_list.htm b/interface/ispconfig/interface/client/templates/clients_list.htm new file mode 100644 index 000000000..f8447712d --- /dev/null +++ b/interface/ispconfig/interface/client/templates/clients_list.htm @@ -0,0 +1,63 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ + + +
diff --git a/interface/ispconfig/interface/client/templates/reseller_edit_address.htm b/interface/ispconfig/interface/client/templates/reseller_edit_address.htm new file mode 100644 index 000000000..798fdf98a --- /dev/null +++ b/interface/ispconfig/interface/client/templates/reseller_edit_address.htm @@ -0,0 +1,101 @@ +

+

+ +
+ +
+
Address +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='password_strength_txt'}

+
+

 

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/reseller_edit_limits.htm b/interface/ispconfig/interface/client/templates/reseller_edit_limits.htm new file mode 100644 index 000000000..8acaf4bd7 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/reseller_edit_limits.htm @@ -0,0 +1,179 @@ +

+

+ +
+ +
+
Limits + +
+ + +
+
+ + + {tmpl_var name='template_additional_list'} + +
+
+   +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+

{tmpl_var name='web_php_options_txt'}

+
+ {tmpl_var name='web_php_options'} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

{tmpl_var name='ssh_chroot_txt'}

+
+ {tmpl_var name='ssh_chroot'} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +  MB +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/client/templates/resellers_list.htm b/interface/ispconfig/interface/client/templates/resellers_list.htm new file mode 100644 index 000000000..fbe90a6f9 --- /dev/null +++ b/interface/ispconfig/interface/client/templates/resellers_list.htm @@ -0,0 +1,63 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ + + +
diff --git a/interface/ispconfig/interface/client/tools.inc.php b/interface/ispconfig/interface/client/tools.inc.php new file mode 100644 index 000000000..c9bfdead3 --- /dev/null +++ b/interface/ispconfig/interface/client/tools.inc.php @@ -0,0 +1,88 @@ +db->queryOneRecord($sql); + $masterTemplateId = $record['template_master']; + $additionalTemplateStr = $record['template_additional']; + + /* + * if the master-Template is custom there is NO changing + */ + if ($masterTemplateId > 0){ + $sql = "SELECT * FROM client_template WHERE template_id = " . intval($masterTemplateId); + $limits = $app->db->queryOneRecord($sql); + } else { + $limits = $page->dataRecord; + } + + /* + * Process the additional tempaltes here (add them to the limits + * if != -1) + */ + $addTpl = explode('/', $additionalTemplateStr); + foreach ($addTpl as $item){ + if (trim($item) != ''){ + $sql = "SELECT * FROM client_template WHERE template_id = " . intval($item); + $addLimits = $app->db->queryOneRecord($sql); + /* maybe the template is deleted in the meantime */ + if (is_array($addLimits)){ + foreach($addLimits as $k => $v){ + if ($limits[$k] > -1){ + if ($v == -1) { + $limits[$k] = -1; + } + else { + $limits[$k] += $v; + } + } + } + } + } + } + + /* + * Write all back to the database + */ + $update = ''; + foreach($limits as $k => $v){ + if (strpos($k, 'limit') !== false && !is_array($v)){ + if ($update != '') $update .= ', '; + $update .= '`' . $k . "`='" . $v . "'"; + } + } + $sql = 'UPDATE client SET ' . $update . " WHERE client_id = " . intval($clientId); + $app->db->query($sql); +} +?> diff --git a/interface/ispconfig/interface/content.php b/interface/ispconfig/interface/content.php new file mode 100644 index 000000000..bcc4525ac --- /dev/null +++ b/interface/ispconfig/interface/content.php @@ -0,0 +1,83 @@ +render(); + if($page->status == 'OK') { + echo $content; + } elseif($page->status == 'REDIRECT') { + $target_parts = explode(':',$page->target); + $module = $target_parts[0]; + $page = $target_parts[1]; + if(!preg_match("/^[a-z]{2,20}$/i", $module)) die('target module name contains unallowed chars.'); + if(!preg_match("/^[a-z]{2,20}$/i", $page)) die('target page name contains unallowed chars.'); + + if(is_file(ISPC_WEB_PATH."/$module/$page.php")) { + include_once(ISPC_WEB_PATH."/$module/$page.php"); + + $classname = $module.'_'.$page; + $page = new $classname(); + + $content = $page->render(); + if($page->status == 'OK') { + echo $content; + } + } + + } + +} elseif (is_array($_SESSION["s"]['user']) or is_array($_SESSION["s"]["module"])) { + // If the user is logged in, we try to load the default page of the module + die('- error -'); +} else { + die('Page does not exist.'); +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/form_edit.php b/interface/ispconfig/interface/designer/form_edit.php new file mode 100644 index 000000000..ad89ae350 --- /dev/null +++ b/interface/ispconfig/interface/designer/form_edit.php @@ -0,0 +1,152 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/form_edit.htm'); + +// Importing variables +$module_name = $_REQUEST["module_name"]; +$form_name = $_REQUEST["form_name"]; + +// Checking imported variables +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$form_name)) die("form_name contains invalid chars."); + +$id = $form_name; + +if(count($_POST) > 1) { + // Bestimme aktion + if($id != '') { + $action = 'UPDATE'; + } else { + $action = 'INSERT'; + } + + + if($error == '') { + + $filename = "../".$module_name."/form/".$form_name.".tform.php"; + $form_new = $_POST["form"]; + + if(@is_file($filename)) { + include_once($filename); + $tabs = $form["tabs"]; + unset($form["tabs"]); + $form_new["tabs"] = $tabs; + } + + $file_content = ""; + + die($file_content); + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + + if (!fwrite($handle, $file_content)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + // zu Liste springen + header("Location: form_list.php"); + exit; + + } else { + $app->tpl->setVar("error","Fehler:
".$error); + $app->tpl->setVar($_POST); + } +} + +if($id != '') { +// Datensatz besteht bereits + // bestehenden Datensatz anzeigen + if($error == '') { + // es liegt ein Fehler vor + include_once("../".$module_name."/form/".$form_name.".tform.php"); + //$tabs = $form["tabs"]; + unset($form["tabs"]); + $record = $form; + $record["form_name"] = $form_name; + $record["module_name"] = $module_name; + $record["auth_preset_userid"] = $form["auth_preset"]["userid"]; + $record["auth_preset_groupid"] = $form["auth_preset"]["groupid"]; + $record["auth_preset_perm_user"] = $form["auth_preset"]["perm_user"]; + $record["auth_preset_perm_group"] = $form["auth_preset"]["perm_group"]; + $record["auth_preset_perm_other"] = $form["auth_preset"]["perm_other"]; + } else { + // ein Fehler + $record = $_POST; + //$navi = $_POST["nav"]; + unset($_POST["tabs"]); + } + $record["readonly"] = 'style="background-color: #EEEEEE;" readonly'; +} else { +// neuer datensatz + if($error == '') { + // es liegt kein Fehler vor + // Pewsets + $record["template"] = "module.tpl.htm"; + } else { + // ein Fehler + $record = $_POST; + unset($_POST["tabs"]); + + } + $record["readonly"] = ''; +} + +$record["id"] = $form_name; + +$app->tpl->setVar($record); + +include_once("lib/lang/".$_SESSION["s"]["language"]."_form_edit.lng"); +$app->tpl->setVar($wb); + +// Defaultwerte setzen +$app->tpl_defaults(); + +// Template parsen +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/form_list.php b/interface/ispconfig/interface/designer/form_list.php new file mode 100644 index 000000000..c0d0a3d31 --- /dev/null +++ b/interface/ispconfig/interface/designer/form_list.php @@ -0,0 +1,89 @@ +auth->check_module_permissions('designer'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/form_list.htm'); + +function getinfo($file, $form_file, $bgcolor) { + $module_name = $file; + include(ISPC_WEB_PATH."/$file/form/$form_file"); + return array( 'name' => $form['name'], + 'title' => $form['title'], + 'description' => $form['description'], + 'module_name' => $module_name, + 'bgcolor' => $bgcolor + ); +} + +// lese Module aus +$bgcolor = '#FFFFFF'; +$modules_list = array(); +$handle = @opendir(ISPC_WEB_PATH); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH."/$file")) { + if(is_file(ISPC_WEB_PATH.'/'.$file.'/lib/module.conf.php') and $file != 'login') { + if(@is_dir(ISPC_WEB_PATH."/$file/form")) { + $handle2 = opendir(ISPC_WEB_PATH."/$file/form"); + while ($form_file = @readdir ($handle2)) { + if (substr($form_file,0,1) != ".") { + //echo ISPC_ROOT_PATH."/web/".$file."/form/$form_file
"; + //include_once(ISPC_ROOT_PATH."/web/".$file."/form/$form_file"); + // Farbwechsel + $bgcolor = ($bgcolor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; + $modules_list[] = getinfo($file, $form_file, $bgcolor); + + } + } + } + } + } + } +} + +$app->tpl->setLoop('records', $modules_list); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_form_list.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/form_show.php b/interface/ispconfig/interface/designer/form_show.php new file mode 100644 index 000000000..c90178b4f --- /dev/null +++ b/interface/ispconfig/interface/designer/form_show.php @@ -0,0 +1,119 @@ +auth->check_module_permissions('designer'); + +if($_SESSION["s"]["user"]["typ"] != "admin") die("Admin permissions required."); + +$app->uses('tpl'); + +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/form_show.htm'); + + +// TODO: Check ID for malicius chars +$module_name = $_REQUEST["module_name"]; +$form_name = $_REQUEST["form_name"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$form_name)) die("form_name contains invalid chars."); + +include_once("../".$module_name."/form/".$form_name.".tform.php"); +$tabs = $form["tabs"]; +unset($form["tabs"]); +$record = $form; +$record["form_name"] = $form_name; +$record["module_name"] = $module_name; + +// loading language file +$lng_file = "lib/lang/".$_SESSION["s"]["language"]."_form_show.lng"; +include($lng_file); +$app->tpl->setVar($wb); + +// baue Tabs navi +$content = ""; +$n1 = 0; +$n2 = 0; +if(is_array($tabs)) { +foreach($tabs as $tab_id => $tab) { + $content .= " + + + + + + "; + //$content .= "\r\n"; + foreach($tab["fields"] as $field_id => $field) { + //$content .= "\r\n"; + //$content .= "\r\n"; + //$content .= "\r\n"; + $content .= " + + + "; + $n2++; + } + $content .= " +
$tab[title] + + + + + +
Bereich:
Titel:
Ziel:       
Link:       
$field_id + + + + +
 
+ + "; + $n1++; +} +} + +$record["nav"] = $content; + + +$app->tpl->setVar($record); + + +$app->tpl->setLoop('records',$modules_list); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/index.php b/interface/ispconfig/interface/designer/index.php new file mode 100644 index 000000000..e69de29bb diff --git a/interface/ispconfig/interface/designer/lib/admin.conf.php b/interface/ispconfig/interface/designer/lib/admin.conf.php new file mode 100644 index 000000000..8dce5a573 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/admin.conf.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/bg.lng b/interface/ispconfig/interface/designer/lib/lang/bg.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/bg_form_edit.lng new file mode 100644 index 000000000..2138e0416 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/bg_form_list.lng new file mode 100644 index 000000000..4a053a3c5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/bg_form_show.lng new file mode 100644 index 000000000..78cf0edda --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/bg_module_edit.lng new file mode 100644 index 000000000..50f0309f7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_module_edit.lng @@ -0,0 +1,12 @@ +Description

Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
Moduletitle: Will be shown in the (upper) main navigation.
Template file: Template file of the module. Currently'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/bg_module_list.lng new file mode 100644 index 000000000..31209a075 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_edit.lng new file mode 100644 index 000000000..7698aac73 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_item_edit.lng new file mode 100644 index 000000000..9a928f5cb --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/bg_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/bg_module_show.lng new file mode 100644 index 000000000..3cbe96358 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/bg_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br.lng b/interface/ispconfig/interface/designer/lib/lang/br.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/br_form_edit.lng new file mode 100644 index 000000000..7d7534a4e --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/br_form_list.lng new file mode 100644 index 000000000..b16ce554b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/br_form_show.lng new file mode 100644 index 000000000..5b68a3165 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/br_module_edit.lng new file mode 100644 index 000000000..34471acd2 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_module_edit.lng @@ -0,0 +1,22 @@ +Descrição +

+Nome do Módulo: Nome do diretório do módulo. Somente números, letras e underscores são permitidos.
+Título do Módulo: Será exibido em caixa alta no menu de navegação.
+Arquivo de Gabarito: Arquivo de Gabarito do Módulo Disponível: modulo.tpl.htm e modulo_tree.tpl.htm. O padrão é modulo.tpl.htm.
+Frame de Navegação: Se modulo_tree.tpl.htm foi selecionado como arquivo de gabarito, insira aqui o caminho do script para o frame a esquerda.
+Página Padrão: Esta página será exibida quando o módulo for aberto.
+Tamanho da Aba: Tamanho das abas na navegação principal. Este campo fica em branco por padrão. Você pode informar valores absolutos em pixels (ex.: 20) ou valores relativos (ex.: 20%).
+Dica: Todos os caminhos são relativos ao diretório web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/br_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/br_module_list.lng new file mode 100644 index 000000000..822263a4a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/br_module_nav_edit.lng new file mode 100644 index 000000000..c5e3266a7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/br_module_nav_item_edit.lng new file mode 100644 index 000000000..5eafa775a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/br_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/br_module_show.lng new file mode 100644 index 000000000..1fb180071 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/br_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de.lng b/interface/ispconfig/interface/designer/lib/lang/de.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/de_form_edit.lng new file mode 100644 index 000000000..74bf458d9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/de_form_list.lng new file mode 100644 index 000000000..998a64f70 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/de_form_show.lng new file mode 100644 index 000000000..b19fd3445 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/de_module_edit.lng new file mode 100644 index 000000000..6eacd64b1 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_module_edit.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/de_module_list.lng new file mode 100644 index 000000000..604063020 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/de_module_nav_edit.lng new file mode 100644 index 000000000..d5142f03c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/de_module_nav_item_edit.lng new file mode 100644 index 000000000..8c0c33c1a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/de_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/de_module_show.lng new file mode 100644 index 000000000..f4b2ad11f --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/de_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/en.lng b/interface/ispconfig/interface/designer/lib/lang/en.lng new file mode 100644 index 000000000..15c5adc7f --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en.lng @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/en_form_edit.lng new file mode 100644 index 000000000..f55e0f4ca --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_form_edit.lng @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/en_form_list.lng new file mode 100644 index 000000000..21a76877d --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_form_list.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/en_form_show.lng new file mode 100644 index 000000000..54b14f6e1 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_form_show.lng @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/en_module_edit.lng new file mode 100644 index 000000000..285a363df --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_module_edit.lng @@ -0,0 +1,23 @@ +Description +

+Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
+Moduletitle: Will be shown in the (upper) main navigation.
+Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
+NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
+Default page: These page will be shown when the module is opened.
+Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
+Hint: All paths are relative to the directory "web". +'; + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/en_module_list.lng new file mode 100644 index 000000000..45260fd9a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_module_list.lng @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/en_module_nav_edit.lng new file mode 100644 index 000000000..3600238f7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_module_nav_edit.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/en_module_nav_item_edit.lng new file mode 100644 index 000000000..56eee32de --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/en_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/en_module_show.lng new file mode 100644 index 000000000..e76f5f332 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/en_module_show.lng @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/lib/lang/es.lng b/interface/ispconfig/interface/designer/lib/lang/es.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/es_form_edit.lng new file mode 100644 index 000000000..c5312559b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/es_form_list.lng new file mode 100644 index 000000000..3334d0b29 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/es_form_show.lng new file mode 100644 index 000000000..4cac14529 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/es_module_edit.lng new file mode 100644 index 000000000..c126365a5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_module_edit.lng @@ -0,0 +1,12 @@ +Descripción

Nombre del módulo: Nombre del directorio del módulo. Sólo se permiten números, carácteres y subrayados.
Título del módulo: Se mostrará en la barra de navegación principal.
Fichero de plantilla: Fichero de la plantilla del módulo. Disponibles actualmente: module.tpl.htm y module_tree.tpl.htm. Por defecto: module.tpl.htm.
Marco de navegación: Si el fichero de plantilla module_tree.tpl.htm está seleccionado, introduzca aquí la ruta al fichero del script del marco de la izquierda.
Página por defecto: Esta página se mostrará cuando el módulo se abra.
Ancho de pestaña: Ancho de las pestañas en la barra de navegación. El campo está vacío por defecto. Puede introducir valores absolutos en píxeles (p.ej. 20) o relativos (p.ej. 20%).
Pista: Todas las rutas son relativas al directorio.'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/es_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/es_module_list.lng new file mode 100644 index 000000000..2805a07bc --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/es_module_nav_edit.lng new file mode 100644 index 000000000..22688b6e1 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/es_module_nav_item_edit.lng new file mode 100644 index 000000000..ec39e5f89 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/es_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/es_module_show.lng new file mode 100644 index 000000000..1f1199de5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/es_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi.lng b/interface/ispconfig/interface/designer/lib/lang/fi.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fi_form_edit.lng new file mode 100644 index 000000000..c9a13038a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/fi_form_list.lng new file mode 100644 index 000000000..9052c8f0c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/fi_form_show.lng new file mode 100644 index 000000000..247a95be5 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fi_module_edit.lng new file mode 100644 index 000000000..8bb4a5c09 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_module_edit.lng @@ -0,0 +1,22 @@ +Kuvaus +

+Modulename: Ohjelmaosion kansion nimi. Vain numerot,kirjaimet ja alaviiva on sallittu.
+Moduletitle: Tulee näkymään ylemmässä päävalikossa.
+Template file: Ohjelmaosion mallitiedosto. Käytettävissä tällä hetkellä: module.tpl.htm ja module_tree.tpl.htm. Oletus on module.tpl.htm.
+NaviFrame: Jos module_tree.tpl.htm valittiin mallitiedostoksi, kirjoita tähän vasemman kehyksen skriptitiedoston polku.
+Default page: Tämä sivu näytetetään kun ohjelmaosio avataan.
+Tab width: Päälikon painikkeiden leveys. Kenttä on oletuksenä tyhjä. Voit antaa arvon pikseleinää tai prosentteina. (esim. 20 tai 20%).
+Vihje: Kaikki polut ovat suhteellisia web-kansioon, eivät absoluuttisia. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/fi_module_list.lng new file mode 100644 index 000000000..f07c9a377 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_edit.lng new file mode 100644 index 000000000..b7c03eafb --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_item_edit.lng new file mode 100644 index 000000000..5f32d5848 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fi_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/fi_module_show.lng new file mode 100644 index 000000000..066d92f58 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fi_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr.lng b/interface/ispconfig/interface/designer/lib/lang/fr.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fr_form_edit.lng new file mode 100644 index 000000000..4ef20b0b2 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/fr_form_list.lng new file mode 100644 index 000000000..b20b84727 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/fr_form_show.lng new file mode 100644 index 000000000..9c9580ce1 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fr_module_edit.lng new file mode 100644 index 000000000..c2eab9481 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_module_edit.lng @@ -0,0 +1,14 @@ +Description
Nom du Module: Nom du rpertoire du module. Seulement nombres, lettres et underscore sont autoriss.Titre du Module: Seras affich dans le menu de navigation (suprieur).Fichier Template: Fichier Template du module. Disponible actuellement: module.tpl.htm et module_tree.tpl.htm. Par dfaut module.tpl.htm.Frame de Navigation: Si module_tree.tpl.htm est choisi comme fichier template, entrer ici le chemin vers le script de la frame de gauche.Page par Dfaut: Cette page seras affiche quand le module seras ouvert.Largeur tableau: Largeur des tableau dans la frame principale. Le champ est vide par defaut. Vous pouvez entrer une valeur absolue en pixel (e.g 20) ou relative (e.g 20%).Note: Tous les paths sont relatifs par rapport au dossier web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/fr_module_list.lng new file mode 100644 index 000000000..5389ac945 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_edit.lng new file mode 100644 index 000000000..423588c93 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_item_edit.lng new file mode 100644 index 000000000..ada5f4ee8 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/fr_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/fr_module_show.lng new file mode 100644 index 000000000..da09511d7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/fr_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu.lng b/interface/ispconfig/interface/designer/lib/lang/hu.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/hu_form_edit.lng new file mode 100644 index 000000000..54fe173ec --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/hu_form_list.lng new file mode 100644 index 000000000..47432257f --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/hu_form_show.lng new file mode 100644 index 000000000..12be609a1 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/hu_module_edit.lng new file mode 100644 index 000000000..592ccd76b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_module_edit.lng @@ -0,0 +1,22 @@ +Description +

+Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
+Moduletitle: Will be shown in the (upper) main navigation.
+Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
+NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
+Default page: These page will be shown when the module is opened.
+Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
+Hint: All paths are relative to the directory web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/hu_module_list.lng new file mode 100644 index 000000000..bc9ebed58 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_edit.lng new file mode 100644 index 000000000..fa5f15aa9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_item_edit.lng new file mode 100644 index 000000000..23f7d1592 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/hu_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/hu_module_show.lng new file mode 100644 index 000000000..357fca149 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/hu_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it.lng b/interface/ispconfig/interface/designer/lib/lang/it.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/it_form_edit.lng new file mode 100644 index 000000000..54fe173ec --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/it_form_list.lng new file mode 100644 index 000000000..47432257f --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/it_form_show.lng new file mode 100644 index 000000000..12be609a1 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/it_module_edit.lng new file mode 100644 index 000000000..592ccd76b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_module_edit.lng @@ -0,0 +1,22 @@ +Description +

+Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
+Moduletitle: Will be shown in the (upper) main navigation.
+Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
+NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
+Default page: These page will be shown when the module is opened.
+Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
+Hint: All paths are relative to the directory web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/it_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/it_module_list.lng new file mode 100644 index 000000000..bc9ebed58 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/it_module_nav_edit.lng new file mode 100644 index 000000000..fa5f15aa9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/it_module_nav_item_edit.lng new file mode 100644 index 000000000..23f7d1592 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/it_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/it_module_show.lng new file mode 100644 index 000000000..e295047b0 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/it_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja.lng b/interface/ispconfig/interface/designer/lib/lang/ja.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ja_form_edit.lng new file mode 100644 index 000000000..130ca0788 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/ja_form_list.lng new file mode 100644 index 000000000..47432257f --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/ja_form_show.lng new file mode 100644 index 000000000..37017fa4a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ja_module_edit.lng new file mode 100644 index 000000000..592ccd76b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_module_edit.lng @@ -0,0 +1,22 @@ +Description +

+Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
+Moduletitle: Will be shown in the (upper) main navigation.
+Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
+NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
+Default page: These page will be shown when the module is opened.
+Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
+Hint: All paths are relative to the directory web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/ja_module_list.lng new file mode 100644 index 000000000..bc9ebed58 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_edit.lng new file mode 100644 index 000000000..fa5f15aa9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_item_edit.lng new file mode 100644 index 000000000..23f7d1592 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ja_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/ja_module_show.lng new file mode 100644 index 000000000..6fe8d45be --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ja_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl.lng b/interface/ispconfig/interface/designer/lib/lang/nl.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/nl_form_edit.lng new file mode 100644 index 000000000..bdc764237 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/nl_form_list.lng new file mode 100644 index 000000000..2da972504 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/nl_form_show.lng new file mode 100644 index 000000000..1c82ea156 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/nl_module_edit.lng new file mode 100644 index 000000000..f4234dc28 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_module_edit.lng @@ -0,0 +1,22 @@ +Description +

+Modulename: Naam van de module directory. Alleen cijfers, letters en underscore zijn toegestaan.
+Moduletitle: Zal worden getoond in de hoofdnavigatie (bovenaan).
+Template file: Template bestand van de module. Momenteel beschikbaar: module.tpl.htm en module_tree.tpl.htm. Standaard is de module.tpl.htm.
+NaviFrame: Als de module_tree.tpl.htm geselecteerd is als template bestand, geef het pad op dat verwijst naar het scriptbestand voor het linker frame.
+Default page: Deze pagina wordt getoont wanneer de module is geopend.
+Tab width: Tabbreedte in de hoofdnavigatie. Het veld is standaard leeg. U kunt absolute waarden opgeven in pixels (bijv. 20) of relatieve (bijv. 20%).
+Hint: Alle paden zijn relatief aan de directorie web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/nl_module_list.lng new file mode 100644 index 000000000..19ea5e944 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_edit.lng new file mode 100644 index 000000000..504b7f754 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_item_edit.lng new file mode 100644 index 000000000..4c2bddd61 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/nl_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/nl_module_show.lng new file mode 100644 index 000000000..8f605e40f --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/nl_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl.lng b/interface/ispconfig/interface/designer/lib/lang/pl.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pl_form_edit.lng new file mode 100644 index 000000000..ee4f4c410 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/pl_form_list.lng new file mode 100644 index 000000000..ac8572277 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/pl_form_show.lng new file mode 100644 index 000000000..db62af16b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pl_module_edit.lng new file mode 100644 index 000000000..691e55052 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_module_edit.lng @@ -0,0 +1,22 @@ +Opis +

+Nazwa modułu: Nazwa katalogu z modułem. Tylko liczby, litery (bez polskich) i podkreślenie są dozwolone.
+Tytuł modułu: Będzie wyświetlaby w głównym menu nawigacyjnym.
+Plik szablonu: Plik szablonu modułu. Aktualnie dostępne: module.tpl.htm oraz module_tree.tpl.htm. Domyślnie jest module.tpl.htm.
+Ramka nawigacyjna: Jeśli module_tree.tpl.htm wybrano jako plik szablonu, wpisz tutaj ścieżkę do pliku ze skryptem dla lewej ramki.
+Strona domyślna: Ta strona będzie otwierana na początku podczas otwarcia modułu.
+Szerokość zakładki: Szerokość zakładek w głownym menu nawigacyjnym. To pole jest domyślnie puste. Możesz podać wartość w pikselach (np.: 20) lub procentach (np.: 20%).
+Podpowiedź: Wszystkie ścieżki są względne według strony www.. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/pl_module_list.lng new file mode 100644 index 000000000..308d1c688 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_edit.lng new file mode 100644 index 000000000..5ace229a9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_item_edit.lng new file mode 100644 index 000000000..779b3b4b3 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pl_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/pl_module_show.lng new file mode 100644 index 000000000..9b98c4948 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pl_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt.lng b/interface/ispconfig/interface/designer/lib/lang/pt.lng new file mode 100644 index 000000000..29f4a51ef --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt.lng @@ -0,0 +1,3 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pt_form_edit.lng new file mode 100644 index 000000000..75869ca5c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_form_edit.lng @@ -0,0 +1,25 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/pt_form_list.lng new file mode 100644 index 000000000..01d0f28e9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_form_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/pt_form_show.lng new file mode 100644 index 000000000..76e748790 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_form_show.lng @@ -0,0 +1,19 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pt_module_edit.lng new file mode 100644 index 000000000..b04975d26 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_module_edit.lng @@ -0,0 +1,23 @@ +Descrição +

+Nome do Módulo: Nome da pasta do módulo. Apenas números, letras e underscores são permitidos.
+Título do Módulo: Será exibido em caixa alta no menu de navegação.
+Ficheiro de Template: Ficheiros de Template do Módulo Disponível: modulo.tpl.htm e modulo_tree.tpl.htm. O padrão é modulo.tpl.htm.
+Frame de Navegação: Se modulo_tree.tpl.htm foi seleccionado como ficheiro de template, insira aqui a pasta do script para o frame a esquerda.
+Página Padrão: Esta página será exibida quando o módulo for aberto.
+Tamanho da Aba: Tamanho das abas na navegação principal. Este campo fica em branco por padrão. Pode fornecer valores absolutos em pixels (ex.: 20) ou valores relativos (ex.: 20%).
+Dica: Todos as pastas são relativas à pasta web. +'; +?> + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/pt_module_list.lng new file mode 100644 index 000000000..8b8f24775 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_module_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_edit.lng new file mode 100644 index 000000000..3a9823598 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_edit.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_item_edit.lng new file mode 100644 index 000000000..4cb7df1af --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_module_nav_item_edit.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/pt_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/pt_module_show.lng new file mode 100644 index 000000000..606181de6 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/pt_module_show.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro.lng b/interface/ispconfig/interface/designer/lib/lang/ro.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ro_form_edit.lng new file mode 100644 index 000000000..a99b975f0 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/ro_form_list.lng new file mode 100644 index 000000000..49b9d5eaf --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/ro_form_show.lng new file mode 100644 index 000000000..9cc5e71d9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ro_module_edit.lng new file mode 100644 index 000000000..327550f20 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_module_edit.lng @@ -0,0 +1,12 @@ +Description

Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
Moduletitle: Will be shown in the (upper) main navigation.
Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
Default page: These page will be shown when the module is opened.
Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
Hint: All paths are relative to the directory '; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/ro_module_list.lng new file mode 100644 index 000000000..c53b556a4 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_edit.lng new file mode 100644 index 000000000..ee6bf5426 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_item_edit.lng new file mode 100644 index 000000000..9b7d60df9 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ro_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/ro_module_show.lng new file mode 100644 index 000000000..2fb748c3d --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ro_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru.lng b/interface/ispconfig/interface/designer/lib/lang/ru.lng new file mode 100644 index 000000000..29f4a51ef --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru.lng @@ -0,0 +1,3 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ru_form_edit.lng new file mode 100644 index 000000000..f1f67688b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_form_edit.lng @@ -0,0 +1,25 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/ru_form_list.lng new file mode 100644 index 000000000..d29fdbe86 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_form_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/ru_form_show.lng new file mode 100644 index 000000000..204f86635 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_form_show.lng @@ -0,0 +1,19 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ru_module_edit.lng new file mode 100644 index 000000000..0b6078410 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_module_edit.lng @@ -0,0 +1,23 @@ +ОпиÑание +

+Ð˜Ð¼Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ: Ð˜Ð¼Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ð¸ модулÑ. ДопуÑтимо иÑпользовать латинÑкие Ñимволы, чиÑла и подчеркивание.
+Заголовок модулÑ: Будет отображатьÑÑ Ð²Ð²ÐµÑ€Ñ…Ñƒ радом Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸ÐµÐ¹.
+Файл шаблона: Файл шаблона Ð´Ð»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ. Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð´Ð¾Ñтупны: module.tpl.htm и module_tree.tpl.htm. По-умолчанию Ñтоит module.tpl.htm.
+Ðавигационный фрейм: ЕÑли module_tree.tpl.htm выбран как шаблон, введите здеÑÑŒ путь до Ñкрипта Ð´Ð»Ñ Ð»ÐµÐ²Ð¾Ð³Ð¾ фрейма.
+Страница по-умолчанию: Эта Ñтраница будет показана, когда открываетÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒ.
+Ширина таба: Ширина таба в главной навигации. По-умолчанию поле пуÑтое. Ð’Ñ‹ можете ввеÑти значение в пикÑелÑÑ… или в процентах.
+ПодÑказка: Ð’Ñе пути в директории web отноÑительные. +'; +?> + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/ru_module_list.lng new file mode 100644 index 000000000..e305b4014 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_module_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_edit.lng new file mode 100644 index 000000000..ad02af8e7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_edit.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_item_edit.lng new file mode 100644 index 000000000..f42aafdb8 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_module_nav_item_edit.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/ru_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/ru_module_show.lng new file mode 100644 index 000000000..ddb1a5f84 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/ru_module_show.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/designer/lib/lang/se.lng b/interface/ispconfig/interface/designer/lib/lang/se.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/se_form_edit.lng new file mode 100644 index 000000000..d047ad393 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/se_form_list.lng new file mode 100644 index 000000000..8e9268e4a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/se_form_show.lng new file mode 100644 index 000000000..ebd3dd9cf --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/se_module_edit.lng new file mode 100644 index 000000000..ee8361d13 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_module_edit.lng @@ -0,0 +1,22 @@ +Description +

+Modulename: Namn på modul mappen. Endast siffror, bokstäver och understreck är tillåtna.
+Moduletitle: Kommer att visas i (övre) huvud navigerigsramen.
+Template file: Mall fil för modulen. Just nu finns: module.tpl.htm och module_tree.tpl.htm. Standard är module.tpl.htm.
+NaviFrame: Om module module_tree.tpl.htm väljs som mall file, skriv här sökvägen till skriptfilen för den vänstra ramen.
+Default page: Dessa sidor kommer att visas när modulen öppnas.
+Tab width: Bredd på Flikarna i huvud navigerings ramen. Detta fält är tomt som standard. Du kan skriva in ett absolutvärde i pixlar (ex. 20) eller relativt värde (ex. 20%).
+Hint: Alla sökvägar är relativa till mappen web. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/se_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/se_module_list.lng new file mode 100644 index 000000000..0fe0187b7 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/se_module_nav_edit.lng new file mode 100644 index 000000000..17e1563ef --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/se_module_nav_item_edit.lng new file mode 100644 index 000000000..3bbbfbd1a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/se_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/se_module_show.lng new file mode 100644 index 000000000..c58df7ac4 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/se_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk.lng b/interface/ispconfig/interface/designer/lib/lang/sk.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/sk_form_edit.lng new file mode 100644 index 000000000..3c72e8819 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/sk_form_list.lng new file mode 100644 index 000000000..0e0c2cb27 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/sk_form_show.lng new file mode 100644 index 000000000..042e10600 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/sk_module_edit.lng new file mode 100644 index 000000000..320bd1429 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_module_edit.lng @@ -0,0 +1,12 @@ + Popis

Modulename: Názov modulu adresár. Len ?ísla, znaky a podtržítko povolené.
Moduletitle: sa objaví v (hornej) navigáciu.
Šablóna súboru: Šablóna súboru modulu. V sú?asnej dobe sú k dispozícii'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/sk_module_list.lng new file mode 100644 index 000000000..4d9cd1e2c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_edit.lng new file mode 100644 index 000000000..69d4d161c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_item_edit.lng new file mode 100644 index 000000000..23f7d1592 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/sk_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/sk_module_show.lng new file mode 100644 index 000000000..3d62509ea --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/sk_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr.lng b/interface/ispconfig/interface/designer/lib/lang/tr.lng new file mode 100644 index 000000000..acb6c3546 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr.lng @@ -0,0 +1,2 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_form_edit.lng b/interface/ispconfig/interface/designer/lib/lang/tr_form_edit.lng new file mode 100644 index 000000000..8288ce84b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_form_edit.lng @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_form_list.lng b/interface/ispconfig/interface/designer/lib/lang/tr_form_list.lng new file mode 100644 index 000000000..54aa1f453 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_form_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_form_show.lng b/interface/ispconfig/interface/designer/lib/lang/tr_form_show.lng new file mode 100644 index 000000000..8efa1df5a --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_form_show.lng @@ -0,0 +1,18 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_module_edit.lng b/interface/ispconfig/interface/designer/lib/lang/tr_module_edit.lng new file mode 100644 index 000000000..92bf93d2c --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_module_edit.lng @@ -0,0 +1,22 @@ +Açıklama +

+Modül adı: Modül klasörünün adı. Sadece sayı, rakam ve alttan çizgi kullanabilirsiniz.
+Modül başlığı: Üst ana menüde gösterilecek olan isim.
+Şablon dosyası: Şablon dosyası veya modülü. Şu anda geçerli olan dosyalar: module.tpl.htm ve module_tree.tpl.htm. Varsayılan dosya: module.tpl.htm.
+NaviFrame: Eğer module_tree.tpl.htm dosyası şablon dosyası olarak seçilirse, buraya sol frame için betik dosyası yolu girebilirsiniz.
+Varsayılan sayfa: Modül açıldığı zaman görünecek sayfa.
+Sekme Genişliği: Temel navigasyonun genişliği. Bu alan varsayılan olarak boştur. Siz bir piksel değeri(20 gibi) veya bir oran(20%) değeri girebilirsiniz.
+İşaret: Tüm yollar web klasörüyle ilişkilidir.. +'; +?> diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_module_list.lng b/interface/ispconfig/interface/designer/lib/lang/tr_module_list.lng new file mode 100644 index 000000000..08c57875f --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_module_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_edit.lng b/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_edit.lng new file mode 100644 index 000000000..fd10993d6 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_edit.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_item_edit.lng b/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_item_edit.lng new file mode 100644 index 000000000..06fe57e84 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_module_nav_item_edit.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/designer/lib/lang/tr_module_show.lng b/interface/ispconfig/interface/designer/lib/lang/tr_module_show.lng new file mode 100644 index 000000000..a40c0743b --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/lang/tr_module_show.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/designer/lib/module.conf.php b/interface/ispconfig/interface/designer/lib/module.conf.php new file mode 100644 index 000000000..16e13c5e8 --- /dev/null +++ b/interface/ispconfig/interface/designer/lib/module.conf.php @@ -0,0 +1,95 @@ + 'designer', + 'title' => 'BE Designer', + 'template' => 'module.tpl.htm', + 'navframe_page' => '', + 'startpage' => 'designer/module_list.php', + 'tab_width' => '', + 'nav' => + array ( + 0 => + array ( + 'title' => 'Modules', + 'open' => '1', + 'items' => + array ( + 0 => + array ( + 'title' => 'Add', + 'target' => 'content', + 'link' => 'designer/module_edit.php', + ), + 1 => + array ( + 'title' => 'Edit', + 'target' => 'content', + 'link' => 'designer/module_list.php', + ), + ), + ), + /* + 1 => + array ( + 'title' => 'Formulare', + 'open' => '1', + 'items' => + array ( + 2 => + array ( + 'title' => 'Add', + 'target' => 'content', + 'link' => 'designer/form_edit.php', + ), + 3 => + array ( + 'title' => 'Edit', + 'target' => 'content', + 'link' => 'designer/form_list.php', + ), + ), + ), + 2 => + array ( + 'title' => 'Lists', + 'open' => '1', + 'items' => + array ( + 4 => + array ( + 'title' => 'Add', + 'target' => 'content', + 'link' => 'designer/list_edit.php', + ), + 5 => + array ( + 'title' => 'Edit', + 'target' => 'content', + 'link' => 'designer/list_list.php', + ), + ), + ), + 3 => + array ( + 'title' => 'Languages', + 'open' => '1', + 'items' => + array ( + 6 => + array ( + 'title' => 'Add', + 'target' => 'content', + 'link' => 'designer/lang_edit.php', + ), + 7 => + array ( + 'title' => 'Edit', + 'target' => 'content', + 'link' => 'designer/lang_list.php', + ), + ), + ), + */ + ), +) +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_edit.php b/interface/ispconfig/interface/designer/module_edit.php new file mode 100644 index 000000000..9d0a556f4 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_edit.php @@ -0,0 +1,183 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_edit.htm'); + +// ID importieren +$id = $_REQUEST["id"]; +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$id)) die("id contains invalid chars."); + +if(count($_POST) > 1) { + // Bestimme aktion + if($id != '') { + $action = 'UPDATE'; + } else { + $action = 'INSERT'; + } + + + if($error == '') { + + $id = $_POST["module"]["name"]; + if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$id)) die("id contains invalid chars."); + + $filename = "../".$id."/lib/module.conf.php"; + $module_new = $_POST["module"]; + + if(@is_file($filename)) { + include_once($filename); + $navi = $module["nav"]; + unset($module); + $module_new["nav"] = $navi; + } + + $m = ""; + + // creating the module directories + if(!@is_dir("../".$id)) mkdir("../".$id) or die("Cannot make directory: ../".$id); + if(!@is_dir("../".$id."/lib")) mkdir("../".$id."/lib") or die("Cannot make directory: ../".$id."/lib"); + if(!@is_dir("../".$id."/lib/lang")) mkdir("../".$id."/lib/lang") or die("Cannot make directory: ../".$id."/lib/lang"); + if(!@is_dir("../".$id."/form")) mkdir("../".$id."/form") or die("Cannot make directory: ../".$id."/form"); + if(!@is_dir("../".$id."/list")) mkdir("../".$id."/list") or die("Cannot make directory: ../".$id."/list"); + if(!@is_dir("../".$id."/templates")) mkdir("../".$id."/templates") or die("Cannot make directory: ../".$id."/templates"); + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + // writing admin conf + $admin_conf_filename = "../".$id."/lib/admin.conf.php"; + if(!is_file($admin_conf_filename)) { + if (!$handle = fopen($admin_conf_filename, 'w')) { + print "Cannot open file ($admin_conf_filename)"; + exit; + } + + if (!fwrite($handle, "")) { + print "Cannot write to file ($admin_conf_filename)"; + exit; + } + + fclose($handle); + } + + // zu Liste springen + header("Location: module_list.php"); + exit; + + } else { + $app->tpl->setVar("error","Fehler:
".$error); + $app->tpl->setVar($_POST); + } +} + +if($id != '') { +// Datensatz besteht bereits + // bestehenden Datensatz anzeigen + if($error == '') { + // es liegt ein Fehler vor + include_once("../".$id."/lib/module.conf.php"); + //$navi = $module["nav"]; + unset($module["nav"]); + $record = $module; + } else { + // ein Fehler + $record = $_POST; + //$navi = $_POST["nav"]; + unset($_POST["nav"]); + } + $record["readonly"] = 'style="background-color: #EEEEEE;" readonly'; +} else { +// neuer datensatz + if($error == '') { + // es liegt ein Fehler vor + $record["template"] = "module.tpl.htm"; + } else { + // ein Fehler + $record = $_POST; + //$navi = $_POST["nav"]; + unset($_POST["nav"]); + + } + $record["readonly"] = ''; +} + +$record["id"] = $id; + +/* +// baue Modul navi +$content = ""; +$n1 = 0; +$n2 = 0; +foreach($navi as $section) { + $content .= "Bereich:\r\n"; + foreach($section["items"] as $item) { + $content .= "Titel:\r\n"; + $content .= "Ziel:       \r\n"; + $content .= "Link:       \r\n"; + $n2++; + } + $n1++; +} + +$record["nav"] = $content; +*/ + +$app->tpl->setVar($record); + +include_once("lib/lang/".$_SESSION["s"]["language"]."_module_edit.lng"); +$app->tpl->setVar($wb); + +// Defaultwerte setzen +$app->tpl_defaults(); + +// Template parsen +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_list.php b/interface/ispconfig/interface/designer/module_list.php new file mode 100644 index 000000000..4806f079d --- /dev/null +++ b/interface/ispconfig/interface/designer/module_list.php @@ -0,0 +1,69 @@ +auth->check_module_permissions('designer'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl','templates/module_list.htm'); + +//* Pick out modules +$bgcolor = '#FFFFFF'; +$modules_list = array(); +$handle = @opendir(ISPC_WEB_PATH); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH."/$file")) { + if(is_file(ISPC_WEB_PATH."/$file/lib/module.conf.php") and $file != 'login') { + include_once(ISPC_WEB_PATH."/$file/lib/module.conf.php"); + $modules_list[] = array( 'module' => $module['name'], + 'title' => $module['title'], + 'bgcolor' => ($bgcolor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF' + ); + } + } + } +} + +$app->tpl->setLoop('records', $modules_list); + +//* loading language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_module_list.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_del.php b/interface/ispconfig/interface/designer/module_nav_del.php new file mode 100644 index 000000000..dfbe761bb --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_del.php @@ -0,0 +1,80 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_nav_edit.htm'); + +// ID importieren +$module_name = $_REQUEST["module_name"]; +$nav_id = $_REQUEST["nav_id"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$nav_id)) die("nav_id contains invalid chars."); + +if(empty($module_name)) die("module is empty."); + +if($nav_id != '') { + + $filename = "../".$module_name."/lib/module.conf.php"; + + if(!@is_file($filename)) die("File not found: $filename"); + include_once($filename); + + unset($module["nav"][$nav_id]); + + $m = ""; + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + + // zu Liste springen + header("Location: module_show.php?id=$module_name"); + exit; +} +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_edit.php b/interface/ispconfig/interface/designer/module_nav_edit.php new file mode 100644 index 000000000..d97cd5e4b --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_edit.php @@ -0,0 +1,146 @@ +auth->check_module_permissions('designer'); + +//* Load template +$app->uses('tpl'); +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/module_nav_edit.htm'); + +// TODO: Check module and nav_id for malicius chars, nav_id can be empty or any number, even 0 +$module_name = $_REQUEST['module_name']; +$nav_id = $_REQUEST['nav_id']; + +//** Sanity checks of module +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/', $module_name)){ + die('module_name contains invalid chars.'); +} +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/', $nav_id)){ + die('nav_id contains invalid chars.'); +} +if(empty($module_name)){ + die('module is empty.'); +} + +if(count($_POST) > 0) { + //* Determine Action + $action = ($nav_id != '') ? 'UPDATE' : 'INSERT'; + $error = ''; + + // TODO: Check variables + + if($error == '') { + + $filename = '../'.$module_name.'/lib/module.conf.php'; + + if(!@is_file($filename)){ + die("File not found: $filename"); + } + include_once($filename); + + $items = ($action == 'UPDATE') ? $module['nav'][$nav_id]['items'] : array(); + + $tmp = array('title' => $_POST['nav']['title'], + 'open' => 1, + 'items' => $items); + + if($action == 'UPDATE') { + $module['nav'][$nav_id] = $tmp; + } else { + $module['nav'][] = $tmp; + } + + $m = ""; + + //* writing module.conf + if (!$handle = fopen($filename, 'w')) { + die("Cannot open file ($filename)"); + } + + if (!fwrite($handle, $m)) { + die("Cannot write to file ($filename)"); + } + + fclose($handle); + + + //* Jump to list + header('Location: module_show.php?id='.urlencode($module_name)); + exit; + + } else { + $app->tpl->setVar('error', 'Fehler:
'.$error); + $app->tpl->setVar($_POST); + } +} + +if($nav_id != '') { + //* Data record exists + if($error == '') { + include_once('../'.$module_name.'/lib/module.conf.php'); + $record = $module['nav'][$nav_id]; + } else { + //* error + $record = $_POST; + } + //$record["readonly"] = 'style="background-color: #EEEEEE;" readonly'; +} else { + //* New data record + if($error == '') { + //* es liegt kein Fehler vor + } else { + //* error + $record = $_POST; + + } + //$record["readonly"] = ''; +} + +$record['nav_id'] = $nav_id; +$record['module_name'] = $module_name; + +$app->tpl->setVar($record); + +include_once('lib/lang/'.$_SESSION['s']['language'].'_module_nav_edit.lng'); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_flip.php b/interface/ispconfig/interface/designer/module_nav_flip.php new file mode 100644 index 000000000..f20dd6306 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_flip.php @@ -0,0 +1,91 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_nav_edit.htm'); + +// ID importieren +$module_name = $_REQUEST["module_name"]; +$nav_id = $_REQUEST["nav_id"]; +$dir = $_REQUEST["dir"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$nav_id)) die("nav_id contains invalid chars."); + +if(empty($module_name)) die("module is empty."); + +if($nav_id != '') { + + $filename = "../".$module_name."/lib/module.conf.php"; + + if(!@is_file($filename)) die("File not found: $filename"); + include_once($filename); + + if($dir == 'up' and $nav_id > 0) { + $tmp = $module["nav"][$nav_id - 1]; + $module["nav"][$nav_id - 1] = $module["nav"][$nav_id]; + $module["nav"][$nav_id] = $tmp; + } + + if($dir == 'down' and $nav_id < count($module["nav"]) -1) { + $tmp = $module["nav"][$nav_id + 1]; + $module["nav"][$nav_id + 1] = $module["nav"][$nav_id]; + $module["nav"][$nav_id] = $tmp; + } + + $m = ""; + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + + // zu Liste springen + echo "HEADER_REDIRECT:designer/module_show.php?id=$module_name"; + exit; +} +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_item_del.php b/interface/ispconfig/interface/designer/module_nav_item_del.php new file mode 100644 index 000000000..d941f5bb8 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_item_del.php @@ -0,0 +1,82 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_nav_edit.htm'); + +// ID importieren +$module_name = $_REQUEST["module_name"]; +$nav_id = $_REQUEST["nav_id"]; +$item_id = $_REQUEST["item_id"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$nav_id)) die("nav_id contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$item_id)) die("item_id contains invalid chars."); + +if(empty($module_name)) die("module is empty."); + +if($nav_id != '') { + + $filename = "../".$module_name."/lib/module.conf.php"; + + if(!@is_file($filename)) die("File not found: $filename"); + include_once($filename); + + unset($module["nav"][$nav_id]["items"][$item_id]); + + $m = ""; + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + + // zu Liste springen + header("Location: module_show.php?id=$module_name"); + exit; +} +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_item_edit.php b/interface/ispconfig/interface/designer/module_nav_item_edit.php new file mode 100644 index 000000000..d270d99b4 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_item_edit.php @@ -0,0 +1,150 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_nav_item_edit.htm'); + +// ID importieren +$module_name = $_REQUEST["module_name"]; +$nav_id = $_REQUEST["nav_id"]; +$item_id = $_REQUEST["item_id"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$nav_id)) die("nav_id contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$item_id)) die("item_id contains invalid chars."); + +if(empty($module_name)) die("module is empty."); + +if(count($_POST) > 0) { + // Bestimme aktion + if($item_id != '') { + $action = 'UPDATE'; + } else { + $action = 'INSERT'; + } + + $error = ''; + + // TODO: Check variables + + + if($error == '') { + + $filename = "../".$module_name."/lib/module.conf.php"; + + if(!@is_file($filename)) die("File not found: $filename"); + include_once($filename); + + $tmp = array('title' =>$_POST["title"], + 'target' => $_POST["target"], + 'link' => $_POST["link"]); + + if($action == 'UPDATE') { + $module["nav"][$nav_id]["items"][$item_id] = $tmp; + } else { + $module["nav"][$nav_id]["items"][] = $tmp; + } + + $m = ""; + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + + // zu Liste springen + header("Location: module_show.php?id=$module_name"); + exit; + + } else { + $app->tpl->setVar("error","Fehler:
".$error); + $app->tpl->setVar($_POST); + } +} + +if($item_id != '') { +// Datensatz besteht bereits + // bestehenden Datensatz anzeigen + if($error == '') { + // es liegt ein Fehler vor + include_once("../".$module_name."/lib/module.conf.php"); + $record = $module["nav"][$nav_id]["items"][$item_id]; + } else { + // ein Fehler + $record = $_POST; + } + //$record["readonly"] = 'style="background-color: #EEEEEE;" readonly'; +} else { +// neuer datensatz + if($error == '') { + // es liegt kein Fehler vor + $record["target"] = "content"; + } else { + // ein Fehler + $record = $_POST; + + } + //$record["readonly"] = ''; +} + +$record["item_id"] = $item_id; +$record["nav_id"] = $nav_id; +$record["module_name"] = $module_name; + +$app->tpl->setVar($record); + +include_once("lib/lang/".$_SESSION["s"]["language"]."_module_nav_item_edit.lng"); +$app->tpl->setVar($wb); + +// Defaultwerte setzen +$app->tpl_defaults(); + +// Template parsen +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_nav_item_flip.php b/interface/ispconfig/interface/designer/module_nav_item_flip.php new file mode 100644 index 000000000..21bc68cee --- /dev/null +++ b/interface/ispconfig/interface/designer/module_nav_item_flip.php @@ -0,0 +1,93 @@ +auth->check_module_permissions('designer'); + +// Lade Template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_nav_edit.htm'); + +// ID importieren +$module_name = $_REQUEST["module_name"]; +$nav_id = $_REQUEST["nav_id"]; +$item_id = $_REQUEST["item_id"]; +$dir = $_REQUEST["dir"]; + +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$module_name)) die("module_name contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{1,50}$/',$nav_id)) die("nav_id contains invalid chars."); +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$item_id)) die("item_id contains invalid chars."); + +if(empty($module_name)) die("module is empty."); + +if($nav_id != '') { + + $filename = "../".$module_name."/lib/module.conf.php"; + + if(!@is_file($filename)) die("File not found: $filename"); + include_once($filename); + + if($dir == 'up' and $item_id > 0) { + $tmp = $module["nav"][$nav_id]["items"][$item_id - 1]; + $module["nav"][$nav_id]["items"][$item_id -1] = $module["nav"][$nav_id]["items"][$item_id]; + $module["nav"][$nav_id]["items"][$item_id] = $tmp; + } + + if($dir == 'down' and $item_id < count($module["nav"][$nav_id]["items"]) -1) { + $tmp = $module["nav"][$nav_id]["items"][$item_id + 1]; + $module["nav"][$nav_id]["items"][$item_id + 1] = $module["nav"][$nav_id]["items"][$item_id]; + $module["nav"][$nav_id]["items"][$item_id] = $tmp; + } + + $m = ""; + + // writing module.conf + if (!$handle = fopen($filename, 'w')) { + print "Cannot open file ($filename)"; + exit; + } + if (!fwrite($handle, $m)) { + print "Cannot write to file ($filename)"; + exit; + } + + fclose($handle); + + + // zu Liste springen + header("Location: module_show.php?id=$module_name"); + exit; +} +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/module_show.php b/interface/ispconfig/interface/designer/module_show.php new file mode 100644 index 000000000..a8a3b3e65 --- /dev/null +++ b/interface/ispconfig/interface/designer/module_show.php @@ -0,0 +1,113 @@ +auth->check_module_permissions('designer'); + +if($_SESSION["s"]["user"]["typ"] != "admin") die("Admin permissions required."); + +$app->uses('tpl'); + +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/module_show.htm'); + + +$module_name = $_REQUEST["id"]; +if(!preg_match('/^[A-Za-z0-9_]{0,50}$/',$module_name)) die("id contains invalid chars."); + +include_once("../".$module_name."/lib/module.conf.php"); +$navi = $module["nav"]; +unset($module["nav"]); +$record = $module; + +// loading language file +$lng_file = "lib/lang/".$_SESSION["s"]["user"]["language"]."_module_show.lng"; +include($lng_file); +$app->tpl->setVar($wb); + +// baue Modul navi +$content = ""; +$n1 = 0; +$n2 = 0; +if(is_array($navi)) { +foreach($navi as $nav_id => $section) { + $content .= " + + + + + + "; + //$content .= "\r\n"; + foreach($section["items"] as $item_id => $item) { + //$content .= "\r\n"; + //$content .= "\r\n"; + //$content .= "\r\n"; + $content .= " + + + "; + $n2++; + } + $content .= " +
$section[title] +
+
+
+
+
+
Bereich:
Titel:
Ziel:       
Link:       
$item[title] +
+
+
+
+
 
+ + "; + $n1++; +} +} + +$record["nav"] = $content; + + +$app->tpl->setVar($record); + + +$app->tpl->setLoop('records',$modules_list); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/form_edit.htm b/interface/ispconfig/interface/designer/templates/form_edit.htm new file mode 100644 index 000000000..4d1c991ab --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/form_edit.htm @@ -0,0 +1,79 @@ +
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
: yes / no
:
:
: yes / no
 
:
:
: r = read, i = insert, u = update, d = delete
: r = read, i = insert, u = update, d = delete
: r = read, i = insert, u = update, d = delete
 
  + +
+ + +
\ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/form_list.htm b/interface/ispconfig/interface/designer/templates/form_list.htm new file mode 100644 index 000000000..57506e8d4 --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/form_list.htm @@ -0,0 +1,24 @@ +
+

+ + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="name"}{tmpl_var name="title"}{tmpl_var name="module_name"}{tmpl_var name="description"}[Delete]
+
\ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/form_show.htm b/interface/ispconfig/interface/designer/templates/form_show.htm new file mode 100644 index 000000000..b10407018 --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/form_show.htm @@ -0,0 +1,61 @@ + +
+

+
{tmpl_var name='form_txt'} + + + + + + + + + + + + + + + + + + + + + + + +
:{tmpl_var name='title'}
:{tmpl_var name='form_name'}
:{tmpl_var name='module_name'}
:{tmpl_var name='description'}
 
+ + +
+
+ + + + + + + + +
 
 
+
\ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/module_edit.htm b/interface/ispconfig/interface/designer/templates/module_edit.htm new file mode 100644 index 000000000..2464f5f7e --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/module_edit.htm @@ -0,0 +1,43 @@ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
  +
 
+
+
 
+ \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/module_list.htm b/interface/ispconfig/interface/designer/templates/module_list.htm new file mode 100644 index 000000000..1198d1c8c --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/module_list.htm @@ -0,0 +1,18 @@ +

+ + + + + + + + + + + + + + + + +
 
{tmpl_var name="module"}{tmpl_var name="title"}[Delete]
\ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/module_nav_edit.htm b/interface/ispconfig/interface/designer/templates/module_nav_edit.htm new file mode 100644 index 000000000..5c46350b3 --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/module_nav_edit.htm @@ -0,0 +1,24 @@ +

+ + + + + + + + + + + + + + + + + +
:
  +
 
+
+
 
+ + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/module_nav_item_edit.htm b/interface/ispconfig/interface/designer/templates/module_nav_item_edit.htm new file mode 100644 index 000000000..7ddcd19c0 --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/module_nav_item_edit.htm @@ -0,0 +1,33 @@ +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
  +
 
+
+
 
+ + + \ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/module_show.htm b/interface/ispconfig/interface/designer/templates/module_show.htm new file mode 100644 index 000000000..8b261720f --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/module_show.htm @@ -0,0 +1,31 @@ +

+
{tmpl_var name='module_txt'} + + + + + + + + + + + + + + + +
:{tmpl_var name='title'}
:{tmpl_var name='name'}
 
+
+
+
+
+ + + + + + + + +
 
 
\ No newline at end of file diff --git a/interface/ispconfig/interface/designer/templates/paging.tpl.htm b/interface/ispconfig/interface/designer/templates/paging.tpl.htm new file mode 100644 index 000000000..cb8270404 --- /dev/null +++ b/interface/ispconfig/interface/designer/templates/paging.tpl.htm @@ -0,0 +1,9 @@ +[ |<< ] + + [<< Zurück] + + Seite {tmpl_var name="next_page"} von {tmpl_var name="max_pages"} + + [Weiter >>] + + [ >>| ] \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_a_edit.php b/interface/ispconfig/interface/dns/dns_a_edit.php new file mode 100644 index 000000000..3bd8dec20 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_a_edit.php @@ -0,0 +1,144 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + //* Check for duplicates where IP and hostname are the same + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE type = 'A' AND name = '".$this->dataRecord["name"]."' AND zone = '".$this->dataRecord["zone"]."' and data = '".$this->dataRecord["data"]."' and id != ".$this->id); + if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("data_error_duplicate")."
"; + unset($tmp); + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_a_list.php b/interface/ispconfig/interface/dns/dns_a_list.php new file mode 100644 index 000000000..681e15839 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_a_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('dns'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLExtWhere = "type = 'A'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_aaaa_edit.php b/interface/ispconfig/interface/dns/dns_aaaa_edit.php new file mode 100644 index 000000000..97a3565eb --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_aaaa_edit.php @@ -0,0 +1,139 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_alias_edit.php b/interface/ispconfig/interface/dns/dns_alias_edit.php new file mode 100644 index 000000000..676d439a6 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_alias_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_cname_edit.php b/interface/ispconfig/interface/dns/dns_cname_edit.php new file mode 100644 index 000000000..96e645348 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_cname_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_hinfo_edit.php b/interface/ispconfig/interface/dns/dns_hinfo_edit.php new file mode 100644 index 000000000..cafbedef9 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_hinfo_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_mx_edit.php b/interface/ispconfig/interface/dns/dns_mx_edit.php new file mode 100644 index 000000000..889d795e1 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_mx_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_ns_edit.php b/interface/ispconfig/interface/dns/dns_ns_edit.php new file mode 100644 index 000000000..5fa65c9d0 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_ns_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_ptr_edit.php b/interface/ispconfig/interface/dns/dns_ptr_edit.php new file mode 100644 index 000000000..04f1b2ef4 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_ptr_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_rp_edit.php b/interface/ispconfig/interface/dns/dns_rp_edit.php new file mode 100644 index 000000000..10c61122f --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_rp_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_rr_del.php b/interface/ispconfig/interface/dns/dns_rr_del.php new file mode 100644 index 000000000..7a0b92d14 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_rr_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('dns'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_soa_del.php b/interface/ispconfig/interface/dns/dns_soa_del.php new file mode 100644 index 000000000..38e35bd67 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_soa_del.php @@ -0,0 +1,69 @@ +auth->check_module_permissions('dns'); + +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + if($app->tform->checkPerm($this->id,'d') == false) $app->error($app->lng('error_no_delete_permission')); + + // Delete all records that belog to this zone. + $records = $app->db->queryAllRecords("SELECT id FROM dns_rr WHERE zone = '".intval($this->id)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('dns_rr','id',$rec['id']); + } + } +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_soa_edit.php b/interface/ispconfig/interface/dns/dns_soa_edit.php new file mode 100644 index 000000000..6bfad6912 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_soa_edit.php @@ -0,0 +1,222 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_dns_zone')) { + $app->error($app->tform->wordbook["limit_dns_zone_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_dns_zone')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_dns_zone_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + // If user is admin, we will allow him to select to whom this record belongs + if($_SESSION["s"]["user"]["typ"] == 'admin') { + // Getting Domains of the user + $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER by name"; + $clients = $app->db->queryAllRecords($sql); + $client_select = ''; + if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= ""; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = ($client["groupid"] == @$tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + } else if($app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY name"; + $clients = $app->db->queryAllRecords($sql); + $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']); + $client_select = ''; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_zone, default_dnsserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // When the record is updated + if($this->id > 0) { + // restore the server ID if the user is not admin and record is edited + $tmp = $app->db->queryOneRecord("SELECT server_id FROM dns_soa WHERE id = ".intval($this->id)); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + // When the record is inserted + } else { + // set the server ID to the default dnsserver of the client + $this->dataRecord["server_id"] = $client["default_dnsserver"]; + + // Check if the user may add another maildomain. + if($client["limit_dns_zone"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_soa WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_zone"]) { + $app->error($app->tform->wordbook["limit_dns_zone_txt"]); + } + } + } + } + + /* + // Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + */ + + + //* Check if soa, ns and mbox have a dot at the end + if(strlen($this->dataRecord["origin"]) > 0 && substr($this->dataRecord["origin"],-1,1) != '.') $this->dataRecord["origin"] .= '.'; + if(strlen($this->dataRecord["ns"]) > 0 && substr($this->dataRecord["ns"],-1,1) != '.') $this->dataRecord["ns"] .= '.'; + if(strlen($this->dataRecord["mbox"]) > 0 && substr($this->dataRecord["mbox"],-1,1) != '.') $this->dataRecord["mbox"] .= '.'; + + //* Replace @ in mbox + if(stristr($this->dataRecord["mbox"],'@')) { + $this->dataRecord["mbox"] = str_replace('@','.',$this->dataRecord["mbox"]); + } + + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + // make sure that the record belongs to the client group and not the admin group when a dmin inserts it + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE dns_soa SET sys_groupid = $client_group_id WHERE id = ".$this->id); + // And we want to update all rr records too, that belong to this record + $app->db->query("UPDATE dns_rr SET sys_groupid = $client_group_id WHERE zone = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE dns_soa SET sys_groupid = $client_group_id WHERE id = ".$this->id); + // And we want to update all rr records too, that belong to this record + $app->db->query("UPDATE dns_rr SET sys_groupid = $client_group_id WHERE zone = ".$this->id); + } + + } + + function onAfterUpdate() { + global $app, $conf; + + $tmp = $app->db->diffrec($this->oldDataRecord,$app->tform->getDataRecord($this->id)); + if($tmp['diff_num'] > 0) { + // Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = ".$this->id); + $app->db->query("UPDATE dns_soa SET serial = '".$app->validate_dns->increase_serial($soa["serial"])."' WHERE id = ".$this->id); + } + + // make sure that the record belongs to the client group and not the admin group when a dmin inserts it + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE dns_soa SET sys_groupid = $client_group_id WHERE id = ".$this->id); + // And we want to update all rr records too, that belong to this record + $app->db->query("UPDATE dns_rr SET sys_groupid = $client_group_id WHERE zone = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE dns_soa SET sys_groupid = $client_group_id WHERE id = ".$this->id); + // And we want to update all rr records too, that belong to this record + $app->db->query("UPDATE dns_rr SET sys_groupid = $client_group_id WHERE zone = ".$this->id); + } + + //** When the client group has changed, change also the owner of the record if the owner is not the admin user + if($this->oldDataRecord["client_group_id"] != $this->dataRecord["client_group_id"] && $this->dataRecord["sys_userid"] != 1) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $tmp = $app->db->queryOneREcord("SELECT userid FROM sys_user WHERE default_group = ".$client_group_id); + if($tmp["userid"] > 0) { + $app->db->query("UPDATE dns_soa SET sys_userid = ".$tmp["userid"]." WHERE id = ".$this->id); + $app->db->query("UPDATE dns_rr SET sys_userid = ".$tmp["userid"]." WHERE zone = ".$this->id); + } + } + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_soa_list.php b/interface/ispconfig/interface/dns/dns_soa_list.php new file mode 100644 index 000000000..7b2981a5b --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_soa_list.php @@ -0,0 +1,25 @@ +auth->check_module_permissions('dns'); + +$app->uses('listform_actions'); +// $app->listform_actions->SQLExtWhere = "access = 'REJECT'"; + +$app->listform_actions->SQLOrderBy = 'ORDER BY origin'; +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_srv_edit.php b/interface/ispconfig/interface/dns/dns_srv_edit.php new file mode 100644 index 000000000..15af1e207 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_srv_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_template_del.php b/interface/ispconfig/interface/dns/dns_template_del.php new file mode 100644 index 000000000..5aa1ff748 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_template_del.php @@ -0,0 +1,58 @@ +auth->check_module_permissions('dns'); + +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_template_edit.php b/interface/ispconfig/interface/dns/dns_template_edit.php new file mode 100644 index 000000000..7d84d5ca8 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_template_edit.php @@ -0,0 +1,60 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access denied for non admin users.'); + +class page_action extends tform_actions { + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_template_list.php b/interface/ispconfig/interface/dns/dns_template_list.php new file mode 100644 index 000000000..4cde9a013 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_template_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('dns'); + +$app->uses('listform_actions'); +// $app->listform_actions->SQLExtWhere = "access = 'REJECT'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/dns_txt_edit.php b/interface/ispconfig/interface/dns/dns_txt_edit.php new file mode 100644 index 000000000..2d5cecdc9 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_txt_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('dns'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_dns'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = '".intval($_POST["zone"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($soa["id"] != $_POST["zone"]) $app->tform->errorMessage .= $app->tform->wordbook["no_zone_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_dns_record FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_dns_record"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_dns_record"]) { + $app->error($app->tform->wordbook["limit_dns_record_txt"]); + } + } + } // end if user is not admin + + + // Set the server ID of the rr record to the same server ID as the parent record. + $this->dataRecord["server_id"] = $soa["server_id"]; + + // Update the serial number and timestamp of the RR record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_rr WHERE id = ".$this->id); + $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); + $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + //* Set the sys_groupid of the rr record to be the same then the sys_groupid of the soa record + $soa = $app->db->queryOneRecord("SELECT sys_groupid,serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->datalogUpdate('dns_rr', "sys_groupid = ".$soa['sys_groupid'], 'id', $this->id); + + //* Update the serial number of the SOA record + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } + + function onAfterUpdate() { + global $app, $conf; + + //* Update the serial number of the SOA record + $soa = $app->db->queryOneRecord("SELECT serial FROM dns_soa WHERE id = '".intval($this->dataRecord["zone"])."' AND ".$app->tform->getAuthSQL('r')); + $soa_id = intval($_POST["zone"]); + $serial = $app->validate_dns->increase_serial($soa["serial"]); + $app->db->datalogUpdate('dns_soa', "serial = $serial", 'id', $soa_id); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/interface/dns/dns_wizard.php b/interface/ispconfig/interface/dns/dns_wizard.php new file mode 100644 index 000000000..2c985eb94 --- /dev/null +++ b/interface/ispconfig/interface/dns/dns_wizard.php @@ -0,0 +1,274 @@ +auth->check_module_permissions('dns'); + + +// Loading the template +$app->uses('tpl,validate_dns'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/dns_wizard.htm'); +$app->load_language_file('/web/dns/lib/lang/'.$_SESSION['s']['language'].'_dns_wizard.lng'); + +// import variables +$template_id = (isset($_POST['template_id']))?intval($_POST['template_id']):0; +$sys_groupid = (isset($_POST['client_group_id']))?intval($_POST['client_group_id']):0; + +// get the correct server_id +if($_SESSION['s']['user']['typ'] == 'admin') { + $server_id = (isset($_POST['server_id']))?intval($_POST['server_id']):1; +} else { + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT default_dnsserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + $server_id = $client["default_dnsserver"]; +} + + +// Load the templates +$records = $app->db->queryAllRecords("SELECT * FROM dns_template WHERE visible = 'Y'"); +$template_id_option = ''; +$n = 0; +foreach($records as $rec){ + $checked = ($rec['template_id'] == $template_id)?' SELECTED':''; + $template_id_option .= ''; + if($n == 0 && $template_id == 0) $template_id = $rec['template_id']; + $n++; +} +unset($n); +$app->tpl->setVar("template_id_option",$template_id_option); + +// If the user is administrator +if($_SESSION['s']['user']['typ'] == 'admin') { + + // Load the list of servers + $records = $app->db->queryAllRecords("SELECT server_id, server_name FROM server WHERE dns_server = 1 ORDER BY server_name"); + $server_id_option = ''; + foreach($records as $rec){ + $checked = ($rec['server_id'] == $server_id)?' SELECTED':''; + $server_id_option .= ''; + } + $app->tpl->setVar("server_id",$server_id_option); + + // load the list of clients + $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER BY name"; + $clients = $app->db->queryAllRecords($sql); + $client_select = ''; + if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= ""; + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':''; + $client_select .= "\r\n"; + } + } + + $app->tpl->setVar("client_group_id",$client_select); +} + +if ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client.client_id, contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + + // load the list of clients + $sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']; + $clients = $app->db->queryAllRecords($sql); + $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']); + $client_select = ''; + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':''; + $client_select .= "\r\n"; + } + } + + $app->tpl->setVar("client_group_id",$client_select); +} + + +$template_record = $app->db->queryOneRecord("SELECT * FROM dns_template WHERE template_id = '$template_id'"); +$fields = explode(',',$template_record['fields']); +if(is_array($fields)) { + foreach($fields as $field) { + $app->tpl->setVar($field."_VISIBLE",1); + $field = strtolower($field); + $app->tpl->setVar($field,$_POST[$field]); + } +} + +if($_POST['create'] == 1) { + + $error = ''; + + if(isset($_POST['domain']) && $_POST['domain'] == '') $error .= $app->lng('error_domain_empty').'
'; + if(isset($_POST['ip']) && $_POST['ip'] == '') $error .= $app->lng('error_ip_empty').'
'; + if(isset($_POST['ns1']) && $_POST['ns1'] == '') $error .= $app->lng('error_ns1_empty').'
'; + if(isset($_POST['ns2']) && $_POST['ns2'] == '') $error .= $app->lng('error_ns2_empty').'
'; + if(isset($_POST['email']) && $_POST['email'] == '') $error .= $app->lng('error_email_empty').'
'; + + if(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z]{2,10}[\.]{0,1}$/',$_POST['domain'])) $error .= $app->lng('error_domain_regex').'
'; + if(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z]{2,10}[\.]{0,1}$/',$_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'
'; + if(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z]{2,10}[\.]{0,1}$/',$_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'
'; + if(isset($_POST['email']) && !preg_match('/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,10}$/i',$_POST['email'])) $error .= $app->lng('error_email_regex').'
'; + + // make sure that the record belongs to the clinet group and not the admin group when a dmin inserts it + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($_POST['client_group_id'])) { + $sys_groupid = intval($_POST['client_group_id']); + } elseif($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($_POST['client_group_id'])) { + $sys_groupid = intval($_POST['client_group_id']); + } else { + $sys_groupid = $_SESSION["s"]["user"]["default_group"]; + } + + $tform_def_file = "form/dns_soa.tform.php"; + $app->uses('tform'); + $app->tform->loadFormDef($tform_def_file); + + if($_SESSION['s']['user']['typ'] != 'admin') { + if(!$app->tform->checkClientLimit('limit_dns_zone')) { + $error .= $app->tform->wordbook["limit_dns_zone_txt"]; + } + if(!$app->tform->checkResellerLimit('limit_dns_zone')) { + $error .= $app->tform->wordbook["limit_dns_zone_txt"]; + } + } + + + // replace template placeholders + $tpl_content = $template_record['template']; + if($_POST['domain'] != '') $tpl_content = str_replace('{DOMAIN}',$_POST['domain'],$tpl_content); + if($_POST['ip'] != '') $tpl_content = str_replace('{IP}',$_POST['ip'],$tpl_content); + if($_POST['ns1'] != '') $tpl_content = str_replace('{NS1}',$_POST['ns1'],$tpl_content); + if($_POST['ns2'] != '') $tpl_content = str_replace('{NS2}',$_POST['ns2'],$tpl_content); + if($_POST['email'] != '') $tpl_content = str_replace('{EMAIL}',$_POST['email'],$tpl_content); + + // Parse the template + $tpl_rows = explode("\n",$tpl_content); + $section = ''; + $vars = array(); + $dns_rr = array(); + foreach($tpl_rows as $row) { + $row = trim($row); + if(substr($row,0,1) == '[') { + if($row == '[ZONE]') { + $section = 'zone'; + } elseif($row == '[DNS_RECORDS]') { + $section = 'dns_records'; + } else { + die('Unknown section type'); + } + } else { + if($row != '') { + // Handle zone section + if($section == 'zone') { + $parts = explode('=',$row); + $key = trim($parts[0]); + $val = trim($parts[1]); + if($key != '') $vars[$key] = $val; + } + // Handle DNS Record rows + if($section == 'dns_records') { + $parts = explode('|',$row); + $dns_rr[] = array( + 'name' => $app->db->quote($parts[1]), + 'type' => $app->db->quote($parts[0]), + 'data' => $app->db->quote($parts[2]), + 'aux' => $app->db->quote($parts[3]), + 'ttl' => $app->db->quote($parts[4]) + ); + } + } + } + + } // end foreach + + if($vars['origin'] == '') $error .= $app->lng('error_origin_empty').'
'; + if($vars['ns'] == '') $error .= $app->lng('error_ns_empty').'
'; + if($vars['mbox'] == '') $error .= $app->lng('error_mbox_empty').'
'; + if($vars['refresh'] == '') $error .= $app->lng('error_refresh_empty').'
'; + if($vars['retry'] == '') $error .= $app->lng('error_retry_empty').'
'; + if($vars['expire'] == '') $error .= $app->lng('error_expire_empty').'
'; + if($vars['minimum'] == '') $error .= $app->lng('error_minimum_empty').'
'; + if($vars['ttl'] == '') $error .= $app->lng('error_ttl_empty').'
'; + + if($error == '') { + // Insert the soa record + $sys_userid = $_SESSION['s']['user']['userid']; + $origin = $app->db->quote($vars['origin']); + $ns = $app->db->quote($vars['ns']); + $mbox = $app->db->quote(str_replace('@','.',$vars['mbox'])); + $refresh = $app->db->quote($vars['refresh']); + $retry = $app->db->quote($vars['retry']); + $expire = $app->db->quote($vars['expire']); + $minimum = $app->db->quote($vars['minimum']); + $ttl = $app->db->quote($vars['ttl']); + $xfer = $app->db->quote($vars['xfer']); + $serial = $app->validate_dns->increase_serial(0); + + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `origin`, `ns`, `mbox`, `serial`, `refresh`, `retry`, `expire`, `minimum`, `ttl`, `active`, `xfer`) VALUES + ('$sys_userid', '$sys_groupid', 'riud', 'riud', '', '$server_id', '$origin', '$ns', '$mbox', '$serial', '$refresh', '$retry', '$expire', '$minimum', '$ttl', 'Y', '$xfer')"; + $dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id'); + + // Insert the dns_rr records + if(is_array($dns_rr) && $dns_soa_id > 0) { + foreach($dns_rr as $rr) { + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `zone`, `name`, `type`, `data`, `aux`, `ttl`, `active`) VALUES + ('$sys_userid', '$sys_groupid', 'riud', 'riud', '', '$server_id', '$dns_soa_id', '$rr[name]', '$rr[type]', '$rr[data]', '$rr[aux]', '$rr[ttl]', 'Y')"; + $dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id'); + } + } + + header("Location: dns_soa_list.php"); + exit; + + } else { + $app->tpl->setVar("error",$error); + } + +} + + + +$app->tpl->setVar("title",'DNS Wizard'); + +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_dns_wizard.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_a.tform.php b/interface/ispconfig/interface/dns/form/dns_a.tform.php new file mode 100644 index 000000000..5cb747570 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_a.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS A", + 'width' => 100, + 'template' => "templates/dns_a_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\*]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'A', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^([1-9]{1}|[1-9]\d|[1]\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9]\d|[1]\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9]\d|[1]\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9]\d|[1]\d\d|2[0-4]\d|25[0-5])$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_aaaa.tform.php b/interface/ispconfig/interface/dns/form/dns_aaaa.tform.php new file mode 100644 index 000000000..0a9e02123 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_aaaa.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS AAAA", + 'width' => 100, + 'template' => "templates/dns_aaaa_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\*]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'AAAA', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^\s*((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?\s*$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_alias.tform.php b/interface/ispconfig/interface/dns/form/dns_alias.tform.php new file mode 100644 index 000000000..37ebc7793 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_alias.tform.php @@ -0,0 +1,161 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS ALIAS", + 'width' => 100, + 'template' => "templates/dns_alias_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'name_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'ALIAS', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_cname.tform.php b/interface/ispconfig/interface/dns/form/dns_cname.tform.php new file mode 100644 index 000000000..6409b9750 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_cname.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS CNAME", + 'width' => 100, + 'template' => "templates/dns_cname_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\*]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'CNAME', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_hinfo.tform.php b/interface/ispconfig/interface/dns/form/dns_hinfo.tform.php new file mode 100644 index 000000000..fd8facf2c --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_hinfo.tform.php @@ -0,0 +1,158 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS HINFO", + 'width' => 100, + 'template' => "templates/dns_hinfo_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'name_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'HINFO', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_mx.tform.php b/interface/ispconfig/interface/dns/form/dns_mx.tform.php new file mode 100644 index 000000000..7a30d4e41 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_mx.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS mx", + 'width' => 100, + 'template' => "templates/dns_mx_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,255}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'MX', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,255}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '10', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_ns.tform.php b/interface/ispconfig/interface/dns/form/dns_ns.tform.php new file mode 100644 index 000000000..2229bac37 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_ns.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS ns", + 'width' => 100, + 'template' => "templates/dns_ns_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'NS', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_ptr.tform.php b/interface/ispconfig/interface/dns/form/dns_ptr.tform.php new file mode 100644 index 000000000..c7521e7f8 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_ptr.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS ptr", + 'width' => 100, + 'template' => "templates/dns_ptr_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'PTR', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_rp.tform.php b/interface/ispconfig/interface/dns/form/dns_rp.tform.php new file mode 100644 index 000000000..02a43196f --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_rp.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS RP", + 'width' => 100, + 'template' => "templates/dns_rp_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'RP', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\s]{1,128}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_soa.tform.php b/interface/ispconfig/interface/dns/form/dns_soa.tform.php new file mode 100644 index 000000000..605679f16 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_soa.tform.php @@ -0,0 +1,230 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns_soa'] = array ( + 'title' => "DNS Zone", + 'width' => 100, + 'template' => "templates/dns_soa_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND dns_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'server_id_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'origin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'origin_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'origin_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-\/]{2,255}\.[a-zA-Z]{2,10}[\.]{0,1}$/', + 'errmsg'=> 'origin_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ns' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{1,64}$/', + 'errmsg'=> 'ns_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'mbox' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mbox_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[[a-zA-Z0-9\.\-]{0,64}\.$/', + 'errmsg'=> 'mbox_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'refresh' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '28800', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'retry' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '7200', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'expire' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '604800', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'minimum' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'xfer' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'also_notify' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'update_acl' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['dns_records'] = array ( + 'title' => "Records", + 'width' => 100, + 'template' => "templates/dns_records_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + + ################################## + # ENDE Datatable fields + ################################## + ), + 'plugins' => array ( + 'dns_records' => array ( + 'class' => 'plugin_listview', + 'options' => array( + 'listdef' => 'list/dns_a.list.php', + 'sqlextwhere' => "zone = ".@intval(@$_REQUEST['id']), + 'sql_order_by' => "ORDER BY type, name" + ) + ) + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_srv.tform.php b/interface/ispconfig/interface/dns/form/dns_srv.tform.php new file mode 100644 index 000000000..4cc2f55c2 --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_srv.tform.php @@ -0,0 +1,159 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS SRV", + 'width' => 100, + 'template' => "templates/dns_srv_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'SRV', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}\s[\w\.\-]{0,64}\s[\w\.\-]{0,64}$/', + 'errmsg'=> 'srv_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_template.tform.php b/interface/ispconfig/interface/dns/form/dns_template.tform.php new file mode 100644 index 000000000..a648fd43c --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_template.tform.php @@ -0,0 +1,101 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['template'] = array ( + 'title' => "DNS Template", + 'width' => 100, + 'template' => "templates/dns_template_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'name_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'fields' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'default' => '', + 'separator' => ',', + 'value' => array('DOMAIN' => 'Domain','IP' => 'IP Address','NS1' => 'NS 1','NS2' => 'NS 2','EMAIL' => 'Email') + ), + 'template' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '40', + 'rows' => '15' + ), + 'visible' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/form/dns_txt.tform.php b/interface/ispconfig/interface/dns/form/dns_txt.tform.php new file mode 100644 index 000000000..153bcc8ea --- /dev/null +++ b/interface/ispconfig/interface/dns/form/dns_txt.tform.php @@ -0,0 +1,156 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS TXT", + 'width' => 100, + 'template' => "templates/dns_txt_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'TXT', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '86400', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N',1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/admin.conf.php b/interface/ispconfig/interface/dns/lib/admin.conf.php new file mode 100644 index 000000000..a45d44034 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/admin.conf.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/bg.lng b/interface/ispconfig/interface/dns/lib/lang/bg.lng new file mode 100644 index 000000000..36def8e93 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_a.lng new file mode 100644 index 000000000..880213951 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_a_list.lng new file mode 100644 index 000000000..87c9cd818 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_aaaa.lng new file mode 100644 index 000000000..31ef0da15 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_alias.lng new file mode 100644 index 000000000..827e5a89e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_cname.lng new file mode 100644 index 000000000..827e5a89e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_hinfo.lng new file mode 100644 index 000000000..0d90bcf40 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_mx.lng new file mode 100644 index 000000000..648827f04 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_ns.lng new file mode 100644 index 000000000..713ec2858 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_ptr.lng new file mode 100644 index 000000000..c02638406 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_rp.lng new file mode 100644 index 000000000..d38efd163 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa.lng new file mode 100644 index 000000000..e63ffb70f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['server_id_error_empty'] = 'No server selected'; +$wb['origin_error_empty'] = 'Zone empty.'; +$wb['origin_error_unique'] = 'There is already a record for this zone.'; +$wb['origin_error_regex'] = 'Zone has a invalid format.'; +$wb['ns_error_regex'] = 'NS has a invalid format.'; +$wb['mbox_error_empty'] = 'Email is empty.'; +$wb['mbox_error_regex'] = 'Email format invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa_list.lng new file mode 100644 index 000000000..42bb32920 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_srv.lng new file mode 100644 index 000000000..d4ea60be9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_template.lng new file mode 100644 index 000000000..3a09e3bb7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_template_list.lng new file mode 100644 index 000000000..8d9d730e5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_txt.lng new file mode 100644 index 000000000..8e6c417d0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/bg_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/bg_dns_wizard.lng new file mode 100644 index 000000000..ffceabb53 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/bg_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br.lng b/interface/ispconfig/interface/dns/lib/lang/br.lng new file mode 100644 index 000000000..de70fdb27 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_a.lng new file mode 100644 index 000000000..137af7c18 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_a_list.lng new file mode 100644 index 000000000..b231c8342 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_aaaa.lng new file mode 100644 index 000000000..17e77b215 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_alias.lng new file mode 100644 index 000000000..d026ddfaa --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_cname.lng new file mode 100644 index 000000000..881cb6376 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_hinfo.lng new file mode 100644 index 000000000..ac6e13b06 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_mx.lng new file mode 100644 index 000000000..0dfd536a2 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_ns.lng new file mode 100644 index 000000000..ef9966fca --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_ptr.lng new file mode 100644 index 000000000..728ea0731 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_rp.lng new file mode 100644 index 000000000..d1854700f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_soa.lng new file mode 100644 index 000000000..486d05afb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_soa.lng @@ -0,0 +1,26 @@ +estes IPs (lista separada por ponto e vírgula)'; +$wb['active_txt'] = 'Ativo'; +$wb['limit_dns_zone_txt'] = 'O número máximo de zonas DNS para sua conta foi atingido.'; +$wb['client_txt'] = 'Cliente'; +$wb['no_zone_perm'] = 'Você não tem permição para adcionar registros a está zona DNS.'; +$wb['server_id_error_empty'] = 'Servidor não selecionado'; +$wb['origin_error_empty'] = 'Zona vazia.'; +$wb['origin_error_unique'] = 'Este registro já existe nesta zona.'; +$wb['origin_error_regex'] = 'Formato de zona inválido.'; +$wb['ns_error_regex'] = 'NS tem um formato inválido.'; +$wb['mbox_error_empty'] = 'Correio está em branco.'; +$wb['mbox_error_regex'] = 'Correio com formato inválido.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Atualizar ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_soa_list.lng new file mode 100644 index 000000000..ef0c93fa2 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_srv.lng new file mode 100644 index 000000000..8a389f58d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_template.lng new file mode 100644 index 000000000..9d7331b79 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_template_list.lng new file mode 100644 index 000000000..a4602aec9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_txt.lng new file mode 100644 index 000000000..f73ada31d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/br_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/br_dns_wizard.lng new file mode 100644 index 000000000..6a94ec29d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/br_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de.lng b/interface/ispconfig/interface/dns/lib/lang/de.lng new file mode 100644 index 000000000..319b221fb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_a.lng new file mode 100644 index 000000000..ea6d02178 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_a_list.lng new file mode 100644 index 000000000..0481c2b67 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_aaaa.lng new file mode 100644 index 000000000..768e67056 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_alias.lng new file mode 100644 index 000000000..9475644b2 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_cname.lng new file mode 100644 index 000000000..4c3d5a0a5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_hinfo.lng new file mode 100644 index 000000000..245480f3b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_mx.lng new file mode 100644 index 000000000..ab21cc498 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_ns.lng new file mode 100644 index 000000000..845da9dc1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_ptr.lng new file mode 100644 index 000000000..aee415596 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_rp.lng new file mode 100644 index 000000000..86f3fc02b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_soa.lng new file mode 100644 index 000000000..d619a3cce --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_soa.lng @@ -0,0 +1,26 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_soa_list.lng new file mode 100644 index 000000000..92f098c84 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_srv.lng new file mode 100644 index 000000000..352e9598c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_template.lng new file mode 100644 index 000000000..33d1090cb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_template_list.lng new file mode 100644 index 000000000..45f0c5c5a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_txt.lng new file mode 100644 index 000000000..182e9945a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/de_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/de_dns_wizard.lng new file mode 100644 index 000000000..6f1bfbe3a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/de_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/en.lng b/interface/ispconfig/interface/dns/lib/lang/en.lng new file mode 100644 index 000000000..c4a5beaad --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en.lng @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_a.lng new file mode 100644 index 000000000..599de5cf9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_a.lng @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_a_list.lng new file mode 100644 index 000000000..88a2366a5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_a_list.lng @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_aaaa.lng new file mode 100644 index 000000000..c56d55863 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_aaaa.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_alias.lng new file mode 100644 index 000000000..46f73a387 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_alias.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_cname.lng new file mode 100644 index 000000000..46f73a387 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_cname.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_hinfo.lng new file mode 100644 index 000000000..0fb7f4597 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_hinfo.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_mx.lng new file mode 100644 index 000000000..d0bee5eba --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_mx.lng @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_ns.lng new file mode 100644 index 000000000..9e0e1e149 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_ns.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_ptr.lng new file mode 100644 index 000000000..1219a96e1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_ptr.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_rp.lng new file mode 100644 index 000000000..e705d9fff --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_rp.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_soa.lng new file mode 100644 index 000000000..3c9a5b0a5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb["active_txt"] = 'Active'; +$wb["limit_dns_zone_txt"] = 'The max. number of DNS zones for your account is reached.'; +$wb["client_txt"] = 'Client'; +$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.'; +$wb["server_id_error_empty"] = 'No server selected'; +$wb["origin_error_empty"] = 'Zone empty.'; +$wb["origin_error_unique"] = 'There is already a record for this zone.'; +$wb["origin_error_regex"] = 'Zone has a invalid format.'; +$wb["ns_error_regex"] = 'NS has a invalid format.'; +$wb["mbox_error_empty"] = 'Email is empty.'; +$wb["mbox_error_regex"] = 'Email format invalid.'; +$wb["also_notify_txt"] = 'Also Notify'; +$wb["update_acl_txt"] = 'Update ACL'; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_soa_list.lng new file mode 100644 index 000000000..6213bdb1d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_soa_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_srv.lng new file mode 100644 index 000000000..d0dcd1eb2 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_srv.lng @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_template.lng new file mode 100644 index 000000000..37643e119 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_template.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_template_list.lng new file mode 100644 index 000000000..33460a20a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_template_list.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_txt.lng new file mode 100644 index 000000000..af4360590 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_txt.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/en_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/en_dns_wizard.lng new file mode 100644 index 000000000..2f9f91421 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/en_dns_wizard.lng @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/es.lng b/interface/ispconfig/interface/dns/lib/lang/es.lng new file mode 100644 index 000000000..4fd59f49d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_a.lng new file mode 100644 index 000000000..36f318c86 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_a_list.lng new file mode 100644 index 000000000..1cbe6d305 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_aaaa.lng new file mode 100644 index 000000000..15ee1d2f3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_alias.lng new file mode 100644 index 000000000..705b5cf0d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_cname.lng new file mode 100644 index 000000000..7c3f7b7f1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_hinfo.lng new file mode 100644 index 000000000..d5412cac4 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_mx.lng new file mode 100644 index 000000000..e7c377d66 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_ns.lng new file mode 100644 index 000000000..568700987 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_ptr.lng new file mode 100644 index 000000000..f8ef426e4 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_rp.lng new file mode 100644 index 000000000..fece32a2b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_soa.lng new file mode 100644 index 000000000..c4143bc63 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_soa.lng @@ -0,0 +1,26 @@ +estas IPs (lista separada por comas)'; +$wb['active_txt'] = 'Activar'; +$wb['limit_dns_zone_txt'] = 'Se ha alcanzado el número máximo de zonas DNS para esta cuenta.'; +$wb['client_txt'] = 'Cliente'; +$wb['no_zone_perm'] = 'No tiene permisos para añadir registros a esta zona DNS.'; +$wb['server_id_error_empty'] = 'No se ha seleccionado el servidor.'; +$wb['origin_error_empty'] = 'Zona vacía.'; +$wb['origin_error_unique'] = 'Ya hay un registro para esta zona.'; +$wb['origin_error_regex'] = 'Formato de zona no válido.'; +$wb['ns_error_regex'] = 'Formato de NS no válido.'; +$wb['mbox_error_empty'] = 'Correo vacío.'; +$wb['mbox_error_regex'] = 'Formato de correo no válido.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_soa_list.lng new file mode 100644 index 000000000..ab942dd50 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_srv.lng new file mode 100644 index 000000000..8e524ee4d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_template.lng new file mode 100644 index 000000000..79ac234a0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_template_list.lng new file mode 100644 index 000000000..388a4c156 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_txt.lng new file mode 100644 index 000000000..55bde142d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/es_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/es_dns_wizard.lng new file mode 100644 index 000000000..0713bcc0a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/es_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi.lng b/interface/ispconfig/interface/dns/lib/lang/fi.lng new file mode 100644 index 000000000..bdca8cd96 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_a.lng new file mode 100644 index 000000000..3a4af610e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_a_list.lng new file mode 100644 index 000000000..0cc82874b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_aaaa.lng new file mode 100644 index 000000000..b87d7ac29 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_alias.lng new file mode 100644 index 000000000..20da599c7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_cname.lng new file mode 100644 index 000000000..a58f0d2f2 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_hinfo.lng new file mode 100644 index 000000000..ea2fb93a3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_mx.lng new file mode 100644 index 000000000..e4b4a60d5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_ns.lng new file mode 100644 index 000000000..8f97c53cb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_ptr.lng new file mode 100644 index 000000000..9885c2be9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_rp.lng new file mode 100644 index 000000000..d47cdcfbd --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa.lng new file mode 100644 index 000000000..7e70915d7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa.lng @@ -0,0 +1,26 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa_list.lng new file mode 100644 index 000000000..95d104443 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_srv.lng new file mode 100644 index 000000000..68f4c859e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_template.lng new file mode 100644 index 000000000..b34a92d6a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_template_list.lng new file mode 100644 index 000000000..47c892423 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_txt.lng new file mode 100644 index 000000000..d1235ba07 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fi_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/fi_dns_wizard.lng new file mode 100644 index 000000000..dba630674 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fi_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr.lng b/interface/ispconfig/interface/dns/lib/lang/fr.lng new file mode 100644 index 000000000..fe6ece558 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_a.lng new file mode 100644 index 000000000..731c3e4fa --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_a_list.lng new file mode 100644 index 000000000..081782615 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_aaaa.lng new file mode 100644 index 000000000..503795f0e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_alias.lng new file mode 100644 index 000000000..1ae97aecd --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_cname.lng new file mode 100644 index 000000000..87fc49ea0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_hinfo.lng new file mode 100644 index 000000000..f26ed7dd5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_mx.lng new file mode 100644 index 000000000..e3904207a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_ns.lng new file mode 100644 index 000000000..a6edc6eaa --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_ptr.lng new file mode 100644 index 000000000..4318e000e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_rp.lng new file mode 100644 index 000000000..fe37f3e79 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa.lng new file mode 100644 index 000000000..28c81c41c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa.lng @@ -0,0 +1,26 @@ +ces IP (liste séparée par des virgules)'; +$wb['active_txt'] = 'Actif'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'Vous navez pas la permissions dajouter un enregistrement dans cette zone DNS.'; +$wb['server_id_error_empty'] = 'Pas de serveur sélectionné'; +$wb['origin_error_empty'] = 'Zone vide.'; +$wb['origin_error_unique'] = 'Il y a déja un enregistrement pour cette zone.'; +$wb['origin_error_regex'] = 'La zone est dun format invalide.'; +$wb['ns_error_regex'] = 'Le serveur de nom est dun format invalide.'; +$wb['mbox_error_empty'] = 'Ladresse e-mail est vide.'; +$wb['mbox_error_regex'] = 'Ladresse e-mail est dun format invalide.'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa_list.lng new file mode 100644 index 000000000..a828044a0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_srv.lng new file mode 100644 index 000000000..de8776354 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_template.lng new file mode 100644 index 000000000..1202cfd76 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_template_list.lng new file mode 100644 index 000000000..52455b2ca --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_txt.lng new file mode 100644 index 000000000..2126a3f24 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/fr_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/fr_dns_wizard.lng new file mode 100644 index 000000000..b828acd2c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/fr_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu.lng b/interface/ispconfig/interface/dns/lib/lang/hu.lng new file mode 100644 index 000000000..36def8e93 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_a.lng new file mode 100644 index 000000000..880213951 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_a_list.lng new file mode 100644 index 000000000..acab15029 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_aaaa.lng new file mode 100644 index 000000000..31ef0da15 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_alias.lng new file mode 100644 index 000000000..827e5a89e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_cname.lng new file mode 100644 index 000000000..827e5a89e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_hinfo.lng new file mode 100644 index 000000000..0d90bcf40 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_mx.lng new file mode 100644 index 000000000..648827f04 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_ns.lng new file mode 100644 index 000000000..713ec2858 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_ptr.lng new file mode 100644 index 000000000..c02638406 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_rp.lng new file mode 100644 index 000000000..d38efd163 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa.lng new file mode 100644 index 000000000..e63ffb70f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['server_id_error_empty'] = 'No server selected'; +$wb['origin_error_empty'] = 'Zone empty.'; +$wb['origin_error_unique'] = 'There is already a record for this zone.'; +$wb['origin_error_regex'] = 'Zone has a invalid format.'; +$wb['ns_error_regex'] = 'NS has a invalid format.'; +$wb['mbox_error_empty'] = 'Email is empty.'; +$wb['mbox_error_regex'] = 'Email format invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa_list.lng new file mode 100644 index 000000000..42bb32920 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_srv.lng new file mode 100644 index 000000000..d4ea60be9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_template.lng new file mode 100644 index 000000000..3a09e3bb7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_template_list.lng new file mode 100644 index 000000000..8d9d730e5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_txt.lng new file mode 100644 index 000000000..8e6c417d0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/hu_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/hu_dns_wizard.lng new file mode 100644 index 000000000..ffceabb53 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/hu_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it.lng b/interface/ispconfig/interface/dns/lib/lang/it.lng new file mode 100644 index 000000000..36def8e93 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_a.lng new file mode 100644 index 000000000..880213951 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_a_list.lng new file mode 100644 index 000000000..87c9cd818 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_aaaa.lng new file mode 100644 index 000000000..31ef0da15 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_alias.lng new file mode 100644 index 000000000..827e5a89e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_cname.lng new file mode 100644 index 000000000..827e5a89e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_hinfo.lng new file mode 100644 index 000000000..0d90bcf40 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_mx.lng new file mode 100644 index 000000000..648827f04 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_ns.lng new file mode 100644 index 000000000..713ec2858 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_ptr.lng new file mode 100644 index 000000000..c02638406 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_rp.lng new file mode 100644 index 000000000..d38efd163 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_soa.lng new file mode 100644 index 000000000..e63ffb70f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['server_id_error_empty'] = 'No server selected'; +$wb['origin_error_empty'] = 'Zone empty.'; +$wb['origin_error_unique'] = 'There is already a record for this zone.'; +$wb['origin_error_regex'] = 'Zone has a invalid format.'; +$wb['ns_error_regex'] = 'NS has a invalid format.'; +$wb['mbox_error_empty'] = 'Email is empty.'; +$wb['mbox_error_regex'] = 'Email format invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_soa_list.lng new file mode 100644 index 000000000..42bb32920 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_srv.lng new file mode 100644 index 000000000..d4ea60be9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_template.lng new file mode 100644 index 000000000..3a09e3bb7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_template_list.lng new file mode 100644 index 000000000..8d9d730e5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_txt.lng new file mode 100644 index 000000000..8e6c417d0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/it_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/it_dns_wizard.lng new file mode 100644 index 000000000..ffceabb53 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/it_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja.lng b/interface/ispconfig/interface/dns/lib/lang/ja.lng new file mode 100644 index 000000000..f96696bc8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_a.lng new file mode 100644 index 000000000..50f551627 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_a_list.lng new file mode 100644 index 000000000..e2297bbbb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_aaaa.lng new file mode 100644 index 000000000..2ca0650fe --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_alias.lng new file mode 100644 index 000000000..4e469a104 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_cname.lng new file mode 100644 index 000000000..4e469a104 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_hinfo.lng new file mode 100644 index 000000000..a0df197ca --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_mx.lng new file mode 100644 index 000000000..648827f04 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_ns.lng new file mode 100644 index 000000000..b9070d831 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_ptr.lng new file mode 100644 index 000000000..8f5f3da20 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_rp.lng new file mode 100644 index 000000000..c43a721e6 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa.lng new file mode 100644 index 000000000..d00e8afb6 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa.lng @@ -0,0 +1,26 @@ +(, ã§åŒºåˆ‡ã£ã¦ãã ã•ã„)'; +$wb['active_txt'] = '有効'; +$wb['limit_dns_zone_txt'] = 'DNSゾーンãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—ãŸã€‚'; +$wb['client_txt'] = 'クライアント'; +$wb['no_zone_perm'] = 'ã“ã®DNSゾーンã«ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’追加ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。'; +$wb['server_id_error_empty'] = 'サーãƒãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。'; +$wb['origin_error_empty'] = 'Zone を指定ã—ã¦ãã ã•ã„。'; +$wb['origin_error_unique'] = 'åŒåã® Zone ãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚'; +$wb['origin_error_regex'] = 'ZoneåãŒä¸æ­£ãªæ–‡å­—ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚'; +$wb['ns_error_regex'] = 'NS ãŒä¸æ­£ãªæ–‡å­—ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚'; +$wb['mbox_error_empty'] = 'メールアドレスを指定ã—ã¦ãã ã•ã„'; +$wb['mbox_error_regex'] = 'メールアドレスã®å½¢å¼ãŒä¸æ­£ã§ã™ã€‚'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa_list.lng new file mode 100644 index 000000000..d6660d9e0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_srv.lng new file mode 100644 index 000000000..94a7f3786 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_template.lng new file mode 100644 index 000000000..7c05ae1cc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_template_list.lng new file mode 100644 index 000000000..2ed5746fa --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_txt.lng new file mode 100644 index 000000000..3af17ab25 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ja_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/ja_dns_wizard.lng new file mode 100644 index 000000000..508911da6 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ja_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl.lng b/interface/ispconfig/interface/dns/lib/lang/nl.lng new file mode 100644 index 000000000..56e5386c5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_a.lng new file mode 100644 index 000000000..32bab7464 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_a_list.lng new file mode 100644 index 000000000..9ffacd242 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_aaaa.lng new file mode 100644 index 000000000..c40ae84d9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_alias.lng new file mode 100644 index 000000000..2f9cccf72 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_cname.lng new file mode 100644 index 000000000..c5891e427 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_hinfo.lng new file mode 100644 index 000000000..a7287c423 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_mx.lng new file mode 100644 index 000000000..f93195c1b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_ns.lng new file mode 100644 index 000000000..75a91b41d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_ptr.lng new file mode 100644 index 000000000..4bd156388 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_rp.lng new file mode 100644 index 000000000..1195406a1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa.lng new file mode 100644 index 000000000..e1d149aec --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa.lng @@ -0,0 +1,26 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa_list.lng new file mode 100644 index 000000000..e6474cb1b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_srv.lng new file mode 100644 index 000000000..202d62d48 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_template.lng new file mode 100644 index 000000000..a6f8e0e9b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_template.lng @@ -0,0 +1,6 @@ +
Voorbeeld (in nieuw venster)'; +$wb['visible_txt'] = 'Geactiveerd voor DNS wizard?'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_template_list.lng new file mode 100644 index 000000000..6ca214c55 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_txt.lng new file mode 100644 index 000000000..94dbb3f47 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/nl_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/nl_dns_wizard.lng new file mode 100644 index 000000000..e7093f01e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/nl_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl.lng b/interface/ispconfig/interface/dns/lib/lang/pl.lng new file mode 100644 index 000000000..0a3f1a9fb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_a.lng new file mode 100644 index 000000000..4ad0a7c41 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_a_list.lng new file mode 100644 index 000000000..3d0db059b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_aaaa.lng new file mode 100644 index 000000000..983fae1a8 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_alias.lng new file mode 100644 index 000000000..a950805e3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_cname.lng new file mode 100644 index 000000000..92cb4ac97 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_hinfo.lng new file mode 100644 index 000000000..53b6da226 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_mx.lng new file mode 100644 index 000000000..4a3936a1b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_ns.lng new file mode 100644 index 000000000..18d7efd6c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_ptr.lng new file mode 100644 index 000000000..eae39817a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_rp.lng new file mode 100644 index 000000000..ece9346e3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa.lng new file mode 100644 index 000000000..868615e08 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa.lng @@ -0,0 +1,26 @@ +tych adresów IP (adresy rozdzielaj przecinkiem)'; +$wb['active_txt'] = 'Aktywny'; +$wb['limit_dns_zone_txt'] = 'Maksymalna ilość stref DNS dla Twojego konta zostaÅ‚a przekroczona.'; +$wb['client_txt'] = 'Klient'; +$wb['no_zone_perm'] = 'Nie masz uprawnieÅ„, aby dodać nowy wpis dla tej strefy DNS.'; +$wb['server_id_error_empty'] = 'Nie wybrano serwera'; +$wb['origin_error_empty'] = 'Strefa jest pusta.'; +$wb['origin_error_unique'] = 'Istnieje już wpis dla tej strefy.'; +$wb['origin_error_regex'] = 'Strefa ma niepoprawny format.'; +$wb['ns_error_regex'] = 'NS ma niepoprawny format.'; +$wb['mbox_error_empty'] = 'E-mail jest pusty.'; +$wb['mbox_error_regex'] = 'E-mail ma niepoprawny format.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa_list.lng new file mode 100644 index 000000000..126209eda --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_srv.lng new file mode 100644 index 000000000..633962132 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_template.lng new file mode 100644 index 000000000..f3e756357 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_template_list.lng new file mode 100644 index 000000000..7deac3b2f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_txt.lng new file mode 100644 index 000000000..628d5c047 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pl_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/pl_dns_wizard.lng new file mode 100644 index 000000000..a5d6a9099 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pl_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt.lng b/interface/ispconfig/interface/dns/lib/lang/pt.lng new file mode 100644 index 000000000..9f1ccffb4 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt.lng @@ -0,0 +1,21 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_a.lng new file mode 100644 index 000000000..3774b1a74 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_a.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_a_list.lng new file mode 100644 index 000000000..d7d55f21a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_a_list.lng @@ -0,0 +1,15 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_aaaa.lng new file mode 100644 index 000000000..4b4524b60 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_aaaa.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_alias.lng new file mode 100644 index 000000000..d7e91e685 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_alias.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_cname.lng new file mode 100644 index 000000000..bb75bcc21 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_cname.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_hinfo.lng new file mode 100644 index 000000000..668291727 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_hinfo.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_mx.lng new file mode 100644 index 000000000..d8b59a765 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_mx.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_ns.lng new file mode 100644 index 000000000..2e16d94de --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_ns.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_ptr.lng new file mode 100644 index 000000000..298872ad1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_ptr.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_rp.lng new file mode 100644 index 000000000..ba45e858c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_rp.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa.lng new file mode 100644 index 000000000..5d10de28d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa.lng @@ -0,0 +1,27 @@ +estes IPs (lista separada por ponto e vírgula)'; +$wb['active_txt'] = 'Activo'; +$wb['limit_dns_zone_txt'] = 'O número máximo de zonas DNS para a conta foi atingido.'; +$wb['client_txt'] = 'Cliente'; +$wb['no_zone_perm'] = 'Não tem permissão para adicionar registos a está zona DNS.'; +$wb['server_id_error_empty'] = 'Servidor não seleccionado'; +$wb['origin_error_empty'] = 'Zona vazia.'; +$wb['origin_error_unique'] = 'Este registo já existe nesta zona.'; +$wb['origin_error_regex'] = 'Formato de zona inválido.'; +$wb['ns_error_regex'] = 'NS tem um formato inválido.'; +$wb['mbox_error_empty'] = 'Correio está em branco.'; +$wb['mbox_error_regex'] = 'Correio com formato inválido.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Actualizar ACL'; +?> + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa_list.lng new file mode 100644 index 000000000..1345fafe3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_soa_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_srv.lng new file mode 100644 index 000000000..853bcf5aa --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_srv.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_template.lng new file mode 100644 index 000000000..9ee4e7222 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_template.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_template_list.lng new file mode 100644 index 000000000..1c89fd515 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_template_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_txt.lng new file mode 100644 index 000000000..8e731078a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_txt.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/pt_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/pt_dns_wizard.lng new file mode 100644 index 000000000..8e1663c1e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/pt_dns_wizard.lng @@ -0,0 +1,30 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro.lng b/interface/ispconfig/interface/dns/lib/lang/ro.lng new file mode 100644 index 000000000..908f2aa49 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_a.lng new file mode 100644 index 000000000..617c9d6ba --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_a_list.lng new file mode 100644 index 000000000..a17f698ea --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_aaaa.lng new file mode 100644 index 000000000..c56d55863 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_aaaa.lng @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_alias.lng new file mode 100644 index 000000000..defa63ac0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_cname.lng new file mode 100644 index 000000000..199d1f431 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_hinfo.lng new file mode 100644 index 000000000..598f7ab1a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_mx.lng new file mode 100644 index 000000000..3c5b54892 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_ns.lng new file mode 100644 index 000000000..0bf8e7ed3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_ptr.lng new file mode 100644 index 000000000..cda046dd9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_rp.lng new file mode 100644 index 000000000..b77bab2e2 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa.lng new file mode 100644 index 000000000..a70d730b3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa.lng @@ -0,0 +1,26 @@ +aceste IP-uri (comma separated list)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_zone_txt'] = 'numar max DNS zone pentru contul dumnevoastra a fost atins.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'Nu aveti permisiunea de a adauga aceasta inregistrare in zona DNS .'; +$wb['server_id_error_empty'] = 'Nu a fost ales serverul'; +$wb['origin_error_empty'] = 'Zone goale'; +$wb['origin_error_unique'] = 'Exista deja o inregistrare pentru aceasta zona'; +$wb['origin_error_regex'] = 'Zona are un format invalid'; +$wb['ns_error_regex'] = 'NS are un format invalid'; +$wb['mbox_error_empty'] = 'Email-ul este gol'; +$wb['mbox_error_regex'] = 'Format email invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa_list.lng new file mode 100644 index 000000000..e17045622 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_srv.lng new file mode 100644 index 000000000..a8b501156 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_template.lng new file mode 100644 index 000000000..f097bb3a0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_template_list.lng new file mode 100644 index 000000000..0a14156d2 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_txt.lng new file mode 100644 index 000000000..b3f781da0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ro_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/ro_dns_wizard.lng new file mode 100644 index 000000000..71d3497c6 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ro_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru.lng b/interface/ispconfig/interface/dns/lib/lang/ru.lng new file mode 100644 index 000000000..b47936efb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru.lng @@ -0,0 +1,21 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_a.lng new file mode 100644 index 000000000..81647b9a1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_a.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_a_list.lng new file mode 100644 index 000000000..803d4d685 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_a_list.lng @@ -0,0 +1,15 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_aaaa.lng new file mode 100644 index 000000000..869206924 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_aaaa.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_alias.lng new file mode 100644 index 000000000..784f99ea3 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_alias.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_cname.lng new file mode 100644 index 000000000..6089373fe --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_cname.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_hinfo.lng new file mode 100644 index 000000000..986891e80 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_hinfo.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_mx.lng new file mode 100644 index 000000000..d1bcbb2d1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_mx.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_ns.lng new file mode 100644 index 000000000..8e9f7d611 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_ns.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_ptr.lng new file mode 100644 index 000000000..2e5e0007c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_ptr.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_rp.lng new file mode 100644 index 000000000..22015068f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_rp.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa.lng new file mode 100644 index 000000000..03dfdeb4c --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa.lng @@ -0,0 +1,27 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa_list.lng new file mode 100644 index 000000000..250f49a99 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_soa_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_srv.lng new file mode 100644 index 000000000..dece24af9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_srv.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_template.lng new file mode 100644 index 000000000..9b9b0c177 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_template.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_template_list.lng new file mode 100644 index 000000000..b9c4fc38e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_template_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_txt.lng new file mode 100644 index 000000000..98e342f9a --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_txt.lng @@ -0,0 +1,16 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/ru_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/ru_dns_wizard.lng new file mode 100644 index 000000000..62f275909 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/ru_dns_wizard.lng @@ -0,0 +1,30 @@ + + diff --git a/interface/ispconfig/interface/dns/lib/lang/se.lng b/interface/ispconfig/interface/dns/lib/lang/se.lng new file mode 100644 index 000000000..36def8e93 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_a.lng new file mode 100644 index 000000000..880213951 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_a_list.lng new file mode 100644 index 000000000..87c9cd818 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_aaaa.lng new file mode 100644 index 000000000..31ef0da15 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_alias.lng new file mode 100644 index 000000000..827e5a89e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_cname.lng new file mode 100644 index 000000000..827e5a89e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_hinfo.lng new file mode 100644 index 000000000..0d90bcf40 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_mx.lng new file mode 100644 index 000000000..648827f04 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_ns.lng new file mode 100644 index 000000000..713ec2858 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_ptr.lng new file mode 100644 index 000000000..c02638406 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_rp.lng new file mode 100644 index 000000000..d38efd163 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_soa.lng new file mode 100644 index 000000000..e63ffb70f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['server_id_error_empty'] = 'No server selected'; +$wb['origin_error_empty'] = 'Zone empty.'; +$wb['origin_error_unique'] = 'There is already a record for this zone.'; +$wb['origin_error_regex'] = 'Zone has a invalid format.'; +$wb['ns_error_regex'] = 'NS has a invalid format.'; +$wb['mbox_error_empty'] = 'Email is empty.'; +$wb['mbox_error_regex'] = 'Email format invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_soa_list.lng new file mode 100644 index 000000000..42bb32920 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_srv.lng new file mode 100644 index 000000000..d4ea60be9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_template.lng new file mode 100644 index 000000000..3a09e3bb7 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_template_list.lng new file mode 100644 index 000000000..8d9d730e5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_txt.lng new file mode 100644 index 000000000..8e6c417d0 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/se_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/se_dns_wizard.lng new file mode 100644 index 000000000..ffceabb53 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/se_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk.lng b/interface/ispconfig/interface/dns/lib/lang/sk.lng new file mode 100644 index 000000000..a7f983618 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_a.lng new file mode 100644 index 000000000..ce9974d2f --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_a_list.lng new file mode 100644 index 000000000..d1124a953 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_aaaa.lng new file mode 100644 index 000000000..03dfe3fc6 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_alias.lng new file mode 100644 index 000000000..a7b4cb228 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_cname.lng new file mode 100644 index 000000000..dc768706b --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_hinfo.lng new file mode 100644 index 000000000..33b814fe2 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_mx.lng new file mode 100644 index 000000000..d179568ae --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_ns.lng new file mode 100644 index 000000000..5df4592eb --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_ptr.lng new file mode 100644 index 000000000..cac489d05 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_rp.lng new file mode 100644 index 000000000..582b61c12 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa.lng new file mode 100644 index 000000000..98de52e15 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa.lng @@ -0,0 +1,26 @@ +tieto IP (comma separated list)'; +$wb['active_txt'] = 'Actívova?'; +$wb['limit_dns_zone_txt'] = 'Max. po?et zón DNS pre váš ú?et je dosiahnutý.'; +$wb['client_txt'] = 'Klient'; +$wb['no_zone_perm'] = 'Nemáte oprávnenie prida? záznam do tejto zóny DNS.'; +$wb['server_id_error_empty'] = 'Žiaden vybraný server'; +$wb['origin_error_empty'] = 'Prazdna zóna.'; +$wb['origin_error_unique'] = 'V sú?asnosti už existuje záznam pre túto zónu.'; +$wb['origin_error_regex'] = 'Zóna má neplatný formát.'; +$wb['ns_error_regex'] = 'NS má neplatný formát.'; +$wb['mbox_error_empty'] = 'Email je prázdny.'; +$wb['mbox_error_regex'] = 'Email má neplatný formát.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa_list.lng new file mode 100644 index 000000000..91a978802 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_srv.lng new file mode 100644 index 000000000..7f867d3af --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_template.lng new file mode 100644 index 000000000..4dd637f58 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_template_list.lng new file mode 100644 index 000000000..0a7c5d7e9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_txt.lng new file mode 100644 index 000000000..e0137c0dc --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/sk_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/sk_dns_wizard.lng new file mode 100644 index 000000000..7c845c7e9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/sk_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr.lng b/interface/ispconfig/interface/dns/lib/lang/tr.lng new file mode 100644 index 000000000..36def8e93 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_a.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_a.lng new file mode 100644 index 000000000..097833f02 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_a.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_a_list.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_a_list.lng new file mode 100644 index 000000000..77dcb8397 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_a_list.lng @@ -0,0 +1,14 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_aaaa.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_aaaa.lng new file mode 100644 index 000000000..3bcf25061 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_aaaa.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_alias.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_alias.lng new file mode 100644 index 000000000..da1e6e616 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_alias.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_cname.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_cname.lng new file mode 100644 index 000000000..d74cfebc9 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_cname.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_hinfo.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_hinfo.lng new file mode 100644 index 000000000..7585d1365 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_hinfo.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_mx.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_mx.lng new file mode 100644 index 000000000..201f686ec --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_mx.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_ns.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_ns.lng new file mode 100644 index 000000000..0a5ef9338 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_ns.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_ptr.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_ptr.lng new file mode 100644 index 000000000..e34394522 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_ptr.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_rp.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_rp.lng new file mode 100644 index 000000000..f444fb0e1 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_rp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa.lng new file mode 100644 index 000000000..756ea05d2 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa.lng @@ -0,0 +1,26 @@ +these IPs (comma separated list)'; +$wb['active_txt'] = 'Aktif'; +$wb['limit_dns_zone_txt'] = 'Hesabınızdaki max. DNS zone kaydına ulaşıldı.'; +$wb['client_txt'] = 'Müşteri'; +$wb['no_zone_perm'] = 'Bu DNS Zone kaydını eklemek için yetkiniz yok.'; +$wb['server_id_error_empty'] = 'Seçili sunucu yok'; +$wb['origin_error_empty'] = 'Zone boÅŸ.'; +$wb['origin_error_unique'] = 'Bu zone için bir kayıt zaten var.'; +$wb['origin_error_regex'] = 'Zone geçersiz formatta.'; +$wb['ns_error_regex'] = 'NS geçersiz formatta.'; +$wb['mbox_error_empty'] = 'Email boÅŸ.'; +$wb['mbox_error_regex'] = 'Email geçersiz formatta.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['update_acl_txt'] = 'Update ACL'; +?> diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa_list.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa_list.lng new file mode 100644 index 000000000..4670b20f5 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_soa_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_srv.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_srv.lng new file mode 100644 index 000000000..c56d06eda --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_srv.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_template.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_template.lng new file mode 100644 index 000000000..1c973fa6d --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_template.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_template_list.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_template_list.lng new file mode 100644 index 000000000..9bc064c76 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_template_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_txt.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_txt.lng new file mode 100644 index 000000000..b2475219e --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_txt.lng @@ -0,0 +1,15 @@ + diff --git a/interface/ispconfig/interface/dns/lib/lang/tr_dns_wizard.lng b/interface/ispconfig/interface/dns/lib/lang/tr_dns_wizard.lng new file mode 100644 index 000000000..dbd4d5a88 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/lang/tr_dns_wizard.lng @@ -0,0 +1,29 @@ + diff --git a/interface/ispconfig/interface/dns/lib/module.conf.php b/interface/ispconfig/interface/dns/lib/module.conf.php new file mode 100644 index 000000000..ae7e8c456 --- /dev/null +++ b/interface/ispconfig/interface/dns/lib/module.conf.php @@ -0,0 +1,57 @@ + "Add DNS Zone", + 'target' => 'content', + 'link' => 'dns/dns_wizard.php'); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + + $items[] = array( 'title' => "Templates", + 'target' => 'content', + 'link' => 'dns/dns_template_list.php'); +} + + +$module["nav"][] = array( 'title' => 'DNS Wizard', + 'open' => 1, + 'items' => $items); + + +unset($items); + +/* + Email accounts menu +*/ + + +$items[] = array( 'title' => "Zones", + 'target' => 'content', + 'link' => 'dns/dns_soa_list.php'); +/* +$items[] = array( 'title' => "A-Records", + 'target' => 'content', + 'link' => 'dns/dns_a_list.php'); +*/ + + +$module["nav"][] = array( 'title' => 'DNS', + 'open' => 1, + 'items' => $items); + +unset($items); + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/list/dns_a.list.php b/interface/ispconfig/interface/dns/list/dns_a.list.php new file mode 100644 index 000000000..54470cfc1 --- /dev/null +++ b/interface/ispconfig/interface/dns/list/dns_a.list.php @@ -0,0 +1,127 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
Yes
",'n' => "
No
")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "zone", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,origin FROM dns_soa WHERE {AUTHSQL} ORDER BY origin', + 'keyfield'=> 'id', + 'valuefield'=> 'origin' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "data", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "aux", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "type", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('A'=>'A','AAAA' => 'AAAA','ALIAS'=>'ALIAS','CNAME'=>'CNAME','HINFO'=>'HINFO','MX'=>'MX','NS'=>'NS','PTR'=>'PTR','RP'=>'RP','SRV'=>'SRV','TXT'=>'TXT')); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/list/dns_soa.list.php b/interface/ispconfig/interface/dns/list/dns_soa.list.php new file mode 100644 index 000000000..3e5fae6a9 --- /dev/null +++ b/interface/ispconfig/interface/dns/list/dns_soa.list.php @@ -0,0 +1,111 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
Yes
",'n' => "
No
")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'CUSTOM', + 'class'=> 'custom_datasource', + 'function'=> 'dns_servers' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "origin", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "ns", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "mbox", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/list/dns_template.list.php b/interface/ispconfig/interface/dns/list/dns_template.list.php new file mode 100644 index 000000000..11a1919b1 --- /dev/null +++ b/interface/ispconfig/interface/dns/list/dns_template.list.php @@ -0,0 +1,80 @@ + "visible", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
Yes
",'N' => "
No
")); + + +$liste["item"][] = array( 'field' => "name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/dns/templates/dns_a_edit.htm b/interface/ispconfig/interface/dns/templates/dns_a_edit.htm new file mode 100644 index 000000000..4bf2bd259 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_a_edit.htm @@ -0,0 +1,39 @@ +

+

+ +
+ +
+
+
+ + +

{tmpl_var name='name_hint_txt'}

+
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_a_list.htm b/interface/ispconfig/interface/dns/templates/dns_a_list.htm new file mode 100644 index 000000000..19d35c21b --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_a_list.htm @@ -0,0 +1,85 @@ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ + + + + + + + + + + +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="type"}{tmpl_var name="name"}{tmpl_var name="data"}{tmpl_var name="aux"} + +
+
+
diff --git a/interface/ispconfig/interface/dns/templates/dns_aaaa_edit.htm b/interface/ispconfig/interface/dns/templates/dns_aaaa_edit.htm new file mode 100644 index 000000000..85085327a --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_aaaa_edit.htm @@ -0,0 +1,39 @@ +

+

+ +
+ +
+
+
+ + +

{tmpl_var name='name_hint_txt'}

+
+
+ + +
+
+ + +
+
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_alias_edit.htm b/interface/ispconfig/interface/dns/templates/dns_alias_edit.htm new file mode 100644 index 000000000..4300af42c --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_alias_edit.htm @@ -0,0 +1,38 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_cname_edit.htm b/interface/ispconfig/interface/dns/templates/dns_cname_edit.htm new file mode 100644 index 000000000..103b743fc --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_cname_edit.htm @@ -0,0 +1,38 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_hinfo_edit.htm b/interface/ispconfig/interface/dns/templates/dns_hinfo_edit.htm new file mode 100644 index 000000000..902911119 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_hinfo_edit.htm @@ -0,0 +1,38 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_mx_edit.htm b/interface/ispconfig/interface/dns/templates/dns_mx_edit.htm new file mode 100644 index 000000000..f8547245d --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_mx_edit.htm @@ -0,0 +1,42 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_ns_edit.htm b/interface/ispconfig/interface/dns/templates/dns_ns_edit.htm new file mode 100644 index 000000000..9141b3b1e --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_ns_edit.htm @@ -0,0 +1,38 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_ptr_edit.htm b/interface/ispconfig/interface/dns/templates/dns_ptr_edit.htm new file mode 100644 index 000000000..58901cdc9 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_ptr_edit.htm @@ -0,0 +1,38 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_records_edit.htm b/interface/ispconfig/interface/dns/templates/dns_records_edit.htm new file mode 100644 index 000000000..1feb3f970 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_records_edit.htm @@ -0,0 +1,12 @@ +

+

+ +
+ + {tmpl_var name='dns_records'} + +
+ +
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_rp_edit.htm b/interface/ispconfig/interface/dns/templates/dns_rp_edit.htm new file mode 100644 index 000000000..93f1e89e9 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_rp_edit.htm @@ -0,0 +1,38 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_soa_edit.htm b/interface/ispconfig/interface/dns/templates/dns_soa_edit.htm new file mode 100644 index 000000000..ef855a836 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_soa_edit.htm @@ -0,0 +1,95 @@ +

+

+ +
+ +
+
DNS Zone + +
+ + +
+
+ + +
+
+ +
+ + +
+
+
+ + +

e.g. domain.tld.

+
+
+ + +

e.g. ns1.domain.tld.

+
+
+ + +

e.g. webmaster.domain.tld.

+
+
+ +  Seconds +
+
+ +  Seconds +
+
+ +  Seconds +
+
+ +  Seconds +
+
+ +  Seconds +
+
+ + +
+
+ + +
+
+ + +
+ +
+

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_soa_list.htm b/interface/ispconfig/interface/dns/templates/dns_soa_list.htm new file mode 100644 index 000000000..46d0160ca --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_soa_list.htm @@ -0,0 +1,62 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="server_id"}{tmpl_var name="origin"}{tmpl_var name="ns"}{tmpl_var name="mbox"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_srv_edit.htm b/interface/ispconfig/interface/dns/templates/dns_srv_edit.htm new file mode 100644 index 000000000..bfa35fd7f --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_srv_edit.htm @@ -0,0 +1,38 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_template_edit.htm b/interface/ispconfig/interface/dns/templates/dns_template_edit.htm new file mode 100644 index 000000000..34cf3b1e0 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_template_edit.htm @@ -0,0 +1,38 @@ +

+

+ +
+ +
+
+
+ + +
+
+

{tmpl_var name='fields_txt'}

+
+ {tmpl_var name='fields'} +
+
+
+ + +
+
+

{tmpl_var name='visible_txt'}

+
+ {tmpl_var name='visible'} +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_template_list.htm b/interface/ispconfig/interface/dns/templates/dns_template_list.htm new file mode 100644 index 000000000..a698a9738 --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_template_list.htm @@ -0,0 +1,53 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="visible"}{tmpl_var name="name"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_txt_edit.htm b/interface/ispconfig/interface/dns/templates/dns_txt_edit.htm new file mode 100644 index 000000000..d1408a9dc --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_txt_edit.htm @@ -0,0 +1,38 @@ +

+

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

{tmpl_var name='active_txt'}

+
+ {tmpl_var name='active'} +
+
+
+ + + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/dns/templates/dns_wizard.htm b/interface/ispconfig/interface/dns/templates/dns_wizard.htm new file mode 100644 index 000000000..f8cd6021f --- /dev/null +++ b/interface/ispconfig/interface/dns/templates/dns_wizard.htm @@ -0,0 +1,80 @@ +

+

+ + +

ERROR

+
+ +
+ +
+
DNS Zone +
+ + +
+ +
+ + +
+
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/help/form/support_message.tform.php b/interface/ispconfig/interface/help/form/support_message.tform.php new file mode 100644 index 000000000..b48dce242 --- /dev/null +++ b/interface/ispconfig/interface/help/form/support_message.tform.php @@ -0,0 +1,120 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + + +//* Begin of the form definition of the first tab. The name of the tab is called "message". We refer +//* to this name in the $form["tab_default"] setting above. +$form["tabs"]['message'] = array ( + 'title' => "Message", // Title of the Tab + 'width' => 100, // Tab width + 'template' => "templates/support_message_edit.htm", // Template file name + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'recipient_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'recipient_id_is_not_integer'), + ), + 'value' => '' + ), + 'sender_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'recipient_id_is_not_integer'), + ), + 'value' => '' + ), + 'subject' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'subject_is_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'message' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXTAREA', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'message_is_empty'), + ), + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10', + 'maxlength' => '255' + ), + 'tstamp' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => time(), + 'value' => '', + 'width' => '30', + 'maxlength' => '30' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/index.php b/interface/ispconfig/interface/help/index.php new file mode 100644 index 000000000..36a23159b --- /dev/null +++ b/interface/ispconfig/interface/help/index.php @@ -0,0 +1,16 @@ + + + +ISPConfig Help + + + +
+

 

+

 

+

 

+

 

+

 

+
+ + \ No newline at end of file diff --git a/interface/ispconfig/interface/help/lib/admin.conf.php b/interface/ispconfig/interface/help/lib/admin.conf.php new file mode 100644 index 000000000..58a17b038 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/admin.conf.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/help/lib/lang/bg.lng b/interface/ispconfig/interface/help/lib/lang/bg.lng new file mode 100644 index 000000000..b93106e6c --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/bg.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/bg_support_message.lng b/interface/ispconfig/interface/help/lib/lang/bg_support_message.lng new file mode 100644 index 000000000..b6d979ad0 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/bg_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/bg_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/bg_support_message_list.lng new file mode 100644 index 000000000..1a5c21c50 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/bg_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/br.lng b/interface/ispconfig/interface/help/lib/lang/br.lng new file mode 100644 index 000000000..3f45599aa --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/br.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/br_support_message.lng b/interface/ispconfig/interface/help/lib/lang/br_support_message.lng new file mode 100644 index 000000000..99dcf309f --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/br_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/br_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/br_support_message_list.lng new file mode 100644 index 000000000..d5ba95829 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/br_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/de.lng b/interface/ispconfig/interface/help/lib/lang/de.lng new file mode 100644 index 000000000..2627e48e9 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/de.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/de_support_message.lng b/interface/ispconfig/interface/help/lib/lang/de_support_message.lng new file mode 100644 index 000000000..b026b17a8 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/de_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/de_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/de_support_message_list.lng new file mode 100644 index 000000000..72734756a --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/de_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/en.lng b/interface/ispconfig/interface/help/lib/lang/en.lng new file mode 100644 index 000000000..369cbb9a8 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/en.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/en_support_message.lng b/interface/ispconfig/interface/help/lib/lang/en_support_message.lng new file mode 100644 index 000000000..25e3221e7 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/en_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/en_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/en_support_message_list.lng new file mode 100644 index 000000000..9f2b3fd37 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/en_support_message_list.lng @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/help/lib/lang/es.lng b/interface/ispconfig/interface/help/lib/lang/es.lng new file mode 100644 index 000000000..dc4e98582 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/es.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/es_support_message.lng b/interface/ispconfig/interface/help/lib/lang/es_support_message.lng new file mode 100644 index 000000000..80a7d97cb --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/es_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/es_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/es_support_message_list.lng new file mode 100644 index 000000000..0ff8eb931 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/es_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fi.lng b/interface/ispconfig/interface/help/lib/lang/fi.lng new file mode 100644 index 000000000..cd13f9c03 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fi.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fi_support_message.lng b/interface/ispconfig/interface/help/lib/lang/fi_support_message.lng new file mode 100644 index 000000000..1e693bc6e --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fi_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fi_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/fi_support_message_list.lng new file mode 100644 index 000000000..4bbc1de79 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fi_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fr.lng b/interface/ispconfig/interface/help/lib/lang/fr.lng new file mode 100644 index 000000000..124280678 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fr.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fr_support_message.lng b/interface/ispconfig/interface/help/lib/lang/fr_support_message.lng new file mode 100644 index 000000000..690a91254 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fr_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/fr_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/fr_support_message_list.lng new file mode 100644 index 000000000..ac63d3f6e --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/fr_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/hu.lng b/interface/ispconfig/interface/help/lib/lang/hu.lng new file mode 100644 index 000000000..0dc1ac1a3 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/hu.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/hu_support_message.lng b/interface/ispconfig/interface/help/lib/lang/hu_support_message.lng new file mode 100644 index 000000000..65a327645 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/hu_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/hu_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/hu_support_message_list.lng new file mode 100644 index 000000000..7e71ebc1e --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/hu_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/it.lng b/interface/ispconfig/interface/help/lib/lang/it.lng new file mode 100644 index 000000000..a5da077c9 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/it.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/it_support_message.lng b/interface/ispconfig/interface/help/lib/lang/it_support_message.lng new file mode 100644 index 000000000..240e6f20d --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/it_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/it_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/it_support_message_list.lng new file mode 100644 index 000000000..95f3558a2 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/it_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ja.lng b/interface/ispconfig/interface/help/lib/lang/ja.lng new file mode 100644 index 000000000..57fa64e0f --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ja.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ja_support_message.lng b/interface/ispconfig/interface/help/lib/lang/ja_support_message.lng new file mode 100644 index 000000000..b4e6e0227 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ja_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ja_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/ja_support_message_list.lng new file mode 100644 index 000000000..0a68de95b --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ja_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/nl.lng b/interface/ispconfig/interface/help/lib/lang/nl.lng new file mode 100644 index 000000000..170c3d6ad --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/nl.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/nl_support_message.lng b/interface/ispconfig/interface/help/lib/lang/nl_support_message.lng new file mode 100644 index 000000000..d2aed4cb6 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/nl_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/nl_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/nl_support_message_list.lng new file mode 100644 index 000000000..0d7b2cb74 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/nl_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/pl.lng b/interface/ispconfig/interface/help/lib/lang/pl.lng new file mode 100644 index 000000000..51ca7ccc8 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pl.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/pl_support_message.lng b/interface/ispconfig/interface/help/lib/lang/pl_support_message.lng new file mode 100644 index 000000000..b21539af2 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pl_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/pl_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/pl_support_message_list.lng new file mode 100644 index 000000000..bc3285694 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pl_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/pt.lng b/interface/ispconfig/interface/help/lib/lang/pt.lng new file mode 100644 index 000000000..adace22c8 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pt.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/pt_support_message.lng b/interface/ispconfig/interface/help/lib/lang/pt_support_message.lng new file mode 100644 index 000000000..ce48ca9d2 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pt_support_message.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/pt_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/pt_support_message_list.lng new file mode 100644 index 000000000..ffd7d85ce --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/pt_support_message_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/ro.lng b/interface/ispconfig/interface/help/lib/lang/ro.lng new file mode 100644 index 000000000..b97df1de6 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ro.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ro_support_message.lng b/interface/ispconfig/interface/help/lib/lang/ro_support_message.lng new file mode 100644 index 000000000..8769c8527 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ro_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ro_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/ro_support_message_list.lng new file mode 100644 index 000000000..34aebb877 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ro_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/ru.lng b/interface/ispconfig/interface/help/lib/lang/ru.lng new file mode 100644 index 000000000..be5e01da8 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ru.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/ru_support_message.lng b/interface/ispconfig/interface/help/lib/lang/ru_support_message.lng new file mode 100644 index 000000000..d59eb1f55 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ru_support_message.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/ru_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/ru_support_message_list.lng new file mode 100644 index 000000000..679d55c34 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/ru_support_message_list.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/help/lib/lang/se.lng b/interface/ispconfig/interface/help/lib/lang/se.lng new file mode 100644 index 000000000..16a245dc0 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/se.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/se_support_message.lng b/interface/ispconfig/interface/help/lib/lang/se_support_message.lng new file mode 100644 index 000000000..25e3221e7 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/se_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/se_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/se_support_message_list.lng new file mode 100644 index 000000000..d6bc2aac3 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/se_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/sk.lng b/interface/ispconfig/interface/help/lib/lang/sk.lng new file mode 100644 index 000000000..f359d0c4a --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/sk.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/sk_support_message.lng b/interface/ispconfig/interface/help/lib/lang/sk_support_message.lng new file mode 100644 index 000000000..08d0eae6c --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/sk_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/sk_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/sk_support_message_list.lng new file mode 100644 index 000000000..9d432bf89 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/sk_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/tr.lng b/interface/ispconfig/interface/help/lib/lang/tr.lng new file mode 100644 index 000000000..b38ed5ff7 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/tr.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/tr_support_message.lng b/interface/ispconfig/interface/help/lib/lang/tr_support_message.lng new file mode 100644 index 000000000..25e3221e7 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/tr_support_message.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/help/lib/lang/tr_support_message_list.lng b/interface/ispconfig/interface/help/lib/lang/tr_support_message_list.lng new file mode 100644 index 000000000..acdb363da --- /dev/null +++ b/interface/ispconfig/interface/help/lib/lang/tr_support_message_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/help/lib/module.conf.php b/interface/ispconfig/interface/help/lib/module.conf.php new file mode 100644 index 000000000..9211aed06 --- /dev/null +++ b/interface/ispconfig/interface/help/lib/module.conf.php @@ -0,0 +1,60 @@ + 'Send message', + 'target' => 'content', + 'link' => 'help/support_message_edit.php'); + +//* Add a menu item with the label 'View messages' +$items[] = array( 'title' => 'View messages', + 'target' => 'content', + 'link' => 'help/support_message_list.php'); + + +//* Add the menu items defined above to a menu section labeled 'Support' +$module['nav'][] = array( 'title' => 'Support', + 'open' => 1, + 'items' => $items); + + +if($_SESSION['s']['user']['typ'] == 'admin') { +//* make sure that the items array is empty +$items = array(); + +//* Add a menu item with the label 'View messages' +$items[] = array( 'title' => 'Version', + 'target' => 'content', + 'link' => 'help/version.php'); + + +//* Add the menu items defined above to a menu section labeled 'Support' +$module['nav'][] = array( 'title' => 'About ISPConfig', + 'open' => 1, + 'items' => $items); + +} + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/list/support_message.list.php b/interface/ispconfig/interface/help/list/support_message.list.php new file mode 100644 index 000000000..c6975d2cb --- /dev/null +++ b/interface/ispconfig/interface/help/list/support_message.list.php @@ -0,0 +1,62 @@ + 'sender_id', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => '=', + 'prefix' => '', + 'suffix' => '', + 'width' => '', + 'datasource'=> array ( 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'value' => ''); + +$liste['item'][] = array( 'field' => 'subject', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => ''); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/support_message_del.php b/interface/ispconfig/interface/help/support_message_del.php new file mode 100644 index 000000000..16db6040a --- /dev/null +++ b/interface/ispconfig/interface/help/support_message_del.php @@ -0,0 +1,48 @@ +auth->check_module_permissions('help'); + +//* Load the form +$app->uses('tform_actions'); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/support_message_edit.php b/interface/ispconfig/interface/help/support_message_edit.php new file mode 100644 index 000000000..8223a0000 --- /dev/null +++ b/interface/ispconfig/interface/help/support_message_edit.php @@ -0,0 +1,71 @@ +auth->check_module_permissions('help'); + +//* Loading the templating and form classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +//* Creating a class page_action that extends the tform_actions base class +class page_action extends tform_actions { + + //* Custom onSubmit Event handler + function onSubmit() + { + global $app, $conf; + + //* If the current user is not the admin user + if($_SESSION['s']['user']['typ'] != 'admin') { + //* Set the admin as recipient + $this->dataRecord['recipient_id'] = 1; + } + + //* Set the sender_id field to the ID of the current user + $this->dataRecord['sender_id'] = $_SESSION['s']['user']['userid']; + + //* call the onSubmit function of the parent class + parent::onSubmit(); + } + + //* Custom onShow Event handler + function onShow() + { + global $app, $conf; + + //* We do not want that messages get edited, so we switch to a + //* read only template if a existing message is loaded + if($this->id > 0) { + $app->tform->formDef['tabs']['message']['template'] = 'templates/support_message_view.htm'; + } + + //* call the onShow function of the parent class + parent::onShow(); + } + + function onAfterInsert() + { + global $app, $conf; + + if($_SESSION['s']['user']['typ'] == 'admin') { + $app->db->query("UPDATE support_message SET sys_userid = ".$this->dataRecord['recipient_id']." WHERE support_message_id = ".$this->id); + } + + } + +} + +//* Create the new page object +$page = new page_action(); + +//* Start the page rendering and action handling +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/support_message_list.php b/interface/ispconfig/interface/help/support_message_list.php new file mode 100644 index 000000000..c03bcde77 --- /dev/null +++ b/interface/ispconfig/interface/help/support_message_list.php @@ -0,0 +1,20 @@ +auth->check_module_permissions('help'); + +//* Loading the class +$app->uses('listform_actions'); + +//* Optional limit +$app->listform_actions->SQLExtWhere = "recipient_id = ".$_SESSION['s']['user']['userid']; + +//* Start the form rendering and action ahndling +$app->listform_actions->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/help/templates/support_message_edit.htm b/interface/ispconfig/interface/help/templates/support_message_edit.htm new file mode 100644 index 000000000..305a47a2b --- /dev/null +++ b/interface/ispconfig/interface/help/templates/support_message_edit.htm @@ -0,0 +1,33 @@ +

+

+ +
+ +
+
Message +
+ + +
+
+ + +
+
+ + +
+
+ + + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/help/templates/support_message_list.htm b/interface/ispconfig/interface/help/templates/support_message_list.htm new file mode 100644 index 000000000..02662ad29 --- /dev/null +++ b/interface/ispconfig/interface/help/templates/support_message_list.htm @@ -0,0 +1,53 @@ +

+

+ +
+ +
+
{tmpl_var name="toolsarea_head_txt"} +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
{tmpl_var name="sender_id"}{tmpl_var name="subject"} + +
+
+
+ +
diff --git a/interface/ispconfig/interface/help/templates/support_message_view.htm b/interface/ispconfig/interface/help/templates/support_message_view.htm new file mode 100644 index 000000000..37cb1e4b3 --- /dev/null +++ b/interface/ispconfig/interface/help/templates/support_message_view.htm @@ -0,0 +1,26 @@ +

+

+ +
+ +
+
Message +
+ + +
+
+ + +
+
+ + + +
+ + +
+
+ +
diff --git a/interface/ispconfig/interface/help/version.php b/interface/ispconfig/interface/help/version.php new file mode 100644 index 000000000..45120f800 --- /dev/null +++ b/interface/ispconfig/interface/help/version.php @@ -0,0 +1,50 @@ +auth->check_module_permissions('admin'); + +echo '

 

 

'.$app->lng('ISPConfig Version:').' '.ISPC_APP_VERSION.'

'; + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/index.htm b/interface/ispconfig/interface/index.htm new file mode 100644 index 000000000..39606dbb3 --- /dev/null +++ b/interface/ispconfig/interface/index.htm @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/interface/ispconfig/interface/index.php b/interface/ispconfig/interface/index.php new file mode 100644 index 000000000..9c312824e --- /dev/null +++ b/interface/ispconfig/interface/index.php @@ -0,0 +1,41 @@ +uses('tpl'); +$app->tpl->newTemplate('main.tpl.htm'); + +$app->tpl_defaults(); +$app->tpl->pparse(); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/js/scrigo.js.php b/interface/ispconfig/interface/js/scrigo.js.php new file mode 100644 index 000000000..1d468de5d --- /dev/null +++ b/interface/ispconfig/interface/js/scrigo.js.php @@ -0,0 +1,503 @@ + + +redirect = ''; + +function loadContentfRefresh(pagename) { + var pageContentCallbackRefresh = { + success: function(o) { + document.getElementById('pageContent').innerHTML = o.responseText; + }, + failure: function(o) { + alert('Ajax Request was not successful.'+pagename); + } + } + + if(document.getElementById('refreshinterval').value > 0) { + var pageContentObject2 = YAHOO.util.Connect.asyncRequest('GET', pagename+"&refresh="+document.getElementById('refreshinterval').value, pageContentCallbackRefresh); + setTimeout( "loadContentRefresh('"+pagename+"&refresh="+document.getElementById('refreshinterval').value+"')", document.getElementById('refreshinterval').value*1000 ); + } +} + +function capp(module) { + var cappCallback = { + success: function(o) { + if(o.responseText != '') { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + loadContent(parts[1]); + } else { + alert(o.responseText); + } + } + loadMenus(); + }, + failure: function(o) { + alert('Ajax Request was not successful.'); + } + } + var submitFormObj = YAHOO.util.Connect.asyncRequest('GET', 'capp.php?mod='+module, cappCallback); +} + +function submitLoginForm(formname) { + + var submitFormCallback = { + success: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + //alert(parts[1]); + loadContent(parts[1]); + //redirect = parts[1]; + //window.setTimeout('loadContent(redirect)', 1000); + } else if (o.responseText.indexOf('LOGIN_REDIRECT:') > -1) { + // Go to the login page + document.location.href = 'index.php'; + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + loadMenus(); + }, + failure: function(o) { + alert('Ajax Request was not successful.'); + } + } + + //* Validate form. TODO: username and password with strip(); + var frm = document.getElementById(formname); + var userNameObj = frm.username; + if(userNameObj.value == ''){ + userNameObj.focus(); + return; + } + var passwordObj = frm.passwort; + if(passwordObj.value == ''){ + passwordObj.focus(); + return; + } + YAHOO.util.Connect.setForm(formname); + var submitFormObj = YAHOO.util.Connect.asyncRequest('POST', 'content.php', submitFormCallback); + /* + if(redirect != '') { + loadContent(redirect); + redirect = ''; + } + document.getElementById('footer').innerHTML = 'Powered by ISPConfig'; + */ + +} + +function submitForm(formname,target) { + + var submitFormCallback = { + success: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + //alert(parts[1]); + loadContent(parts[1]); + //redirect = parts[1]; + //window.setTimeout('loadContent(redirect)', 1000); + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + }, + failure: function(o) { + var parts = o.responseText.split(':'); + alert('Ajax Request was not successful. '+parts[1]); + } + } + + YAHOO.util.Connect.setForm(formname); + var submitFormObj = YAHOO.util.Connect.asyncRequest('POST', target, submitFormCallback); + /* + if(redirect != '') { + loadContent(redirect); + redirect = ''; + } + */ +} + +function submitUploadForm(formname,target) { + + var submitFormCallback = { + success: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + //alert(parts[1]); + loadContent(parts[1]); + //redirect = parts[1]; + //window.setTimeout('loadContent(redirect)', 1000); + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + }, + upload: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + //alert(parts[1]); + loadContent(parts[1]); + //redirect = parts[1]; + //window.setTimeout('loadContent(redirect)', 1000); + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + }, + failure: function(o) { + alert('Ajax Request was not successful. 1'); + } + } + + YAHOO.util.Connect.setForm(formname,true); + var submitFormObj = YAHOO.util.Connect.asyncRequest('POST', target, submitFormCallback); + /* + if(redirect != '') { + loadContent(redirect); + redirect = ''; + } + */ +} + +function loadContent(pagename) { + var pageContentCallback2 = { + success: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(':'); + loadContent(parts[1]); + } else if (o.responseText.indexOf('URL_REDIRECT:') > -1) { + var newUrl= o.responseText.substr(o.responseText.indexOf('URL_REDIRECT:') + "URL_REDIRECT:".length); + document.location.href = newUrl; + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + }, + failure: function(o) { + alert('Ajax Request was not successful.'); + } + } + + + var pageContentObject2 = YAHOO.util.Connect.asyncRequest('GET', pagename, pageContentCallback2); +} + + +function loadInitContent() { + + var pageContentCallback = { + success: function(o) { + if(o.responseText.indexOf('HEADER_REDIRECT:') > -1) { + var parts = o.responseText.split(":"); + loadContent(parts[1]); + } else { + document.getElementById('pageContent').innerHTML = o.responseText; + } + + /* + var items = document.getElementsByTagName('input'); + for(i=0;i,<\" ")) { + points += 1; + } + + if (points == 0) { + if (length >= 5 && length <=6) { + pass_result(1); + } else if (length >= 7 && length <=8) { + pass_result(2); + } else { + pass_result(3); + } + } else if (points == 1) { + if (length >= 5 && length <=6) { + pass_result(2); + } else if (length >= 7 && length <=10) { + pass_result(3); + } else { + pass_result(4); + } + } else if (points == 2) { + if (length >= 5 && length <=8) { + pass_result(3); + } else if (length >= 9 && length <=10) { + pass_result(4); + } else { + pass_result(5); + } + } else if (points == 3) { + if (length >= 5 && length <=6) { + pass_result(3); + } else if (length >= 7 && length <=8) { + pass_result(4); + } else { + pass_result(5); + } + } else if (points >= 4) { + if (length >= 5 && length <=6) { + pass_result(4); + } else { + pass_result(5); + } + } +} + + + +function pass_result(points, message) { + if (points == 0) { + width = 10; + } else { + width = points*20; + } + document.getElementById("passBar").innerHTML = '
'; + document.getElementById("passText").innerHTML = pass_messages[points]['text']; +} +function pass_contains(pass, check) { + for (i = 0; i < pass.length; i++) { + if (check.indexOf(pass.charAt(i)) > -1) { + return true; + } + } + return false; +} + +function addAdditionalTemplate(){ + var tpl_add = document.getElementById('template_additional').value; + + var tpl_list = document.getElementById('template_additional_list').innerHTML; + var addTemplate = document.getElementById('tpl_add_select').value.split('|',2); + var addTplId = addTemplate[0]; + var addTplText = addTemplate[1]; + if(addTplId > 0) { + var newVal = tpl_add + '/' + addTplId + '/'; + newVal = newVal.replace('//', '/'); + var newList = tpl_list + '
' + addTplText; + newList = newList.replace('

', '
'); + document.getElementById('template_additional').value = newVal; + document.getElementById('template_additional_list').innerHTML = newList; + alert('additional template ' + addTplText + ' added to customer'); + } else { + alert('no additional template selcted'); + } +} + +function delAdditionalTemplate(){ + var tpl_add = document.getElementById('template_additional').value; + if(tpl_add != '') { + var tpl_list = document.getElementById('template_additional_list').innerHTML; + var addTemplate = document.getElementById('tpl_add_select').value.split('|',2); + var addTplId = addTemplate[0]; + var addTplText = addTemplate[1]; + var newVal = tpl_add; + newVal = newVal.replace(addTplId, ''); + newVal = newVal.replace('//', '/'); + var newList = tpl_list.replace(addTplText, ''); + newList = newList.replace('

', '
'); + document.getElementById('template_additional').value = newVal; + document.getElementById('template_additional_list').innerHTML = newList; + alert('additional template ' + addTplText + ' deleted from customer'); + } else { + alert('no additional template selcted'); + } + +} diff --git a/interface/ispconfig/interface/js/uni-form/jquery.js b/interface/ispconfig/interface/js/uni-form/jquery.js new file mode 100644 index 000000000..7090c1c53 --- /dev/null +++ b/interface/ispconfig/interface/js/uni-form/jquery.js @@ -0,0 +1 @@ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[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}('7(1C 1w.6=="T"){1w.T=1w.T;B 6=u(a,c){7(1w==q)v 1p 6(a,c);a=a||17;7(6.1t(a))v 1p 6(17)[6.E.27?"27":"2O"](a);7(1C a=="23"){B m=/^[^<]*(<(.|\\s)+>)[^>]*$/.2Q(a);7(m)a=6.3k([m[1]]);J v 1p 6(c).2o(a)}v q.6r(a.1l==2y&&a||(a.3Y||a.I&&a!=1w&&!a.24&&a[0]!=T&&a[0].24)&&6.3M(a)||[a])};7(1C $!="T")6.2S$=$;B $=6;6.E=6.8p={3Y:"1.1.2",8q:u(){v q.I},I:0,2b:u(1T){v 1T==T?6.3M(q):q[1T]},2r:u(a){B L=6(a);L.6p=q;v L},6r:u(a){q.I=0;[].1g.14(q,a);v q},K:u(E,1E){v 6.K(q,E,1E)},2h:u(1c){B 4c=-1;q.K(u(i){7(q==1c)4c=i});v 4c},1I:u(1Y,O,C){B 1c=1Y;7(1Y.1l==3t)7(O==T)v q.I&&6[C||"1I"](q[0],1Y)||T;J{1c={};1c[1Y]=O}v q.K(u(2h){P(B H 1x 1c)6.1I(C?q.1q:q,H,6.H(q,1c[H],C,2h,H))})},1m:u(1Y,O){v q.1I(1Y,O,"30")},2L:u(e){7(1C e=="23")v q.3u().3r(17.8t(e));B t="";6.K(e||q,u(){6.K(q.2I,u(){7(q.24!=8)t+=q.24!=1?q.60:6.E.2L([q])})});v t},2K:u(){B a=6.3k(1A);v q.K(u(){B b=a[0].3l(U);q.11.2X(b,q);22(b.1b)b=b.1b;b.4C(q)})},3r:u(){v q.3j(1A,U,1,u(a){q.4C(a)})},5i:u(){v q.3j(1A,U,-1,u(a){q.2X(a,q.1b)})},5j:u(){v q.3j(1A,12,1,u(a){q.11.2X(a,q)})},5t:u(){v q.3j(1A,12,-1,u(a){q.11.2X(a,q.2e)})},4g:u(){v q.6p||6([])},2o:u(t){v q.2r(6.31(q,u(a){v 6.2o(t,a)}),t)},4Y:u(4N){v q.2r(6.31(q,u(a){B a=a.3l(4N!=T?4N:U);a.$1H=16;v a}))},1D:u(t){v q.2r(6.1t(t)&&6.2q(q,u(2z,2h){v t.14(2z,[2h])})||6.3z(t,q))},2g:u(t){v q.2r(t.1l==3t&&6.3z(t,q,U)||6.2q(q,u(a){v(t.1l==2y||t.3Y)?6.3y(a,t)<0:a!=t}))},1M:u(t){v q.2r(6.2k(q.2b(),t.1l==3t?6(t).2b():t.I!=T&&(!t.1f||t.1f=="8v")?t:[t]))},4l:u(1s){v 1s?6.1D(1s,q).r.I>0:12},1a:u(1a){v 1a==T?(q.I?q[0].O:16):q.1I("O",1a)},4U:u(1a){v 1a==T?(q.I?q[0].2t:16):q.3u().3r(1a)},3j:u(1E,1P,3Z,E){B 4Y=q.I>1;B a=6.3k(1E);7(3Z<0)a.8w();v q.K(u(){B 1c=q;7(1P&&6.1f(q,"1P")&&6.1f(a[0],"3m"))1c=q.5J("20")[0]||q.4C(17.6n("20"));6.K(a,u(){E.14(1c,[4Y?q.3l(U):q])})})}};6.1z=6.E.1z=u(){B 1O=1A[0],a=1;7(1A.I==1){1O=q;a=0}B H;22(H=1A[a++])P(B i 1x H)1O[i]=H[i];v 1O};6.1z({8x:u(){7(6.2S$)$=6.2S$;v 6},1t:u(E){v!!E&&1C E!="23"&&!E.1f&&1C E[0]=="T"&&/u/i.1n(E+"")},4B:u(D){v D.66&&D.5I&&!D.5I.64},1f:u(D,Y){v D.1f&&D.1f.3K()==Y.3K()},K:u(1c,E,1E){7(1c.I==T)P(B i 1x 1c)E.14(1c[i],1E||[i,1c[i]]);J P(B i=0,6q=1c.I;i<6q;i++)7(E.14(1c[i],1E||[i,1c[i]])===12)3O;v 1c},H:u(D,O,C,2h,H){7(6.1t(O))O=O.3n(D,[2h]);B 6s=/z-?2h|7P-?8A|1d|58|8B-?28/i;v O&&O.1l==3Q&&C=="30"&&!6s.1n(H)?O+"4S":O},19:{1M:u(D,c){6.K(c.3o(/\\s+/),u(i,Q){7(!6.19.2V(D.19,Q))D.19+=(D.19?" ":"")+Q})},2f:u(D,c){D.19=c?6.2q(D.19.3o(/\\s+/),u(Q){v!6.19.2V(c,Q)}).6t(" "):""},2V:u(t,c){t=t.19||t;c=c.1R(/([\\.\\\\\\+\\*\\?\\[\\^\\]\\$\\(\\)\\{\\}\\=\\!\\<\\>\\|\\:])/g,"\\\\$1");v t&&1p 4v("(^|\\\\s)"+c+"(\\\\s|$)").1n(t)}},4d:u(e,o,f){P(B i 1x o){e.1q["1N"+i]=e.1q[i];e.1q[i]=o[i]}f.14(e,[]);P(B i 1x o)e.1q[i]=e.1q["1N"+i]},1m:u(e,p){7(p=="28"||p=="3V"){B 1N={},46,3P,d=["7d","8C","8D","8E"];6.K(d,u(){1N["8F"+q]=0;1N["8G"+q+"8H"]=0});6.4d(e,1N,u(){7(6.1m(e,"1h")!="1Z"){46=e.8I;3P=e.8J}J{e=6(e.3l(U)).2o(":4j").5l("2Z").4g().1m({4n:"1G",45:"8K",1h:"2D",7I:"0",8M:"0"}).5z(e.11)[0];B 3d=6.1m(e.11,"45");7(3d==""||3d=="4b")e.11.1q.45="6x";46=e.6y;3P=e.6z;7(3d==""||3d=="4b")e.11.1q.45="4b";e.11.33(e)}});v p=="28"?46:3P}v 6.30(e,p)},30:u(D,H,53){B L;7(H=="1d"&&6.W.1j)v 6.1I(D.1q,"1d");7(H=="4h"||H=="2v")H=6.W.1j?"3T":"2v";7(!53&&D.1q[H])L=D.1q[H];J 7(17.44&&17.44.4W){7(H=="2v"||H=="3T")H="4h";H=H.1R(/([A-Z])/g,"-$1").4m();B Q=17.44.4W(D,16);7(Q)L=Q.55(H);J 7(H=="1h")L="1Z";J 6.4d(D,{1h:"2D"},u(){B c=17.44.4W(q,"");L=c&&c.55(H)||""})}J 7(D.51){B 56=H.1R(/\\-(\\w)/g,u(m,c){v c.3K()});L=D.51[H]||D.51[56]}v L},3k:u(a){B r=[];6.K(a,u(i,1r){7(!1r)v;7(1r.1l==3Q)1r=1r.6C();7(1C 1r=="23"){B s=6.35(1r),1V=17.6n("1V"),2i=[];B 2K=!s.18("<1u")&&[1,"<42>",""]||(!s.18("<6D")||!s.18("<20")||!s.18("<6E"))&&[1,"<1P>",""]||!s.18("<3m")&&[2,"<1P><20>",""]||(!s.18("<6F")||!s.18("<6G"))&&[3,"<1P><20><3m>",""]||[0,"",""];1V.2t=2K[1]+s+2K[2];22(2K[0]--)1V=1V.1b;7(6.W.1j){7(!s.18("<1P")&&s.18("<20")<0)2i=1V.1b&&1V.1b.2I;J 7(2K[1]=="<1P>"&&s.18("<20")<0)2i=1V.2I;P(B n=2i.I-1;n>=0;--n)7(6.1f(2i[n],"20")&&!2i[n].2I.I)2i[n].11.33(2i[n])}1r=[];P(B i=0,l=1V.2I.I;im[3]-0",2a:"m[3]-0==i",5q:"m[3]-0==i",2u:"i==0",2T:"i==r.I-1",5R:"i%2==0",5S:"i%2","2a-3s":"6.2a(a.11.1b,m[3],\'2e\',a)==a","2u-3s":"6.2a(a.11.1b,1,\'2e\')==a","2T-3s":"6.2a(a.11.7n,1,\'5s\')==a","7p-3s":"6.2B(a.11.1b).I==1",5u:"a.1b",3u:"!a.1b",5v:"6.E.2L.14([a]).18(m[3])>=0",3i:\'a.C!="1G"&&6.1m(a,"1h")!="1Z"&&6.1m(a,"4n")!="1G"\',1G:\'a.C=="1G"||6.1m(a,"1h")=="1Z"||6.1m(a,"4n")=="1G"\',7v:"!a.2W",2W:"a.2W",2Z:"a.2Z",2Y:"a.2Y||6.1I(a,\'2Y\')",2L:"a.C==\'2L\'",4j:"a.C==\'4j\'",5x:"a.C==\'5x\'",4G:"a.C==\'4G\'",5y:"a.C==\'5y\'",4R:"a.C==\'4R\'",5A:"a.C==\'5A\'",5B:"a.C==\'5B\'",3x:\'a.C=="3x"||6.1f(a,"3x")\',5C:"/5C|42|7A|3x/i.1n(a.1f)"},".":"6.19.2V(a,m[2])","@":{"=":"z==m[4]","!=":"z!=m[4]","^=":"z&&!z.18(m[4])","$=":"z&&z.2U(z.I - m[4].I,m[4].I)==m[4]","*=":"z&&z.18(m[4])>=0","":"z",4u:u(m){v["",m[1],m[3],m[2],m[5]]},5P:"z=a[m[3]];7(!z||/5E|3e/.1n(m[3]))z=6.1I(a,m[3]);"},"[":"6.2o(m[2],a).I"},5M:[/^\\[ *(@)([a-2m-3C-]*) *([!*$^=]*) *(\'?"?)(.*?)\\4 *\\]/i,/^(\\[)\\s*(.*?(\\[.*?\\])?[^[]*?)\\s*\\]/,/^(:)([a-2m-3C-]*)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/i,/^([:.#]*)([a-2m-3C*-]*)/i],1Q:[/^(\\/?\\.\\.)/,"a.11",/^(>|\\/)/,"6.2B(a.1b)",/^(\\+)/,"6.2a(a,2,\'2e\')",/^(~)/,u(a){B s=6.2B(a.11.1b);v s.3N(6.3y(a,s)+1)}],3z:u(1s,1U,2g){B 1N,Q=[];22(1s&&1s!=1N){1N=1s;B f=6.1D(1s,1U,2g);1s=f.t.1R(/^\\s*,\\s*/,"");Q=2g?1U=f.r:6.2k(Q,f.r)}v Q},2o:u(t,1B){7(1C t!="23")v[t];7(1B&&!1B.24)1B=16;1B=1B||17;7(!t.18("//")){1B=1B.4H;t=t.2U(2,t.I)}J 7(!t.18("/")){1B=1B.4H;t=t.2U(1,t.I);7(t.18("/")>=1)t=t.2U(t.18("/"),t.I)}B L=[1B],2c=[],2T=16;22(t&&2T!=t){B r=[];2T=t;t=6.35(t).1R(/^\\/\\//i,"");B 3B=12;B 1J=/^[\\/>]\\s*([a-2m-9*-]+)/i;B m=1J.2Q(t);7(m){6.K(L,u(){P(B c=q.1b;c;c=c.2e)7(c.24==1&&(6.1f(c,m[1])||m[1]=="*"))r.1g(c)});L=r;t=t.1R(1J,"");7(t.18(" ")==0)5F;3B=U}J{P(B i=0;i<6.1Q.I;i+=2){B 1J=6.1Q[i];B m=1J.2Q(t);7(m){r=L=6.31(L,6.1t(6.1Q[i+1])?6.1Q[i+1]:u(a){v 40(6.1Q[i+1])});t=6.35(t.1R(1J,""));3B=U;3O}}}7(t&&!3B){7(!t.18(",")){7(L[0]==1B)L.4L();6.2k(2c,L);r=L=[1B];t=" "+t.2U(1,t.I)}J{B 34=/^([a-2m-3C-]+)(#)([a-2m-9\\\\*2S-]*)/i;B m=34.2Q(t);7(m){m=[0,m[2],m[3],m[1]]}J{34=/^([#.]?)([a-2m-9\\\\*2S-]*)/i;m=34.2Q(t)}7(m[1]=="#"&&L[L.I-1].4X){B 2l=L[L.I-1].4X(m[2]);7(6.W.1j&&2l&&2l.2J!=m[2])2l=6(\'[@2J="\'+m[2]+\'"]\',L[L.I-1])[0];L=r=2l&&(!m[3]||6.1f(2l,m[3]))?[2l]:[]}J{7(m[1]==".")B 4r=1p 4v("(^|\\\\s)"+m[2]+"(\\\\s|$)");6.K(L,u(){B 3E=m[1]!=""||m[0]==""?"*":m[2];7(6.1f(q,"7J")&&3E=="*")3E="3g";6.2k(r,m[1]!=""&&L.I!=1?6.4x(q,[],m[1],m[2],4r):q.5J(3E))});7(m[1]=="."&&L.I==1)r=6.2q(r,u(e){v 4r.1n(e.19)});7(m[1]=="#"&&L.I==1){B 5K=r;r=[];6.K(5K,u(){7(q.36("2J")==m[2]){r=[q];v 12}})}L=r}t=t.1R(34,"")}}7(t){B 1a=6.1D(t,r);L=r=1a.r;t=6.35(1a.t)}}7(L&&L[0]==1B)L.4L();6.2k(2c,L);v 2c},1D:u(t,r,2g){22(t&&/^[a-z[({<*:.#]/i.1n(t)){B p=6.5M,m;6.K(p,u(i,1J){m=1J.2Q(t);7(m){t=t.7M(m[0].I);7(6.1s[m[1]].4u)m=6.1s[m[1]].4u(m);v 12}});7(m[1]==":"&&m[2]=="2g")r=6.1D(m[3],r,U).r;J 7(m[1]=="."){B 1J=1p 4v("(^|\\\\s)"+m[2]+"(\\\\s|$)");r=6.2q(r,u(e){v 1J.1n(e.19||"")},2g)}J{B f=6.1s[m[1]];7(1C f!="23")f=6.1s[m[1]][m[2]];40("f = u(a,i){"+(6.1s[m[1]].5P||"")+"v "+f+"}");r=6.2q(r,f,2g)}}v{r:r,t:t}},4x:u(o,r,1Q,Y,1J){P(B s=o.1b;s;s=s.2e)7(s.24==1){B 1M=U;7(1Q==".")1M=s.19&&1J.1n(s.19);J 7(1Q=="#")1M=s.36("2J")==Y;7(1M)r.1g(s);7(1Q=="#"&&r.I)3O;7(s.1b)6.4x(s,r,1Q,Y,1J)}v r},4z:u(D){B 4A=[];B Q=D.11;22(Q&&Q!=17){4A.1g(Q);Q=Q.11}v 4A},2a:u(Q,1i,3Z,D){1i=1i||1;B 1T=0;P(;Q;Q=Q[3Z]){7(Q.24==1)1T++;7(1T==1i||1i=="5R"&&1T%2==0&&1T>1&&Q==D||1i=="5S"&&1T%2==1&&Q==D)v Q}},2B:u(n,D){B r=[];P(;n;n=n.2e){7(n.24==1&&(!D||n!=D))r.1g(n)}v r}});6.G={1M:u(S,C,1o,F){7(6.W.1j&&S.3L!=T)S=1w;7(F)1o.F=F;7(!1o.2A)1o.2A=q.2A++;7(!S.$1H)S.$1H={};B 38=S.$1H[C];7(!38){38=S.$1H[C]={};7(S["39"+C])38[0]=S["39"+C]}38[1o.2A]=1o;S["39"+C]=q.5Y;7(!q.1k[C])q.1k[C]=[];q.1k[C].1g(S)},2A:1,1k:{},2f:u(S,C,1o){7(S.$1H){B i,j,k;7(C&&C.C){1o=C.1o;C=C.C}7(C&&S.$1H[C])7(1o)5U S.$1H[C][1o.2A];J P(i 1x S.$1H[C])5U S.$1H[C][i];J P(j 1x S.$1H)q.2f(S,j);P(k 1x S.$1H[C])7(k){k=U;3O}7(!k)S["39"+C]=16}},1S:u(C,F,S){F=6.3M(F||[]);7(!S)6.K(q.1k[C]||[],u(){6.G.1S(C,F,q)});J{B 1o=S["39"+C],1a,E=6.1t(S[C]);7(1o){F.61(q.2j({C:C,1O:S}));7((1a=1o.14(S,F))!==12)q.4F=U}7(E&&1a!==12)S[C]();q.4F=12}},5Y:u(G){7(1C 6=="T"||6.G.4F)v;G=6.G.2j(G||1w.G||{});B 3R;B c=q.$1H[G.C];B 1E=[].3N.3n(1A,1);1E.61(G);P(B j 1x c){1E[0].1o=c[j];1E[0].F=c[j].F;7(c[j].14(q,1E)===12){G.2n();G.2H();3R=12}}7(6.W.1j)G.1O=G.2n=G.2H=G.1o=G.F=16;v 3R},2j:u(G){7(!G.1O&&G.63)G.1O=G.63;7(G.65==T&&G.67!=T){B e=17.4H,b=17.64;G.65=G.67+(e.68||b.68);G.7Y=G.7Z+(e.6c||b.6c)}7(6.W.2N&&G.1O.24==3){B 3a=G;G=6.1z({},3a);G.1O=3a.1O.11;G.2n=u(){v 3a.2n()};G.2H=u(){v 3a.2H()}}7(!G.2n)G.2n=u(){q.3R=12};7(!G.2H)G.2H=u(){q.82=U};v G}};6.E.1z({3U:u(C,F,E){v q.K(u(){6.G.1M(q,C,E||F,F)})},6u:u(C,F,E){v q.K(u(){6.G.1M(q,C,u(G){6(q).6f(G);v(E||F).14(q,1A)},F)})},6f:u(C,E){v q.K(u(){6.G.2f(q,C,E)})},1S:u(C,F){v q.K(u(){6.G.1S(C,F,q)})},3X:u(){B a=1A;v q.6j(u(e){q.4M=q.4M==0?1:0;e.2n();v a[q.4M].14(q,[e])||12})},83:u(f,g){u 4O(e){B p=(e.C=="41"?e.84:e.85)||e.86;22(p&&p!=q)2G{p=p.11}2w(e){p=q};7(p==q)v 12;v(e.C=="41"?f:g).14(q,[e])}v q.41(4O).6k(4O)},27:u(f){7(6.3W)f.14(17,[6]);J{6.3c.1g(u(){v f.14(q,[6])})}v q}});6.1z({3W:12,3c:[],27:u(){7(!6.3W){6.3W=U;7(6.3c){6.K(6.3c,u(){q.14(17)});6.3c=16}7(6.W.3h||6.W.3f)17.87("6o",6.27,12)}}});1p u(){6.K(("88,8a,2O,8b,8d,52,6j,8e,"+"8f,8g,8h,41,6k,8j,42,"+"4R,8k,8l,8m,2C").3o(","),u(i,o){6.E[o]=u(f){v f?q.3U(o,f):q.1S(o)}});7(6.W.3h||6.W.3f)17.8n("6o",6.27,12);J 7(6.W.1j){17.8o("<8r"+"8s 2J=62 8u=U "+"3e=//:><\\/2d>");B 2d=17.4X("62");7(2d)2d.37=u(){7(q.3D!="1X")v;q.11.33(q);6.27()};2d=16}J 7(6.W.2N)6.50=3L(u(){7(17.3D=="8y"||17.3D=="1X"){4p(6.50);6.50=16;6.27()}},10);6.G.1M(1w,"2O",6.27)};7(6.W.1j)6(1w).6u("52",u(){B 1k=6.G.1k;P(B C 1x 1k){B 4Z=1k[C],i=4Z.I;7(i&&C!=\'52\')6w 6.G.2f(4Z[i-1],C);22(--i)}});6.E.1z({6A:u(V,21,M){q.2O(V,21,M,1)},2O:u(V,21,M,1W){7(6.1t(V))v q.3U("2O",V);M=M||u(){};B C="5d";7(21)7(6.1t(21)){M=21;21=16}J{21=6.3g(21);C="5V"}B 4e=q;6.3v({V:V,C:C,F:21,1W:1W,1X:u(2P,15){7(15=="2M"||!1W&&15=="5L")4e.1I("2t",2P.3G).4V().K(M,[2P.3G,15,2P]);J M.14(4e,[2P.3G,15,2P])}});v q},6B:u(){v 6.3g(q)},4V:u(){v q.2o("2d").K(u(){7(q.3e)6.59(q.3e);J 6.4a(q.2L||q.6H||q.2t||"")}).4g()}});7(!1w.3p)3p=u(){v 1p 6I("6K.6M")};6.K("5m,5Q,5O,5W,5N,5H".3o(","),u(i,o){6.E[o]=u(f){v q.3U(o,f)}});6.1z({2b:u(V,F,M,C,1W){7(6.1t(F)){M=F;F=16}v 6.3v({V:V,F:F,2M:M,4t:C,1W:1W})},6Q:u(V,F,M,C){v 6.2b(V,F,M,C,1)},59:u(V,M){v 6.2b(V,16,M,"2d")},6S:u(V,F,M){v 6.2b(V,F,M,"6m")},6U:u(V,F,M,C){7(6.1t(F)){M=F;F={}}v 6.3v({C:"5V",V:V,F:F,2M:M,4t:C})},6X:u(29){6.3q.29=29},6Y:u(5c){6.1z(6.3q,5c)},3q:{1k:U,C:"5d",29:0,5r:"70/x-73-3w-77",5h:U,48:U,F:16},3S:{},3v:u(s){s=6.1z({},6.3q,s);7(s.F){7(s.5h&&1C s.F!="23")s.F=6.3g(s.F);7(s.C.4m()=="2b"){s.V+=((s.V.18("?")>-1)?"&":"?")+s.F;s.F=16}}7(s.1k&&!6.4E++)6.G.1S("5m");B 4y=12;B N=1p 3p();N.7j(s.C,s.V,s.48);7(s.F)N.3A("7l-7m",s.5r);7(s.1W)N.3A("7o-4K-7q",6.3S[s.V]||"7s, 7t 7w 7x 4o:4o:4o 7z");N.3A("X-7B-7C","3p");7(N.7E)N.3A("7F","7G");7(s.5G)s.5G(N);7(s.1k)6.G.1S("5H",[N,s]);B 37=u(4s){7(N&&(N.3D==4||4s=="29")){4y=U;7(3I){4p(3I);3I=16}B 15;2G{15=6.5Z(N)&&4s!="29"?s.1W&&6.69(N,s.V)?"5L":"2M":"2C";7(15!="2C"){B 3F;2G{3F=N.4P("6b-4K")}2w(e){}7(s.1W&&3F)6.3S[s.V]=3F;B F=6.6i(N,s.4t);7(s.2M)s.2M(F,15);7(s.1k)6.G.1S("5N",[N,s])}J 6.3J(s,N,15)}2w(e){15="2C";6.3J(s,N,15,e)}7(s.1k)6.G.1S("5O",[N,s]);7(s.1k&&!--6.4E)6.G.1S("5Q");7(s.1X)s.1X(N,15);7(s.48)N=16}};B 3I=3L(37,13);7(s.29>0)57(u(){7(N){N.7N();7(!4y)37("29")}},s.29);2G{N.7Q(s.F)}2w(e){6.3J(s,N,16,e)}7(!s.48)37();v N},3J:u(s,N,15,e){7(s.2C)s.2C(N,15,e);7(s.1k)6.G.1S("5W",[N,s,e])},4E:0,5Z:u(r){2G{v!r.15&&7V.7W=="4G:"||(r.15>=5X&&r.15<7X)||r.15==6d||6.W.2N&&r.15==T}2w(e){}v 12},69:u(N,V){2G{B 6e=N.4P("6b-4K");v N.15==6d||6e==6.3S[V]||6.W.2N&&N.15==T}2w(e){}v 12},6i:u(r,C){B 4Q=r.4P("8c-C");B F=!C&&4Q&&4Q.18("N")>=0;F=C=="N"||F?r.8i:r.3G;7(C=="2d")6.4a(F);7(C=="6m")40("F = "+F);7(C=="4U")6("<1V>").4U(F).4V();v F},3g:u(a){B s=[];7(a.1l==2y||a.3Y)6.K(a,u(){s.1g(2x(q.Y)+"="+2x(q.O))});J P(B j 1x a)7(a[j]&&a[j].1l==2y)6.K(a[j],u(){s.1g(2x(j)+"="+2x(q))});J s.1g(2x(j)+"="+2x(a[j]));v s.6t("&")},4a:u(F){7(1w.54)1w.54(F);J 7(6.W.2N)1w.57(F,0);J 40.3n(1w,F)}});6.E.1z({1L:u(R,M){B 1G=q.1D(":1G");R?1G.26({28:"1L",3V:"1L",1d:"1L"},R,M):1G.K(u(){q.1q.1h=q.2E?q.2E:"";7(6.1m(q,"1h")=="1Z")q.1q.1h="2D"});v q},1K:u(R,M){B 3i=q.1D(":3i");R?3i.26({28:"1K",3V:"1K",1d:"1K"},R,M):3i.K(u(){q.2E=q.2E||6.1m(q,"1h");7(q.2E=="1Z")q.2E="2D";q.1q.1h="1Z"});v q},5g:6.E.3X,3X:u(E,4I){B 1E=1A;v 6.1t(E)&&6.1t(4I)?q.5g(E,4I):q.K(u(){6(q)[6(q).4l(":1G")?"1L":"1K"].14(6(q),1E)})},7a:u(R,M){v q.26({28:"1L"},R,M)},7c:u(R,M){v q.26({28:"1K"},R,M)},7f:u(R,M){v q.K(u(){B 5k=6(q).4l(":1G")?"1L":"1K";6(q).26({28:5k},R,M)})},7r:u(R,M){v q.26({1d:"1L"},R,M)},7u:u(R,M){v q.26({1d:"1K"},R,M)},7y:u(R,43,M){v q.26({1d:43},R,M)},26:u(H,R,1v,M){v q.1F(u(){q.2F=6.1z({},H);B 1u=6.R(R,1v,M);P(B p 1x H){B e=1p 6.3b(q,1u,p);7(H[p].1l==3Q)e.2s(e.Q(),H[p]);J e[H[p]](H)}})},1F:u(C,E){7(!E){E=C;C="3b"}v q.K(u(){7(!q.1F)q.1F={};7(!q.1F[C])q.1F[C]=[];q.1F[C].1g(E);7(q.1F[C].I==1)E.14(q)})}});6.1z({R:u(R,1v,E){B 1u=R&&R.1l==7K?R:{1X:E||!E&&1v||6.1t(R)&&R,25:R,1v:E&&1v||1v&&1v.1l!=4w&&1v};1u.25=(1u.25&&1u.25.1l==3Q?1u.25:{7R:7S,7T:5X}[1u.25])||7U;1u.1N=1u.1X;1u.1X=u(){6.6a(q,"3b");7(6.1t(1u.1N))1u.1N.14(q)};v 1u},1v:{},1F:{},6a:u(D,C){C=C||"3b";7(D.1F&&D.1F[C]){D.1F[C].4L();B f=D.1F[C][0];7(f)f.14(D)}},3b:u(D,1e,H){B z=q;B y=D.1q;B 4D=6.1m(D,"1h");y.5T="1G";z.a=u(){7(1e.49)1e.49.14(D,[z.2p]);7(H=="1d")6.1I(y,"1d",z.2p);J 7(6l(z.2p))y[H]=6l(z.2p)+"4S";y.1h="2D"};z.6v=u(){v 4T(6.1m(D,H))};z.Q=u(){B r=4T(6.30(D,H));v r&&r>-8z?r:z.6v()};z.2s=u(4f,43){z.4J=(1p 5o()).5w();z.2p=4f;z.a();z.4q=3L(u(){z.49(4f,43)},13)};z.1L=u(){7(!D.1y)D.1y={};D.1y[H]=q.Q();1e.1L=U;z.2s(0,D.1y[H]);7(H!="1d")y[H]="5a"};z.1K=u(){7(!D.1y)D.1y={};D.1y[H]=q.Q();1e.1K=U;z.2s(D.1y[H],0)};z.3X=u(){7(!D.1y)D.1y={};D.1y[H]=q.Q();7(4D=="1Z"){1e.1L=U;7(H!="1d")y[H]="5a";z.2s(0,D.1y[H])}J{1e.1K=U;z.2s(D.1y[H],0)}};z.49=u(32,47){B t=(1p 5o()).5w();7(t>1e.25+z.4J){4p(z.4q);z.4q=16;z.2p=47;z.a();7(D.2F)D.2F[H]=U;B 2c=U;P(B i 1x D.2F)7(D.2F[i]!==U)2c=12;7(2c){y.5T="";y.1h=4D;7(6.1m(D,"1h")=="1Z")y.1h="2D";7(1e.1K)y.1h="1Z";7(1e.1K||1e.1L)P(B p 1x D.2F)7(p=="1d")6.1I(y,p,D.1y[p]);J y[p]=""}7(2c&&6.1t(1e.1X))1e.1X.14(D)}J{B n=t-q.4J;B p=n/1e.25;z.2p=1e.1v&&6.1v[1e.1v]?6.1v[1e.1v](p,n,32,(47-32),1e.25):((-6h.7O(p*6h.8L)/2)+0.5)*(47-32)+32;z.a()}}}})}',62,545,'||||||jQuery|if|||||||||||||||||||this||||function|return||||||var|type|elem|fn|data|event|prop|length|else|each|ret|callback|xml|value|for|cur|speed|element|undefined|true|url|browser||name|||parentNode|false||apply|status|null|document|indexOf|className|val|firstChild|obj|opacity|options|nodeName|push|display|result|msie|global|constructor|css|test|handler|new|style|arg|expr|isFunction|opt|easing|window|in|orig|extend|arguments|context|typeof|filter|args|queue|hidden|events|attr|re|hide|show|add|old|target|table|token|replace|trigger|num|elems|div|ifModified|complete|key|none|tbody|params|while|string|nodeType|duration|animate|ready|height|timeout|nth|get|done|script|nextSibling|remove|not|index|tb|fix|merge|oid|z0|preventDefault|find|now|grep|pushStack|custom|innerHTML|first|cssFloat|catch|encodeURIComponent|Array|el|guid|sibling|error|block|oldblock|curAnim|try|stopPropagation|childNodes|id|wrap|text|success|safari|load|res|exec|al|_|last|substr|has|disabled|insertBefore|selected|checked|curCSS|map|firstNum|removeChild|re2|trim|getAttribute|onreadystatechange|handlers|on|originalEvent|fx|readyList|parPos|src|opera|param|mozilla|visible|domManip|clean|cloneNode|tr|call|split|XMLHttpRequest|ajaxSettings|append|child|String|empty|ajax|form|button|inArray|multiFilter|setRequestHeader|foundToken|9_|readyState|tag|modRes|responseText|second|ival|handleError|toUpperCase|setInterval|makeArray|slice|break|oWidth|Number|returnValue|lastModified|styleFloat|bind|width|isReady|toggle|jquery|dir|eval|mouseover|select|to|defaultView|position|oHeight|lastNum|async|step|globalEval|static|pos|swap|self|from|end|float|alpha|radio|inv|is|toLowerCase|visibility|00|clearInterval|timer|rec|isTimeout|dataType|_resort|RegExp|Function|getAll|requestDone|parents|matched|isXMLDoc|appendChild|oldDisplay|active|triggered|file|documentElement|fn2|startTime|Modified|shift|lastToggle|deep|handleHover|getResponseHeader|ct|submit|px|parseFloat|html|evalScripts|getComputedStyle|getElementById|clone|els|safariTimer|currentStyle|unload|force|execScript|getPropertyValue|newProp|setTimeout|zoom|getScript|1px|sl|settings|GET|rl|check|_toggle|processData|prepend|before|state|removeAttr|ajaxStart|lt|Date|gt|eq|contentType|previousSibling|after|parent|contains|getTime|checkbox|password|appendTo|image|reset|input|webkit|href|continue|beforeSend|ajaxSend|ownerDocument|getElementsByTagName|tmp|notmodified|parse|ajaxSuccess|ajaxComplete|_prefix|ajaxStop|even|odd|overflow|delete|POST|ajaxError|200|handle|httpSuccess|nodeValue|unshift|__ie_init|srcElement|body|pageX|tagName|clientX|scrollLeft|httpNotModified|dequeue|Last|scrollTop|304|xmlRes|unbind|100|Math|httpData|click|mouseout|parseInt|json|createElement|DOMContentLoaded|prevObject|ol|setArray|exclude|join|one|max|do|relative|clientHeight|clientWidth|loadIfModified|serialize|toString|thead|tfoot|td|th|textContent|ActiveXObject|htmlFor|Microsoft|class|XMLHTTP|readOnly|gi|match|getIfModified|9999|getJSON|getAttributeNode|post|setAttribute|ig|ajaxTimeout|ajaxSetup|concat|application|userAgent|compatible|www|compatMode|CSS1Compat|next|urlencoded|siblings|children|slideDown|prependTo|slideUp|Top|insertAfter|slideToggle|removeAttribute|addClass|removeClass|open|toggleClass|Content|Type|lastChild|If|only|Since|fadeIn|Thu|01|fadeOut|enabled|Jan|1970|fadeTo|GMT|textarea|Requested|With|prev|overrideMimeType|Connection|close|boxModel|right|object|Object|navigator|substring|abort|cos|font|send|slow|600|fast|400|location|protocol|300|pageY|clientY|method|action|cancelBubble|hover|fromElement|toElement|relatedTarget|removeEventListener|blur|readonly|focus|resize|content|scroll|dblclick|mousedown|mouseup|mousemove|responseXML|change|keydown|keypress|keyup|addEventListener|write|prototype|size|scr|ipt|createTextNode|defer|FORM|reverse|noConflict|loaded|10000|weight|line|Bottom|Right|Left|padding|border|Width|offsetHeight|offsetWidth|absolute|PI|left'.split('|'),0,{})) diff --git a/interface/ispconfig/interface/js/uni-form/uni-form.jquery.js b/interface/ispconfig/interface/js/uni-form/uni-form.jquery.js new file mode 100644 index 000000000..e09e63a4f --- /dev/null +++ b/interface/ispconfig/interface/js/uni-form/uni-form.jquery.js @@ -0,0 +1,106 @@ +jQuery.fn.uniform = function(settings) { + settings = jQuery.extend({ + valid_class : 'valid', + invalid_class : 'invalid', + focused_class : 'focused', + holder_class : 'ctrlHolder', + field_selector : 'input, select, textarea' + }, settings); + + return this.each(function() { + var form = jQuery(this); + + // Focus specific control holder + var focusControlHolder = function(element) { + var parent = element.parent(); + + while(typeof(parent) == 'object') { + if(parent) { + if(parent[0] && (parent[0].className.indexOf(settings.holder_class) >= 0)) { + parent.addClass(settings.focused_class); + return; + } // if + } // if + parent = jQuery(parent.parent()); + } // while + }; + + // Select form fields and attach them higlighter functionality + form.find(settings.field_selector).focus(function() { + form.find('.' + settings.focused_class).removeClass(settings.focused_class); + focusControlHolder(jQuery(this)); + }).blur(function() { + form.find('.' + settings.focused_class).removeClass(settings.focused_class); + }); + }); +}; + +// Auto set on page load... +$(document).ready(function() { + jQuery('form.uniForm').uniform(); +}); + +function AR_ResetDates() +{ + if ($("#autoresponder:checked").val() == null) { + $("form.uniForm select").each( + function(){ + $(this).val( $("#" + $(this).attr("id") + " option:first").val() ); + } + ); + } +} + +function AR_SetNow() +{ + DateTime_SetValues('autoresponder_start_date'); + + now = new Date(); + end_date = new Date(now.getFullYear(), now.getMonth(), now.getDate()+2, 0, 0); + + DateTime_SetValues('autoresponder_end_date', end_date); +} + +function DateTime_SetValues(datetime_id, date_obj) +{ + var selects = ['day', 'month', 'year', 'hour', 'minute', 'second']; + + if ( (typeof(date_obj) == 'object') && (typeof(date_obj.getDate()) == 'number') ) { + var now = date_obj; + } else { + var now = new Date(); + } + + jQuery.each(selects, function() { + var unit_name = this.toString(); + var unit_value = ''; + + switch(unit_name) + { + case 'day': + unit_value = now.getDate(); + break; + case 'month': + unit_value = now.getMonth() + 1; + if(unit_value < 10) unit_value = '0'+unit_value; + break; + case 'year': + unit_value = now.getFullYear(); + break; + case 'hour': + unit_value = now.getHours(); + break; + case 'minute': + unit_value = Math.round(parseInt(now.getMinutes())/5)*5; + break; + case 'second': + unit_value = now.getSeconds(); + break; + } + + unit_obj = $("#"+ datetime_id + "_" + unit_name); + if (unit_obj.val() !== null) { + unit_obj.val(unit_value); + } + }); +} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/animation/README b/interface/ispconfig/interface/js/yui/animation/README new file mode 100644 index 000000000..a3160f62d --- /dev/null +++ b/interface/ispconfig/interface/js/yui/animation/README @@ -0,0 +1,45 @@ +Animation Release Notes + +*** version 2.2.0 ** + +* Fixed AnimMgr.stop() when called without tween + +*** version 0.12.2 *** + +* raised AnimMgr.fps to 1000 + +*** version 0.12.1 *** +* minified version no longer strips line breaks + +*** version 0.12.0 *** + +* added boolean finish argument to Anim.stop() + +*** version 0.11.3 *** + +* no changes + +*** version 0.11.1 *** + +* changed "prototype" shorthand to "proto" (workaround firefox < 1.5 scoping +bug) + +*** version 0.11.0 *** + +* ColorAnim subclass added +* Motion and Scroll now inherit from ColorAnim +* getDefaultUnit method added +* defaultUnit and defaultUnits deprecated +* getDefault and setDefault methods deprecated + +*** version 0.10.0 *** + +* Scroll now handles relative ("by") animation correctly + +* Now converts "auto" values of "from" to appropriate initial values + +*** version 0.9.0 *** + +* Initial release + + diff --git a/interface/ispconfig/interface/js/yui/animation/animation-debug.js b/interface/ispconfig/interface/js/yui/animation/animation-debug.js new file mode 100644 index 000000000..43061953e --- /dev/null +++ b/interface/ispconfig/interface/js/yui/animation/animation-debug.js @@ -0,0 +1,1361 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +*/ + +/** + * The animation module provides allows effects to be added to HTMLElements. + * @module animation + * @requires yahoo, event, dom + */ + +/** + * + * Base animation class that provides the interface for building animated effects. + *

Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Anim + * @namespace YAHOO.util + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + +YAHOO.util.Anim = function(el, attributes, duration, method) { + if (el) { + this.init(el, attributes, duration, method); + } +}; + +YAHOO.util.Anim.prototype = { + /** + * Provides a readable name for the Anim instance. + * @method toString + * @return {String} + */ + toString: function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Anim " + id); + }, + + patterns: { // cached for performance + noNegatives: /width|height|opacity|padding/i, // keep at zero or above + offsetAttribute: /^((width|height)|(top|left))$/, // use offsetValue as default + defaultUnit: /width|height|top$|bottom$|left$|right$/i, // use 'px' by default + offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset + }, + + /** + * Returns the value computed by the animation's "method". + * @method doMethod + * @param {String} attr The name of the attribute. + * @param {Number} start The value this attribute should start from for this animation. + * @param {Number} end The value this attribute should end at for this animation. + * @return {Number} The Value to be applied to the attribute. + */ + doMethod: function(attr, start, end) { + return this.method(this.currentFrame, start, end - start, this.totalFrames); + }, + + /** + * Applies a value to an attribute. + * @method setAttribute + * @param {String} attr The name of the attribute. + * @param {Number} val The value to be applied to the attribute. + * @param {String} unit The unit ('px', '%', etc.) of the value. + */ + setAttribute: function(attr, val, unit) { + if ( this.patterns.noNegatives.test(attr) ) { + val = (val > 0) ? val : 0; + } + + YAHOO.util.Dom.setStyle(this.getEl(), attr, val + unit); + }, + + /** + * Returns current value of the attribute. + * @method getAttribute + * @param {String} attr The name of the attribute. + * @return {Number} val The current value of the attribute. + */ + getAttribute: function(attr) { + var el = this.getEl(); + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) { + return parseFloat(val); + } + + var a = this.patterns.offsetAttribute.exec(attr) || []; + var pos = !!( a[3] ); // top or left + var box = !!( a[2] ); // width or height + + // use offsets for width/height and abs pos top/left + if ( box || (YAHOO.util.Dom.getStyle(el, 'position') == 'absolute' && pos) ) { + val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)]; + } else { // default to zero for other 'auto' + val = 0; + } + + return val; + }, + + /** + * Returns the unit to use when none is supplied. + * @method getDefaultUnit + * @param {attr} attr The name of the attribute. + * @return {String} The default unit to be used. + */ + getDefaultUnit: function(attr) { + if ( this.patterns.defaultUnit.test(attr) ) { + return 'px'; + } + + return ''; + }, + + /** + * Sets the actual values to be used during the animation. Should only be needed for subclass use. + * @method setRuntimeAttribute + * @param {Object} attr The attribute object + * @private + */ + setRuntimeAttribute: function(attr) { + var start; + var end; + var attributes = this.attributes; + + this.runtimeAttributes[attr] = {}; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) { + return false; // note return; nothing to animate to + } + + start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr); + + // To beats by, per SMIL 2.1 spec + if ( isset(attributes[attr]['to']) ) { + end = attributes[attr]['to']; + } else if ( isset(attributes[attr]['by']) ) { + if (start.constructor == Array) { + end = []; + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + attributes[attr]['by'][i]; + } + } else { + end = start + attributes[attr]['by']; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + + // set units if needed + this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? attributes[attr]['unit'] : this.getDefaultUnit(attr); + }, + + /** + * Constructor for Anim instance. + * @method init + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + init: function(el, attributes, duration, method) { + /** + * Whether or not the animation is running. + * @property isAnimated + * @private + * @type Boolean + */ + var isAnimated = false; + + /** + * A Date object that is created when the animation begins. + * @property startTime + * @private + * @type Date + */ + var startTime = null; + + /** + * The number of frames this animation was able to execute. + * @property actualFrames + * @private + * @type Int + */ + var actualFrames = 0; + + /** + * The element to be animated. + * @property el + * @private + * @type HTMLElement + */ + el = YAHOO.util.Dom.get(el); + + /** + * The collection of attributes to be animated. + * Each attribute must have at least a "to" or "by" defined in order to animate. + * If "to" is supplied, the animation will end with the attribute at that value. + * If "by" is supplied, the animation will end at that value plus its starting value. + * If both are supplied, "to" is used, and "by" is ignored. + * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values). + * @property attributes + * @type Object + */ + this.attributes = attributes || {}; + + /** + * The length of the animation. Defaults to "1" (second). + * @property duration + * @type Number + */ + this.duration = duration || 1; + + /** + * The method that will provide values to the attribute(s) during the animation. + * Defaults to "YAHOO.util.Easing.easeNone". + * @property method + * @type Function + */ + this.method = method || YAHOO.util.Easing.easeNone; + + /** + * Whether or not the duration should be treated as seconds. + * Defaults to true. + * @property useSeconds + * @type Boolean + */ + this.useSeconds = true; // default to seconds + + /** + * The location of the current animation on the timeline. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property currentFrame + * @type Int + */ + this.currentFrame = 0; + + /** + * The total number of frames to be executed. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property totalFrames + * @type Int + */ + this.totalFrames = YAHOO.util.AnimMgr.fps; + + + /** + * Returns a reference to the animated element. + * @method getEl + * @return {HTMLElement} + */ + this.getEl = function() { return el; }; + + /** + * Checks whether the element is currently animated. + * @method isAnimated + * @return {Boolean} current value of isAnimated. + */ + this.isAnimated = function() { + return isAnimated; + }; + + /** + * Returns the animation start time. + * @method getStartTime + * @return {Date} current value of startTime. + */ + this.getStartTime = function() { + return startTime; + }; + + this.runtimeAttributes = {}; + + var logger = {}; + logger.log = function() {YAHOO.log.apply(window, arguments)}; + + logger.log('creating new instance of ' + this); + + /** + * Starts the animation by registering it with the animation manager. + * @method animate + */ + this.animate = function() { + if ( this.isAnimated() ) { + return false; + } + + this.currentFrame = 0; + + this.totalFrames = ( this.useSeconds ) ? Math.ceil(YAHOO.util.AnimMgr.fps * this.duration) : this.duration; + + YAHOO.util.AnimMgr.registerElement(this); + }; + + /** + * Stops the animation. Normally called by AnimMgr when animation completes. + * @method stop + * @param {Boolean} finish (optional) If true, animation will jump to final frame. + */ + this.stop = function(finish) { + if (finish) { + this.currentFrame = this.totalFrames; + this._onTween.fire(); + } + YAHOO.util.AnimMgr.stop(this); + }; + + var onStart = function() { + this.onStart.fire(); + + this.runtimeAttributes = {}; + for (var attr in this.attributes) { + this.setRuntimeAttribute(attr); + } + + isAnimated = true; + actualFrames = 0; + startTime = new Date(); + }; + + /** + * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). + * @private + */ + + var onTween = function() { + var data = { + duration: new Date() - this.getStartTime(), + currentFrame: this.currentFrame + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', currentFrame: ' + data.currentFrame + ); + }; + + this.onTween.fire(data); + + var runtimeAttributes = this.runtimeAttributes; + + for (var attr in runtimeAttributes) { + this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); + } + + actualFrames += 1; + }; + + var onComplete = function() { + var actual_duration = (new Date() - startTime) / 1000 ; + + var data = { + duration: actual_duration, + frames: actualFrames, + fps: actualFrames / actual_duration + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', frames: ' + data.frames + + ', fps: ' + data.fps + ); + }; + + isAnimated = false; + actualFrames = 0; + this.onComplete.fire(data); + }; + + /** + * Custom event that fires after onStart, useful in subclassing + * @private + */ + this._onStart = new YAHOO.util.CustomEvent('_start', this, true); + + /** + * Custom event that fires when animation begins + * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) + * @event onStart + */ + this.onStart = new YAHOO.util.CustomEvent('start', this); + + /** + * Custom event that fires between each frame + * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) + * @event onTween + */ + this.onTween = new YAHOO.util.CustomEvent('tween', this); + + /** + * Custom event that fires after onTween + * @private + */ + this._onTween = new YAHOO.util.CustomEvent('_tween', this, true); + + /** + * Custom event that fires when animation ends + * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) + * @event onComplete + */ + this.onComplete = new YAHOO.util.CustomEvent('complete', this); + /** + * Custom event that fires after onComplete + * @private + */ + this._onComplete = new YAHOO.util.CustomEvent('_complete', this, true); + + this._onStart.subscribe(onStart); + this._onTween.subscribe(onTween); + this._onComplete.subscribe(onComplete); + } +}; + +/** + * Handles animation queueing and threading. + * Used by Anim and subclasses. + * @class AnimMgr + * @namespace YAHOO.util + */ +YAHOO.util.AnimMgr = new function() { + /** + * Reference to the animation Interval. + * @property thread + * @private + * @type Int + */ + var thread = null; + + /** + * The current queue of registered animation objects. + * @property queue + * @private + * @type Array + */ + var queue = []; + + /** + * The number of active animations. + * @property tweenCount + * @private + * @type Int + */ + var tweenCount = 0; + + /** + * Base frame rate (frames per second). + * Arbitrarily high for better x-browser calibration (slower browsers drop more frames). + * @property fps + * @type Int + * + */ + this.fps = 1000; + + /** + * Interval delay in milliseconds, defaults to fastest possible. + * @property delay + * @type Int + * + */ + this.delay = 1; + + /** + * Adds an animation instance to the animation queue. + * All animation instances must be registered in order to animate. + * @method registerElement + * @param {object} tween The Anim instance to be be registered + */ + this.registerElement = function(tween) { + queue[queue.length] = tween; + tweenCount += 1; + tween._onStart.fire(); + this.start(); + }; + + /** + * removes an animation instance from the animation queue. + * All animation instances must be registered in order to animate. + * @method unRegister + * @param {object} tween The Anim instance to be be registered + * @param {Int} index The index of the Anim instance + * @private + */ + this.unRegister = function(tween, index) { + tween._onComplete.fire(); + index = index || getIndex(tween); + if (index != -1) { + queue.splice(index, 1); + } + + tweenCount -= 1; + if (tweenCount <= 0) { + this.stop(); + } + }; + + /** + * Starts the animation thread. + * Only one thread can run at a time. + * @method start + */ + this.start = function() { + if (thread === null) { + thread = setInterval(this.run, this.delay); + } + }; + + /** + * Stops the animation thread or a specific animation instance. + * @method stop + * @param {object} tween A specific Anim instance to stop (optional) + * If no instance given, Manager stops thread and all animations. + */ + this.stop = function(tween) { + if (!tween) { + clearInterval(thread); + + for (var i = 0, len = queue.length; i < len; ++i) { + if ( queue[0].isAnimated() ) { + this.unRegister(queue[0], 0); + } + } + + queue = []; + thread = null; + tweenCount = 0; + } + else { + this.unRegister(tween); + } + }; + + /** + * Called per Interval to handle each animation frame. + * @method run + */ + this.run = function() { + for (var i = 0, len = queue.length; i < len; ++i) { + var tween = queue[i]; + if ( !tween || !tween.isAnimated() ) { continue; } + + if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) + { + tween.currentFrame += 1; + + if (tween.useSeconds) { + correctFrame(tween); + } + tween._onTween.fire(); + } + else { YAHOO.util.AnimMgr.stop(tween, i); } + } + }; + + var getIndex = function(anim) { + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i] == anim) { + return i; // note return; + } + } + return -1; + }; + + /** + * On the fly frame correction to keep animation on time. + * @method correctFrame + * @private + * @param {Object} tween The Anim instance being corrected. + */ + var correctFrame = function(tween) { + var frames = tween.totalFrames; + var frame = tween.currentFrame; + var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames); + var elapsed = (new Date() - tween.getStartTime()); + var tweak = 0; + + if (elapsed < tween.duration * 1000) { // check if falling behind + tweak = Math.round((elapsed / expected - 1) * tween.currentFrame); + } else { // went over duration, so jump to end + tweak = frames - (frame + 1); + } + if (tweak > 0 && isFinite(tweak)) { // adjust if needed + if (tween.currentFrame + tweak >= frames) {// dont go past last frame + tweak = frames - (frame + 1); + } + + tween.currentFrame += tweak; + } + }; +}; +/** + * Used to calculate Bezier splines for any number of control points. + * @class Bezier + * @namespace YAHOO.util + * + */ +YAHOO.util.Bezier = new function() { + /** + * Get the current position of the animated element based on t. + * Each point is an array of "x" and "y" values (0 = x, 1 = y) + * At least 2 points are required (start and end). + * First point is start. Last point is end. + * Additional control points are optional. + * @method getPosition + * @param {Array} points An array containing Bezier points + * @param {Number} t A number between 0 and 1 which is the basis for determining current position + * @return {Array} An array containing int x and y member data + */ + this.getPosition = function(points, t) { + var n = points.length; + var tmp = []; + + for (var i = 0; i < n; ++i){ + tmp[i] = [points[i][0], points[i][1]]; // save input + } + + for (var j = 1; j < n; ++j) { + for (i = 0; i < n - j; ++i) { + tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; + tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; + } + } + + return [ tmp[0][0], tmp[0][1] ]; + + }; +}; +(function() { +/** + * Anim subclass for color transitions. + *

Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, + * [255,255,255], or rgb(255,255,255)

+ * @class ColorAnim + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @constructor + * @extends YAHOO.util.Anim + * @param {HTMLElement | String} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.ColorAnim = function(el, attributes, duration, method) { + YAHOO.util.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); + }; + + YAHOO.extend(YAHOO.util.ColorAnim, YAHOO.util.Anim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.ColorAnim.superclass; + var proto = Y.ColorAnim.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("ColorAnim " + id); + }; + + proto.patterns.color = /color$/i; + proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i; + proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i; + proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i; + proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari + + /** + * Attempts to parse the given string and return a 3-tuple. + * @method parseColor + * @param {String} s The string to parse. + * @return {Array} The 3-tuple of rgb values. + */ + proto.parseColor = function(s) { + if (s.length == 3) { return s; } + + var c = this.patterns.hex.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ]; + } + + c = this.patterns.rgb.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ]; + } + + c = this.patterns.hex3.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ]; + } + + return null; + }; + + proto.getAttribute = function(attr) { + var el = this.getEl(); + if ( this.patterns.color.test(attr) ) { + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (this.patterns.transparent.test(val)) { // bgcolor default + var parent = el.parentNode; // try and get from an ancestor + val = Y.Dom.getStyle(parent, attr); + + while (parent && this.patterns.transparent.test(val)) { + parent = parent.parentNode; + val = Y.Dom.getStyle(parent, attr); + if (parent.tagName.toUpperCase() == 'HTML') { + val = '#fff'; + } + } + } + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val; + + if ( this.patterns.color.test(attr) ) { + val = []; + for (var i = 0, len = start.length; i < len; ++i) { + val[i] = superclass.doMethod.call(this, attr, start[i], end[i]); + } + + val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')'; + } + else { + val = superclass.doMethod.call(this, attr, start, end); + } + + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + superclass.setRuntimeAttribute.call(this, attr); + + if ( this.patterns.color.test(attr) ) { + var attributes = this.attributes; + var start = this.parseColor(this.runtimeAttributes[attr].start); + var end = this.parseColor(this.runtimeAttributes[attr].end); + // fix colors if going "by" + if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) { + end = this.parseColor(attributes[attr].by); + + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + end[i]; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + } + }; +})(); +/* +TERMS OF USE - EASING EQUATIONS +Open source under the BSD License. +Copyright 2001 Robert Penner All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Singleton that determines how an animation proceeds from start to end. + * @class Easing + * @namespace YAHOO.util +*/ + +YAHOO.util.Easing = { + + /** + * Uniform speed between points. + * @method easeNone + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeNone: function (t, b, c, d) { + return c*t/d + b; + }, + + /** + * Begins slowly and accelerates towards end. (quadratic) + * @method easeIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeIn: function (t, b, c, d) { + return c*(t/=d)*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quadratic) + * @method easeOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOut: function (t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quadratic) + * @method easeBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBoth: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t + b; + } + + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + + /** + * Begins slowly and accelerates towards end. (quartic) + * @method easeInStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeInStrong: function (t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quartic) + * @method easeOutStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOutStrong: function (t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quartic) + * @method easeBothStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBothStrong: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t*t*t + b; + } + + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + + /** + * Snap in elastic effect. + * @method elasticIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + + elasticIn: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + + /** + * Snap out elastic effect. + * @method elasticOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticOut: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + + /** + * Snap both elastic effect. + * @method elasticBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticBoth: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + + if ( (t /= d/2) == 2 ) { + return b+c; + } + + if (!p) { + p = d*(.3*1.5); + } + + if ( !a || a < Math.abs(c) ) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + if (t < 1) { + return -.5*(a*Math.pow(2,10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + } + return a*Math.pow(2,-10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + + + /** + * Backtracks slightly, then reverses direction and moves to end. + * @method backIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backIn: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + + /** + * Overshoots end, then reverses and comes back to end. + * @method backOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backOut: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + + /** + * Backtracks slightly, then reverses direction, overshoots end, + * then reverses and comes back to end. + * @method backBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backBoth: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + + if ((t /= d/2 ) < 1) { + return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + } + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + + /** + * Bounce off of start. + * @method bounceIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceIn: function (t, b, c, d) { + return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b; + }, + + /** + * Bounces off end. + * @method bounceOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceOut: function (t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + }, + + /** + * Bounces off start and end. + * @method bounceBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceBoth: function (t, b, c, d) { + if (t < d/2) { + return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b; + } + return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}; + +(function() { +/** + * Anim subclass for moving elements along a path defined by the "points" + * member of "attributes". All "points" are arrays with x, y coordinates. + *

Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Motion + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @extends YAHOO.util.Anim + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.Motion = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Motion.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Motion, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Motion.superclass; + var proto = Y.Motion.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Motion " + id); + }; + + proto.patterns.points = /^points$/i; + + proto.setAttribute = function(attr, val, unit) { + if ( this.patterns.points.test(attr) ) { + unit = unit || 'px'; + superclass.setAttribute.call(this, 'left', val[0], unit); + superclass.setAttribute.call(this, 'top', val[1], unit); + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + proto.getAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var val = [ + superclass.getAttribute.call(this, 'left'), + superclass.getAttribute.call(this, 'top') + ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if ( this.patterns.points.test(attr) ) { + var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100; + val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t); + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var el = this.getEl(); + var attributes = this.attributes; + var start; + var control = attributes['points']['control'] || []; + var end; + var i, len; + + if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points + control = [control]; + } else { // break reference to attributes.points.control + var tmp = []; + for (i = 0, len = control.length; i< len; ++i) { + tmp[i] = control[i]; + } + control = tmp; + } + + if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative + Y.Dom.setStyle(el, 'position', 'relative'); + } + + if ( isset(attributes['points']['from']) ) { + Y.Dom.setXY(el, attributes['points']['from']); // set position to from point + } + else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position + + start = this.getAttribute('points'); // get actual top & left + + // TO beats BY, per SMIL 2.1 spec + if ( isset(attributes['points']['to']) ) { + end = translateValues.call(this, attributes['points']['to'], start); + + var pageXY = Y.Dom.getXY(this.getEl()); + for (i = 0, len = control.length; i < len; ++i) { + control[i] = translateValues.call(this, control[i], start); + } + + + } else if ( isset(attributes['points']['by']) ) { + end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ]; + + for (i = 0, len = control.length; i < len; ++i) { + control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; + } + } + + this.runtimeAttributes[attr] = [start]; + + if (control.length > 0) { + this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); + } + + this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end; + } + else { + superclass.setRuntimeAttribute.call(this, attr); + } + }; + + var translateValues = function(val, start) { + var pageXY = Y.Dom.getXY(this.getEl()); + val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ]; + + return val; + }; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; +})(); +(function() { +/** + * Anim subclass for scrolling elements to a position defined by the "scroll" + * member of "attributes". All "scroll" members are arrays with x, y scroll positions. + *

Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Scroll + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @extends YAHOO.util.Anim + * @constructor + * @param {String or HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.Scroll = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Scroll.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Scroll, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Scroll.superclass; + var proto = Y.Scroll.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Scroll " + id); + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if (attr == 'scroll') { + val = [ + this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), + this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames) + ]; + + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.getAttribute = function(attr) { + var val = null; + var el = this.getEl(); + + if (attr == 'scroll') { + val = [ el.scrollLeft, el.scrollTop ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.setAttribute = function(attr, val, unit) { + var el = this.getEl(); + + if (attr == 'scroll') { + el.scrollLeft = val[0]; + el.scrollTop = val[1]; + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; +})(); +YAHOO.register("animation", YAHOO.util.Anim, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/animation/animation-min.js b/interface/ispconfig/interface/js/yui/animation/animation-min.js new file mode 100644 index 000000000..ba5a9b15d --- /dev/null +++ b/interface/ispconfig/interface/js/yui/animation/animation-min.js @@ -0,0 +1,75 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +YAHOO.util.Anim=function(el,attributes,duration,method){if(el){this.init(el,attributes,duration,method);}};YAHOO.util.Anim.prototype={toString:function(){var el=this.getEl();var id=el.id||el.tagName;return("Anim "+id);},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(attr,start,end){return this.method(this.currentFrame,start,end-start,this.totalFrames);},setAttribute:function(attr,val,unit){if(this.patterns.noNegatives.test(attr)){val=(val>0)?val:0;} +YAHOO.util.Dom.setStyle(this.getEl(),attr,val+unit);},getAttribute:function(attr){var el=this.getEl();var val=YAHOO.util.Dom.getStyle(el,attr);if(val!=='auto'&&!this.patterns.offsetUnit.test(val)){return parseFloat(val);} +var a=this.patterns.offsetAttribute.exec(attr)||[];var pos=!!(a[3]);var box=!!(a[2]);if(box||(YAHOO.util.Dom.getStyle(el,'position')=='absolute'&&pos)){val=el['offset'+a[0].charAt(0).toUpperCase()+a[0].substr(1)];}else{val=0;} +return val;},getDefaultUnit:function(attr){if(this.patterns.defaultUnit.test(attr)){return'px';} +return'';},setRuntimeAttribute:function(attr){var start;var end;var attributes=this.attributes;this.runtimeAttributes[attr]={};var isset=function(prop){return(typeof prop!=='undefined');};if(!isset(attributes[attr]['to'])&&!isset(attributes[attr]['by'])){return false;} +start=(isset(attributes[attr]['from']))?attributes[attr]['from']:this.getAttribute(attr);if(isset(attributes[attr]['to'])){end=attributes[attr]['to'];}else if(isset(attributes[attr]['by'])){if(start.constructor==Array){end=[];for(var i=0,len=start.length;i0&&isFinite(tweak)){if(tween.currentFrame+tweak>=frames){tweak=frames-(frame+1);} +tween.currentFrame+=tweak;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(points,t){var n=points.length;var tmp=[];for(var i=0;i0&&!(control[0]instanceof Array)){control=[control];}else{var tmp=[];for(i=0,len=control.length;i0){this.runtimeAttributes[attr]=this.runtimeAttributes[attr].concat(control);} +this.runtimeAttributes[attr][this.runtimeAttributes[attr].length]=end;} +else{superclass.setRuntimeAttribute.call(this,attr);}};var translateValues=function(val,start){var pageXY=Y.Dom.getXY(this.getEl());val=[val[0]-pageXY[0]+start[0],val[1]-pageXY[1]+start[1]];return val;};var isset=function(prop){return(typeof prop!=='undefined');};})();(function(){YAHOO.util.Scroll=function(el,attributes,duration,method){if(el){YAHOO.util.Scroll.superclass.constructor.call(this,el,attributes,duration,method);}};YAHOO.extend(YAHOO.util.Scroll,YAHOO.util.ColorAnim);var Y=YAHOO.util;var superclass=Y.Scroll.superclass;var proto=Y.Scroll.prototype;proto.toString=function(){var el=this.getEl();var id=el.id||el.tagName;return("Scroll "+id);};proto.doMethod=function(attr,start,end){var val=null;if(attr=='scroll'){val=[this.method(this.currentFrame,start[0],end[0]-start[0],this.totalFrames),this.method(this.currentFrame,start[1],end[1]-start[1],this.totalFrames)];}else{val=superclass.doMethod.call(this,attr,start,end);} +return val;};proto.getAttribute=function(attr){var val=null;var el=this.getEl();if(attr=='scroll'){val=[el.scrollLeft,el.scrollTop];}else{val=superclass.getAttribute.call(this,attr);} +return val;};proto.setAttribute=function(attr,val,unit){var el=this.getEl();if(attr=='scroll'){el.scrollLeft=val[0];el.scrollTop=val[1];}else{superclass.setAttribute.call(this,attr,val,unit);}};})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.2.0",build:"127"}); \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/animation/animation.js b/interface/ispconfig/interface/js/yui/animation/animation.js new file mode 100644 index 000000000..a70b84183 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/animation/animation.js @@ -0,0 +1,1358 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +*/ + +/** + * The animation module provides allows effects to be added to HTMLElements. + * @module animation + * @requires yahoo, event, dom + */ + +/** + * + * Base animation class that provides the interface for building animated effects. + *

Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Anim + * @namespace YAHOO.util + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + +YAHOO.util.Anim = function(el, attributes, duration, method) { + if (el) { + this.init(el, attributes, duration, method); + } +}; + +YAHOO.util.Anim.prototype = { + /** + * Provides a readable name for the Anim instance. + * @method toString + * @return {String} + */ + toString: function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Anim " + id); + }, + + patterns: { // cached for performance + noNegatives: /width|height|opacity|padding/i, // keep at zero or above + offsetAttribute: /^((width|height)|(top|left))$/, // use offsetValue as default + defaultUnit: /width|height|top$|bottom$|left$|right$/i, // use 'px' by default + offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset + }, + + /** + * Returns the value computed by the animation's "method". + * @method doMethod + * @param {String} attr The name of the attribute. + * @param {Number} start The value this attribute should start from for this animation. + * @param {Number} end The value this attribute should end at for this animation. + * @return {Number} The Value to be applied to the attribute. + */ + doMethod: function(attr, start, end) { + return this.method(this.currentFrame, start, end - start, this.totalFrames); + }, + + /** + * Applies a value to an attribute. + * @method setAttribute + * @param {String} attr The name of the attribute. + * @param {Number} val The value to be applied to the attribute. + * @param {String} unit The unit ('px', '%', etc.) of the value. + */ + setAttribute: function(attr, val, unit) { + if ( this.patterns.noNegatives.test(attr) ) { + val = (val > 0) ? val : 0; + } + + YAHOO.util.Dom.setStyle(this.getEl(), attr, val + unit); + }, + + /** + * Returns current value of the attribute. + * @method getAttribute + * @param {String} attr The name of the attribute. + * @return {Number} val The current value of the attribute. + */ + getAttribute: function(attr) { + var el = this.getEl(); + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) { + return parseFloat(val); + } + + var a = this.patterns.offsetAttribute.exec(attr) || []; + var pos = !!( a[3] ); // top or left + var box = !!( a[2] ); // width or height + + // use offsets for width/height and abs pos top/left + if ( box || (YAHOO.util.Dom.getStyle(el, 'position') == 'absolute' && pos) ) { + val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)]; + } else { // default to zero for other 'auto' + val = 0; + } + + return val; + }, + + /** + * Returns the unit to use when none is supplied. + * @method getDefaultUnit + * @param {attr} attr The name of the attribute. + * @return {String} The default unit to be used. + */ + getDefaultUnit: function(attr) { + if ( this.patterns.defaultUnit.test(attr) ) { + return 'px'; + } + + return ''; + }, + + /** + * Sets the actual values to be used during the animation. Should only be needed for subclass use. + * @method setRuntimeAttribute + * @param {Object} attr The attribute object + * @private + */ + setRuntimeAttribute: function(attr) { + var start; + var end; + var attributes = this.attributes; + + this.runtimeAttributes[attr] = {}; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) { + return false; // note return; nothing to animate to + } + + start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr); + + // To beats by, per SMIL 2.1 spec + if ( isset(attributes[attr]['to']) ) { + end = attributes[attr]['to']; + } else if ( isset(attributes[attr]['by']) ) { + if (start.constructor == Array) { + end = []; + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + attributes[attr]['by'][i]; + } + } else { + end = start + attributes[attr]['by']; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + + // set units if needed + this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? attributes[attr]['unit'] : this.getDefaultUnit(attr); + }, + + /** + * Constructor for Anim instance. + * @method init + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + init: function(el, attributes, duration, method) { + /** + * Whether or not the animation is running. + * @property isAnimated + * @private + * @type Boolean + */ + var isAnimated = false; + + /** + * A Date object that is created when the animation begins. + * @property startTime + * @private + * @type Date + */ + var startTime = null; + + /** + * The number of frames this animation was able to execute. + * @property actualFrames + * @private + * @type Int + */ + var actualFrames = 0; + + /** + * The element to be animated. + * @property el + * @private + * @type HTMLElement + */ + el = YAHOO.util.Dom.get(el); + + /** + * The collection of attributes to be animated. + * Each attribute must have at least a "to" or "by" defined in order to animate. + * If "to" is supplied, the animation will end with the attribute at that value. + * If "by" is supplied, the animation will end at that value plus its starting value. + * If both are supplied, "to" is used, and "by" is ignored. + * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values). + * @property attributes + * @type Object + */ + this.attributes = attributes || {}; + + /** + * The length of the animation. Defaults to "1" (second). + * @property duration + * @type Number + */ + this.duration = duration || 1; + + /** + * The method that will provide values to the attribute(s) during the animation. + * Defaults to "YAHOO.util.Easing.easeNone". + * @property method + * @type Function + */ + this.method = method || YAHOO.util.Easing.easeNone; + + /** + * Whether or not the duration should be treated as seconds. + * Defaults to true. + * @property useSeconds + * @type Boolean + */ + this.useSeconds = true; // default to seconds + + /** + * The location of the current animation on the timeline. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property currentFrame + * @type Int + */ + this.currentFrame = 0; + + /** + * The total number of frames to be executed. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property totalFrames + * @type Int + */ + this.totalFrames = YAHOO.util.AnimMgr.fps; + + + /** + * Returns a reference to the animated element. + * @method getEl + * @return {HTMLElement} + */ + this.getEl = function() { return el; }; + + /** + * Checks whether the element is currently animated. + * @method isAnimated + * @return {Boolean} current value of isAnimated. + */ + this.isAnimated = function() { + return isAnimated; + }; + + /** + * Returns the animation start time. + * @method getStartTime + * @return {Date} current value of startTime. + */ + this.getStartTime = function() { + return startTime; + }; + + this.runtimeAttributes = {}; + + + + /** + * Starts the animation by registering it with the animation manager. + * @method animate + */ + this.animate = function() { + if ( this.isAnimated() ) { + return false; + } + + this.currentFrame = 0; + + this.totalFrames = ( this.useSeconds ) ? Math.ceil(YAHOO.util.AnimMgr.fps * this.duration) : this.duration; + + YAHOO.util.AnimMgr.registerElement(this); + }; + + /** + * Stops the animation. Normally called by AnimMgr when animation completes. + * @method stop + * @param {Boolean} finish (optional) If true, animation will jump to final frame. + */ + this.stop = function(finish) { + if (finish) { + this.currentFrame = this.totalFrames; + this._onTween.fire(); + } + YAHOO.util.AnimMgr.stop(this); + }; + + var onStart = function() { + this.onStart.fire(); + + this.runtimeAttributes = {}; + for (var attr in this.attributes) { + this.setRuntimeAttribute(attr); + } + + isAnimated = true; + actualFrames = 0; + startTime = new Date(); + }; + + /** + * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). + * @private + */ + + var onTween = function() { + var data = { + duration: new Date() - this.getStartTime(), + currentFrame: this.currentFrame + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', currentFrame: ' + data.currentFrame + ); + }; + + this.onTween.fire(data); + + var runtimeAttributes = this.runtimeAttributes; + + for (var attr in runtimeAttributes) { + this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); + } + + actualFrames += 1; + }; + + var onComplete = function() { + var actual_duration = (new Date() - startTime) / 1000 ; + + var data = { + duration: actual_duration, + frames: actualFrames, + fps: actualFrames / actual_duration + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', frames: ' + data.frames + + ', fps: ' + data.fps + ); + }; + + isAnimated = false; + actualFrames = 0; + this.onComplete.fire(data); + }; + + /** + * Custom event that fires after onStart, useful in subclassing + * @private + */ + this._onStart = new YAHOO.util.CustomEvent('_start', this, true); + + /** + * Custom event that fires when animation begins + * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) + * @event onStart + */ + this.onStart = new YAHOO.util.CustomEvent('start', this); + + /** + * Custom event that fires between each frame + * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) + * @event onTween + */ + this.onTween = new YAHOO.util.CustomEvent('tween', this); + + /** + * Custom event that fires after onTween + * @private + */ + this._onTween = new YAHOO.util.CustomEvent('_tween', this, true); + + /** + * Custom event that fires when animation ends + * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) + * @event onComplete + */ + this.onComplete = new YAHOO.util.CustomEvent('complete', this); + /** + * Custom event that fires after onComplete + * @private + */ + this._onComplete = new YAHOO.util.CustomEvent('_complete', this, true); + + this._onStart.subscribe(onStart); + this._onTween.subscribe(onTween); + this._onComplete.subscribe(onComplete); + } +}; + +/** + * Handles animation queueing and threading. + * Used by Anim and subclasses. + * @class AnimMgr + * @namespace YAHOO.util + */ +YAHOO.util.AnimMgr = new function() { + /** + * Reference to the animation Interval. + * @property thread + * @private + * @type Int + */ + var thread = null; + + /** + * The current queue of registered animation objects. + * @property queue + * @private + * @type Array + */ + var queue = []; + + /** + * The number of active animations. + * @property tweenCount + * @private + * @type Int + */ + var tweenCount = 0; + + /** + * Base frame rate (frames per second). + * Arbitrarily high for better x-browser calibration (slower browsers drop more frames). + * @property fps + * @type Int + * + */ + this.fps = 1000; + + /** + * Interval delay in milliseconds, defaults to fastest possible. + * @property delay + * @type Int + * + */ + this.delay = 1; + + /** + * Adds an animation instance to the animation queue. + * All animation instances must be registered in order to animate. + * @method registerElement + * @param {object} tween The Anim instance to be be registered + */ + this.registerElement = function(tween) { + queue[queue.length] = tween; + tweenCount += 1; + tween._onStart.fire(); + this.start(); + }; + + /** + * removes an animation instance from the animation queue. + * All animation instances must be registered in order to animate. + * @method unRegister + * @param {object} tween The Anim instance to be be registered + * @param {Int} index The index of the Anim instance + * @private + */ + this.unRegister = function(tween, index) { + tween._onComplete.fire(); + index = index || getIndex(tween); + if (index != -1) { + queue.splice(index, 1); + } + + tweenCount -= 1; + if (tweenCount <= 0) { + this.stop(); + } + }; + + /** + * Starts the animation thread. + * Only one thread can run at a time. + * @method start + */ + this.start = function() { + if (thread === null) { + thread = setInterval(this.run, this.delay); + } + }; + + /** + * Stops the animation thread or a specific animation instance. + * @method stop + * @param {object} tween A specific Anim instance to stop (optional) + * If no instance given, Manager stops thread and all animations. + */ + this.stop = function(tween) { + if (!tween) { + clearInterval(thread); + + for (var i = 0, len = queue.length; i < len; ++i) { + if ( queue[0].isAnimated() ) { + this.unRegister(queue[0], 0); + } + } + + queue = []; + thread = null; + tweenCount = 0; + } + else { + this.unRegister(tween); + } + }; + + /** + * Called per Interval to handle each animation frame. + * @method run + */ + this.run = function() { + for (var i = 0, len = queue.length; i < len; ++i) { + var tween = queue[i]; + if ( !tween || !tween.isAnimated() ) { continue; } + + if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) + { + tween.currentFrame += 1; + + if (tween.useSeconds) { + correctFrame(tween); + } + tween._onTween.fire(); + } + else { YAHOO.util.AnimMgr.stop(tween, i); } + } + }; + + var getIndex = function(anim) { + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i] == anim) { + return i; // note return; + } + } + return -1; + }; + + /** + * On the fly frame correction to keep animation on time. + * @method correctFrame + * @private + * @param {Object} tween The Anim instance being corrected. + */ + var correctFrame = function(tween) { + var frames = tween.totalFrames; + var frame = tween.currentFrame; + var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames); + var elapsed = (new Date() - tween.getStartTime()); + var tweak = 0; + + if (elapsed < tween.duration * 1000) { // check if falling behind + tweak = Math.round((elapsed / expected - 1) * tween.currentFrame); + } else { // went over duration, so jump to end + tweak = frames - (frame + 1); + } + if (tweak > 0 && isFinite(tweak)) { // adjust if needed + if (tween.currentFrame + tweak >= frames) {// dont go past last frame + tweak = frames - (frame + 1); + } + + tween.currentFrame += tweak; + } + }; +}; +/** + * Used to calculate Bezier splines for any number of control points. + * @class Bezier + * @namespace YAHOO.util + * + */ +YAHOO.util.Bezier = new function() { + /** + * Get the current position of the animated element based on t. + * Each point is an array of "x" and "y" values (0 = x, 1 = y) + * At least 2 points are required (start and end). + * First point is start. Last point is end. + * Additional control points are optional. + * @method getPosition + * @param {Array} points An array containing Bezier points + * @param {Number} t A number between 0 and 1 which is the basis for determining current position + * @return {Array} An array containing int x and y member data + */ + this.getPosition = function(points, t) { + var n = points.length; + var tmp = []; + + for (var i = 0; i < n; ++i){ + tmp[i] = [points[i][0], points[i][1]]; // save input + } + + for (var j = 1; j < n; ++j) { + for (i = 0; i < n - j; ++i) { + tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; + tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; + } + } + + return [ tmp[0][0], tmp[0][1] ]; + + }; +}; +(function() { +/** + * Anim subclass for color transitions. + *

Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, + * [255,255,255], or rgb(255,255,255)

+ * @class ColorAnim + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @constructor + * @extends YAHOO.util.Anim + * @param {HTMLElement | String} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.ColorAnim = function(el, attributes, duration, method) { + YAHOO.util.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); + }; + + YAHOO.extend(YAHOO.util.ColorAnim, YAHOO.util.Anim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.ColorAnim.superclass; + var proto = Y.ColorAnim.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("ColorAnim " + id); + }; + + proto.patterns.color = /color$/i; + proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i; + proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i; + proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i; + proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari + + /** + * Attempts to parse the given string and return a 3-tuple. + * @method parseColor + * @param {String} s The string to parse. + * @return {Array} The 3-tuple of rgb values. + */ + proto.parseColor = function(s) { + if (s.length == 3) { return s; } + + var c = this.patterns.hex.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ]; + } + + c = this.patterns.rgb.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ]; + } + + c = this.patterns.hex3.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ]; + } + + return null; + }; + + proto.getAttribute = function(attr) { + var el = this.getEl(); + if ( this.patterns.color.test(attr) ) { + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (this.patterns.transparent.test(val)) { // bgcolor default + var parent = el.parentNode; // try and get from an ancestor + val = Y.Dom.getStyle(parent, attr); + + while (parent && this.patterns.transparent.test(val)) { + parent = parent.parentNode; + val = Y.Dom.getStyle(parent, attr); + if (parent.tagName.toUpperCase() == 'HTML') { + val = '#fff'; + } + } + } + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val; + + if ( this.patterns.color.test(attr) ) { + val = []; + for (var i = 0, len = start.length; i < len; ++i) { + val[i] = superclass.doMethod.call(this, attr, start[i], end[i]); + } + + val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')'; + } + else { + val = superclass.doMethod.call(this, attr, start, end); + } + + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + superclass.setRuntimeAttribute.call(this, attr); + + if ( this.patterns.color.test(attr) ) { + var attributes = this.attributes; + var start = this.parseColor(this.runtimeAttributes[attr].start); + var end = this.parseColor(this.runtimeAttributes[attr].end); + // fix colors if going "by" + if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) { + end = this.parseColor(attributes[attr].by); + + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + end[i]; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + } + }; +})(); +/* +TERMS OF USE - EASING EQUATIONS +Open source under the BSD License. +Copyright 2001 Robert Penner All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Singleton that determines how an animation proceeds from start to end. + * @class Easing + * @namespace YAHOO.util +*/ + +YAHOO.util.Easing = { + + /** + * Uniform speed between points. + * @method easeNone + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeNone: function (t, b, c, d) { + return c*t/d + b; + }, + + /** + * Begins slowly and accelerates towards end. (quadratic) + * @method easeIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeIn: function (t, b, c, d) { + return c*(t/=d)*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quadratic) + * @method easeOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOut: function (t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quadratic) + * @method easeBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBoth: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t + b; + } + + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + + /** + * Begins slowly and accelerates towards end. (quartic) + * @method easeInStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeInStrong: function (t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quartic) + * @method easeOutStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOutStrong: function (t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quartic) + * @method easeBothStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBothStrong: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t*t*t + b; + } + + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + + /** + * Snap in elastic effect. + * @method elasticIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + + elasticIn: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + + /** + * Snap out elastic effect. + * @method elasticOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticOut: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + + /** + * Snap both elastic effect. + * @method elasticBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticBoth: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + + if ( (t /= d/2) == 2 ) { + return b+c; + } + + if (!p) { + p = d*(.3*1.5); + } + + if ( !a || a < Math.abs(c) ) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + if (t < 1) { + return -.5*(a*Math.pow(2,10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + } + return a*Math.pow(2,-10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + + + /** + * Backtracks slightly, then reverses direction and moves to end. + * @method backIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backIn: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + + /** + * Overshoots end, then reverses and comes back to end. + * @method backOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backOut: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + + /** + * Backtracks slightly, then reverses direction, overshoots end, + * then reverses and comes back to end. + * @method backBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backBoth: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + + if ((t /= d/2 ) < 1) { + return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + } + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + + /** + * Bounce off of start. + * @method bounceIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceIn: function (t, b, c, d) { + return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b; + }, + + /** + * Bounces off end. + * @method bounceOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceOut: function (t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + }, + + /** + * Bounces off start and end. + * @method bounceBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceBoth: function (t, b, c, d) { + if (t < d/2) { + return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b; + } + return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}; + +(function() { +/** + * Anim subclass for moving elements along a path defined by the "points" + * member of "attributes". All "points" are arrays with x, y coordinates. + *

Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Motion + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @extends YAHOO.util.Anim + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.Motion = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Motion.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Motion, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Motion.superclass; + var proto = Y.Motion.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Motion " + id); + }; + + proto.patterns.points = /^points$/i; + + proto.setAttribute = function(attr, val, unit) { + if ( this.patterns.points.test(attr) ) { + unit = unit || 'px'; + superclass.setAttribute.call(this, 'left', val[0], unit); + superclass.setAttribute.call(this, 'top', val[1], unit); + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + proto.getAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var val = [ + superclass.getAttribute.call(this, 'left'), + superclass.getAttribute.call(this, 'top') + ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if ( this.patterns.points.test(attr) ) { + var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100; + val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t); + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var el = this.getEl(); + var attributes = this.attributes; + var start; + var control = attributes['points']['control'] || []; + var end; + var i, len; + + if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points + control = [control]; + } else { // break reference to attributes.points.control + var tmp = []; + for (i = 0, len = control.length; i< len; ++i) { + tmp[i] = control[i]; + } + control = tmp; + } + + if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative + Y.Dom.setStyle(el, 'position', 'relative'); + } + + if ( isset(attributes['points']['from']) ) { + Y.Dom.setXY(el, attributes['points']['from']); // set position to from point + } + else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position + + start = this.getAttribute('points'); // get actual top & left + + // TO beats BY, per SMIL 2.1 spec + if ( isset(attributes['points']['to']) ) { + end = translateValues.call(this, attributes['points']['to'], start); + + var pageXY = Y.Dom.getXY(this.getEl()); + for (i = 0, len = control.length; i < len; ++i) { + control[i] = translateValues.call(this, control[i], start); + } + + + } else if ( isset(attributes['points']['by']) ) { + end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ]; + + for (i = 0, len = control.length; i < len; ++i) { + control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; + } + } + + this.runtimeAttributes[attr] = [start]; + + if (control.length > 0) { + this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); + } + + this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end; + } + else { + superclass.setRuntimeAttribute.call(this, attr); + } + }; + + var translateValues = function(val, start) { + var pageXY = Y.Dom.getXY(this.getEl()); + val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ]; + + return val; + }; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; +})(); +(function() { +/** + * Anim subclass for scrolling elements to a position defined by the "scroll" + * member of "attributes". All "scroll" members are arrays with x, y scroll positions. + *

Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

+ * @class Scroll + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @extends YAHOO.util.Anim + * @constructor + * @param {String or HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + YAHOO.util.Scroll = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Scroll.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Scroll, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Scroll.superclass; + var proto = Y.Scroll.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Scroll " + id); + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if (attr == 'scroll') { + val = [ + this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), + this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames) + ]; + + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.getAttribute = function(attr) { + var val = null; + var el = this.getEl(); + + if (attr == 'scroll') { + val = [ el.scrollLeft, el.scrollTop ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.setAttribute = function(attr, val, unit) { + var el = this.getEl(); + + if (attr == 'scroll') { + el.scrollLeft = val[0]; + el.scrollTop = val[1]; + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; +})(); +YAHOO.register("animation", YAHOO.util.Anim, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/autocomplete/README b/interface/ispconfig/interface/js/yui/autocomplete/README new file mode 100644 index 000000000..6ab63439b --- /dev/null +++ b/interface/ispconfig/interface/js/yui/autocomplete/README @@ -0,0 +1,77 @@ +AutoComplete Release Notes + +*** version 2.2.0 *** + +* No changes. + + + +*** version 0.12.2 *** + +* No changes. + + + +*** version 0.12.1 *** + +* No longer trigger typeAhead feature when user is backspacing on input text. + + + +*** version 0.12.0 *** + +* The following constants must be defined as static class properties and are no longer +available as instance properties: + +YAHOO.widget.DataSource.ERROR_DATANULL +YAHOO.widget.DataSource.ERROR_DATAPARSE +YAHOO.widget.DS_XHR.TYPE_JSON +YAHOO.widget.DS_XHR.TYPE_XML +YAHOO.widget.DS_XHR.TYPE_FLAT +YAHOO.widget.DS_XHR.ERROR_DATAXHR + +* The property minQueryLength now supports zero and negative number values for +DS_JSFunction and DS_XHR objects, to enable null or empty string queries and to disable +AutoComplete functionality altogether, respectively. + +* Enabling the alwaysShowContainer feature will no longer send containerExpandEvent or +containerCollapseEvent. + + + +**** version 0.11.3 *** + +* The iFrameSrc property has been deprecated. Implementers no longer need to +specify an https URL to avoid IE security warnings when working with sites over +SSL. + + + +*** version 0.11.0 *** + +* The method getListIds() has been deprecated for getListItems(), which returns +an array of DOM references. + +* All classnames have been prefixed with "yui-ac-". + +* Container elements should no longer have CSS property "display" set to "none". + +* The useIFrame property can now be set after instantiation. + +* On some browsers, the unmatchedItemSelectEvent may not be fired properly when +delimiter characters are defined. + +* On some browsers, defining delimiter characters while enabling forceSelection +may result in unexpected behavior. + + + +*** version 0.10.0 *** + +* Initial release + +* In order to enable the useIFrame property, it should be set in the +constructor. + +* On some browsers, defining delimiter characters while enabling forceSelection +may result in unexpected behavior. diff --git a/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-debug.js b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-debug.js new file mode 100644 index 000000000..70c0b94ea --- /dev/null +++ b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-debug.js @@ -0,0 +1,3100 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + /** + * The AutoComplete control provides the front-end logic for text-entry suggestion and + * completion functionality. + * + * @module autocomplete + * @requires yahoo, dom, event, datasource + * @optional animation, connection + * @namespace YAHOO.widget + * @title AutoComplete Widget + */ + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The AutoComplete class provides the customizable functionality of a plug-and-play DHTML + * auto completion widget. Some key features: + *
    + *
  • Navigate with up/down arrow keys and/or mouse to pick a selection
  • + *
  • The drop down container can "roll down" or "fly out" via configurable + * animation
  • + *
  • UI look-and-feel customizable through CSS, including container + * attributes, borders, position, fonts, etc
  • + *
+ * + * @class AutoComplete + * @constructor + * @param elInput {HTMLElement} DOM element reference of an input field. + * @param elInput {String} String ID of an input field. + * @param elContainer {HTMLElement} DOM element reference of an existing DIV. + * @param elContainer {String} String ID of an existing DIV. + * @param oDataSource {YAHOO.widget.DataSource} DataSource instance. + * @param oConfigs {Object} (optional) Object literal of configuration params. + */ +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) { + if(elInput && elContainer && oDataSource) { + // Validate DataSource + if (oDataSource && (oDataSource instanceof YAHOO.widget.DataSource)) { + this.dataSource = oDataSource; + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid DataSource", "error", this.toString()); + return; + } + + // Validate input element + if(YAHOO.util.Dom.inDocument(elInput)) { + if(typeof elInput == "string") { + this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput; + this._oTextbox = document.getElementById(elInput); + } + else { + this._sName = (elInput.id) ? + "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id: + "instance" + YAHOO.widget.AutoComplete._nIndex; + this._oTextbox = elInput; + } + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid input element", "error", this.toString()); + return; + } + + // Validate container element + if(YAHOO.util.Dom.inDocument(elContainer)) { + if(typeof elContainer == "string") { + this._oContainer = document.getElementById(elContainer); + } + else { + this._oContainer = elContainer; + } + if(this._oContainer.style.display == "none") { + YAHOO.log("The container may not display properly if display is set to \"none\" in CSS", "warn", this.toString()); + } + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid container element", "error", this.toString()); + return; + } + + // Set any config params passed in to override defaults + if (typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + if (sConfig) { + this[sConfig] = oConfigs[sConfig]; + } + } + } + + // Initialization sequence + this._initContainer(); + this._initProps(); + this._initList(); + this._initContainerHelpers(); + + // Set up events + var oSelf = this; + var oTextbox = this._oTextbox; + // Events are actually for the content module within the container + var oContent = this._oContainer._oContent; + + // Dom events + YAHOO.util.Event.addListener(oTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf); + YAHOO.util.Event.addListener(oTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf); + YAHOO.util.Event.addListener(oTextbox,"focus",oSelf._onTextboxFocus,oSelf); + YAHOO.util.Event.addListener(oTextbox,"blur",oSelf._onTextboxBlur,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseover",oSelf._onContainerMouseover,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseout",oSelf._onContainerMouseout,oSelf); + YAHOO.util.Event.addListener(oContent,"scroll",oSelf._onContainerScroll,oSelf); + YAHOO.util.Event.addListener(oContent,"resize",oSelf._onContainerResize,oSelf); + if(oTextbox.form) { + YAHOO.util.Event.addListener(oTextbox.form,"submit",oSelf._onFormSubmit,oSelf); + } + YAHOO.util.Event.addListener(oTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf); + + // Custom events + this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this); + this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this); + this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this); + this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this); + this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this); + this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this); + this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this); + this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this); + this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this); + this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this); + this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this); + this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this); + this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this); + this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this); + + // Finish up + oTextbox.setAttribute("autocomplete","off"); + YAHOO.widget.AutoComplete._nIndex++; + YAHOO.log("AutoComplete initialized","info",this.toString()); + } + // Required arguments were not found + else { + YAHOO.log("Could not instantiate AutoComplete due invalid arguments", "error", this.toString()); + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * The DataSource object that encapsulates the data used for auto completion. + * This object should be an inherited object from YAHOO.widget.DataSource. + * + * @property dataSource + * @type YAHOO.widget.DataSource + */ +YAHOO.widget.AutoComplete.prototype.dataSource = null; + +/** + * Number of characters that must be entered before querying for results. A negative value + * effectively turns off the widget. A value of 0 allows queries of null or empty string + * values. + * + * @property minQueryLength + * @type Number + * @default 1 + */ +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1; + +/** + * Maximum number of results to display in results container. + * + * @property maxResultsDisplayed + * @type Number + * @default 10 + */ +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10; + +/** + * Number of seconds to delay before submitting a query request. If a query + * request is received before a previous one has completed its delay, the + * previous request is cancelled and the new request is set to the delay. + * + * @property queryDelay + * @type Number + * @default 0.5 + */ +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.5; + +/** + * Class name of a highlighted item within results container. + * + * @property highlightClassName + * @type String + * @default "yui-ac-highlight" + */ +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight"; + +/** + * Class name of a pre-highlighted item within results container. + * + * @property prehighlightClassName + * @type String + */ +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null; + +/** + * Query delimiter. A single character separator for multiple delimited + * selections. Multiple delimiter characteres may be defined as an array of + * strings. A null value or empty string indicates that query results cannot + * be delimited. This feature is not recommended if you need forceSelection to + * be true. + * + * @property delimChar + * @type String | String[] + */ +YAHOO.widget.AutoComplete.prototype.delimChar = null; + +/** + * Whether or not the first item in results container should be automatically highlighted + * on expand. + * + * @property autoHighlight + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.autoHighlight = true; + +/** + * Whether or not the input field should be automatically updated + * with the first query result as the user types, auto-selecting the substring + * that the user has not typed. + * + * @property typeAhead + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.typeAhead = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * horizontal direction. + * + * @property animHoriz + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.animHoriz = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * vertical direction. + * + * @property animVert + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.animVert = true; + +/** + * Speed of container expand/collapse animation, in seconds.. + * + * @property animSpeed + * @type Number + * @default 0.3 + */ +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3; + +/** + * Whether or not to force the user's selection to match one of the query + * results. Enabling this feature essentially transforms the input field into a + * <select> field. This feature is not recommended with delimiter character(s) + * defined. + * + * @property forceSelection + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.forceSelection = false; + +/** + * Whether or not to allow browsers to cache user-typed input in the input + * field. Disabling this feature will prevent the widget from setting the + * autocomplete="off" on the input field. When autocomplete="off" + * and users click the back button after form submission, user-typed input can + * be prefilled by the browser from its cache. This caching of user input may + * not be desired for sensitive data, such as credit card numbers, in which + * case, implementers should consider setting allowBrowserAutocomplete to false. + * + * @property allowBrowserAutocomplete + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true; + +/** + * Whether or not the results container should always be displayed. + * Enabling this feature displays the container when the widget is instantiated + * and prevents the toggling of the container to a collapsed state. + * + * @property alwaysShowContainer + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false; + +/** + * Whether or not to use an iFrame to layer over Windows form elements in + * IE. Set to true only when the results container will be on top of a + * <select> field in IE and thus exposed to the IE z-index bug (i.e., + * 5.5 < IE < 7). + * + * @property useIFrame + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useIFrame = false; + +/** + * Whether or not the results container should have a shadow. + * + * @property useShadow + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useShadow = false; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the AutoComplete instance. + * + * @method toString + * @return {String} Unique name of the AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.toString = function() { + return "AutoComplete " + this._sName; +}; + + /** + * Returns true if container is in an expanded state, false otherwise. + * + * @method isContainerOpen + * @return {Boolean} Returns true if container is in an expanded state, false otherwise. + */ +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() { + return this._bContainerOpen; +}; + +/** + * Public accessor to the internal array of DOM <li> elements that + * display query results within the results container. + * + * @method getListItems + * @return {HTMLElement[]} Array of <li> elements within the results container. + */ +YAHOO.widget.AutoComplete.prototype.getListItems = function() { + return this._aListItems; +}; + +/** + * Public accessor to the data held in an <li> element of the + * results container. + * + * @method getListItemData + * @return {Object | Object[]} Object or array of result data or null + */ +YAHOO.widget.AutoComplete.prototype.getListItemData = function(oListItem) { + if(oListItem._oResultData) { + return oListItem._oResultData; + } + else { + return false; + } +}; + +/** + * Sets HTML markup for the results container header. This markup will be + * inserted within a <div> tag with a class of "yui-ac-hd". + * + * @method setHeader + * @param sHeader {String} HTML markup for results container header. + */ +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) { + if(sHeader) { + if(this._oContainer._oContent._oHeader) { + this._oContainer._oContent._oHeader.innerHTML = sHeader; + this._oContainer._oContent._oHeader.style.display = "block"; + } + } + else { + this._oContainer._oContent._oHeader.innerHTML = ""; + this._oContainer._oContent._oHeader.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container footer. This markup will be + * inserted within a <div> tag with a class of "yui-ac-ft". + * + * @method setFooter + * @param sFooter {String} HTML markup for results container footer. + */ +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) { + if(sFooter) { + if(this._oContainer._oContent._oFooter) { + this._oContainer._oContent._oFooter.innerHTML = sFooter; + this._oContainer._oContent._oFooter.style.display = "block"; + } + } + else { + this._oContainer._oContent._oFooter.innerHTML = ""; + this._oContainer._oContent._oFooter.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container body. This markup will be + * inserted within a <div> tag with a class of "yui-ac-bd". + * + * @method setBody + * @param sBody {String} HTML markup for results container body. + */ +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) { + if(sBody) { + if(this._oContainer._oContent._oBody) { + this._oContainer._oContent._oBody.innerHTML = sBody; + this._oContainer._oContent._oBody.style.display = "block"; + this._oContainer._oContent.style.display = "block"; + } + } + else { + this._oContainer._oContent._oBody.innerHTML = ""; + this._oContainer._oContent.style.display = "none"; + } + this._maxResultsDisplayed = 0; +}; + +/** + * Overridable method that converts a result item object into HTML markup + * for display. Return data values are accessible via the oResultItem object, + * and the key return value will always be oResultItem[0]. Markup will be + * displayed within <li> element tags in the container. + * + * @method formatResult + * @param oResultItem {Object} Result item representing one query result. Data is held in an array. + * @param sQuery {String} The current query string. + * @return {String} HTML markup of formatted result data. + */ +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultItem, sQuery) { + var sResult = oResultItem[0]; + if(sResult) { + return sResult; + } + else { + return ""; + } +}; + +/** + * Overridable method called before container expands allows implementers to access data + * and DOM elements. + * + * @method doBeforeExpandContainer + * @return {Boolean} Return true to continue expanding container, false to cancel the expand. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(oResultItem, sQuery) { + return true; +}; + +/** + * Makes query request to the DataSource. + * + * @method sendQuery + * @param sQuery {String} Query string. + */ +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) { + this._sendQuery(sQuery); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when the input field receives focus. + * + * @event textboxFocusEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null; + +/** + * Fired when the input field receives key input. + * + * @event textboxKeyEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param nKeycode {Number} The keycode number. + */ +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null; + +/** + * Fired when the AutoComplete instance makes a query to the DataSource. + * + * @event dataRequestEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null; + +/** + * Fired when the AutoComplete instance receives query results from the data + * source. + * + * @event dataReturnEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Results array. + */ +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null; + +/** + * Fired when the AutoComplete instance does not receive query results from the + * DataSource due to an error. + * + * @event dataErrorEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null; + +/** + * Fired when the results container is expanded. + * + * @event containerExpandEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null; + +/** + * Fired when the input field has been prefilled by the type-ahead + * feature. + * + * @event typeAheadEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param sPrefill {String} The prefill string. + */ +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null; + +/** + * Fired when result item has been moused over. + * + * @event itemMouseOverEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused to. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null; + +/** + * Fired when result item has been moused out. + * + * @event itemMouseOutEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused from. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null; + +/** + * Fired when result item has been arrowed to. + * + * @event itemArrowToEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed to. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null; + +/** + * Fired when result item has been arrowed away from. + * + * @event itemArrowFromEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed from. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null; + +/** + * Fired when an item is selected via mouse click, ENTER key, or TAB key. + * + * @event itemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The selected <li> element item. + * @param oData {Object} The data returned for the item, either as an object, + * or mapped from the schema into an array. + */ +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null; + +/** + * Fired when a user selection does not match any of the displayed result items. + * Note that this event may not behave as expected when delimiter characters + * have been defined. + * + * @event unmatchedItemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The user-typed query string. + */ +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null; + +/** + * Fired if forceSelection is enabled and the user's input has been cleared + * because it did not match one of the returned query results. + * + * @event selectionEnforceEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null; + +/** + * Fired when the results container is collapsed. + * + * @event containerCollapseEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null; + +/** + * Fired when the input field loses focus. + * + * @event textboxBlurEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple AutoComplete instances. + * + * @property _nIndex + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.AutoComplete._nIndex = 0; + +/** + * Name of AutoComplete instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sName = null; + +/** + * Text input field DOM element. + * + * @property _oTextbox + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oTextbox = null; + +/** + * Whether or not the input field is currently in focus. If query results come back + * but the user has already moved on, do not proceed with auto complete behavior. + * + * @property _bFocused + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bFocused = true; + +/** + * Animation instance for container expand/collapse. + * + * @property _oAnim + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._oAnim = null; + +/** + * Container DOM element. + * + * @property _oContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oContainer = null; + +/** + * Whether or not the results container is currently open. + * + * @property _bContainerOpen + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false; + +/** + * Whether or not the mouse is currently over the results + * container. This is necessary in order to prevent clicks on container items + * from being text input field blur events. + * + * @property _bOverContainer + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bOverContainer = false; + +/** + * Array of <li> elements references that contain query results within the + * results container. + * + * @property _aListItems + * @type HTMLElement[] + * @private + */ +YAHOO.widget.AutoComplete.prototype._aListItems = null; + +/** + * Number of <li> elements currently displayed in results container. + * + * @property _nDisplayedItems + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0; + +/** + * Internal count of <li> elements displayed and hidden in results container. + * + * @property _maxResultsDisplayed + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0; + +/** + * Current query string + * + * @property _sCurQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sCurQuery = null; + +/** + * Past queries this session (for saving delimited queries). + * + * @property _sSavedQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sSavedQuery = null; + +/** + * Pointer to the currently highlighted <li> element in the container. + * + * @property _oCurItem + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oCurItem = null; + +/** + * Whether or not an item has been selected since the container was populated + * with results. Reset to false by _populateList, and set to true when item is + * selected. + * + * @property _bItemSelected + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bItemSelected = false; + +/** + * Key code of the last key pressed in textbox. + * + * @property _nKeyCode + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nKeyCode = null; + +/** + * Delay timeout ID. + * + * @property _nDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDelayID = -1; + +/** + * Src to iFrame used when useIFrame = true. Supports implementations over SSL + * as well. + * + * @property _iFrameSrc + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;"; + +/** + * For users typing via certain IMEs, queries must be triggered by intervals, + * since key events yet supported across all browsers for all IMEs. + * + * @property _queryInterval + * @type Object + * @private + */ +YAHOO.widget.AutoComplete.prototype._queryInterval = null; + +/** + * Internal tracker to last known textbox value, used to determine whether or not + * to trigger a query via interval for certain IME users. + * + * @event _sLastTextboxValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Updates and validates latest public config properties. + * + * @method __initProps + * @private + */ +YAHOO.widget.AutoComplete.prototype._initProps = function() { + // Correct any invalid values + var minQueryLength = this.minQueryLength; + if(isNaN(minQueryLength) || (minQueryLength < 1)) { + minQueryLength = 1; + } + var maxResultsDisplayed = this.maxResultsDisplayed; + if(isNaN(this.maxResultsDisplayed) || (this.maxResultsDisplayed < 1)) { + this.maxResultsDisplayed = 10; + } + var queryDelay = this.queryDelay; + if(isNaN(this.queryDelay) || (this.queryDelay < 0)) { + this.queryDelay = 0.5; + } + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + if(typeof aDelimChar == "string") { + this.delimChar = [aDelimChar]; + } + else if(aDelimChar.constructor != Array) { + this.delimChar = null; + } + } + var animSpeed = this.animSpeed; + if((this.animHoriz || this.animVert) && YAHOO.util.Anim) { + if(isNaN(animSpeed) || (animSpeed < 0)) { + animSpeed = 0.3; + } + if(!this._oAnim ) { + oAnim = new YAHOO.util.Anim(this._oContainer._oContent, {}, this.animSpeed); + this._oAnim = oAnim; + } + else { + this._oAnim.duration = animSpeed; + } + } + if(this.forceSelection && this.delimChar) { + YAHOO.log("The forceSelection feature has been enabled with delimChar defined.","warn", this.toString()); + } +}; + +/** + * Initializes the results container helpers if they are enabled and do + * not exist + * + * @method _initContainerHelpers + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerHelpers = function() { + if(this.useShadow && !this._oContainer._oShadow) { + var oShadow = document.createElement("div"); + oShadow.className = "yui-ac-shadow"; + this._oContainer._oShadow = this._oContainer.appendChild(oShadow); + } + if(this.useIFrame && !this._oContainer._oIFrame) { + var oIFrame = document.createElement("iframe"); + oIFrame.src = this._iFrameSrc; + oIFrame.frameBorder = 0; + oIFrame.scrolling = "no"; + oIFrame.style.position = "absolute"; + oIFrame.style.width = "100%"; + oIFrame.style.height = "100%"; + oIFrame.tabIndex = -1; + this._oContainer._oIFrame = this._oContainer.appendChild(oIFrame); + } +}; + +/** + * Initializes the results container once at object creation + * + * @method _initContainer + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainer = function() { + if(!this._oContainer._oContent) { + // The oContent div helps size the iframe and shadow properly + var oContent = document.createElement("div"); + oContent.className = "yui-ac-content"; + oContent.style.display = "none"; + this._oContainer._oContent = this._oContainer.appendChild(oContent); + + var oHeader = document.createElement("div"); + oHeader.className = "yui-ac-hd"; + oHeader.style.display = "none"; + this._oContainer._oContent._oHeader = this._oContainer._oContent.appendChild(oHeader); + + var oBody = document.createElement("div"); + oBody.className = "yui-ac-bd"; + this._oContainer._oContent._oBody = this._oContainer._oContent.appendChild(oBody); + + var oFooter = document.createElement("div"); + oFooter.className = "yui-ac-ft"; + oFooter.style.display = "none"; + this._oContainer._oContent._oFooter = this._oContainer._oContent.appendChild(oFooter); + } + else { + YAHOO.log("Could not initialize the container","warn",this.toString()); + } +}; + +/** + * Clears out contents of container body and creates up to + * YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an + * <ul> element. + * + * @method _initList + * @private + */ +YAHOO.widget.AutoComplete.prototype._initList = function() { + this._aListItems = []; + while(this._oContainer._oContent._oBody.hasChildNodes()) { + var oldListItems = this.getListItems(); + if(oldListItems) { + for(var oldi = oldListItems.length-1; oldi >= 0; i--) { + oldListItems[oldi] = null; + } + } + this._oContainer._oContent._oBody.innerHTML = ""; + } + + var oList = document.createElement("ul"); + oList = this._oContainer._oContent._oBody.appendChild(oList); + for(var i=0; i= 18 && nKeyCode <= 20) || // alt,pause/break,caps lock + (nKeyCode == 27) || // esc + (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end + (nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up + (nKeyCode == 40) || // down + (nKeyCode >= 44 && nKeyCode <= 45)) { // print screen,insert + return true; + } + return false; +}; + +/** + * Makes query request to the DataSource. + * + * @method _sendQuery + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) { + // Widget has been effectively turned off + if(this.minQueryLength == -1) { + this._toggleContainer(false); + return; + } + // Delimiter has been enabled + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + // Loop through all possible delimiters and find the latest one + // A " " may be a false positive if they are defined as delimiters AND + // are used to separate delimited queries + var nDelimIndex = -1; + for(var i = aDelimChar.length-1; i >= 0; i--) { + var nNewIndex = sQuery.lastIndexOf(aDelimChar[i]); + if(nNewIndex > nDelimIndex) { + nDelimIndex = nNewIndex; + } + } + // If we think the last delimiter is a space (" "), make sure it is NOT + // a false positive by also checking the char directly before it + if(aDelimChar[i] == " ") { + for (var j = aDelimChar.length-1; j >= 0; j--) { + if(sQuery[nDelimIndex - 1] == aDelimChar[j]) { + nDelimIndex--; + break; + } + } + } + // A delimiter has been found so extract the latest query + if (nDelimIndex > -1) { + var nQueryStart = nDelimIndex + 1; + // Trim any white space from the beginning... + while(sQuery.charAt(nQueryStart) == " ") { + nQueryStart += 1; + } + // ...and save the rest of the string for later + this._sSavedQuery = sQuery.substring(0,nQueryStart); + // Here is the query itself + sQuery = sQuery.substr(nQueryStart); + } + else if(sQuery.indexOf(this._sSavedQuery) < 0){ + this._sSavedQuery = null; + } + } + + // Don't search queries that are too short + if (sQuery && (sQuery.length < this.minQueryLength) || (!sQuery && this.minQueryLength > 0)) { + if (this._nDelayID != -1) { + clearTimeout(this._nDelayID); + } + this._toggleContainer(false); + return; + } + + sQuery = encodeURIComponent(sQuery); + this._nDelayID = -1; // Reset timeout ID because request has been made + this.dataRequestEvent.fire(this, sQuery); + this.dataSource.getResults(this._populateList, sQuery, this); +}; + +/** + * Populates the array of <li> elements in the container with query + * results. This method is passed to YAHOO.widget.DataSource#getResults as a + * callback function so results from the DataSource instance are returned to the + * AutoComplete instance. + * + * @method _populateList + * @param sQuery {String} The query string. + * @param aResults {Object[]} An array of query result objects from the DataSource. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, aResults, oSelf) { + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, sQuery); + } + if (!oSelf._bFocused || !aResults) { + return; + } + + var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + var contentStyle = oSelf._oContainer._oContent.style; + contentStyle.width = (!isOpera) ? null : ""; + contentStyle.height = (!isOpera) ? null : ""; + + var sCurQuery = decodeURIComponent(sQuery); + oSelf._sCurQuery = sCurQuery; + oSelf._bItemSelected = false; + + if(oSelf._maxResultsDisplayed != oSelf.maxResultsDisplayed) { + oSelf._initList(); + } + + var nItems = Math.min(aResults.length,oSelf.maxResultsDisplayed); + oSelf._nDisplayedItems = nItems; + if (nItems > 0) { + oSelf._initContainerHelpers(); + var aItems = oSelf._aListItems; + + // Fill items with data + for(var i = nItems-1; i >= 0; i--) { + var oItemi = aItems[i]; + var oResultItemi = aResults[i]; + oItemi.innerHTML = oSelf.formatResult(oResultItemi, sCurQuery); + oItemi.style.display = "list-item"; + oItemi._sResultKey = oResultItemi[0]; + oItemi._oResultData = oResultItemi; + + } + + // Empty out remaining items if any + for(var j = aItems.length-1; j >= nItems ; j--) { + var oItemj = aItems[j]; + oItemj.innerHTML = null; + oItemj.style.display = "none"; + oItemj._sResultKey = null; + oItemj._oResultData = null; + } + + if(oSelf.autoHighlight) { + // Go to the first item + var oFirstItem = aItems[0]; + oSelf._toggleHighlight(oFirstItem,"to"); + oSelf.itemArrowToEvent.fire(oSelf, oFirstItem); + oSelf._typeAhead(oFirstItem,sQuery); + } + else { + oSelf._oCurItem = null; + } + + // Expand the container + var ok = oSelf.doBeforeExpandContainer(oSelf._oTextbox, oSelf._oContainer, sQuery, aResults); + oSelf._toggleContainer(ok); + } + else { + oSelf._toggleContainer(false); + } + oSelf.dataReturnEvent.fire(oSelf, sQuery, aResults); +}; + +/** + * When forceSelection is true and the user attempts + * leave the text input box without selecting an item from the query results, + * the user selection is cleared. + * + * @method _clearSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearSelection = function() { + var sValue = this._oTextbox.value; + var sChar = (this.delimChar) ? this.delimChar[0] : null; + var nIndex = (sChar) ? sValue.lastIndexOf(sChar, sValue.length-2) : -1; + if(nIndex > -1) { + this._oTextbox.value = sValue.substring(0,nIndex); + } + else { + this._oTextbox.value = ""; + } + this._sSavedQuery = this._oTextbox.value; + + // Fire custom event + this.selectionEnforceEvent.fire(this); +}; + +/** + * Whether or not user-typed value in the text input box matches any of the + * query results. + * + * @method _textMatchesOption + * @return {Boolean} True if user-input text matches a result, false otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() { + var foundMatch = false; + + for(var i = this._nDisplayedItems-1; i >= 0 ; i--) { + var oItem = this._aListItems[i]; + var sMatch = oItem._sResultKey.toLowerCase(); + if (sMatch == this._sCurQuery.toLowerCase()) { + foundMatch = true; + break; + } + } + return(foundMatch); +}; + +/** + * Updates in the text input box with the first query result as the user types, + * selecting the substring that the user has not typed. + * + * @method _typeAhead + * @param oItem {HTMLElement} The <li> element item whose data populates the input field. + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._typeAhead = function(oItem, sQuery) { + // Don't update if turned off + if (!this.typeAhead || (this._nKeyCode == 8)) { + return; + } + + var oTextbox = this._oTextbox; + var sValue = this._oTextbox.value; // any saved queries plus what user has typed + + // Don't update with type-ahead if text selection is not supported + if(!oTextbox.setSelectionRange && !oTextbox.createTextRange) { + return; + } + + // Select the portion of text that the user has not typed + var nStart = sValue.length; + this._updateValue(oItem); + var nEnd = oTextbox.value.length; + this._selectText(oTextbox,nStart,nEnd); + var sPrefill = oTextbox.value.substr(nStart,nEnd); + this.typeAheadEvent.fire(this,sQuery,sPrefill); +}; + +/** + * Selects text in the input field. + * + * @method _selectText + * @param oTextbox {HTMLElement} Text input box element in which to select text. + * @param nStart {Number} Starting index of text string to select. + * @param nEnd {Number} Ending index of text selection. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectText = function(oTextbox, nStart, nEnd) { + if (oTextbox.setSelectionRange) { // For Mozilla + oTextbox.setSelectionRange(nStart,nEnd); + } + else if (oTextbox.createTextRange) { // For IE + var oTextRange = oTextbox.createTextRange(); + oTextRange.moveStart("character", nStart); + oTextRange.moveEnd("character", nEnd-oTextbox.value.length); + oTextRange.select(); + } + else { + oTextbox.select(); + } +}; + +/** + * Syncs results container with its helpers. + * + * @method _toggleContainerHelpers + * @param bShow {Boolean} True if container is expanded, false if collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) { + var bFireEvent = false; + var width = this._oContainer._oContent.offsetWidth + "px"; + var height = this._oContainer._oContent.offsetHeight + "px"; + + if(this.useIFrame && this._oContainer._oIFrame) { + bFireEvent = true; + if(bShow) { + this._oContainer._oIFrame.style.width = width; + this._oContainer._oIFrame.style.height = height; + } + else { + this._oContainer._oIFrame.style.width = 0; + this._oContainer._oIFrame.style.height = 0; + } + } + if(this.useShadow && this._oContainer._oShadow) { + bFireEvent = true; + if(bShow) { + this._oContainer._oShadow.style.width = width; + this._oContainer._oShadow.style.height = height; + } + else { + this._oContainer._oShadow.style.width = 0; + this._oContainer._oShadow.style.height = 0; + } + } +}; + +/** + * Animates expansion or collapse of the container. + * + * @method _toggleContainer + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) { + var oContainer = this._oContainer; + + // Implementer has container always open so don't mess with it + if(this.alwaysShowContainer && this._bContainerOpen) { + return; + } + + // Clear contents of container + if(!bShow) { + this._oContainer._oContent.scrollTop = 0; + var aItems = this._aListItems; + + if(aItems && (aItems.length > 0)) { + for(var i = aItems.length-1; i >= 0 ; i--) { + aItems[i].style.display = "none"; + } + } + + if (this._oCurItem) { + this._toggleHighlight(this._oCurItem,"from"); + } + + this._oCurItem = null; + this._nDisplayedItems = 0; + this._sCurQuery = null; + } + + // Container is already closed + if (!bShow && !this._bContainerOpen) { + oContainer._oContent.style.display = "none"; + return; + } + + // If animation is enabled... + var oAnim = this._oAnim; + if (oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) { + // If helpers need to be collapsed, do it right away... + // but if helpers need to be expanded, wait until after the container expands + if(!bShow) { + this._toggleContainerHelpers(bShow); + } + + if(oAnim.isAnimated()) { + oAnim.stop(); + } + + // Clone container to grab current size offscreen + var oClone = oContainer._oContent.cloneNode(true); + oContainer.appendChild(oClone); + oClone.style.top = "-9000px"; + oClone.style.display = "block"; + + // Current size of the container is the EXPANDED size + var wExp = oClone.offsetWidth; + var hExp = oClone.offsetHeight; + + // Calculate COLLAPSED sizes based on horiz and vert anim + var wColl = (this.animHoriz) ? 0 : wExp; + var hColl = (this.animVert) ? 0 : hExp; + + // Set animation sizes + oAnim.attributes = (bShow) ? + {width: { to: wExp }, height: { to: hExp }} : + {width: { to: wColl}, height: { to: hColl }}; + + // If opening anew, set to a collapsed size... + if(bShow && !this._bContainerOpen) { + oContainer._oContent.style.width = wColl+"px"; + oContainer._oContent.style.height = hColl+"px"; + } + // Else, set it to its last known size. + else { + oContainer._oContent.style.width = wExp+"px"; + oContainer._oContent.style.height = hExp+"px"; + } + + oContainer.removeChild(oClone); + oClone = null; + + var oSelf = this; + var onAnimComplete = function() { + // Finish the collapse + oAnim.onComplete.unsubscribeAll(); + + if(bShow) { + oSelf.containerExpandEvent.fire(oSelf); + } + else { + oContainer._oContent.style.display = "none"; + oSelf.containerCollapseEvent.fire(oSelf); + } + oSelf._toggleContainerHelpers(bShow); + }; + + // Display container and animate it + oContainer._oContent.style.display = "block"; + oAnim.onComplete.subscribe(onAnimComplete); + oAnim.animate(); + this._bContainerOpen = bShow; + } + // Else don't animate, just show or hide + else { + if(bShow) { + oContainer._oContent.style.display = "block"; + this.containerExpandEvent.fire(this); + } + else { + oContainer._oContent.style.display = "none"; + this.containerCollapseEvent.fire(this); + } + this._toggleContainerHelpers(bShow); + this._bContainerOpen = bShow; + } + +}; + +/** + * Toggles the highlight on or off for an item in the container, and also cleans + * up highlighting of any previous item. + * + * @method _toggleHighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(oNewItem, sType) { + var sHighlight = this.highlightClassName; + if(this._oCurItem) { + // Remove highlight from old item + YAHOO.util.Dom.removeClass(this._oCurItem, sHighlight); + } + + if((sType == "to") && sHighlight) { + // Apply highlight to new item + YAHOO.util.Dom.addClass(oNewItem, sHighlight); + this._oCurItem = oNewItem; + } +}; + +/** + * Toggles the pre-highlight on or off for an item in the container. + * + * @method _togglePrehighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(oNewItem, sType) { + if(oNewItem == this._oCurItem) { + return; + } + + var sPrehighlight = this.prehighlightClassName; + if((sType == "mouseover") && sPrehighlight) { + // Apply prehighlight to new item + YAHOO.util.Dom.addClass(oNewItem, sPrehighlight); + } + else { + // Remove prehighlight from old item + YAHOO.util.Dom.removeClass(oNewItem, sPrehighlight); + } +}; + +/** + * Updates the text input box value with selected query result. If a delimiter + * has been defined, then the value gets appended with the delimiter. + * + * @method _updateValue + * @param oItem {HTMLElement} The <li> element item with which to update the value. + * @private + */ +YAHOO.widget.AutoComplete.prototype._updateValue = function(oItem) { + var oTextbox = this._oTextbox; + var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; + var sSavedQuery = this._sSavedQuery; + var sResultKey = oItem._sResultKey; + oTextbox.focus(); + + // First clear text field + oTextbox.value = ""; + // Grab data to put into text field + if(sDelimChar) { + if(sSavedQuery) { + oTextbox.value = sSavedQuery; + } + oTextbox.value += sResultKey + sDelimChar; + if(sDelimChar != " ") { + oTextbox.value += " "; + } + } + else { oTextbox.value = sResultKey; } + + // scroll to bottom of textarea if necessary + if(oTextbox.type == "textarea") { + oTextbox.scrollTop = oTextbox.scrollHeight; + } + + // move cursor to end + var end = oTextbox.value.length; + this._selectText(oTextbox,end,end); + + this._oCurItem = oItem; +}; + +/** + * Selects a result item from the container + * + * @method _selectItem + * @param oItem {HTMLElement} The selected <li> element item. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectItem = function(oItem) { + this._bItemSelected = true; + this._updateValue(oItem); + this._cancelIntervalDetection(this); + this.itemSelectEvent.fire(this, oItem, oItem._oResultData); + this._toggleContainer(false); +}; + +/** + * For values updated by type-ahead, the right arrow key jumps to the end + * of the textbox, otherwise the container is closed. + * + * @method _jumpSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() { + if(!this.typeAhead) { + return; + } + else { + this._toggleContainer(false); + } +}; + +/** + * Triggered by up and down arrow keys, changes the current highlighted + * <li> element item. Scrolls container if necessary. + * + * @method _moveSelection + * @param nKeyCode {Number} Code of key pressed. + * @private + */ +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) { + if(this._bContainerOpen) { + // Determine current item's id number + var oCurItem = this._oCurItem; + var nCurItemIndex = -1; + + if (oCurItem) { + nCurItemIndex = oCurItem._nItemIndex; + } + + var nNewItemIndex = (nKeyCode == 40) ? + (nCurItemIndex + 1) : (nCurItemIndex - 1); + + // Out of bounds + if (nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) { + return; + } + + if (oCurItem) { + // Unhighlight current item + this._toggleHighlight(oCurItem, "from"); + this.itemArrowFromEvent.fire(this, oCurItem); + } + if (nNewItemIndex == -1) { + // Go back to query (remove type-ahead string) + if(this.delimChar && this._sSavedQuery) { + if (!this._textMatchesOption()) { + this._oTextbox.value = this._sSavedQuery; + } + else { + this._oTextbox.value = this._sSavedQuery + this._sCurQuery; + } + } + else { + this._oTextbox.value = this._sCurQuery; + } + this._oCurItem = null; + return; + } + if (nNewItemIndex == -2) { + // Close container + this._toggleContainer(false); + return; + } + + var oNewItem = this._aListItems[nNewItemIndex]; + + // Scroll the container if necessary + var oContent = this._oContainer._oContent; + var scrollOn = ((YAHOO.util.Dom.getStyle(oContent,"overflow") == "auto") || + (YAHOO.util.Dom.getStyle(oContent,"overflowY") == "auto")); + if(scrollOn && (nNewItemIndex > -1) && + (nNewItemIndex < this._nDisplayedItems)) { + // User is keying down + if(nKeyCode == 40) { + // Bottom of selected item is below scroll area... + if((oNewItem.offsetTop+oNewItem.offsetHeight) > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of scroll area to bottom of selected item + oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + // Bottom of selected item is above scroll area... + else if((oNewItem.offsetTop+oNewItem.offsetHeight) < oContent.scrollTop) { + // Set top of selected item to top of scroll area + oContent.scrollTop = oNewItem.offsetTop; + + } + } + // User is keying up + else { + // Top of selected item is above scroll area + if(oNewItem.offsetTop < oContent.scrollTop) { + // Set top of scroll area to top of selected item + this._oContainer._oContent.scrollTop = oNewItem.offsetTop; + } + // Top of selected item is below scroll area + else if(oNewItem.offsetTop > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of selected item to bottom of scroll area + this._oContainer._oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + } + } + + this._toggleHighlight(oNewItem, "to"); + this.itemArrowToEvent.fire(this, oNewItem); + if(this.typeAhead) { + this._updateValue(oNewItem); + } + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private event handlers +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Handles <li> element mouseover events in the container. + * + * @method _onItemMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseover = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseover"); + } + else { + oSelf._toggleHighlight(this,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element mouseout events in the container. + * + * @method _onItemMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseout = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseout"); + } + else { + oSelf._toggleHighlight(this,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element click events in the container. + * + * @method _onItemMouseclick + * @param v {HTMLEvent} The click event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseclick = function(v,oSelf) { + // In case item has not been moused over + oSelf._toggleHighlight(this,"to"); + oSelf._selectItem(this); +}; + +/** + * Handles container mouseover events. + * + * @method _onContainerMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) { + oSelf._bOverContainer = true; +}; + +/** + * Handles container mouseout events. + * + * @method _onContainerMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) { + oSelf._bOverContainer = false; + // If container is still active + if(oSelf._oCurItem) { + oSelf._toggleHighlight(oSelf._oCurItem,"to"); + } +}; + +/** + * Handles container scroll events. + * + * @method _onContainerScroll + * @param v {HTMLEvent} The scroll event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) { + oSelf._oTextbox.focus(); +}; + +/** + * Handles container resize events. + * + * @method _onContainerResize + * @param v {HTMLEvent} The resize event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) { + oSelf._toggleContainerHelpers(oSelf._bContainerOpen); +}; + + +/** + * Handles textbox keydown events of functional keys, mainly for UI behavior. + * + * @method _onTextboxKeyDown + * @param v {HTMLEvent} The keydown event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) { + var nKeyCode = v.keyCode; + + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + // select an item or clear out + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 27: // esc + oSelf._toggleContainer(false); + return; + case 39: // right + oSelf._jumpSelection(); + break; + case 38: // up + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + case 40: // down + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + default: + break; + } +}; + +/** + * Handles textbox keypress events. + * @method _onTextboxKeyPress + * @param v {HTMLEvent} The keypress event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) { + var nKeyCode = v.keyCode; + + //Expose only to Mac browsers, where stopEvent is ineffective on keydown events (bug 790337) + var isMac = (navigator.userAgent.toLowerCase().indexOf("mac") != -1); + if(isMac) { + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 38: // up + case 40: // down + YAHOO.util.Event.stopEvent(v); + break; + default: + break; + } + } + + //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948) + // Korean IME detected + else if(nKeyCode == 229) { + oSelf._queryInterval = setInterval(function() { oSelf._onIMEDetected(oSelf); },500); + } +}; + +/** + * Handles textbox keyup events that trigger queries. + * + * @method _onTextboxKeyUp + * @param v {HTMLEvent} The keyup event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) { + // Check to see if any of the public properties have been updated + oSelf._initProps(); + + var nKeyCode = v.keyCode; + oSelf._nKeyCode = nKeyCode; + var sText = this.value; //string in textbox + + // Filter out chars that don't trigger queries + if (oSelf._isIgnoreKey(nKeyCode) || (sText.toLowerCase() == oSelf._sCurQuery)) { + return; + } + else { + oSelf.textboxKeyEvent.fire(oSelf, nKeyCode); + } + + // Set timeout on the request + if (oSelf.queryDelay > 0) { + var nDelayID = + setTimeout(function(){oSelf._sendQuery(sText);},(oSelf.queryDelay * 1000)); + + if (oSelf._nDelayID != -1) { + clearTimeout(oSelf._nDelayID); + } + + oSelf._nDelayID = nDelayID; + } + else { + // No delay so send request immediately + oSelf._sendQuery(sText); + } +}; + +/** + * Handles text input box receiving focus. + * + * @method _onTextboxFocus + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) { + oSelf._oTextbox.setAttribute("autocomplete","off"); + oSelf._bFocused = true; + oSelf.textboxFocusEvent.fire(oSelf); +}; + +/** + * Handles text input box losing focus. + * + * @method _onTextboxBlur + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) { + // Don't treat as a blur if it was a selection via mouse click + if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) { + // Current query needs to be validated + if(!oSelf._bItemSelected) { + if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && !oSelf._textMatchesOption())) { + if(oSelf.forceSelection) { + oSelf._clearSelection(); + } + else { + oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery); + } + } + } + + if(oSelf._bContainerOpen) { + oSelf._toggleContainer(false); + } + oSelf._cancelIntervalDetection(oSelf); + oSelf._bFocused = false; + oSelf.textboxBlurEvent.fire(oSelf); + } +}; + +/** + * Handles form submission event. + * + * @method _onFormSubmit + * @param v {HTMLEvent} The submit event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onFormSubmit = function(v,oSelf) { + if(oSelf.allowBrowserAutocomplete) { + oSelf._oTextbox.setAttribute("autocomplete","on"); + } + else { + oSelf._oTextbox.setAttribute("autocomplete","off"); + } +}; + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The DataSource classes manages sending a request and returning response from a live + * database. Supported data include local JavaScript arrays and objects and databases + * accessible via XHR connections. Supported response formats include JavaScript arrays, + * JSON, XML, and flat-file textual data. + * + * @class DataSource + * @constructor + */ +YAHOO.widget.DataSource = function() { + /* abstract class */ +}; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Error message for null data responses. + * + * @property ERROR_DATANULL + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATANULL = "Response data was null"; + +/** + * Error message for data responses with parsing errors. + * + * @property ERROR_DATAPARSE + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATAPARSE = "Response data could not be parsed"; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Max size of the local cache. Set to 0 to turn off caching. Caching is + * useful to reduce the number of server connections. Recommended only for data + * sources that return comprehensive results for queries or when stale data is + * not an issue. + * + * @property maxCacheEntries + * @type Number + * @default 15 + */ +YAHOO.widget.DataSource.prototype.maxCacheEntries = 15; + +/** + * Use this to equate cache matching with the type of matching done by your live + * data source. If caching is on and queryMatchContains is true, the cache + * returns results that "contain" the query string. By default, + * queryMatchContains is set to false, meaning the cache only returns results + * that "start with" the query string. + * + * @property queryMatchContains + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchContains = false; + +/** + * Enables query subset matching. If caching is on and queryMatchSubset is + * true, substrings of queries will return matching cached results. For + * instance, if the first query is for "abc" susequent queries that start with + * "abc", like "abcd", will be queried against the cache, and not the live data + * source. Recommended only for DataSources that return comprehensive results + * for queries with very few characters. + * + * @property queryMatchSubset + * @type Boolean + * @default false + * + */ +YAHOO.widget.DataSource.prototype.queryMatchSubset = false; + +/** + * Enables query case-sensitivity matching. If caching is on and + * queryMatchCase is true, queries will only return results for case-sensitive + * matches. + * + * @property queryMatchCase + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchCase = false; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the DataSource instance. + * + * @method toString + * @return {String} Unique name of the DataSource instance + */ +YAHOO.widget.DataSource.prototype.toString = function() { + return "DataSource " + this._sName; +}; + +/** + * Retrieves query results, first checking the local cache, then making the + * query request to the live data source as defined by the function doQuery. + * + * @method getResults + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.getResults = function(oCallbackFn, sQuery, oParent) { + + // First look in cache + var aResults = this._doQueryCache(oCallbackFn,sQuery,oParent); + + // Not in cache, so get results from server + if(aResults.length === 0) { + this.queryEvent.fire(this, oParent, sQuery); + this.doQuery(oCallbackFn, sQuery, oParent); + } +}; + +/** + * Abstract method implemented by subclasses to make a query to the live data + * source. Must call the callback function with the response returned from the + * query. Populates cache (if enabled). + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function implemented by oParent to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + /* override this */ +}; + +/** + * Flushes cache. + * + * @method flushCache + */ +YAHOO.widget.DataSource.prototype.flushCache = function() { + if(this._aCache) { + this._aCache = []; + } + if(this._aCacheHelper) { + this._aCacheHelper = []; + } + this.cacheFlushEvent.fire(this); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when a query is made to the live data source. + * + * @event queryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.queryEvent = null; + +/** + * Fired when a query is made to the local cache. + * + * @event cacheQueryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.cacheQueryEvent = null; + +/** + * Fired when data is retrieved from the live data source. + * + * @event getResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getResultsEvent = null; + +/** + * Fired when data is retrieved from the local cache. + * + * @event getCachedResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getCachedResultsEvent = null; + +/** + * Fired when an error is encountered with the live data source. + * + * @event dataErrorEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param sMsg {String} Error message string + */ +YAHOO.widget.DataSource.prototype.dataErrorEvent = null; + +/** + * Fired when the local cache is flushed. + * + * @event cacheFlushEvent + * @param oSelf {Object} The DataSource instance + */ +YAHOO.widget.DataSource.prototype.cacheFlushEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple DataSource instances. + * + * @property _nIndex + * @type Number + * @private + * @static + */ +YAHOO.widget.DataSource._nIndex = 0; + +/** + * Name of DataSource instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.DataSource.prototype._sName = null; + +/** + * Local cache of data result objects indexed chronologically. + * + * @property _aCache + * @type Object[] + * @private + */ +YAHOO.widget.DataSource.prototype._aCache = null; + + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Initializes DataSource instance. + * + * @method _init + * @private + */ +YAHOO.widget.DataSource.prototype._init = function() { + // Validate and initialize public configs + var maxCacheEntries = this.maxCacheEntries; + if(isNaN(maxCacheEntries) || (maxCacheEntries < 0)) { + maxCacheEntries = 0; + } + // Initialize local cache + if(maxCacheEntries > 0 && !this._aCache) { + this._aCache = []; + } + + this._sName = "instance" + YAHOO.widget.DataSource._nIndex; + YAHOO.widget.DataSource._nIndex++; + + this.queryEvent = new YAHOO.util.CustomEvent("query", this); + this.cacheQueryEvent = new YAHOO.util.CustomEvent("cacheQuery", this); + this.getResultsEvent = new YAHOO.util.CustomEvent("getResults", this); + this.getCachedResultsEvent = new YAHOO.util.CustomEvent("getCachedResults", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.cacheFlushEvent = new YAHOO.util.CustomEvent("cacheFlush", this); +}; + +/** + * Adds a result object to the local cache, evicting the oldest element if the + * cache is full. Newer items will have higher indexes, the oldest item will have + * index of 0. + * + * @method _addCacheElem + * @param oResult {Object} Data result object, including array of results. + * @private + */ +YAHOO.widget.DataSource.prototype._addCacheElem = function(oResult) { + var aCache = this._aCache; + // Don't add if anything important is missing. + if(!aCache || !oResult || !oResult.query || !oResult.results) { + return; + } + + // If the cache is full, make room by removing from index=0 + if(aCache.length >= this.maxCacheEntries) { + aCache.shift(); + } + + // Add to cache, at the end of the array + aCache.push(oResult); +}; + +/** + * Queries the local cache for results. If query has been cached, the callback + * function is called with the results, and the cached is refreshed so that it + * is now the newest element. + * + * @method _doQueryCache + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + * @return aResults {Object[]} Array of results from local cache if found, otherwise null. + * @private + */ +YAHOO.widget.DataSource.prototype._doQueryCache = function(oCallbackFn, sQuery, oParent) { + var aResults = []; + var bMatchFound = false; + var aCache = this._aCache; + var nCacheLength = (aCache) ? aCache.length : 0; + var bMatchContains = this.queryMatchContains; + + // If cache is enabled... + if((this.maxCacheEntries > 0) && aCache && (nCacheLength > 0)) { + this.cacheQueryEvent.fire(this, oParent, sQuery); + // If case is unimportant, normalize query now instead of in loops + if(!this.queryMatchCase) { + var sOrigQuery = sQuery; + sQuery = sQuery.toLowerCase(); + } + + // Loop through each cached element's query property... + for(var i = nCacheLength-1; i >= 0; i--) { + var resultObj = aCache[i]; + var aAllResultItems = resultObj.results; + // If case is unimportant, normalize match key for comparison + var matchKey = (!this.queryMatchCase) ? + encodeURIComponent(resultObj.query).toLowerCase(): + encodeURIComponent(resultObj.query); + + // If a cached match key exactly matches the query... + if(matchKey == sQuery) { + // Stash all result objects into aResult[] and stop looping through the cache. + bMatchFound = true; + aResults = aAllResultItems; + + // The matching cache element was not the most recent, + // so now we need to refresh the cache. + if(i != nCacheLength-1) { + // Remove element from its original location + aCache.splice(i,1); + // Add element as newest + this._addCacheElem(resultObj); + } + break; + } + // Else if this query is not an exact match and subset matching is enabled... + else if(this.queryMatchSubset) { + // Loop through substrings of each cached element's query property... + for(var j = sQuery.length-1; j >= 0 ; j--) { + var subQuery = sQuery.substr(0,j); + + // If a substring of a cached sQuery exactly matches the query... + if(matchKey == subQuery) { + bMatchFound = true; + + // Go through each cached result object to match against the query... + for(var k = aAllResultItems.length-1; k >= 0; k--) { + var aRecord = aAllResultItems[k]; + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aRecord[0]).indexOf(sQuery): + encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aRecord); + } + } + + // Add the subset match result set object as the newest element to cache, + // and stop looping through the cache. + resultObj = {}; + resultObj.query = sQuery; + resultObj.results = aResults; + this._addCacheElem(resultObj); + break; + } + } + if(bMatchFound) { + break; + } + } + } + + // If there was a match, send along the results. + if(bMatchFound) { + this.getCachedResultsEvent.fire(this, oParent, sOrigQuery, aResults); + oCallbackFn(sOrigQuery, aResults, oParent); + } + } + return aResults; +}; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using XML HTTP requests that return + * query results. + * + * @class DS_XHR + * @extends YAHOO.widget.DataSource + * @requires connection + * @constructor + * @param sScriptURI {String} Absolute or relative URI to script that returns query + * results as JSON, XML, or delimited flat-file data. + * @param aSchema {String[]} Data schema definition of results. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_XHR = function(sScriptURI, aSchema, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aSchema || (aSchema.constructor != Array)) { + YAHOO.log("Could not instantiate XHR DataSource due to invalid arguments", "error", this.toString()); + return; + } + else { + this.schema = aSchema; + } + this.scriptURI = sScriptURI; + this._init(); + YAHOO.log("XHR DataSource initialized","info",this.toString()); +}; + +YAHOO.widget.DS_XHR.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * JSON data type. + * + * @property TYPE_JSON + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_JSON = 0; + +/** + * XML data type. + * + * @property TYPE_XML + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_XML = 1; + +/** + * Flat-file data type. + * + * @property TYPE_FLAT + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_FLAT = 2; + +/** + * Error message for XHR failure. + * + * @property ERROR_DATAXHR + * @type String + * @static + * @final + */ +YAHOO.widget.DS_XHR.ERROR_DATAXHR = "XHR response failed"; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Alias to YUI Connection Manager. Allows implementers to specify their own + * subclasses of the YUI Connection Manager utility. + * + * @property connMgr + * @type Object + * @default YAHOO.util.Connect + */ +YAHOO.widget.DS_XHR.prototype.connMgr = YAHOO.util.Connect; + +/** + * Number of milliseconds the XHR connection will wait for a server response. A + * a value of zero indicates the XHR connection will wait forever. Any value + * greater than zero will use the Connection utility's Auto-Abort feature. + * + * @property connTimeout + * @type Number + * @default 0 + */ +YAHOO.widget.DS_XHR.prototype.connTimeout = 0; + +/** + * Absolute or relative URI to script that returns query results. For instance, + * queries will be sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptURI + * @type String + */ +YAHOO.widget.DS_XHR.prototype.scriptURI = null; + +/** + * Query string parameter name sent to scriptURI. For instance, queries will be + * sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptQueryParam + * @type String + * @default "query" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryParam = "query"; + +/** + * String of key/value pairs to append to requests made to scriptURI. Define + * this string when you want to send additional query parameters to your script. + * When defined, queries will be sent to + * <scriptURI>?<scriptQueryParam>=userinput&<scriptQueryAppend> + * + * @property scriptQueryAppend + * @type String + * @default "" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryAppend = ""; + +/** + * XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML + * and YAHOO.widget.DS_XHR.TYPE_FLAT. + * + * @property responseType + * @type String + * @default YAHOO.widget.DS_XHR.TYPE_JSON + */ +YAHOO.widget.DS_XHR.prototype.responseType = YAHOO.widget.DS_XHR.TYPE_JSON; + +/** + * String after which to strip results. If the results from the XHR are sent + * back as HTML, the gzip HTML comment appears at the end of the data and should + * be ignored. + * + * @property responseStripAfter + * @type String + * @default "\n<!-" + */ +YAHOO.widget.DS_XHR.prototype.responseStripAfter = "\n 0) { + sUri += "&" + this.scriptQueryAppend; + } + YAHOO.log("DataSource is querying URL " + sUri, "info", this.toString()); + var oResponse = null; + + var oSelf = this; + /* + * Sets up ajax request callback + * + * @param {object} oReq HTTPXMLRequest object + * @private + */ + var responseSuccess = function(oResp) { + // Response ID does not match last made request ID. + if(!oSelf._oConn || (oResp.tId != oSelf._oConn.tId)) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATANULL, "error", this.toString()); + return; + } +//DEBUG +/*YAHOO.log(oResp.responseXML.getElementsByTagName("Result"),'warn'); +for(var foo in oResp) { + YAHOO.log(foo + ": "+oResp[foo],'warn'); +} +YAHOO.log('responseXML.xml: '+oResp.responseXML.xml,'warn');*/ + if(!isXML) { + oResp = oResp.responseText; + } + else { + oResp = oResp.responseXML; + } + if(oResp === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATANULL, "error", oSelf.toString()); + return; + } + + var aResults = oSelf.parseResponse(sQuery, oResp, oParent); + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATAPARSE); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATAPARSE, "error", oSelf.toString()); + aResults = []; + } + else { + oSelf.getResultsEvent.fire(oSelf, oParent, sQuery, aResults); + oSelf._addCacheElem(resultObj); + } + oCallbackFn(sQuery, aResults, oParent); + }; + + var responseFailure = function(oResp) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DS_XHR.ERROR_DATAXHR); + YAHOO.log(YAHOO.widget.DS_XHR.ERROR_DATAXHR + ": " + oResp.statusText, "error", oSelf.toString()); + return; + }; + + var oCallback = { + success:responseSuccess, + failure:responseFailure + }; + + if(!isNaN(this.connTimeout) && this.connTimeout > 0) { + oCallback.timeout = this.connTimeout; + } + + if(this._oConn) { + this.connMgr.abort(this._oConn); + } + + oSelf._oConn = this.connMgr.asyncRequest("GET", sUri, oCallback, null); +}; + +/** + * Parses raw response data into an array of result objects. The result data key + * is always stashed in the [0] element of each result object. + * + * @method parseResponse + * @param sQuery {String} Query string. + * @param oResponse {Object} The raw response data to parse. + * @param oParent {Object} The object instance that has requested data. + * @returns {Object[]} Array of result objects. + */ +YAHOO.widget.DS_XHR.prototype.parseResponse = function(sQuery, oResponse, oParent) { + var aSchema = this.schema; + var aResults = []; + var bError = false; + + // Strip out comment at the end of results + var nEnd = ((this.responseStripAfter !== "") && (oResponse.indexOf)) ? + oResponse.indexOf(this.responseStripAfter) : -1; + if(nEnd != -1) { + oResponse = oResponse.substring(0,nEnd); + } + + switch (this.responseType) { + case YAHOO.widget.DS_XHR.TYPE_JSON: + var jsonList; + // Divert KHTML clients from JSON lib + if(window.JSON && (navigator.userAgent.toLowerCase().indexOf('khtml')== -1)) { + // Use the JSON utility if available + var jsonObjParsed = JSON.parse(oResponse); + if(!jsonObjParsed) { + bError = true; + break; + } + else { + try { + // eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("jsonObjParsed." + aSchema[0]); + } + catch(e) { + bError = true; + break; + } + } + } + else { + // Parse the JSON response as a string + try { + // Trim leading spaces + while (oResponse.substring(0,1) == " ") { + oResponse = oResponse.substring(1, oResponse.length); + } + + // Invalid JSON response + if(oResponse.indexOf("{") < 0) { + bError = true; + break; + } + + // Empty (but not invalid) JSON response + if(oResponse.indexOf("{}") === 0) { + break; + } + + // Turn the string into an object literal... + // ...eval is necessary here + var jsonObjRaw = eval("(" + oResponse + ")"); + if(!jsonObjRaw) { + bError = true; + break; + } + + // Grab the object member that contains an array of all reponses... + // ...eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("(jsonObjRaw." + aSchema[0]+")"); + } + catch(e) { + bError = true; + break; + } + } + + if(!jsonList) { + bError = true; + break; + } + + if(jsonList.constructor != Array) { + jsonList = [jsonList]; + } + + // Loop through the array of all responses... + for(var i = jsonList.length-1; i >= 0 ; i--) { + var aResultItem = []; + var jsonResult = jsonList[i]; + // ...and loop through each data field value of each response + for(var j = aSchema.length-1; j >= 1 ; j--) { + // ...and capture data into an array mapped according to the schema... + var dataFieldValue = jsonResult[aSchema[j]]; + if(!dataFieldValue) { + dataFieldValue = ""; + } + //YAHOO.log("data: " + i + " value:" +j+" = "+dataFieldValue,"debug",this.toString()); + aResultItem.unshift(dataFieldValue); + } + // If schema isn't well defined, pass along the entire result object + if(aResultItem.length == 1) { + aResultItem.push(jsonResult); + } + // Capture the array of data field values in an array of results + aResults.unshift(aResultItem); + } + break; + case YAHOO.widget.DS_XHR.TYPE_XML: + // Get the collection of results + var xmlList = oResponse.getElementsByTagName(aSchema[0]); + if(!xmlList) { + bError = true; + break; + } + // Loop through each result + for(var k = xmlList.length-1; k >= 0 ; k--) { + var result = xmlList.item(k); + //YAHOO.log("Result"+k+" is "+result.attributes.item(0).firstChild.nodeValue,"debug",this.toString()); + var aFieldSet = []; + // Loop through each data field in each result using the schema + for(var m = aSchema.length-1; m >= 1 ; m--) { + //YAHOO.log(aSchema[m]+" is "+result.attributes.getNamedItem(aSchema[m]).firstChild.nodeValue); + var sValue = null; + // Values may be held in an attribute... + var xmlAttr = result.attributes.getNamedItem(aSchema[m]); + if(xmlAttr) { + sValue = xmlAttr.value; + //YAHOO.log("Attr value is "+sValue,"debug",this.toString()); + } + // ...or in a node + else{ + var xmlNode = result.getElementsByTagName(aSchema[m]); + if(xmlNode && xmlNode.item(0) && xmlNode.item(0).firstChild) { + sValue = xmlNode.item(0).firstChild.nodeValue; + //YAHOO.log("Node value is "+sValue,"debug",this.toString()); + } + else { + sValue = ""; + //YAHOO.log("Value not found","debug",this.toString()); + } + } + // Capture the schema-mapped data field values into an array + aFieldSet.unshift(sValue); + } + // Capture each array of values into an array of results + aResults.unshift(aFieldSet); + } + break; + case YAHOO.widget.DS_XHR.TYPE_FLAT: + if(oResponse.length > 0) { + // Delete the last line delimiter at the end of the data if it exists + var newLength = oResponse.length-aSchema[0].length; + if(oResponse.substr(newLength) == aSchema[0]) { + oResponse = oResponse.substr(0, newLength); + } + var aRecords = oResponse.split(aSchema[0]); + for(var n = aRecords.length-1; n >= 0; n--) { + aResults[n] = aRecords[n].split(aSchema[1]); + } + } + break; + default: + break; + } + sQuery = null; + oResponse = null; + oParent = null; + if(bError) { + return null; + } + else { + return aResults; + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * XHR connection object. + * + * @property _oConn + * @type Object + * @private + */ +YAHOO.widget.DS_XHR.prototype._oConn = null; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript function as + * its live data source. + * + * @class DS_JSFunction + * @constructor + * @extends YAHOO.widget.DataSource + * @param oFunction {HTMLFunction} In-memory Javascript function that returns query results as an array of objects. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSFunction = function(oFunction, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!oFunction || (oFunction.constructor != Function)) { + YAHOO.log("Could not instantiate JSFunction DataSource due to invalid arguments", "error", this.toString()); + return; + } + else { + this.dataFunction = oFunction; + this._init(); + YAHOO.log("JS Function DataSource initialized","info",this.toString()); + } +}; + +YAHOO.widget.DS_JSFunction.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript function that returns query results. + * + * @property dataFunction + * @type HTMLFunction + */ +YAHOO.widget.DS_JSFunction.prototype.dataFunction = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by function for results. Results are + * passed back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSFunction.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var oFunction = this.dataFunction; + var aResults = []; + + aResults = oFunction(sQuery); + if(aResults === null) { + this.dataErrorEvent.fire(this, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATANULL, "error", this.toString()); + return; + } + + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + this._addCacheElem(resultObj); + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); + return; +}; + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript array as + * its live data source. + * + * @class DS_JSArray + * @constructor + * @extends YAHOO.widget.DataSource + * @param aData {String[]} In-memory Javascript array of simple string data. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSArray = function(aData, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aData || (aData.constructor != Array)) { + YAHOO.log("Could not instantiate JSArray DataSource due to invalid arguments", "error", this.toString()); + return; + } + else { + this.data = aData; + this._init(); + YAHOO.log("JS Array DataSource initialized","info",this.toString()); + } +}; + +YAHOO.widget.DS_JSArray.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript array of strings. + * + * @property data + * @type Array + */ +YAHOO.widget.DS_JSArray.prototype.data = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by data for results. Results are passed + * back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSArray.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var aData = this.data; // the array + var aResults = []; // container for results + var bMatchFound = false; + var bMatchContains = this.queryMatchContains; + if(sQuery) { + if(!this.queryMatchCase) { + sQuery = sQuery.toLowerCase(); + } + + // Loop through each element of the array... + // which can be a string or an array of strings + for(var i = aData.length-1; i >= 0; i--) { + var aDataset = []; + + if(aData[i]) { + if(aData[i].constructor == String) { + aDataset[0] = aData[i]; + } + else if(aData[i].constructor == Array) { + aDataset = aData[i]; + } + } + + if(aDataset[0] && (aDataset[0].constructor == String)) { + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aDataset[0]).indexOf(sQuery): + encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aDataset); + } + } + } + } + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); +}; + +YAHOO.register("autocomplete", YAHOO.widget.AutoComplete, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-min.js b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-min.js new file mode 100644 index 000000000..f15e71897 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete-min.js @@ -0,0 +1,183 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +YAHOO.widget.AutoComplete=function(elInput,elContainer,oDataSource,oConfigs){if(elInput&&elContainer&&oDataSource){if(oDataSource&&(oDataSource instanceof YAHOO.widget.DataSource)){this.dataSource=oDataSource;} +else{return;} +if(YAHOO.util.Dom.inDocument(elInput)){if(typeof elInput=="string"){this._sName="instance"+YAHOO.widget.AutoComplete._nIndex+" "+elInput;this._oTextbox=document.getElementById(elInput);} +else{this._sName=(elInput.id)?"instance"+YAHOO.widget.AutoComplete._nIndex+" "+elInput.id:"instance"+YAHOO.widget.AutoComplete._nIndex;this._oTextbox=elInput;}} +else{return;} +if(YAHOO.util.Dom.inDocument(elContainer)){if(typeof elContainer=="string"){this._oContainer=document.getElementById(elContainer);} +else{this._oContainer=elContainer;} +if(this._oContainer.style.display=="none"){}} +else{return;} +if(typeof oConfigs=="object"){for(var sConfig in oConfigs){if(sConfig){this[sConfig]=oConfigs[sConfig];}}} +this._initContainer();this._initProps();this._initList();this._initContainerHelpers();var oSelf=this;var oTextbox=this._oTextbox;var oContent=this._oContainer._oContent;YAHOO.util.Event.addListener(oTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf);YAHOO.util.Event.addListener(oTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf);YAHOO.util.Event.addListener(oTextbox,"focus",oSelf._onTextboxFocus,oSelf);YAHOO.util.Event.addListener(oTextbox,"blur",oSelf._onTextboxBlur,oSelf);YAHOO.util.Event.addListener(oContent,"mouseover",oSelf._onContainerMouseover,oSelf);YAHOO.util.Event.addListener(oContent,"mouseout",oSelf._onContainerMouseout,oSelf);YAHOO.util.Event.addListener(oContent,"scroll",oSelf._onContainerScroll,oSelf);YAHOO.util.Event.addListener(oContent,"resize",oSelf._onContainerResize,oSelf);if(oTextbox.form){YAHOO.util.Event.addListener(oTextbox.form,"submit",oSelf._onFormSubmit,oSelf);} +YAHOO.util.Event.addListener(oTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf);this.textboxFocusEvent=new YAHOO.util.CustomEvent("textboxFocus",this);this.textboxKeyEvent=new YAHOO.util.CustomEvent("textboxKey",this);this.dataRequestEvent=new YAHOO.util.CustomEvent("dataRequest",this);this.dataReturnEvent=new YAHOO.util.CustomEvent("dataReturn",this);this.dataErrorEvent=new YAHOO.util.CustomEvent("dataError",this);this.containerExpandEvent=new YAHOO.util.CustomEvent("containerExpand",this);this.typeAheadEvent=new YAHOO.util.CustomEvent("typeAhead",this);this.itemMouseOverEvent=new YAHOO.util.CustomEvent("itemMouseOver",this);this.itemMouseOutEvent=new YAHOO.util.CustomEvent("itemMouseOut",this);this.itemArrowToEvent=new YAHOO.util.CustomEvent("itemArrowTo",this);this.itemArrowFromEvent=new YAHOO.util.CustomEvent("itemArrowFrom",this);this.itemSelectEvent=new YAHOO.util.CustomEvent("itemSelect",this);this.unmatchedItemSelectEvent=new YAHOO.util.CustomEvent("unmatchedItemSelect",this);this.selectionEnforceEvent=new YAHOO.util.CustomEvent("selectionEnforce",this);this.containerCollapseEvent=new YAHOO.util.CustomEvent("containerCollapse",this);this.textboxBlurEvent=new YAHOO.util.CustomEvent("textboxBlur",this);oTextbox.setAttribute("autocomplete","off");YAHOO.widget.AutoComplete._nIndex++;} +else{}};YAHOO.widget.AutoComplete.prototype.dataSource=null;YAHOO.widget.AutoComplete.prototype.minQueryLength=1;YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed=10;YAHOO.widget.AutoComplete.prototype.queryDelay=0.5;YAHOO.widget.AutoComplete.prototype.highlightClassName="yui-ac-highlight";YAHOO.widget.AutoComplete.prototype.prehighlightClassName=null;YAHOO.widget.AutoComplete.prototype.delimChar=null;YAHOO.widget.AutoComplete.prototype.autoHighlight=true;YAHOO.widget.AutoComplete.prototype.typeAhead=false;YAHOO.widget.AutoComplete.prototype.animHoriz=false;YAHOO.widget.AutoComplete.prototype.animVert=true;YAHOO.widget.AutoComplete.prototype.animSpeed=0.3;YAHOO.widget.AutoComplete.prototype.forceSelection=false;YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete=true;YAHOO.widget.AutoComplete.prototype.alwaysShowContainer=false;YAHOO.widget.AutoComplete.prototype.useIFrame=false;YAHOO.widget.AutoComplete.prototype.useShadow=false;YAHOO.widget.AutoComplete.prototype.toString=function(){return"AutoComplete "+this._sName;};YAHOO.widget.AutoComplete.prototype.isContainerOpen=function(){return this._bContainerOpen;};YAHOO.widget.AutoComplete.prototype.getListItems=function(){return this._aListItems;};YAHOO.widget.AutoComplete.prototype.getListItemData=function(oListItem){if(oListItem._oResultData){return oListItem._oResultData;} +else{return false;}};YAHOO.widget.AutoComplete.prototype.setHeader=function(sHeader){if(sHeader){if(this._oContainer._oContent._oHeader){this._oContainer._oContent._oHeader.innerHTML=sHeader;this._oContainer._oContent._oHeader.style.display="block";}} +else{this._oContainer._oContent._oHeader.innerHTML="";this._oContainer._oContent._oHeader.style.display="none";}};YAHOO.widget.AutoComplete.prototype.setFooter=function(sFooter){if(sFooter){if(this._oContainer._oContent._oFooter){this._oContainer._oContent._oFooter.innerHTML=sFooter;this._oContainer._oContent._oFooter.style.display="block";}} +else{this._oContainer._oContent._oFooter.innerHTML="";this._oContainer._oContent._oFooter.style.display="none";}};YAHOO.widget.AutoComplete.prototype.setBody=function(sBody){if(sBody){if(this._oContainer._oContent._oBody){this._oContainer._oContent._oBody.innerHTML=sBody;this._oContainer._oContent._oBody.style.display="block";this._oContainer._oContent.style.display="block";}} +else{this._oContainer._oContent._oBody.innerHTML="";this._oContainer._oContent.style.display="none";} +this._maxResultsDisplayed=0;};YAHOO.widget.AutoComplete.prototype.formatResult=function(oResultItem,sQuery){var sResult=oResultItem[0];if(sResult){return sResult;} +else{return"";}};YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer=function(oResultItem,sQuery){return true;};YAHOO.widget.AutoComplete.prototype.sendQuery=function(sQuery){this._sendQuery(sQuery);};YAHOO.widget.AutoComplete.prototype.textboxFocusEvent=null;YAHOO.widget.AutoComplete.prototype.textboxKeyEvent=null;YAHOO.widget.AutoComplete.prototype.dataRequestEvent=null;YAHOO.widget.AutoComplete.prototype.dataReturnEvent=null;YAHOO.widget.AutoComplete.prototype.dataErrorEvent=null;YAHOO.widget.AutoComplete.prototype.containerExpandEvent=null;YAHOO.widget.AutoComplete.prototype.typeAheadEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowToEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent=null;YAHOO.widget.AutoComplete.prototype.itemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent=null;YAHOO.widget.AutoComplete.prototype.containerCollapseEvent=null;YAHOO.widget.AutoComplete.prototype.textboxBlurEvent=null;YAHOO.widget.AutoComplete._nIndex=0;YAHOO.widget.AutoComplete.prototype._sName=null;YAHOO.widget.AutoComplete.prototype._oTextbox=null;YAHOO.widget.AutoComplete.prototype._bFocused=true;YAHOO.widget.AutoComplete.prototype._oAnim=null;YAHOO.widget.AutoComplete.prototype._oContainer=null;YAHOO.widget.AutoComplete.prototype._bContainerOpen=false;YAHOO.widget.AutoComplete.prototype._bOverContainer=false;YAHOO.widget.AutoComplete.prototype._aListItems=null;YAHOO.widget.AutoComplete.prototype._nDisplayedItems=0;YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed=0;YAHOO.widget.AutoComplete.prototype._sCurQuery=null;YAHOO.widget.AutoComplete.prototype._sSavedQuery=null;YAHOO.widget.AutoComplete.prototype._oCurItem=null;YAHOO.widget.AutoComplete.prototype._bItemSelected=false;YAHOO.widget.AutoComplete.prototype._nKeyCode=null;YAHOO.widget.AutoComplete.prototype._nDelayID=-1;YAHOO.widget.AutoComplete.prototype._iFrameSrc="javascript:false;";YAHOO.widget.AutoComplete.prototype._queryInterval=null;YAHOO.widget.AutoComplete.prototype._sLastTextboxValue=null;YAHOO.widget.AutoComplete.prototype._initProps=function(){var minQueryLength=this.minQueryLength;if(isNaN(minQueryLength)||(minQueryLength<1)){minQueryLength=1;} +var maxResultsDisplayed=this.maxResultsDisplayed;if(isNaN(this.maxResultsDisplayed)||(this.maxResultsDisplayed<1)){this.maxResultsDisplayed=10;} +var queryDelay=this.queryDelay;if(isNaN(this.queryDelay)||(this.queryDelay<0)){this.queryDelay=0.5;} +var aDelimChar=(this.delimChar)?this.delimChar:null;if(aDelimChar){if(typeof aDelimChar=="string"){this.delimChar=[aDelimChar];} +else if(aDelimChar.constructor!=Array){this.delimChar=null;}} +var animSpeed=this.animSpeed;if((this.animHoriz||this.animVert)&&YAHOO.util.Anim){if(isNaN(animSpeed)||(animSpeed<0)){animSpeed=0.3;} +if(!this._oAnim){oAnim=new YAHOO.util.Anim(this._oContainer._oContent,{},this.animSpeed);this._oAnim=oAnim;} +else{this._oAnim.duration=animSpeed;}} +if(this.forceSelection&&this.delimChar){}};YAHOO.widget.AutoComplete.prototype._initContainerHelpers=function(){if(this.useShadow&&!this._oContainer._oShadow){var oShadow=document.createElement("div");oShadow.className="yui-ac-shadow";this._oContainer._oShadow=this._oContainer.appendChild(oShadow);} +if(this.useIFrame&&!this._oContainer._oIFrame){var oIFrame=document.createElement("iframe");oIFrame.src=this._iFrameSrc;oIFrame.frameBorder=0;oIFrame.scrolling="no";oIFrame.style.position="absolute";oIFrame.style.width="100%";oIFrame.style.height="100%";oIFrame.tabIndex=-1;this._oContainer._oIFrame=this._oContainer.appendChild(oIFrame);}};YAHOO.widget.AutoComplete.prototype._initContainer=function(){if(!this._oContainer._oContent){var oContent=document.createElement("div");oContent.className="yui-ac-content";oContent.style.display="none";this._oContainer._oContent=this._oContainer.appendChild(oContent);var oHeader=document.createElement("div");oHeader.className="yui-ac-hd";oHeader.style.display="none";this._oContainer._oContent._oHeader=this._oContainer._oContent.appendChild(oHeader);var oBody=document.createElement("div");oBody.className="yui-ac-bd";this._oContainer._oContent._oBody=this._oContainer._oContent.appendChild(oBody);var oFooter=document.createElement("div");oFooter.className="yui-ac-ft";oFooter.style.display="none";this._oContainer._oContent._oFooter=this._oContainer._oContent.appendChild(oFooter);} +else{}};YAHOO.widget.AutoComplete.prototype._initList=function(){this._aListItems=[];while(this._oContainer._oContent._oBody.hasChildNodes()){var oldListItems=this.getListItems();if(oldListItems){for(var oldi=oldListItems.length-1;oldi>=0;i--){oldListItems[oldi]=null;}} +this._oContainer._oContent._oBody.innerHTML="";} +var oList=document.createElement("ul");oList=this._oContainer._oContent._oBody.appendChild(oList);for(var i=0;i=18&&nKeyCode<=20)||(nKeyCode==27)||(nKeyCode>=33&&nKeyCode<=35)||(nKeyCode>=36&&nKeyCode<=38)||(nKeyCode==40)||(nKeyCode>=44&&nKeyCode<=45)){return true;} +return false;};YAHOO.widget.AutoComplete.prototype._sendQuery=function(sQuery){if(this.minQueryLength==-1){this._toggleContainer(false);return;} +var aDelimChar=(this.delimChar)?this.delimChar:null;if(aDelimChar){var nDelimIndex=-1;for(var i=aDelimChar.length-1;i>=0;i--){var nNewIndex=sQuery.lastIndexOf(aDelimChar[i]);if(nNewIndex>nDelimIndex){nDelimIndex=nNewIndex;}} +if(aDelimChar[i]==" "){for(var j=aDelimChar.length-1;j>=0;j--){if(sQuery[nDelimIndex-1]==aDelimChar[j]){nDelimIndex--;break;}}} +if(nDelimIndex>-1){var nQueryStart=nDelimIndex+1;while(sQuery.charAt(nQueryStart)==" "){nQueryStart+=1;} +this._sSavedQuery=sQuery.substring(0,nQueryStart);sQuery=sQuery.substr(nQueryStart);} +else if(sQuery.indexOf(this._sSavedQuery)<0){this._sSavedQuery=null;}} +if(sQuery&&(sQuery.length0)){if(this._nDelayID!=-1){clearTimeout(this._nDelayID);} +this._toggleContainer(false);return;} +sQuery=encodeURIComponent(sQuery);this._nDelayID=-1;this.dataRequestEvent.fire(this,sQuery);this.dataSource.getResults(this._populateList,sQuery,this);};YAHOO.widget.AutoComplete.prototype._populateList=function(sQuery,aResults,oSelf){if(aResults===null){oSelf.dataErrorEvent.fire(oSelf,sQuery);} +if(!oSelf._bFocused||!aResults){return;} +var isOpera=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);var contentStyle=oSelf._oContainer._oContent.style;contentStyle.width=(!isOpera)?null:"";contentStyle.height=(!isOpera)?null:"";var sCurQuery=decodeURIComponent(sQuery);oSelf._sCurQuery=sCurQuery;oSelf._bItemSelected=false;if(oSelf._maxResultsDisplayed!=oSelf.maxResultsDisplayed){oSelf._initList();} +var nItems=Math.min(aResults.length,oSelf.maxResultsDisplayed);oSelf._nDisplayedItems=nItems;if(nItems>0){oSelf._initContainerHelpers();var aItems=oSelf._aListItems;for(var i=nItems-1;i>=0;i--){var oItemi=aItems[i];var oResultItemi=aResults[i];oItemi.innerHTML=oSelf.formatResult(oResultItemi,sCurQuery);oItemi.style.display="list-item";oItemi._sResultKey=oResultItemi[0];oItemi._oResultData=oResultItemi;} +for(var j=aItems.length-1;j>=nItems;j--){var oItemj=aItems[j];oItemj.innerHTML=null;oItemj.style.display="none";oItemj._sResultKey=null;oItemj._oResultData=null;} +if(oSelf.autoHighlight){var oFirstItem=aItems[0];oSelf._toggleHighlight(oFirstItem,"to");oSelf.itemArrowToEvent.fire(oSelf,oFirstItem);oSelf._typeAhead(oFirstItem,sQuery);} +else{oSelf._oCurItem=null;} +var ok=oSelf.doBeforeExpandContainer(oSelf._oTextbox,oSelf._oContainer,sQuery,aResults);oSelf._toggleContainer(ok);} +else{oSelf._toggleContainer(false);} +oSelf.dataReturnEvent.fire(oSelf,sQuery,aResults);};YAHOO.widget.AutoComplete.prototype._clearSelection=function(){var sValue=this._oTextbox.value;var sChar=(this.delimChar)?this.delimChar[0]:null;var nIndex=(sChar)?sValue.lastIndexOf(sChar,sValue.length-2):-1;if(nIndex>-1){this._oTextbox.value=sValue.substring(0,nIndex);} +else{this._oTextbox.value="";} +this._sSavedQuery=this._oTextbox.value;this.selectionEnforceEvent.fire(this);};YAHOO.widget.AutoComplete.prototype._textMatchesOption=function(){var foundMatch=false;for(var i=this._nDisplayedItems-1;i>=0;i--){var oItem=this._aListItems[i];var sMatch=oItem._sResultKey.toLowerCase();if(sMatch==this._sCurQuery.toLowerCase()){foundMatch=true;break;}} +return(foundMatch);};YAHOO.widget.AutoComplete.prototype._typeAhead=function(oItem,sQuery){if(!this.typeAhead||(this._nKeyCode==8)){return;} +var oTextbox=this._oTextbox;var sValue=this._oTextbox.value;if(!oTextbox.setSelectionRange&&!oTextbox.createTextRange){return;} +var nStart=sValue.length;this._updateValue(oItem);var nEnd=oTextbox.value.length;this._selectText(oTextbox,nStart,nEnd);var sPrefill=oTextbox.value.substr(nStart,nEnd);this.typeAheadEvent.fire(this,sQuery,sPrefill);};YAHOO.widget.AutoComplete.prototype._selectText=function(oTextbox,nStart,nEnd){if(oTextbox.setSelectionRange){oTextbox.setSelectionRange(nStart,nEnd);} +else if(oTextbox.createTextRange){var oTextRange=oTextbox.createTextRange();oTextRange.moveStart("character",nStart);oTextRange.moveEnd("character",nEnd-oTextbox.value.length);oTextRange.select();} +else{oTextbox.select();}};YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers=function(bShow){var bFireEvent=false;var width=this._oContainer._oContent.offsetWidth+"px";var height=this._oContainer._oContent.offsetHeight+"px";if(this.useIFrame&&this._oContainer._oIFrame){bFireEvent=true;if(bShow){this._oContainer._oIFrame.style.width=width;this._oContainer._oIFrame.style.height=height;} +else{this._oContainer._oIFrame.style.width=0;this._oContainer._oIFrame.style.height=0;}} +if(this.useShadow&&this._oContainer._oShadow){bFireEvent=true;if(bShow){this._oContainer._oShadow.style.width=width;this._oContainer._oShadow.style.height=height;} +else{this._oContainer._oShadow.style.width=0;this._oContainer._oShadow.style.height=0;}}};YAHOO.widget.AutoComplete.prototype._toggleContainer=function(bShow){var oContainer=this._oContainer;if(this.alwaysShowContainer&&this._bContainerOpen){return;} +if(!bShow){this._oContainer._oContent.scrollTop=0;var aItems=this._aListItems;if(aItems&&(aItems.length>0)){for(var i=aItems.length-1;i>=0;i--){aItems[i].style.display="none";}} +if(this._oCurItem){this._toggleHighlight(this._oCurItem,"from");} +this._oCurItem=null;this._nDisplayedItems=0;this._sCurQuery=null;} +if(!bShow&&!this._bContainerOpen){oContainer._oContent.style.display="none";return;} +var oAnim=this._oAnim;if(oAnim&&oAnim.getEl()&&(this.animHoriz||this.animVert)){if(!bShow){this._toggleContainerHelpers(bShow);} +if(oAnim.isAnimated()){oAnim.stop();} +var oClone=oContainer._oContent.cloneNode(true);oContainer.appendChild(oClone);oClone.style.top="-9000px";oClone.style.display="block";var wExp=oClone.offsetWidth;var hExp=oClone.offsetHeight;var wColl=(this.animHoriz)?0:wExp;var hColl=(this.animVert)?0:hExp;oAnim.attributes=(bShow)?{width:{to:wExp},height:{to:hExp}}:{width:{to:wColl},height:{to:hColl}};if(bShow&&!this._bContainerOpen){oContainer._oContent.style.width=wColl+"px";oContainer._oContent.style.height=hColl+"px";} +else{oContainer._oContent.style.width=wExp+"px";oContainer._oContent.style.height=hExp+"px";} +oContainer.removeChild(oClone);oClone=null;var oSelf=this;var onAnimComplete=function(){oAnim.onComplete.unsubscribeAll();if(bShow){oSelf.containerExpandEvent.fire(oSelf);} +else{oContainer._oContent.style.display="none";oSelf.containerCollapseEvent.fire(oSelf);} +oSelf._toggleContainerHelpers(bShow);};oContainer._oContent.style.display="block";oAnim.onComplete.subscribe(onAnimComplete);oAnim.animate();this._bContainerOpen=bShow;} +else{if(bShow){oContainer._oContent.style.display="block";this.containerExpandEvent.fire(this);} +else{oContainer._oContent.style.display="none";this.containerCollapseEvent.fire(this);} +this._toggleContainerHelpers(bShow);this._bContainerOpen=bShow;}};YAHOO.widget.AutoComplete.prototype._toggleHighlight=function(oNewItem,sType){var sHighlight=this.highlightClassName;if(this._oCurItem){YAHOO.util.Dom.removeClass(this._oCurItem,sHighlight);} +if((sType=="to")&&sHighlight){YAHOO.util.Dom.addClass(oNewItem,sHighlight);this._oCurItem=oNewItem;}};YAHOO.widget.AutoComplete.prototype._togglePrehighlight=function(oNewItem,sType){if(oNewItem==this._oCurItem){return;} +var sPrehighlight=this.prehighlightClassName;if((sType=="mouseover")&&sPrehighlight){YAHOO.util.Dom.addClass(oNewItem,sPrehighlight);} +else{YAHOO.util.Dom.removeClass(oNewItem,sPrehighlight);}};YAHOO.widget.AutoComplete.prototype._updateValue=function(oItem){var oTextbox=this._oTextbox;var sDelimChar=(this.delimChar)?(this.delimChar[0]||this.delimChar):null;var sSavedQuery=this._sSavedQuery;var sResultKey=oItem._sResultKey;oTextbox.focus();oTextbox.value="";if(sDelimChar){if(sSavedQuery){oTextbox.value=sSavedQuery;} +oTextbox.value+=sResultKey+sDelimChar;if(sDelimChar!=" "){oTextbox.value+=" ";}} +else{oTextbox.value=sResultKey;} +if(oTextbox.type=="textarea"){oTextbox.scrollTop=oTextbox.scrollHeight;} +var end=oTextbox.value.length;this._selectText(oTextbox,end,end);this._oCurItem=oItem;};YAHOO.widget.AutoComplete.prototype._selectItem=function(oItem){this._bItemSelected=true;this._updateValue(oItem);this._cancelIntervalDetection(this);this.itemSelectEvent.fire(this,oItem,oItem._oResultData);this._toggleContainer(false);};YAHOO.widget.AutoComplete.prototype._jumpSelection=function(){if(!this.typeAhead){return;} +else{this._toggleContainer(false);}};YAHOO.widget.AutoComplete.prototype._moveSelection=function(nKeyCode){if(this._bContainerOpen){var oCurItem=this._oCurItem;var nCurItemIndex=-1;if(oCurItem){nCurItemIndex=oCurItem._nItemIndex;} +var nNewItemIndex=(nKeyCode==40)?(nCurItemIndex+1):(nCurItemIndex-1);if(nNewItemIndex<-2||nNewItemIndex>=this._nDisplayedItems){return;} +if(oCurItem){this._toggleHighlight(oCurItem,"from");this.itemArrowFromEvent.fire(this,oCurItem);} +if(nNewItemIndex==-1){if(this.delimChar&&this._sSavedQuery){if(!this._textMatchesOption()){this._oTextbox.value=this._sSavedQuery;} +else{this._oTextbox.value=this._sSavedQuery+this._sCurQuery;}} +else{this._oTextbox.value=this._sCurQuery;} +this._oCurItem=null;return;} +if(nNewItemIndex==-2){this._toggleContainer(false);return;} +var oNewItem=this._aListItems[nNewItemIndex];var oContent=this._oContainer._oContent;var scrollOn=((YAHOO.util.Dom.getStyle(oContent,"overflow")=="auto")||(YAHOO.util.Dom.getStyle(oContent,"overflowY")=="auto"));if(scrollOn&&(nNewItemIndex>-1)&&(nNewItemIndex(oContent.scrollTop+oContent.offsetHeight)){oContent.scrollTop=(oNewItem.offsetTop+oNewItem.offsetHeight)-oContent.offsetHeight;} +else if((oNewItem.offsetTop+oNewItem.offsetHeight)(oContent.scrollTop+oContent.offsetHeight)){this._oContainer._oContent.scrollTop=(oNewItem.offsetTop+oNewItem.offsetHeight)-oContent.offsetHeight;}}} +this._toggleHighlight(oNewItem,"to");this.itemArrowToEvent.fire(this,oNewItem);if(this.typeAhead){this._updateValue(oNewItem);}}};YAHOO.widget.AutoComplete.prototype._onItemMouseover=function(v,oSelf){if(oSelf.prehighlightClassName){oSelf._togglePrehighlight(this,"mouseover");} +else{oSelf._toggleHighlight(this,"to");} +oSelf.itemMouseOverEvent.fire(oSelf,this);};YAHOO.widget.AutoComplete.prototype._onItemMouseout=function(v,oSelf){if(oSelf.prehighlightClassName){oSelf._togglePrehighlight(this,"mouseout");} +else{oSelf._toggleHighlight(this,"from");} +oSelf.itemMouseOutEvent.fire(oSelf,this);};YAHOO.widget.AutoComplete.prototype._onItemMouseclick=function(v,oSelf){oSelf._toggleHighlight(this,"to");oSelf._selectItem(this);};YAHOO.widget.AutoComplete.prototype._onContainerMouseover=function(v,oSelf){oSelf._bOverContainer=true;};YAHOO.widget.AutoComplete.prototype._onContainerMouseout=function(v,oSelf){oSelf._bOverContainer=false;if(oSelf._oCurItem){oSelf._toggleHighlight(oSelf._oCurItem,"to");}};YAHOO.widget.AutoComplete.prototype._onContainerScroll=function(v,oSelf){oSelf._oTextbox.focus();};YAHOO.widget.AutoComplete.prototype._onContainerResize=function(v,oSelf){oSelf._toggleContainerHelpers(oSelf._bContainerOpen);};YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown=function(v,oSelf){var nKeyCode=v.keyCode;switch(nKeyCode){case 9:if(oSelf.delimChar&&(oSelf._nKeyCode!=nKeyCode)){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +if(oSelf._oCurItem){oSelf._selectItem(oSelf._oCurItem);} +else{oSelf._toggleContainer(false);} +break;case 13:if(oSelf._nKeyCode!=nKeyCode){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +if(oSelf._oCurItem){oSelf._selectItem(oSelf._oCurItem);} +else{oSelf._toggleContainer(false);} +break;case 27:oSelf._toggleContainer(false);return;case 39:oSelf._jumpSelection();break;case 38:YAHOO.util.Event.stopEvent(v);oSelf._moveSelection(nKeyCode);break;case 40:YAHOO.util.Event.stopEvent(v);oSelf._moveSelection(nKeyCode);break;default:break;}};YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress=function(v,oSelf){var nKeyCode=v.keyCode;var isMac=(navigator.userAgent.toLowerCase().indexOf("mac")!=-1);if(isMac){switch(nKeyCode){case 9:if(oSelf.delimChar&&(oSelf._nKeyCode!=nKeyCode)){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +break;case 13:if(oSelf._nKeyCode!=nKeyCode){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +break;case 38:case 40:YAHOO.util.Event.stopEvent(v);break;default:break;}} +else if(nKeyCode==229){oSelf._queryInterval=setInterval(function(){oSelf._onIMEDetected(oSelf);},500);}};YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp=function(v,oSelf){oSelf._initProps();var nKeyCode=v.keyCode;oSelf._nKeyCode=nKeyCode;var sText=this.value;if(oSelf._isIgnoreKey(nKeyCode)||(sText.toLowerCase()==oSelf._sCurQuery)){return;} +else{oSelf.textboxKeyEvent.fire(oSelf,nKeyCode);} +if(oSelf.queryDelay>0){var nDelayID=setTimeout(function(){oSelf._sendQuery(sText);},(oSelf.queryDelay*1000));if(oSelf._nDelayID!=-1){clearTimeout(oSelf._nDelayID);} +oSelf._nDelayID=nDelayID;} +else{oSelf._sendQuery(sText);}};YAHOO.widget.AutoComplete.prototype._onTextboxFocus=function(v,oSelf){oSelf._oTextbox.setAttribute("autocomplete","off");oSelf._bFocused=true;oSelf.textboxFocusEvent.fire(oSelf);};YAHOO.widget.AutoComplete.prototype._onTextboxBlur=function(v,oSelf){if(!oSelf._bOverContainer||(oSelf._nKeyCode==9)){if(!oSelf._bItemSelected){if(!oSelf._bContainerOpen||(oSelf._bContainerOpen&&!oSelf._textMatchesOption())){if(oSelf.forceSelection){oSelf._clearSelection();} +else{oSelf.unmatchedItemSelectEvent.fire(oSelf,oSelf._sCurQuery);}}} +if(oSelf._bContainerOpen){oSelf._toggleContainer(false);} +oSelf._cancelIntervalDetection(oSelf);oSelf._bFocused=false;oSelf.textboxBlurEvent.fire(oSelf);}};YAHOO.widget.AutoComplete.prototype._onFormSubmit=function(v,oSelf){if(oSelf.allowBrowserAutocomplete){oSelf._oTextbox.setAttribute("autocomplete","on");} +else{oSelf._oTextbox.setAttribute("autocomplete","off");}};YAHOO.widget.DataSource=function(){};YAHOO.widget.DataSource.ERROR_DATANULL="Response data was null";YAHOO.widget.DataSource.ERROR_DATAPARSE="Response data could not be parsed";YAHOO.widget.DataSource.prototype.maxCacheEntries=15;YAHOO.widget.DataSource.prototype.queryMatchContains=false;YAHOO.widget.DataSource.prototype.queryMatchSubset=false;YAHOO.widget.DataSource.prototype.queryMatchCase=false;YAHOO.widget.DataSource.prototype.toString=function(){return"DataSource "+this._sName;};YAHOO.widget.DataSource.prototype.getResults=function(oCallbackFn,sQuery,oParent){var aResults=this._doQueryCache(oCallbackFn,sQuery,oParent);if(aResults.length===0){this.queryEvent.fire(this,oParent,sQuery);this.doQuery(oCallbackFn,sQuery,oParent);}};YAHOO.widget.DataSource.prototype.doQuery=function(oCallbackFn,sQuery,oParent){};YAHOO.widget.DataSource.prototype.flushCache=function(){if(this._aCache){this._aCache=[];} +if(this._aCacheHelper){this._aCacheHelper=[];} +this.cacheFlushEvent.fire(this);};YAHOO.widget.DataSource.prototype.queryEvent=null;YAHOO.widget.DataSource.prototype.cacheQueryEvent=null;YAHOO.widget.DataSource.prototype.getResultsEvent=null;YAHOO.widget.DataSource.prototype.getCachedResultsEvent=null;YAHOO.widget.DataSource.prototype.dataErrorEvent=null;YAHOO.widget.DataSource.prototype.cacheFlushEvent=null;YAHOO.widget.DataSource._nIndex=0;YAHOO.widget.DataSource.prototype._sName=null;YAHOO.widget.DataSource.prototype._aCache=null;YAHOO.widget.DataSource.prototype._init=function(){var maxCacheEntries=this.maxCacheEntries;if(isNaN(maxCacheEntries)||(maxCacheEntries<0)){maxCacheEntries=0;} +if(maxCacheEntries>0&&!this._aCache){this._aCache=[];} +this._sName="instance"+YAHOO.widget.DataSource._nIndex;YAHOO.widget.DataSource._nIndex++;this.queryEvent=new YAHOO.util.CustomEvent("query",this);this.cacheQueryEvent=new YAHOO.util.CustomEvent("cacheQuery",this);this.getResultsEvent=new YAHOO.util.CustomEvent("getResults",this);this.getCachedResultsEvent=new YAHOO.util.CustomEvent("getCachedResults",this);this.dataErrorEvent=new YAHOO.util.CustomEvent("dataError",this);this.cacheFlushEvent=new YAHOO.util.CustomEvent("cacheFlush",this);};YAHOO.widget.DataSource.prototype._addCacheElem=function(oResult){var aCache=this._aCache;if(!aCache||!oResult||!oResult.query||!oResult.results){return;} +if(aCache.length>=this.maxCacheEntries){aCache.shift();} +aCache.push(oResult);};YAHOO.widget.DataSource.prototype._doQueryCache=function(oCallbackFn,sQuery,oParent){var aResults=[];var bMatchFound=false;var aCache=this._aCache;var nCacheLength=(aCache)?aCache.length:0;var bMatchContains=this.queryMatchContains;if((this.maxCacheEntries>0)&&aCache&&(nCacheLength>0)){this.cacheQueryEvent.fire(this,oParent,sQuery);if(!this.queryMatchCase){var sOrigQuery=sQuery;sQuery=sQuery.toLowerCase();} +for(var i=nCacheLength-1;i>=0;i--){var resultObj=aCache[i];var aAllResultItems=resultObj.results;var matchKey=(!this.queryMatchCase)?encodeURIComponent(resultObj.query).toLowerCase():encodeURIComponent(resultObj.query);if(matchKey==sQuery){bMatchFound=true;aResults=aAllResultItems;if(i!=nCacheLength-1){aCache.splice(i,1);this._addCacheElem(resultObj);} +break;} +else if(this.queryMatchSubset){for(var j=sQuery.length-1;j>=0;j--){var subQuery=sQuery.substr(0,j);if(matchKey==subQuery){bMatchFound=true;for(var k=aAllResultItems.length-1;k>=0;k--){var aRecord=aAllResultItems[k];var sKeyIndex=(this.queryMatchCase)?encodeURIComponent(aRecord[0]).indexOf(sQuery):encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery);if((!bMatchContains&&(sKeyIndex===0))||(bMatchContains&&(sKeyIndex>-1))){aResults.unshift(aRecord);}} +resultObj={};resultObj.query=sQuery;resultObj.results=aResults;this._addCacheElem(resultObj);break;}} +if(bMatchFound){break;}}} +if(bMatchFound){this.getCachedResultsEvent.fire(this,oParent,sOrigQuery,aResults);oCallbackFn(sOrigQuery,aResults,oParent);}} +return aResults;};YAHOO.widget.DS_XHR=function(sScriptURI,aSchema,oConfigs){if(typeof oConfigs=="object"){for(var sConfig in oConfigs){this[sConfig]=oConfigs[sConfig];}} +if(!aSchema||(aSchema.constructor!=Array)){return;} +else{this.schema=aSchema;} +this.scriptURI=sScriptURI;this._init();};YAHOO.widget.DS_XHR.prototype=new YAHOO.widget.DataSource();YAHOO.widget.DS_XHR.TYPE_JSON=0;YAHOO.widget.DS_XHR.TYPE_XML=1;YAHOO.widget.DS_XHR.TYPE_FLAT=2;YAHOO.widget.DS_XHR.ERROR_DATAXHR="XHR response failed";YAHOO.widget.DS_XHR.prototype.connMgr=YAHOO.util.Connect;YAHOO.widget.DS_XHR.prototype.connTimeout=0;YAHOO.widget.DS_XHR.prototype.scriptURI=null;YAHOO.widget.DS_XHR.prototype.scriptQueryParam="query";YAHOO.widget.DS_XHR.prototype.scriptQueryAppend="";YAHOO.widget.DS_XHR.prototype.responseType=YAHOO.widget.DS_XHR.TYPE_JSON;YAHOO.widget.DS_XHR.prototype.responseStripAfter="\n0){sUri+="&"+this.scriptQueryAppend;} +var oResponse=null;var oSelf=this;var responseSuccess=function(oResp){if(!oSelf._oConn||(oResp.tId!=oSelf._oConn.tId)){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATANULL);return;} +for(var foo in oResp){} +if(!isXML){oResp=oResp.responseText;} +else{oResp=oResp.responseXML;} +if(oResp===null){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATANULL);return;} +var aResults=oSelf.parseResponse(sQuery,oResp,oParent);var resultObj={};resultObj.query=decodeURIComponent(sQuery);resultObj.results=aResults;if(aResults===null){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATAPARSE);aResults=[];} +else{oSelf.getResultsEvent.fire(oSelf,oParent,sQuery,aResults);oSelf._addCacheElem(resultObj);} +oCallbackFn(sQuery,aResults,oParent);};var responseFailure=function(oResp){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DS_XHR.ERROR_DATAXHR);return;};var oCallback={success:responseSuccess,failure:responseFailure};if(!isNaN(this.connTimeout)&&this.connTimeout>0){oCallback.timeout=this.connTimeout;} +if(this._oConn){this.connMgr.abort(this._oConn);} +oSelf._oConn=this.connMgr.asyncRequest("GET",sUri,oCallback,null);};YAHOO.widget.DS_XHR.prototype.parseResponse=function(sQuery,oResponse,oParent){var aSchema=this.schema;var aResults=[];var bError=false;var nEnd=((this.responseStripAfter!=="")&&(oResponse.indexOf))?oResponse.indexOf(this.responseStripAfter):-1;if(nEnd!=-1){oResponse=oResponse.substring(0,nEnd);} +switch(this.responseType){case YAHOO.widget.DS_XHR.TYPE_JSON:var jsonList;if(window.JSON&&(navigator.userAgent.toLowerCase().indexOf('khtml')==-1)){var jsonObjParsed=JSON.parse(oResponse);if(!jsonObjParsed){bError=true;break;} +else{try{jsonList=eval("jsonObjParsed."+aSchema[0]);} +catch(e){bError=true;break;}}} +else{try{while(oResponse.substring(0,1)==" "){oResponse=oResponse.substring(1,oResponse.length);} +if(oResponse.indexOf("{")<0){bError=true;break;} +if(oResponse.indexOf("{}")===0){break;} +var jsonObjRaw=eval("("+oResponse+")");if(!jsonObjRaw){bError=true;break;} +jsonList=eval("(jsonObjRaw."+aSchema[0]+")");} +catch(e){bError=true;break;}} +if(!jsonList){bError=true;break;} +if(jsonList.constructor!=Array){jsonList=[jsonList];} +for(var i=jsonList.length-1;i>=0;i--){var aResultItem=[];var jsonResult=jsonList[i];for(var j=aSchema.length-1;j>=1;j--){var dataFieldValue=jsonResult[aSchema[j]];if(!dataFieldValue){dataFieldValue="";} +aResultItem.unshift(dataFieldValue);} +if(aResultItem.length==1){aResultItem.push(jsonResult);} +aResults.unshift(aResultItem);} +break;case YAHOO.widget.DS_XHR.TYPE_XML:var xmlList=oResponse.getElementsByTagName(aSchema[0]);if(!xmlList){bError=true;break;} +for(var k=xmlList.length-1;k>=0;k--){var result=xmlList.item(k);var aFieldSet=[];for(var m=aSchema.length-1;m>=1;m--){var sValue=null;var xmlAttr=result.attributes.getNamedItem(aSchema[m]);if(xmlAttr){sValue=xmlAttr.value;} +else{var xmlNode=result.getElementsByTagName(aSchema[m]);if(xmlNode&&xmlNode.item(0)&&xmlNode.item(0).firstChild){sValue=xmlNode.item(0).firstChild.nodeValue;} +else{sValue="";}} +aFieldSet.unshift(sValue);} +aResults.unshift(aFieldSet);} +break;case YAHOO.widget.DS_XHR.TYPE_FLAT:if(oResponse.length>0){var newLength=oResponse.length-aSchema[0].length;if(oResponse.substr(newLength)==aSchema[0]){oResponse=oResponse.substr(0,newLength);} +var aRecords=oResponse.split(aSchema[0]);for(var n=aRecords.length-1;n>=0;n--){aResults[n]=aRecords[n].split(aSchema[1]);}} +break;default:break;} +sQuery=null;oResponse=null;oParent=null;if(bError){return null;} +else{return aResults;}};YAHOO.widget.DS_XHR.prototype._oConn=null;YAHOO.widget.DS_JSFunction=function(oFunction,oConfigs){if(typeof oConfigs=="object"){for(var sConfig in oConfigs){this[sConfig]=oConfigs[sConfig];}} +if(!oFunction||(oFunction.constructor!=Function)){return;} +else{this.dataFunction=oFunction;this._init();}};YAHOO.widget.DS_JSFunction.prototype=new YAHOO.widget.DataSource();YAHOO.widget.DS_JSFunction.prototype.dataFunction=null;YAHOO.widget.DS_JSFunction.prototype.doQuery=function(oCallbackFn,sQuery,oParent){var oFunction=this.dataFunction;var aResults=[];aResults=oFunction(sQuery);if(aResults===null){this.dataErrorEvent.fire(this,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATANULL);return;} +var resultObj={};resultObj.query=decodeURIComponent(sQuery);resultObj.results=aResults;this._addCacheElem(resultObj);this.getResultsEvent.fire(this,oParent,sQuery,aResults);oCallbackFn(sQuery,aResults,oParent);return;};YAHOO.widget.DS_JSArray=function(aData,oConfigs){if(typeof oConfigs=="object"){for(var sConfig in oConfigs){this[sConfig]=oConfigs[sConfig];}} +if(!aData||(aData.constructor!=Array)){return;} +else{this.data=aData;this._init();}};YAHOO.widget.DS_JSArray.prototype=new YAHOO.widget.DataSource();YAHOO.widget.DS_JSArray.prototype.data=null;YAHOO.widget.DS_JSArray.prototype.doQuery=function(oCallbackFn,sQuery,oParent){var aData=this.data;var aResults=[];var bMatchFound=false;var bMatchContains=this.queryMatchContains;if(sQuery){if(!this.queryMatchCase){sQuery=sQuery.toLowerCase();} +for(var i=aData.length-1;i>=0;i--){var aDataset=[];if(aData[i]){if(aData[i].constructor==String){aDataset[0]=aData[i];} +else if(aData[i].constructor==Array){aDataset=aData[i];}} +if(aDataset[0]&&(aDataset[0].constructor==String)){var sKeyIndex=(this.queryMatchCase)?encodeURIComponent(aDataset[0]).indexOf(sQuery):encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery);if((!bMatchContains&&(sKeyIndex===0))||(bMatchContains&&(sKeyIndex>-1))){aResults.unshift(aDataset);}}}} +this.getResultsEvent.fire(this,oParent,sQuery,aResults);oCallbackFn(sQuery,aResults,oParent);};YAHOO.register("autocomplete",YAHOO.widget.AutoComplete,{version:"2.2.0",build:"127"}); \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/autocomplete/autocomplete.js b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete.js new file mode 100644 index 000000000..ce4e0581e --- /dev/null +++ b/interface/ispconfig/interface/js/yui/autocomplete/autocomplete.js @@ -0,0 +1,3071 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + /** + * The AutoComplete control provides the front-end logic for text-entry suggestion and + * completion functionality. + * + * @module autocomplete + * @requires yahoo, dom, event, datasource + * @optional animation, connection + * @namespace YAHOO.widget + * @title AutoComplete Widget + */ + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The AutoComplete class provides the customizable functionality of a plug-and-play DHTML + * auto completion widget. Some key features: + *
    + *
  • Navigate with up/down arrow keys and/or mouse to pick a selection
  • + *
  • The drop down container can "roll down" or "fly out" via configurable + * animation
  • + *
  • UI look-and-feel customizable through CSS, including container + * attributes, borders, position, fonts, etc
  • + *
+ * + * @class AutoComplete + * @constructor + * @param elInput {HTMLElement} DOM element reference of an input field. + * @param elInput {String} String ID of an input field. + * @param elContainer {HTMLElement} DOM element reference of an existing DIV. + * @param elContainer {String} String ID of an existing DIV. + * @param oDataSource {YAHOO.widget.DataSource} DataSource instance. + * @param oConfigs {Object} (optional) Object literal of configuration params. + */ +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) { + if(elInput && elContainer && oDataSource) { + // Validate DataSource + if (oDataSource && (oDataSource instanceof YAHOO.widget.DataSource)) { + this.dataSource = oDataSource; + } + else { + return; + } + + // Validate input element + if(YAHOO.util.Dom.inDocument(elInput)) { + if(typeof elInput == "string") { + this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput; + this._oTextbox = document.getElementById(elInput); + } + else { + this._sName = (elInput.id) ? + "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id: + "instance" + YAHOO.widget.AutoComplete._nIndex; + this._oTextbox = elInput; + } + } + else { + return; + } + + // Validate container element + if(YAHOO.util.Dom.inDocument(elContainer)) { + if(typeof elContainer == "string") { + this._oContainer = document.getElementById(elContainer); + } + else { + this._oContainer = elContainer; + } + if(this._oContainer.style.display == "none") { + } + } + else { + return; + } + + // Set any config params passed in to override defaults + if (typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + if (sConfig) { + this[sConfig] = oConfigs[sConfig]; + } + } + } + + // Initialization sequence + this._initContainer(); + this._initProps(); + this._initList(); + this._initContainerHelpers(); + + // Set up events + var oSelf = this; + var oTextbox = this._oTextbox; + // Events are actually for the content module within the container + var oContent = this._oContainer._oContent; + + // Dom events + YAHOO.util.Event.addListener(oTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf); + YAHOO.util.Event.addListener(oTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf); + YAHOO.util.Event.addListener(oTextbox,"focus",oSelf._onTextboxFocus,oSelf); + YAHOO.util.Event.addListener(oTextbox,"blur",oSelf._onTextboxBlur,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseover",oSelf._onContainerMouseover,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseout",oSelf._onContainerMouseout,oSelf); + YAHOO.util.Event.addListener(oContent,"scroll",oSelf._onContainerScroll,oSelf); + YAHOO.util.Event.addListener(oContent,"resize",oSelf._onContainerResize,oSelf); + if(oTextbox.form) { + YAHOO.util.Event.addListener(oTextbox.form,"submit",oSelf._onFormSubmit,oSelf); + } + YAHOO.util.Event.addListener(oTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf); + + // Custom events + this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this); + this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this); + this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this); + this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this); + this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this); + this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this); + this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this); + this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this); + this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this); + this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this); + this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this); + this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this); + this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this); + this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this); + + // Finish up + oTextbox.setAttribute("autocomplete","off"); + YAHOO.widget.AutoComplete._nIndex++; + } + // Required arguments were not found + else { + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * The DataSource object that encapsulates the data used for auto completion. + * This object should be an inherited object from YAHOO.widget.DataSource. + * + * @property dataSource + * @type YAHOO.widget.DataSource + */ +YAHOO.widget.AutoComplete.prototype.dataSource = null; + +/** + * Number of characters that must be entered before querying for results. A negative value + * effectively turns off the widget. A value of 0 allows queries of null or empty string + * values. + * + * @property minQueryLength + * @type Number + * @default 1 + */ +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1; + +/** + * Maximum number of results to display in results container. + * + * @property maxResultsDisplayed + * @type Number + * @default 10 + */ +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10; + +/** + * Number of seconds to delay before submitting a query request. If a query + * request is received before a previous one has completed its delay, the + * previous request is cancelled and the new request is set to the delay. + * + * @property queryDelay + * @type Number + * @default 0.5 + */ +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.5; + +/** + * Class name of a highlighted item within results container. + * + * @property highlightClassName + * @type String + * @default "yui-ac-highlight" + */ +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight"; + +/** + * Class name of a pre-highlighted item within results container. + * + * @property prehighlightClassName + * @type String + */ +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null; + +/** + * Query delimiter. A single character separator for multiple delimited + * selections. Multiple delimiter characteres may be defined as an array of + * strings. A null value or empty string indicates that query results cannot + * be delimited. This feature is not recommended if you need forceSelection to + * be true. + * + * @property delimChar + * @type String | String[] + */ +YAHOO.widget.AutoComplete.prototype.delimChar = null; + +/** + * Whether or not the first item in results container should be automatically highlighted + * on expand. + * + * @property autoHighlight + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.autoHighlight = true; + +/** + * Whether or not the input field should be automatically updated + * with the first query result as the user types, auto-selecting the substring + * that the user has not typed. + * + * @property typeAhead + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.typeAhead = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * horizontal direction. + * + * @property animHoriz + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.animHoriz = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * vertical direction. + * + * @property animVert + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.animVert = true; + +/** + * Speed of container expand/collapse animation, in seconds.. + * + * @property animSpeed + * @type Number + * @default 0.3 + */ +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3; + +/** + * Whether or not to force the user's selection to match one of the query + * results. Enabling this feature essentially transforms the input field into a + * <select> field. This feature is not recommended with delimiter character(s) + * defined. + * + * @property forceSelection + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.forceSelection = false; + +/** + * Whether or not to allow browsers to cache user-typed input in the input + * field. Disabling this feature will prevent the widget from setting the + * autocomplete="off" on the input field. When autocomplete="off" + * and users click the back button after form submission, user-typed input can + * be prefilled by the browser from its cache. This caching of user input may + * not be desired for sensitive data, such as credit card numbers, in which + * case, implementers should consider setting allowBrowserAutocomplete to false. + * + * @property allowBrowserAutocomplete + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true; + +/** + * Whether or not the results container should always be displayed. + * Enabling this feature displays the container when the widget is instantiated + * and prevents the toggling of the container to a collapsed state. + * + * @property alwaysShowContainer + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false; + +/** + * Whether or not to use an iFrame to layer over Windows form elements in + * IE. Set to true only when the results container will be on top of a + * <select> field in IE and thus exposed to the IE z-index bug (i.e., + * 5.5 < IE < 7). + * + * @property useIFrame + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useIFrame = false; + +/** + * Whether or not the results container should have a shadow. + * + * @property useShadow + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useShadow = false; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the AutoComplete instance. + * + * @method toString + * @return {String} Unique name of the AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.toString = function() { + return "AutoComplete " + this._sName; +}; + + /** + * Returns true if container is in an expanded state, false otherwise. + * + * @method isContainerOpen + * @return {Boolean} Returns true if container is in an expanded state, false otherwise. + */ +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() { + return this._bContainerOpen; +}; + +/** + * Public accessor to the internal array of DOM <li> elements that + * display query results within the results container. + * + * @method getListItems + * @return {HTMLElement[]} Array of <li> elements within the results container. + */ +YAHOO.widget.AutoComplete.prototype.getListItems = function() { + return this._aListItems; +}; + +/** + * Public accessor to the data held in an <li> element of the + * results container. + * + * @method getListItemData + * @return {Object | Object[]} Object or array of result data or null + */ +YAHOO.widget.AutoComplete.prototype.getListItemData = function(oListItem) { + if(oListItem._oResultData) { + return oListItem._oResultData; + } + else { + return false; + } +}; + +/** + * Sets HTML markup for the results container header. This markup will be + * inserted within a <div> tag with a class of "yui-ac-hd". + * + * @method setHeader + * @param sHeader {String} HTML markup for results container header. + */ +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) { + if(sHeader) { + if(this._oContainer._oContent._oHeader) { + this._oContainer._oContent._oHeader.innerHTML = sHeader; + this._oContainer._oContent._oHeader.style.display = "block"; + } + } + else { + this._oContainer._oContent._oHeader.innerHTML = ""; + this._oContainer._oContent._oHeader.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container footer. This markup will be + * inserted within a <div> tag with a class of "yui-ac-ft". + * + * @method setFooter + * @param sFooter {String} HTML markup for results container footer. + */ +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) { + if(sFooter) { + if(this._oContainer._oContent._oFooter) { + this._oContainer._oContent._oFooter.innerHTML = sFooter; + this._oContainer._oContent._oFooter.style.display = "block"; + } + } + else { + this._oContainer._oContent._oFooter.innerHTML = ""; + this._oContainer._oContent._oFooter.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container body. This markup will be + * inserted within a <div> tag with a class of "yui-ac-bd". + * + * @method setBody + * @param sBody {String} HTML markup for results container body. + */ +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) { + if(sBody) { + if(this._oContainer._oContent._oBody) { + this._oContainer._oContent._oBody.innerHTML = sBody; + this._oContainer._oContent._oBody.style.display = "block"; + this._oContainer._oContent.style.display = "block"; + } + } + else { + this._oContainer._oContent._oBody.innerHTML = ""; + this._oContainer._oContent.style.display = "none"; + } + this._maxResultsDisplayed = 0; +}; + +/** + * Overridable method that converts a result item object into HTML markup + * for display. Return data values are accessible via the oResultItem object, + * and the key return value will always be oResultItem[0]. Markup will be + * displayed within <li> element tags in the container. + * + * @method formatResult + * @param oResultItem {Object} Result item representing one query result. Data is held in an array. + * @param sQuery {String} The current query string. + * @return {String} HTML markup of formatted result data. + */ +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultItem, sQuery) { + var sResult = oResultItem[0]; + if(sResult) { + return sResult; + } + else { + return ""; + } +}; + +/** + * Overridable method called before container expands allows implementers to access data + * and DOM elements. + * + * @method doBeforeExpandContainer + * @return {Boolean} Return true to continue expanding container, false to cancel the expand. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(oResultItem, sQuery) { + return true; +}; + +/** + * Makes query request to the DataSource. + * + * @method sendQuery + * @param sQuery {String} Query string. + */ +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) { + this._sendQuery(sQuery); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when the input field receives focus. + * + * @event textboxFocusEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null; + +/** + * Fired when the input field receives key input. + * + * @event textboxKeyEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param nKeycode {Number} The keycode number. + */ +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null; + +/** + * Fired when the AutoComplete instance makes a query to the DataSource. + * + * @event dataRequestEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null; + +/** + * Fired when the AutoComplete instance receives query results from the data + * source. + * + * @event dataReturnEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Results array. + */ +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null; + +/** + * Fired when the AutoComplete instance does not receive query results from the + * DataSource due to an error. + * + * @event dataErrorEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null; + +/** + * Fired when the results container is expanded. + * + * @event containerExpandEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null; + +/** + * Fired when the input field has been prefilled by the type-ahead + * feature. + * + * @event typeAheadEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param sPrefill {String} The prefill string. + */ +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null; + +/** + * Fired when result item has been moused over. + * + * @event itemMouseOverEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused to. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null; + +/** + * Fired when result item has been moused out. + * + * @event itemMouseOutEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused from. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null; + +/** + * Fired when result item has been arrowed to. + * + * @event itemArrowToEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed to. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null; + +/** + * Fired when result item has been arrowed away from. + * + * @event itemArrowFromEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed from. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null; + +/** + * Fired when an item is selected via mouse click, ENTER key, or TAB key. + * + * @event itemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The selected <li> element item. + * @param oData {Object} The data returned for the item, either as an object, + * or mapped from the schema into an array. + */ +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null; + +/** + * Fired when a user selection does not match any of the displayed result items. + * Note that this event may not behave as expected when delimiter characters + * have been defined. + * + * @event unmatchedItemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The user-typed query string. + */ +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null; + +/** + * Fired if forceSelection is enabled and the user's input has been cleared + * because it did not match one of the returned query results. + * + * @event selectionEnforceEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null; + +/** + * Fired when the results container is collapsed. + * + * @event containerCollapseEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null; + +/** + * Fired when the input field loses focus. + * + * @event textboxBlurEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple AutoComplete instances. + * + * @property _nIndex + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.AutoComplete._nIndex = 0; + +/** + * Name of AutoComplete instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sName = null; + +/** + * Text input field DOM element. + * + * @property _oTextbox + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oTextbox = null; + +/** + * Whether or not the input field is currently in focus. If query results come back + * but the user has already moved on, do not proceed with auto complete behavior. + * + * @property _bFocused + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bFocused = true; + +/** + * Animation instance for container expand/collapse. + * + * @property _oAnim + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._oAnim = null; + +/** + * Container DOM element. + * + * @property _oContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oContainer = null; + +/** + * Whether or not the results container is currently open. + * + * @property _bContainerOpen + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false; + +/** + * Whether or not the mouse is currently over the results + * container. This is necessary in order to prevent clicks on container items + * from being text input field blur events. + * + * @property _bOverContainer + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bOverContainer = false; + +/** + * Array of <li> elements references that contain query results within the + * results container. + * + * @property _aListItems + * @type HTMLElement[] + * @private + */ +YAHOO.widget.AutoComplete.prototype._aListItems = null; + +/** + * Number of <li> elements currently displayed in results container. + * + * @property _nDisplayedItems + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0; + +/** + * Internal count of <li> elements displayed and hidden in results container. + * + * @property _maxResultsDisplayed + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0; + +/** + * Current query string + * + * @property _sCurQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sCurQuery = null; + +/** + * Past queries this session (for saving delimited queries). + * + * @property _sSavedQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sSavedQuery = null; + +/** + * Pointer to the currently highlighted <li> element in the container. + * + * @property _oCurItem + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oCurItem = null; + +/** + * Whether or not an item has been selected since the container was populated + * with results. Reset to false by _populateList, and set to true when item is + * selected. + * + * @property _bItemSelected + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bItemSelected = false; + +/** + * Key code of the last key pressed in textbox. + * + * @property _nKeyCode + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nKeyCode = null; + +/** + * Delay timeout ID. + * + * @property _nDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDelayID = -1; + +/** + * Src to iFrame used when useIFrame = true. Supports implementations over SSL + * as well. + * + * @property _iFrameSrc + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;"; + +/** + * For users typing via certain IMEs, queries must be triggered by intervals, + * since key events yet supported across all browsers for all IMEs. + * + * @property _queryInterval + * @type Object + * @private + */ +YAHOO.widget.AutoComplete.prototype._queryInterval = null; + +/** + * Internal tracker to last known textbox value, used to determine whether or not + * to trigger a query via interval for certain IME users. + * + * @event _sLastTextboxValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Updates and validates latest public config properties. + * + * @method __initProps + * @private + */ +YAHOO.widget.AutoComplete.prototype._initProps = function() { + // Correct any invalid values + var minQueryLength = this.minQueryLength; + if(isNaN(minQueryLength) || (minQueryLength < 1)) { + minQueryLength = 1; + } + var maxResultsDisplayed = this.maxResultsDisplayed; + if(isNaN(this.maxResultsDisplayed) || (this.maxResultsDisplayed < 1)) { + this.maxResultsDisplayed = 10; + } + var queryDelay = this.queryDelay; + if(isNaN(this.queryDelay) || (this.queryDelay < 0)) { + this.queryDelay = 0.5; + } + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + if(typeof aDelimChar == "string") { + this.delimChar = [aDelimChar]; + } + else if(aDelimChar.constructor != Array) { + this.delimChar = null; + } + } + var animSpeed = this.animSpeed; + if((this.animHoriz || this.animVert) && YAHOO.util.Anim) { + if(isNaN(animSpeed) || (animSpeed < 0)) { + animSpeed = 0.3; + } + if(!this._oAnim ) { + oAnim = new YAHOO.util.Anim(this._oContainer._oContent, {}, this.animSpeed); + this._oAnim = oAnim; + } + else { + this._oAnim.duration = animSpeed; + } + } + if(this.forceSelection && this.delimChar) { + } +}; + +/** + * Initializes the results container helpers if they are enabled and do + * not exist + * + * @method _initContainerHelpers + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerHelpers = function() { + if(this.useShadow && !this._oContainer._oShadow) { + var oShadow = document.createElement("div"); + oShadow.className = "yui-ac-shadow"; + this._oContainer._oShadow = this._oContainer.appendChild(oShadow); + } + if(this.useIFrame && !this._oContainer._oIFrame) { + var oIFrame = document.createElement("iframe"); + oIFrame.src = this._iFrameSrc; + oIFrame.frameBorder = 0; + oIFrame.scrolling = "no"; + oIFrame.style.position = "absolute"; + oIFrame.style.width = "100%"; + oIFrame.style.height = "100%"; + oIFrame.tabIndex = -1; + this._oContainer._oIFrame = this._oContainer.appendChild(oIFrame); + } +}; + +/** + * Initializes the results container once at object creation + * + * @method _initContainer + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainer = function() { + if(!this._oContainer._oContent) { + // The oContent div helps size the iframe and shadow properly + var oContent = document.createElement("div"); + oContent.className = "yui-ac-content"; + oContent.style.display = "none"; + this._oContainer._oContent = this._oContainer.appendChild(oContent); + + var oHeader = document.createElement("div"); + oHeader.className = "yui-ac-hd"; + oHeader.style.display = "none"; + this._oContainer._oContent._oHeader = this._oContainer._oContent.appendChild(oHeader); + + var oBody = document.createElement("div"); + oBody.className = "yui-ac-bd"; + this._oContainer._oContent._oBody = this._oContainer._oContent.appendChild(oBody); + + var oFooter = document.createElement("div"); + oFooter.className = "yui-ac-ft"; + oFooter.style.display = "none"; + this._oContainer._oContent._oFooter = this._oContainer._oContent.appendChild(oFooter); + } + else { + } +}; + +/** + * Clears out contents of container body and creates up to + * YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an + * <ul> element. + * + * @method _initList + * @private + */ +YAHOO.widget.AutoComplete.prototype._initList = function() { + this._aListItems = []; + while(this._oContainer._oContent._oBody.hasChildNodes()) { + var oldListItems = this.getListItems(); + if(oldListItems) { + for(var oldi = oldListItems.length-1; oldi >= 0; i--) { + oldListItems[oldi] = null; + } + } + this._oContainer._oContent._oBody.innerHTML = ""; + } + + var oList = document.createElement("ul"); + oList = this._oContainer._oContent._oBody.appendChild(oList); + for(var i=0; i= 18 && nKeyCode <= 20) || // alt,pause/break,caps lock + (nKeyCode == 27) || // esc + (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end + (nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up + (nKeyCode == 40) || // down + (nKeyCode >= 44 && nKeyCode <= 45)) { // print screen,insert + return true; + } + return false; +}; + +/** + * Makes query request to the DataSource. + * + * @method _sendQuery + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) { + // Widget has been effectively turned off + if(this.minQueryLength == -1) { + this._toggleContainer(false); + return; + } + // Delimiter has been enabled + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + // Loop through all possible delimiters and find the latest one + // A " " may be a false positive if they are defined as delimiters AND + // are used to separate delimited queries + var nDelimIndex = -1; + for(var i = aDelimChar.length-1; i >= 0; i--) { + var nNewIndex = sQuery.lastIndexOf(aDelimChar[i]); + if(nNewIndex > nDelimIndex) { + nDelimIndex = nNewIndex; + } + } + // If we think the last delimiter is a space (" "), make sure it is NOT + // a false positive by also checking the char directly before it + if(aDelimChar[i] == " ") { + for (var j = aDelimChar.length-1; j >= 0; j--) { + if(sQuery[nDelimIndex - 1] == aDelimChar[j]) { + nDelimIndex--; + break; + } + } + } + // A delimiter has been found so extract the latest query + if (nDelimIndex > -1) { + var nQueryStart = nDelimIndex + 1; + // Trim any white space from the beginning... + while(sQuery.charAt(nQueryStart) == " ") { + nQueryStart += 1; + } + // ...and save the rest of the string for later + this._sSavedQuery = sQuery.substring(0,nQueryStart); + // Here is the query itself + sQuery = sQuery.substr(nQueryStart); + } + else if(sQuery.indexOf(this._sSavedQuery) < 0){ + this._sSavedQuery = null; + } + } + + // Don't search queries that are too short + if (sQuery && (sQuery.length < this.minQueryLength) || (!sQuery && this.minQueryLength > 0)) { + if (this._nDelayID != -1) { + clearTimeout(this._nDelayID); + } + this._toggleContainer(false); + return; + } + + sQuery = encodeURIComponent(sQuery); + this._nDelayID = -1; // Reset timeout ID because request has been made + this.dataRequestEvent.fire(this, sQuery); + this.dataSource.getResults(this._populateList, sQuery, this); +}; + +/** + * Populates the array of <li> elements in the container with query + * results. This method is passed to YAHOO.widget.DataSource#getResults as a + * callback function so results from the DataSource instance are returned to the + * AutoComplete instance. + * + * @method _populateList + * @param sQuery {String} The query string. + * @param aResults {Object[]} An array of query result objects from the DataSource. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, aResults, oSelf) { + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, sQuery); + } + if (!oSelf._bFocused || !aResults) { + return; + } + + var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + var contentStyle = oSelf._oContainer._oContent.style; + contentStyle.width = (!isOpera) ? null : ""; + contentStyle.height = (!isOpera) ? null : ""; + + var sCurQuery = decodeURIComponent(sQuery); + oSelf._sCurQuery = sCurQuery; + oSelf._bItemSelected = false; + + if(oSelf._maxResultsDisplayed != oSelf.maxResultsDisplayed) { + oSelf._initList(); + } + + var nItems = Math.min(aResults.length,oSelf.maxResultsDisplayed); + oSelf._nDisplayedItems = nItems; + if (nItems > 0) { + oSelf._initContainerHelpers(); + var aItems = oSelf._aListItems; + + // Fill items with data + for(var i = nItems-1; i >= 0; i--) { + var oItemi = aItems[i]; + var oResultItemi = aResults[i]; + oItemi.innerHTML = oSelf.formatResult(oResultItemi, sCurQuery); + oItemi.style.display = "list-item"; + oItemi._sResultKey = oResultItemi[0]; + oItemi._oResultData = oResultItemi; + + } + + // Empty out remaining items if any + for(var j = aItems.length-1; j >= nItems ; j--) { + var oItemj = aItems[j]; + oItemj.innerHTML = null; + oItemj.style.display = "none"; + oItemj._sResultKey = null; + oItemj._oResultData = null; + } + + if(oSelf.autoHighlight) { + // Go to the first item + var oFirstItem = aItems[0]; + oSelf._toggleHighlight(oFirstItem,"to"); + oSelf.itemArrowToEvent.fire(oSelf, oFirstItem); + oSelf._typeAhead(oFirstItem,sQuery); + } + else { + oSelf._oCurItem = null; + } + + // Expand the container + var ok = oSelf.doBeforeExpandContainer(oSelf._oTextbox, oSelf._oContainer, sQuery, aResults); + oSelf._toggleContainer(ok); + } + else { + oSelf._toggleContainer(false); + } + oSelf.dataReturnEvent.fire(oSelf, sQuery, aResults); +}; + +/** + * When forceSelection is true and the user attempts + * leave the text input box without selecting an item from the query results, + * the user selection is cleared. + * + * @method _clearSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearSelection = function() { + var sValue = this._oTextbox.value; + var sChar = (this.delimChar) ? this.delimChar[0] : null; + var nIndex = (sChar) ? sValue.lastIndexOf(sChar, sValue.length-2) : -1; + if(nIndex > -1) { + this._oTextbox.value = sValue.substring(0,nIndex); + } + else { + this._oTextbox.value = ""; + } + this._sSavedQuery = this._oTextbox.value; + + // Fire custom event + this.selectionEnforceEvent.fire(this); +}; + +/** + * Whether or not user-typed value in the text input box matches any of the + * query results. + * + * @method _textMatchesOption + * @return {Boolean} True if user-input text matches a result, false otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() { + var foundMatch = false; + + for(var i = this._nDisplayedItems-1; i >= 0 ; i--) { + var oItem = this._aListItems[i]; + var sMatch = oItem._sResultKey.toLowerCase(); + if (sMatch == this._sCurQuery.toLowerCase()) { + foundMatch = true; + break; + } + } + return(foundMatch); +}; + +/** + * Updates in the text input box with the first query result as the user types, + * selecting the substring that the user has not typed. + * + * @method _typeAhead + * @param oItem {HTMLElement} The <li> element item whose data populates the input field. + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._typeAhead = function(oItem, sQuery) { + // Don't update if turned off + if (!this.typeAhead || (this._nKeyCode == 8)) { + return; + } + + var oTextbox = this._oTextbox; + var sValue = this._oTextbox.value; // any saved queries plus what user has typed + + // Don't update with type-ahead if text selection is not supported + if(!oTextbox.setSelectionRange && !oTextbox.createTextRange) { + return; + } + + // Select the portion of text that the user has not typed + var nStart = sValue.length; + this._updateValue(oItem); + var nEnd = oTextbox.value.length; + this._selectText(oTextbox,nStart,nEnd); + var sPrefill = oTextbox.value.substr(nStart,nEnd); + this.typeAheadEvent.fire(this,sQuery,sPrefill); +}; + +/** + * Selects text in the input field. + * + * @method _selectText + * @param oTextbox {HTMLElement} Text input box element in which to select text. + * @param nStart {Number} Starting index of text string to select. + * @param nEnd {Number} Ending index of text selection. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectText = function(oTextbox, nStart, nEnd) { + if (oTextbox.setSelectionRange) { // For Mozilla + oTextbox.setSelectionRange(nStart,nEnd); + } + else if (oTextbox.createTextRange) { // For IE + var oTextRange = oTextbox.createTextRange(); + oTextRange.moveStart("character", nStart); + oTextRange.moveEnd("character", nEnd-oTextbox.value.length); + oTextRange.select(); + } + else { + oTextbox.select(); + } +}; + +/** + * Syncs results container with its helpers. + * + * @method _toggleContainerHelpers + * @param bShow {Boolean} True if container is expanded, false if collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) { + var bFireEvent = false; + var width = this._oContainer._oContent.offsetWidth + "px"; + var height = this._oContainer._oContent.offsetHeight + "px"; + + if(this.useIFrame && this._oContainer._oIFrame) { + bFireEvent = true; + if(bShow) { + this._oContainer._oIFrame.style.width = width; + this._oContainer._oIFrame.style.height = height; + } + else { + this._oContainer._oIFrame.style.width = 0; + this._oContainer._oIFrame.style.height = 0; + } + } + if(this.useShadow && this._oContainer._oShadow) { + bFireEvent = true; + if(bShow) { + this._oContainer._oShadow.style.width = width; + this._oContainer._oShadow.style.height = height; + } + else { + this._oContainer._oShadow.style.width = 0; + this._oContainer._oShadow.style.height = 0; + } + } +}; + +/** + * Animates expansion or collapse of the container. + * + * @method _toggleContainer + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) { + var oContainer = this._oContainer; + + // Implementer has container always open so don't mess with it + if(this.alwaysShowContainer && this._bContainerOpen) { + return; + } + + // Clear contents of container + if(!bShow) { + this._oContainer._oContent.scrollTop = 0; + var aItems = this._aListItems; + + if(aItems && (aItems.length > 0)) { + for(var i = aItems.length-1; i >= 0 ; i--) { + aItems[i].style.display = "none"; + } + } + + if (this._oCurItem) { + this._toggleHighlight(this._oCurItem,"from"); + } + + this._oCurItem = null; + this._nDisplayedItems = 0; + this._sCurQuery = null; + } + + // Container is already closed + if (!bShow && !this._bContainerOpen) { + oContainer._oContent.style.display = "none"; + return; + } + + // If animation is enabled... + var oAnim = this._oAnim; + if (oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) { + // If helpers need to be collapsed, do it right away... + // but if helpers need to be expanded, wait until after the container expands + if(!bShow) { + this._toggleContainerHelpers(bShow); + } + + if(oAnim.isAnimated()) { + oAnim.stop(); + } + + // Clone container to grab current size offscreen + var oClone = oContainer._oContent.cloneNode(true); + oContainer.appendChild(oClone); + oClone.style.top = "-9000px"; + oClone.style.display = "block"; + + // Current size of the container is the EXPANDED size + var wExp = oClone.offsetWidth; + var hExp = oClone.offsetHeight; + + // Calculate COLLAPSED sizes based on horiz and vert anim + var wColl = (this.animHoriz) ? 0 : wExp; + var hColl = (this.animVert) ? 0 : hExp; + + // Set animation sizes + oAnim.attributes = (bShow) ? + {width: { to: wExp }, height: { to: hExp }} : + {width: { to: wColl}, height: { to: hColl }}; + + // If opening anew, set to a collapsed size... + if(bShow && !this._bContainerOpen) { + oContainer._oContent.style.width = wColl+"px"; + oContainer._oContent.style.height = hColl+"px"; + } + // Else, set it to its last known size. + else { + oContainer._oContent.style.width = wExp+"px"; + oContainer._oContent.style.height = hExp+"px"; + } + + oContainer.removeChild(oClone); + oClone = null; + + var oSelf = this; + var onAnimComplete = function() { + // Finish the collapse + oAnim.onComplete.unsubscribeAll(); + + if(bShow) { + oSelf.containerExpandEvent.fire(oSelf); + } + else { + oContainer._oContent.style.display = "none"; + oSelf.containerCollapseEvent.fire(oSelf); + } + oSelf._toggleContainerHelpers(bShow); + }; + + // Display container and animate it + oContainer._oContent.style.display = "block"; + oAnim.onComplete.subscribe(onAnimComplete); + oAnim.animate(); + this._bContainerOpen = bShow; + } + // Else don't animate, just show or hide + else { + if(bShow) { + oContainer._oContent.style.display = "block"; + this.containerExpandEvent.fire(this); + } + else { + oContainer._oContent.style.display = "none"; + this.containerCollapseEvent.fire(this); + } + this._toggleContainerHelpers(bShow); + this._bContainerOpen = bShow; + } + +}; + +/** + * Toggles the highlight on or off for an item in the container, and also cleans + * up highlighting of any previous item. + * + * @method _toggleHighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(oNewItem, sType) { + var sHighlight = this.highlightClassName; + if(this._oCurItem) { + // Remove highlight from old item + YAHOO.util.Dom.removeClass(this._oCurItem, sHighlight); + } + + if((sType == "to") && sHighlight) { + // Apply highlight to new item + YAHOO.util.Dom.addClass(oNewItem, sHighlight); + this._oCurItem = oNewItem; + } +}; + +/** + * Toggles the pre-highlight on or off for an item in the container. + * + * @method _togglePrehighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(oNewItem, sType) { + if(oNewItem == this._oCurItem) { + return; + } + + var sPrehighlight = this.prehighlightClassName; + if((sType == "mouseover") && sPrehighlight) { + // Apply prehighlight to new item + YAHOO.util.Dom.addClass(oNewItem, sPrehighlight); + } + else { + // Remove prehighlight from old item + YAHOO.util.Dom.removeClass(oNewItem, sPrehighlight); + } +}; + +/** + * Updates the text input box value with selected query result. If a delimiter + * has been defined, then the value gets appended with the delimiter. + * + * @method _updateValue + * @param oItem {HTMLElement} The <li> element item with which to update the value. + * @private + */ +YAHOO.widget.AutoComplete.prototype._updateValue = function(oItem) { + var oTextbox = this._oTextbox; + var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; + var sSavedQuery = this._sSavedQuery; + var sResultKey = oItem._sResultKey; + oTextbox.focus(); + + // First clear text field + oTextbox.value = ""; + // Grab data to put into text field + if(sDelimChar) { + if(sSavedQuery) { + oTextbox.value = sSavedQuery; + } + oTextbox.value += sResultKey + sDelimChar; + if(sDelimChar != " ") { + oTextbox.value += " "; + } + } + else { oTextbox.value = sResultKey; } + + // scroll to bottom of textarea if necessary + if(oTextbox.type == "textarea") { + oTextbox.scrollTop = oTextbox.scrollHeight; + } + + // move cursor to end + var end = oTextbox.value.length; + this._selectText(oTextbox,end,end); + + this._oCurItem = oItem; +}; + +/** + * Selects a result item from the container + * + * @method _selectItem + * @param oItem {HTMLElement} The selected <li> element item. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectItem = function(oItem) { + this._bItemSelected = true; + this._updateValue(oItem); + this._cancelIntervalDetection(this); + this.itemSelectEvent.fire(this, oItem, oItem._oResultData); + this._toggleContainer(false); +}; + +/** + * For values updated by type-ahead, the right arrow key jumps to the end + * of the textbox, otherwise the container is closed. + * + * @method _jumpSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() { + if(!this.typeAhead) { + return; + } + else { + this._toggleContainer(false); + } +}; + +/** + * Triggered by up and down arrow keys, changes the current highlighted + * <li> element item. Scrolls container if necessary. + * + * @method _moveSelection + * @param nKeyCode {Number} Code of key pressed. + * @private + */ +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) { + if(this._bContainerOpen) { + // Determine current item's id number + var oCurItem = this._oCurItem; + var nCurItemIndex = -1; + + if (oCurItem) { + nCurItemIndex = oCurItem._nItemIndex; + } + + var nNewItemIndex = (nKeyCode == 40) ? + (nCurItemIndex + 1) : (nCurItemIndex - 1); + + // Out of bounds + if (nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) { + return; + } + + if (oCurItem) { + // Unhighlight current item + this._toggleHighlight(oCurItem, "from"); + this.itemArrowFromEvent.fire(this, oCurItem); + } + if (nNewItemIndex == -1) { + // Go back to query (remove type-ahead string) + if(this.delimChar && this._sSavedQuery) { + if (!this._textMatchesOption()) { + this._oTextbox.value = this._sSavedQuery; + } + else { + this._oTextbox.value = this._sSavedQuery + this._sCurQuery; + } + } + else { + this._oTextbox.value = this._sCurQuery; + } + this._oCurItem = null; + return; + } + if (nNewItemIndex == -2) { + // Close container + this._toggleContainer(false); + return; + } + + var oNewItem = this._aListItems[nNewItemIndex]; + + // Scroll the container if necessary + var oContent = this._oContainer._oContent; + var scrollOn = ((YAHOO.util.Dom.getStyle(oContent,"overflow") == "auto") || + (YAHOO.util.Dom.getStyle(oContent,"overflowY") == "auto")); + if(scrollOn && (nNewItemIndex > -1) && + (nNewItemIndex < this._nDisplayedItems)) { + // User is keying down + if(nKeyCode == 40) { + // Bottom of selected item is below scroll area... + if((oNewItem.offsetTop+oNewItem.offsetHeight) > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of scroll area to bottom of selected item + oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + // Bottom of selected item is above scroll area... + else if((oNewItem.offsetTop+oNewItem.offsetHeight) < oContent.scrollTop) { + // Set top of selected item to top of scroll area + oContent.scrollTop = oNewItem.offsetTop; + + } + } + // User is keying up + else { + // Top of selected item is above scroll area + if(oNewItem.offsetTop < oContent.scrollTop) { + // Set top of scroll area to top of selected item + this._oContainer._oContent.scrollTop = oNewItem.offsetTop; + } + // Top of selected item is below scroll area + else if(oNewItem.offsetTop > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of selected item to bottom of scroll area + this._oContainer._oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + } + } + + this._toggleHighlight(oNewItem, "to"); + this.itemArrowToEvent.fire(this, oNewItem); + if(this.typeAhead) { + this._updateValue(oNewItem); + } + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private event handlers +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Handles <li> element mouseover events in the container. + * + * @method _onItemMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseover = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseover"); + } + else { + oSelf._toggleHighlight(this,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element mouseout events in the container. + * + * @method _onItemMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseout = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseout"); + } + else { + oSelf._toggleHighlight(this,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element click events in the container. + * + * @method _onItemMouseclick + * @param v {HTMLEvent} The click event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseclick = function(v,oSelf) { + // In case item has not been moused over + oSelf._toggleHighlight(this,"to"); + oSelf._selectItem(this); +}; + +/** + * Handles container mouseover events. + * + * @method _onContainerMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) { + oSelf._bOverContainer = true; +}; + +/** + * Handles container mouseout events. + * + * @method _onContainerMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) { + oSelf._bOverContainer = false; + // If container is still active + if(oSelf._oCurItem) { + oSelf._toggleHighlight(oSelf._oCurItem,"to"); + } +}; + +/** + * Handles container scroll events. + * + * @method _onContainerScroll + * @param v {HTMLEvent} The scroll event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) { + oSelf._oTextbox.focus(); +}; + +/** + * Handles container resize events. + * + * @method _onContainerResize + * @param v {HTMLEvent} The resize event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) { + oSelf._toggleContainerHelpers(oSelf._bContainerOpen); +}; + + +/** + * Handles textbox keydown events of functional keys, mainly for UI behavior. + * + * @method _onTextboxKeyDown + * @param v {HTMLEvent} The keydown event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) { + var nKeyCode = v.keyCode; + + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + // select an item or clear out + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 27: // esc + oSelf._toggleContainer(false); + return; + case 39: // right + oSelf._jumpSelection(); + break; + case 38: // up + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + case 40: // down + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + default: + break; + } +}; + +/** + * Handles textbox keypress events. + * @method _onTextboxKeyPress + * @param v {HTMLEvent} The keypress event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) { + var nKeyCode = v.keyCode; + + //Expose only to Mac browsers, where stopEvent is ineffective on keydown events (bug 790337) + var isMac = (navigator.userAgent.toLowerCase().indexOf("mac") != -1); + if(isMac) { + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 38: // up + case 40: // down + YAHOO.util.Event.stopEvent(v); + break; + default: + break; + } + } + + //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948) + // Korean IME detected + else if(nKeyCode == 229) { + oSelf._queryInterval = setInterval(function() { oSelf._onIMEDetected(oSelf); },500); + } +}; + +/** + * Handles textbox keyup events that trigger queries. + * + * @method _onTextboxKeyUp + * @param v {HTMLEvent} The keyup event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) { + // Check to see if any of the public properties have been updated + oSelf._initProps(); + + var nKeyCode = v.keyCode; + oSelf._nKeyCode = nKeyCode; + var sText = this.value; //string in textbox + + // Filter out chars that don't trigger queries + if (oSelf._isIgnoreKey(nKeyCode) || (sText.toLowerCase() == oSelf._sCurQuery)) { + return; + } + else { + oSelf.textboxKeyEvent.fire(oSelf, nKeyCode); + } + + // Set timeout on the request + if (oSelf.queryDelay > 0) { + var nDelayID = + setTimeout(function(){oSelf._sendQuery(sText);},(oSelf.queryDelay * 1000)); + + if (oSelf._nDelayID != -1) { + clearTimeout(oSelf._nDelayID); + } + + oSelf._nDelayID = nDelayID; + } + else { + // No delay so send request immediately + oSelf._sendQuery(sText); + } +}; + +/** + * Handles text input box receiving focus. + * + * @method _onTextboxFocus + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) { + oSelf._oTextbox.setAttribute("autocomplete","off"); + oSelf._bFocused = true; + oSelf.textboxFocusEvent.fire(oSelf); +}; + +/** + * Handles text input box losing focus. + * + * @method _onTextboxBlur + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) { + // Don't treat as a blur if it was a selection via mouse click + if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) { + // Current query needs to be validated + if(!oSelf._bItemSelected) { + if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && !oSelf._textMatchesOption())) { + if(oSelf.forceSelection) { + oSelf._clearSelection(); + } + else { + oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery); + } + } + } + + if(oSelf._bContainerOpen) { + oSelf._toggleContainer(false); + } + oSelf._cancelIntervalDetection(oSelf); + oSelf._bFocused = false; + oSelf.textboxBlurEvent.fire(oSelf); + } +}; + +/** + * Handles form submission event. + * + * @method _onFormSubmit + * @param v {HTMLEvent} The submit event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onFormSubmit = function(v,oSelf) { + if(oSelf.allowBrowserAutocomplete) { + oSelf._oTextbox.setAttribute("autocomplete","on"); + } + else { + oSelf._oTextbox.setAttribute("autocomplete","off"); + } +}; + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The DataSource classes manages sending a request and returning response from a live + * database. Supported data include local JavaScript arrays and objects and databases + * accessible via XHR connections. Supported response formats include JavaScript arrays, + * JSON, XML, and flat-file textual data. + * + * @class DataSource + * @constructor + */ +YAHOO.widget.DataSource = function() { + /* abstract class */ +}; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Error message for null data responses. + * + * @property ERROR_DATANULL + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATANULL = "Response data was null"; + +/** + * Error message for data responses with parsing errors. + * + * @property ERROR_DATAPARSE + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATAPARSE = "Response data could not be parsed"; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Max size of the local cache. Set to 0 to turn off caching. Caching is + * useful to reduce the number of server connections. Recommended only for data + * sources that return comprehensive results for queries or when stale data is + * not an issue. + * + * @property maxCacheEntries + * @type Number + * @default 15 + */ +YAHOO.widget.DataSource.prototype.maxCacheEntries = 15; + +/** + * Use this to equate cache matching with the type of matching done by your live + * data source. If caching is on and queryMatchContains is true, the cache + * returns results that "contain" the query string. By default, + * queryMatchContains is set to false, meaning the cache only returns results + * that "start with" the query string. + * + * @property queryMatchContains + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchContains = false; + +/** + * Enables query subset matching. If caching is on and queryMatchSubset is + * true, substrings of queries will return matching cached results. For + * instance, if the first query is for "abc" susequent queries that start with + * "abc", like "abcd", will be queried against the cache, and not the live data + * source. Recommended only for DataSources that return comprehensive results + * for queries with very few characters. + * + * @property queryMatchSubset + * @type Boolean + * @default false + * + */ +YAHOO.widget.DataSource.prototype.queryMatchSubset = false; + +/** + * Enables query case-sensitivity matching. If caching is on and + * queryMatchCase is true, queries will only return results for case-sensitive + * matches. + * + * @property queryMatchCase + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchCase = false; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the DataSource instance. + * + * @method toString + * @return {String} Unique name of the DataSource instance + */ +YAHOO.widget.DataSource.prototype.toString = function() { + return "DataSource " + this._sName; +}; + +/** + * Retrieves query results, first checking the local cache, then making the + * query request to the live data source as defined by the function doQuery. + * + * @method getResults + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.getResults = function(oCallbackFn, sQuery, oParent) { + + // First look in cache + var aResults = this._doQueryCache(oCallbackFn,sQuery,oParent); + + // Not in cache, so get results from server + if(aResults.length === 0) { + this.queryEvent.fire(this, oParent, sQuery); + this.doQuery(oCallbackFn, sQuery, oParent); + } +}; + +/** + * Abstract method implemented by subclasses to make a query to the live data + * source. Must call the callback function with the response returned from the + * query. Populates cache (if enabled). + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function implemented by oParent to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + /* override this */ +}; + +/** + * Flushes cache. + * + * @method flushCache + */ +YAHOO.widget.DataSource.prototype.flushCache = function() { + if(this._aCache) { + this._aCache = []; + } + if(this._aCacheHelper) { + this._aCacheHelper = []; + } + this.cacheFlushEvent.fire(this); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when a query is made to the live data source. + * + * @event queryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.queryEvent = null; + +/** + * Fired when a query is made to the local cache. + * + * @event cacheQueryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.cacheQueryEvent = null; + +/** + * Fired when data is retrieved from the live data source. + * + * @event getResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getResultsEvent = null; + +/** + * Fired when data is retrieved from the local cache. + * + * @event getCachedResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getCachedResultsEvent = null; + +/** + * Fired when an error is encountered with the live data source. + * + * @event dataErrorEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param sMsg {String} Error message string + */ +YAHOO.widget.DataSource.prototype.dataErrorEvent = null; + +/** + * Fired when the local cache is flushed. + * + * @event cacheFlushEvent + * @param oSelf {Object} The DataSource instance + */ +YAHOO.widget.DataSource.prototype.cacheFlushEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple DataSource instances. + * + * @property _nIndex + * @type Number + * @private + * @static + */ +YAHOO.widget.DataSource._nIndex = 0; + +/** + * Name of DataSource instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.DataSource.prototype._sName = null; + +/** + * Local cache of data result objects indexed chronologically. + * + * @property _aCache + * @type Object[] + * @private + */ +YAHOO.widget.DataSource.prototype._aCache = null; + + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Initializes DataSource instance. + * + * @method _init + * @private + */ +YAHOO.widget.DataSource.prototype._init = function() { + // Validate and initialize public configs + var maxCacheEntries = this.maxCacheEntries; + if(isNaN(maxCacheEntries) || (maxCacheEntries < 0)) { + maxCacheEntries = 0; + } + // Initialize local cache + if(maxCacheEntries > 0 && !this._aCache) { + this._aCache = []; + } + + this._sName = "instance" + YAHOO.widget.DataSource._nIndex; + YAHOO.widget.DataSource._nIndex++; + + this.queryEvent = new YAHOO.util.CustomEvent("query", this); + this.cacheQueryEvent = new YAHOO.util.CustomEvent("cacheQuery", this); + this.getResultsEvent = new YAHOO.util.CustomEvent("getResults", this); + this.getCachedResultsEvent = new YAHOO.util.CustomEvent("getCachedResults", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.cacheFlushEvent = new YAHOO.util.CustomEvent("cacheFlush", this); +}; + +/** + * Adds a result object to the local cache, evicting the oldest element if the + * cache is full. Newer items will have higher indexes, the oldest item will have + * index of 0. + * + * @method _addCacheElem + * @param oResult {Object} Data result object, including array of results. + * @private + */ +YAHOO.widget.DataSource.prototype._addCacheElem = function(oResult) { + var aCache = this._aCache; + // Don't add if anything important is missing. + if(!aCache || !oResult || !oResult.query || !oResult.results) { + return; + } + + // If the cache is full, make room by removing from index=0 + if(aCache.length >= this.maxCacheEntries) { + aCache.shift(); + } + + // Add to cache, at the end of the array + aCache.push(oResult); +}; + +/** + * Queries the local cache for results. If query has been cached, the callback + * function is called with the results, and the cached is refreshed so that it + * is now the newest element. + * + * @method _doQueryCache + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + * @return aResults {Object[]} Array of results from local cache if found, otherwise null. + * @private + */ +YAHOO.widget.DataSource.prototype._doQueryCache = function(oCallbackFn, sQuery, oParent) { + var aResults = []; + var bMatchFound = false; + var aCache = this._aCache; + var nCacheLength = (aCache) ? aCache.length : 0; + var bMatchContains = this.queryMatchContains; + + // If cache is enabled... + if((this.maxCacheEntries > 0) && aCache && (nCacheLength > 0)) { + this.cacheQueryEvent.fire(this, oParent, sQuery); + // If case is unimportant, normalize query now instead of in loops + if(!this.queryMatchCase) { + var sOrigQuery = sQuery; + sQuery = sQuery.toLowerCase(); + } + + // Loop through each cached element's query property... + for(var i = nCacheLength-1; i >= 0; i--) { + var resultObj = aCache[i]; + var aAllResultItems = resultObj.results; + // If case is unimportant, normalize match key for comparison + var matchKey = (!this.queryMatchCase) ? + encodeURIComponent(resultObj.query).toLowerCase(): + encodeURIComponent(resultObj.query); + + // If a cached match key exactly matches the query... + if(matchKey == sQuery) { + // Stash all result objects into aResult[] and stop looping through the cache. + bMatchFound = true; + aResults = aAllResultItems; + + // The matching cache element was not the most recent, + // so now we need to refresh the cache. + if(i != nCacheLength-1) { + // Remove element from its original location + aCache.splice(i,1); + // Add element as newest + this._addCacheElem(resultObj); + } + break; + } + // Else if this query is not an exact match and subset matching is enabled... + else if(this.queryMatchSubset) { + // Loop through substrings of each cached element's query property... + for(var j = sQuery.length-1; j >= 0 ; j--) { + var subQuery = sQuery.substr(0,j); + + // If a substring of a cached sQuery exactly matches the query... + if(matchKey == subQuery) { + bMatchFound = true; + + // Go through each cached result object to match against the query... + for(var k = aAllResultItems.length-1; k >= 0; k--) { + var aRecord = aAllResultItems[k]; + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aRecord[0]).indexOf(sQuery): + encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aRecord); + } + } + + // Add the subset match result set object as the newest element to cache, + // and stop looping through the cache. + resultObj = {}; + resultObj.query = sQuery; + resultObj.results = aResults; + this._addCacheElem(resultObj); + break; + } + } + if(bMatchFound) { + break; + } + } + } + + // If there was a match, send along the results. + if(bMatchFound) { + this.getCachedResultsEvent.fire(this, oParent, sOrigQuery, aResults); + oCallbackFn(sOrigQuery, aResults, oParent); + } + } + return aResults; +}; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using XML HTTP requests that return + * query results. + * + * @class DS_XHR + * @extends YAHOO.widget.DataSource + * @requires connection + * @constructor + * @param sScriptURI {String} Absolute or relative URI to script that returns query + * results as JSON, XML, or delimited flat-file data. + * @param aSchema {String[]} Data schema definition of results. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_XHR = function(sScriptURI, aSchema, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aSchema || (aSchema.constructor != Array)) { + return; + } + else { + this.schema = aSchema; + } + this.scriptURI = sScriptURI; + this._init(); +}; + +YAHOO.widget.DS_XHR.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * JSON data type. + * + * @property TYPE_JSON + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_JSON = 0; + +/** + * XML data type. + * + * @property TYPE_XML + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_XML = 1; + +/** + * Flat-file data type. + * + * @property TYPE_FLAT + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_FLAT = 2; + +/** + * Error message for XHR failure. + * + * @property ERROR_DATAXHR + * @type String + * @static + * @final + */ +YAHOO.widget.DS_XHR.ERROR_DATAXHR = "XHR response failed"; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Alias to YUI Connection Manager. Allows implementers to specify their own + * subclasses of the YUI Connection Manager utility. + * + * @property connMgr + * @type Object + * @default YAHOO.util.Connect + */ +YAHOO.widget.DS_XHR.prototype.connMgr = YAHOO.util.Connect; + +/** + * Number of milliseconds the XHR connection will wait for a server response. A + * a value of zero indicates the XHR connection will wait forever. Any value + * greater than zero will use the Connection utility's Auto-Abort feature. + * + * @property connTimeout + * @type Number + * @default 0 + */ +YAHOO.widget.DS_XHR.prototype.connTimeout = 0; + +/** + * Absolute or relative URI to script that returns query results. For instance, + * queries will be sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptURI + * @type String + */ +YAHOO.widget.DS_XHR.prototype.scriptURI = null; + +/** + * Query string parameter name sent to scriptURI. For instance, queries will be + * sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptQueryParam + * @type String + * @default "query" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryParam = "query"; + +/** + * String of key/value pairs to append to requests made to scriptURI. Define + * this string when you want to send additional query parameters to your script. + * When defined, queries will be sent to + * <scriptURI>?<scriptQueryParam>=userinput&<scriptQueryAppend> + * + * @property scriptQueryAppend + * @type String + * @default "" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryAppend = ""; + +/** + * XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML + * and YAHOO.widget.DS_XHR.TYPE_FLAT. + * + * @property responseType + * @type String + * @default YAHOO.widget.DS_XHR.TYPE_JSON + */ +YAHOO.widget.DS_XHR.prototype.responseType = YAHOO.widget.DS_XHR.TYPE_JSON; + +/** + * String after which to strip results. If the results from the XHR are sent + * back as HTML, the gzip HTML comment appears at the end of the data and should + * be ignored. + * + * @property responseStripAfter + * @type String + * @default "\n<!-" + */ +YAHOO.widget.DS_XHR.prototype.responseStripAfter = "\n 0) { + sUri += "&" + this.scriptQueryAppend; + } + var oResponse = null; + + var oSelf = this; + /* + * Sets up ajax request callback + * + * @param {object} oReq HTTPXMLRequest object + * @private + */ + var responseSuccess = function(oResp) { + // Response ID does not match last made request ID. + if(!oSelf._oConn || (oResp.tId != oSelf._oConn.tId)) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + return; + } +//DEBUG +for(var foo in oResp) { +} + if(!isXML) { + oResp = oResp.responseText; + } + else { + oResp = oResp.responseXML; + } + if(oResp === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + return; + } + + var aResults = oSelf.parseResponse(sQuery, oResp, oParent); + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATAPARSE); + aResults = []; + } + else { + oSelf.getResultsEvent.fire(oSelf, oParent, sQuery, aResults); + oSelf._addCacheElem(resultObj); + } + oCallbackFn(sQuery, aResults, oParent); + }; + + var responseFailure = function(oResp) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DS_XHR.ERROR_DATAXHR); + return; + }; + + var oCallback = { + success:responseSuccess, + failure:responseFailure + }; + + if(!isNaN(this.connTimeout) && this.connTimeout > 0) { + oCallback.timeout = this.connTimeout; + } + + if(this._oConn) { + this.connMgr.abort(this._oConn); + } + + oSelf._oConn = this.connMgr.asyncRequest("GET", sUri, oCallback, null); +}; + +/** + * Parses raw response data into an array of result objects. The result data key + * is always stashed in the [0] element of each result object. + * + * @method parseResponse + * @param sQuery {String} Query string. + * @param oResponse {Object} The raw response data to parse. + * @param oParent {Object} The object instance that has requested data. + * @returns {Object[]} Array of result objects. + */ +YAHOO.widget.DS_XHR.prototype.parseResponse = function(sQuery, oResponse, oParent) { + var aSchema = this.schema; + var aResults = []; + var bError = false; + + // Strip out comment at the end of results + var nEnd = ((this.responseStripAfter !== "") && (oResponse.indexOf)) ? + oResponse.indexOf(this.responseStripAfter) : -1; + if(nEnd != -1) { + oResponse = oResponse.substring(0,nEnd); + } + + switch (this.responseType) { + case YAHOO.widget.DS_XHR.TYPE_JSON: + var jsonList; + // Divert KHTML clients from JSON lib + if(window.JSON && (navigator.userAgent.toLowerCase().indexOf('khtml')== -1)) { + // Use the JSON utility if available + var jsonObjParsed = JSON.parse(oResponse); + if(!jsonObjParsed) { + bError = true; + break; + } + else { + try { + // eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("jsonObjParsed." + aSchema[0]); + } + catch(e) { + bError = true; + break; + } + } + } + else { + // Parse the JSON response as a string + try { + // Trim leading spaces + while (oResponse.substring(0,1) == " ") { + oResponse = oResponse.substring(1, oResponse.length); + } + + // Invalid JSON response + if(oResponse.indexOf("{") < 0) { + bError = true; + break; + } + + // Empty (but not invalid) JSON response + if(oResponse.indexOf("{}") === 0) { + break; + } + + // Turn the string into an object literal... + // ...eval is necessary here + var jsonObjRaw = eval("(" + oResponse + ")"); + if(!jsonObjRaw) { + bError = true; + break; + } + + // Grab the object member that contains an array of all reponses... + // ...eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("(jsonObjRaw." + aSchema[0]+")"); + } + catch(e) { + bError = true; + break; + } + } + + if(!jsonList) { + bError = true; + break; + } + + if(jsonList.constructor != Array) { + jsonList = [jsonList]; + } + + // Loop through the array of all responses... + for(var i = jsonList.length-1; i >= 0 ; i--) { + var aResultItem = []; + var jsonResult = jsonList[i]; + // ...and loop through each data field value of each response + for(var j = aSchema.length-1; j >= 1 ; j--) { + // ...and capture data into an array mapped according to the schema... + var dataFieldValue = jsonResult[aSchema[j]]; + if(!dataFieldValue) { + dataFieldValue = ""; + } + aResultItem.unshift(dataFieldValue); + } + // If schema isn't well defined, pass along the entire result object + if(aResultItem.length == 1) { + aResultItem.push(jsonResult); + } + // Capture the array of data field values in an array of results + aResults.unshift(aResultItem); + } + break; + case YAHOO.widget.DS_XHR.TYPE_XML: + // Get the collection of results + var xmlList = oResponse.getElementsByTagName(aSchema[0]); + if(!xmlList) { + bError = true; + break; + } + // Loop through each result + for(var k = xmlList.length-1; k >= 0 ; k--) { + var result = xmlList.item(k); + var aFieldSet = []; + // Loop through each data field in each result using the schema + for(var m = aSchema.length-1; m >= 1 ; m--) { + var sValue = null; + // Values may be held in an attribute... + var xmlAttr = result.attributes.getNamedItem(aSchema[m]); + if(xmlAttr) { + sValue = xmlAttr.value; + } + // ...or in a node + else{ + var xmlNode = result.getElementsByTagName(aSchema[m]); + if(xmlNode && xmlNode.item(0) && xmlNode.item(0).firstChild) { + sValue = xmlNode.item(0).firstChild.nodeValue; + } + else { + sValue = ""; + } + } + // Capture the schema-mapped data field values into an array + aFieldSet.unshift(sValue); + } + // Capture each array of values into an array of results + aResults.unshift(aFieldSet); + } + break; + case YAHOO.widget.DS_XHR.TYPE_FLAT: + if(oResponse.length > 0) { + // Delete the last line delimiter at the end of the data if it exists + var newLength = oResponse.length-aSchema[0].length; + if(oResponse.substr(newLength) == aSchema[0]) { + oResponse = oResponse.substr(0, newLength); + } + var aRecords = oResponse.split(aSchema[0]); + for(var n = aRecords.length-1; n >= 0; n--) { + aResults[n] = aRecords[n].split(aSchema[1]); + } + } + break; + default: + break; + } + sQuery = null; + oResponse = null; + oParent = null; + if(bError) { + return null; + } + else { + return aResults; + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * XHR connection object. + * + * @property _oConn + * @type Object + * @private + */ +YAHOO.widget.DS_XHR.prototype._oConn = null; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript function as + * its live data source. + * + * @class DS_JSFunction + * @constructor + * @extends YAHOO.widget.DataSource + * @param oFunction {HTMLFunction} In-memory Javascript function that returns query results as an array of objects. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSFunction = function(oFunction, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!oFunction || (oFunction.constructor != Function)) { + return; + } + else { + this.dataFunction = oFunction; + this._init(); + } +}; + +YAHOO.widget.DS_JSFunction.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript function that returns query results. + * + * @property dataFunction + * @type HTMLFunction + */ +YAHOO.widget.DS_JSFunction.prototype.dataFunction = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by function for results. Results are + * passed back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSFunction.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var oFunction = this.dataFunction; + var aResults = []; + + aResults = oFunction(sQuery); + if(aResults === null) { + this.dataErrorEvent.fire(this, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + return; + } + + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + this._addCacheElem(resultObj); + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); + return; +}; + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript array as + * its live data source. + * + * @class DS_JSArray + * @constructor + * @extends YAHOO.widget.DataSource + * @param aData {String[]} In-memory Javascript array of simple string data. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSArray = function(aData, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aData || (aData.constructor != Array)) { + return; + } + else { + this.data = aData; + this._init(); + } +}; + +YAHOO.widget.DS_JSArray.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript array of strings. + * + * @property data + * @type Array + */ +YAHOO.widget.DS_JSArray.prototype.data = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by data for results. Results are passed + * back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSArray.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var aData = this.data; // the array + var aResults = []; // container for results + var bMatchFound = false; + var bMatchContains = this.queryMatchContains; + if(sQuery) { + if(!this.queryMatchCase) { + sQuery = sQuery.toLowerCase(); + } + + // Loop through each element of the array... + // which can be a string or an array of strings + for(var i = aData.length-1; i >= 0; i--) { + var aDataset = []; + + if(aData[i]) { + if(aData[i].constructor == String) { + aDataset[0] = aData[i]; + } + else if(aData[i].constructor == Array) { + aDataset = aData[i]; + } + } + + if(aDataset[0] && (aDataset[0].constructor == String)) { + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aDataset[0]).indexOf(sQuery): + encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aDataset); + } + } + } + } + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); +}; + +YAHOO.register("autocomplete", YAHOO.widget.AutoComplete, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/button/README b/interface/ispconfig/interface/js/yui/button/README new file mode 100644 index 000000000..036e33d9c --- /dev/null +++ b/interface/ispconfig/interface/js/yui/button/README @@ -0,0 +1,3 @@ +*** Version 2.2.0 *** + +* Button Control introduced \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/button/assets/background.png b/interface/ispconfig/interface/js/yui/button/assets/background.png new file mode 100644 index 0000000000000000000000000000000000000000..87c85b5e539b5c514df107bbb4e298948a016e3d GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI}!3HGf{@&OHq*&4&eH|GXuHCreA7KRKOP07s zlmzFem6RtIr7}3C4z5p~n gmGe&ZegFVdQ&MBb@01E{`BLDyZ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/button/assets/button.css b/interface/ispconfig/interface/js/yui/button/assets/button.css new file mode 100644 index 000000000..ff90c8ec8 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/button/assets/button.css @@ -0,0 +1,217 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +.yuibutton { + + display:-moz-inline-stack; /* Gecko */ + display:inline-block; /* IE, Opera and Safari */ + + border-width:1px 0; + border-style:solid; + border-color:#999; + + background:#ecece3 url(background.png) left center; + + /* Give the transparent background image to IE 6 */ + _background-image:none; + _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../../build/button/assets/background.png', sizingMethod = 'scale'); + + margin:auto .25em; + +} + +.yuibutton .first-child { + + display:block; /* Gecko, Opera and Safari */ + *display:inline-block; /* IE */ + + border-width:0 1px; + border-style:solid; + border-color:#999; + + margin:0 -1px; + *position:relative; + *left:-1px; + +} + +.yuibutton button, +.yuibutton a { + + display:block; /* Opera and Safari */ + display:-moz-inline-block; /* Gecko */ + *display:inline-block; /* IE */ + padding:.25em .5em; + border:1px solid #ccc; + +} + +.yuibutton button { + + overflow:visible; /* Remove superfluous padding for IE */ + font-size:100%; /* Makes form controls resizable in IE */ + background-color:transparent; + cursor:pointer; + cursor:hand; + +} + +.yuibutton a { + + text-decoration:none; + color:#000; + +} + +.yuibutton.splitbutton button, +.yuibutton.menubutton button { + + padding-right:20px; + background-position:right center; + background-repeat:no-repeat; + +} + +.yuibutton.menubutton button { + + background-image:url(menuarrow.gif); + +} + +.yuibutton.splitbutton button { + + background-image:url(splitarrow.gif); + +} + + +/* Focus state */ + +.yuibutton.focus { + + border-color:#5e5c95; + +} + +.yuibutton.focus .first-child { + + border-color:#5e5c95; + +} + +.yuibutton.focus button, +.yuibutton.focus a { + + border-color:#cec1fc; + +} + + +/* Hover state */ + +.yuibutton.hover { + + border-color:#406fac; + background-color:#98d5fc; + +} + +.yuibutton.hover .first-child { + + border-color:#406fac; + +} + +.yuibutton.hover button, +.yuibutton.hover a { + + border-color:#7099ce; + +} + + +/* Active state */ + +.yuibutton.active { + + border-color:#7a8180; + background-color:#333; + +} + +.yuibutton.active .first-child { + + border-color:#7a8180; + +} + +.yuibutton.active button, +.yuibutton.active a { + + border-color:#98a09f; + +} + +.yuibutton.splitbutton.activeoption button { + + background-color:transparent; + background-image:url(splitarrow_active.gif); + +} + + + +/* Checked state */ + +.yuibutton.radio.checked, +.yuibutton.checkbox.checked { + + border-color:#7a8180; + background-color:#333; + +} + +.yuibutton.radio.checked .first-child, +.yuibutton.checkbox.checked .first-child { + + border-color:#7a8180; + +} + +.yuibutton.radio.checked button, +.yuibutton.checkbox.checked button { + + border-color:#98a09f; + +} + + + +/* Disabled state */ + +.yuibutton.disabled { + + border-color:#cbcdc5; + background:#ecece3; + + _filter:none; + +} + +.yuibutton.disabled .first-child { + + border-color:#cbcdc5; + +} + +.yuibutton.disabled button, +.yuibutton.disabled a { + + border-color:transparent; + color:#b9b9b9; + cursor:default; + +} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/button/assets/menuarrow.gif b/interface/ispconfig/interface/js/yui/button/assets/menuarrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffa2ba9d25d7ec10438cc1c8ac043c99d4cd7d55 GIT binary patch literal 67 zcmZ?wbhEHb6ky|Ns9CV4(Pug^_`Ql|cu@1F22A-3wdUSxVwHR<{`lNF$F-vEqUn2Y8&$0d-hKG>=h?8FBOG%?}?woIihl=FFK4V4(Pu1x)LJNRV0v<}i=o zJMUhd6kEPVY~7m5?>x^sWoFJ4vs!tbZ4>{Wz3(EXf1kPh_pR*oSZnUBCRWL(;*Za*b6hLhE}Fjgwo%oZ;N6E`f1cgu%fMg_0M=nV82|tP literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/button/button-beta-debug.js b/interface/ispconfig/interface/js/yui/button/button-beta-debug.js new file mode 100644 index 000000000..e9403670b --- /dev/null +++ b/interface/ispconfig/interface/js/yui/button/button-beta-debug.js @@ -0,0 +1,4061 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** +* @module button +* @description

The Button Control enables the creation of rich, graphical +* buttons that function like traditional HTML form buttons. Unlike +* tradition HTML form buttons, buttons created with the Button Control can have +* a label that is different from its value. With the inclusion of the optional +* Menu Control, the Button Control can also be +* used to create menu buttons and split buttons, controls that are not +* available natively in HTML. The Button Control can also be thought of as a +* way to create more visually engaging implementations of the browser's +* default radio-button and check-box controls.

+*

The Button Control supports the following types:

+*
+*
button
+*
Basic push button that can execute a user-specified command when +* pressed.
+*
link
+*
Navigates to a specified url when pressed.
+*
submit
+*
Submits the parent form when pressed.
+*
reset
+*
Resets the parent form when pressed.
+*
checkbox
+*
Maintains a "checked" state that can be toggled on and off.
+*
radio
+*
Maintains a "checked" state that can be toggled on and off. Use with +* the ButtonGroup class to create a set of controls that are mutually +* exclusive; checking one button in the set will uncheck all others in +* the group.
+*
menubutton
+*
When pressed will show/hide a menu.
+*
splitbutton
+*
Can execute a user-specified command or display a menu when pressed.
+*
+* @title Button +* @namespace YAHOO.widget +* @requires yahoo, dom, element, event +* @optional container, menu +* @beta +*/ + + +(function() { + +// Shorthard for utilities + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang, + + + // Private member variables + + m_oButtons = {}, + m_oFocusedButton = null; + + + +// Constructor + + +/** +* The Button class creates a rich, graphical button. +* @param {String} p_oElement String specifying the id attribute of the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {HTMLInputElement|HTMLElement} p_oElement Object reference for the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {Object} p_oElement Object literal specifying a set of configuration +* attributes used to create the button. +* @param {Object} p_oAttributes Optional. Object literal specifying a set of +* configuration attributes used to create the button. +* @namespace YAHOO.widget +* @class Button +* @constructor +* @extends YAHOO.util.Element +*/ +YAHOO.widget.Button = function(p_oElement, p_oAttributes) { + + var fnSuperClass = YAHOO.widget.Button.superclass.constructor; + + if( + arguments.length == 1 && + !Lang.isString(p_oElement) && + !p_oElement.nodeName + ) { + + if(!p_oElement.id) { + + p_oElement.id = Dom.generateId(); + + YAHOO.log( + "No value specified for the button's \"id\" attribute. " + + "Setting button id to \"" + p_oElement.id + "\".", + "warn" + ); + + } + + this.logger = new YAHOO.widget.LogWriter("Button " + p_oElement.id); + + this.logger.log( + "No source HTML element. " + + "Building the button using the set of configuration attributes." + ); + + fnSuperClass.call( + this, + (this._createButtonElement(p_oElement.type)), + p_oElement + ); + + } + else { + + var oConfig = { + + element: null, + attributes: (p_oAttributes || {}) + + }; + + + if(Lang.isString(p_oElement)) { + + var me = this; + + Event.onAvailable(p_oElement, function() { + + var sTagName = this.tagName.toUpperCase(); + + if(sTagName == me.TAG_NAME) { + + oConfig.attributes.id = this.id; + + } + else if(sTagName == "INPUT" && !oConfig.attributes.id) { + + oConfig.attributes.id = Dom.generateId(); + + YAHOO.log( + "No value specified for the button's \"id\" " + + "attribute. Setting button id to \"" + + oConfig.attributes.id + "\".", + "warn" + ); + + } + + me.logger = new YAHOO.widget.LogWriter( + "Button " + oConfig.attributes.id + ); + + me.logger.log( + "Building the button using an existing HTML " + + "element as a source element." + ); + + + oConfig.attributes.srcelement = this; + + initConfig.call(me, oConfig); + + + if(!oConfig.element) { + + me.logger.log( + "Source element could not be used as is. " + + "Creating a new HTML element for the button." + ); + + oConfig.element = + me._createButtonElement(oConfig.attributes.type); + + } + + fnSuperClass.call(me, oConfig.element, oConfig.attributes); + + }); + + } + else { + + var sTagName = p_oElement.tagName.toUpperCase(); + + if(sTagName == this.TAG_NAME) { + + if(p_oElement.id) { + + oConfig.attributes.id = p_oElement.id; + + } + else { + + oConfig.attributes.id = Dom.generateId(); + + YAHOO.log( + "No value specified for the button's \"id\" " + + "attribute. Setting button id to \"" + + oConfig.attributes.id + "\".", + "warn" + ); + + } + + + } + else if(sTagName == "INPUT" && !oConfig.attributes.id) { + + oConfig.attributes.id = Dom.generateId(); + + YAHOO.log( + "No value specified for the button's \"id\" " + + "attribute. Setting button id to \"" + + oConfig.attributes.id + "\".", + "warn" + ); + + } + + this.logger = + new YAHOO.widget.LogWriter("Button " + oConfig.attributes.id); + + this.logger.log( + "Building the button using an existing HTML element as " + + "a source element." + ); + + + oConfig.attributes.srcelement = p_oElement; + + initConfig.call(this, oConfig); + + + if(!oConfig.element) { + + this.logger.log( + "Source element could not be used as is. " + + "Creating a new HTML element for the button." + ); + + oConfig.element = + this._createButtonElement(oConfig.attributes.type); + + } + + fnSuperClass.call(this, oConfig.element, oConfig.attributes); + + } + + } + +}; + + + +// Private methods + + +/** +* @method getFirstElement +* @description Returns an HTML element's first HTML element node. +* @private +* @param {HTMLElement} p_oElement Object +* reference specifying the element to be evaluated. +* @return {HTMLElement} +*/ +function getFirstElement(p_oElement) { + + var oFirstChild = p_oElement.firstChild; + + if(oFirstChild) { + + if(oFirstChild.nodeType == 1) { + + return oFirstChild; + + } + else { + + var oNextSibling = oFirstChild.nextSibling; + + if(oNextSibling && oNextSibling.nodeType == 1) { + + return oNextSibling; + + } + + } + + } + +} + + +/** +* @method createInputElement +* @description Creates an <input> element of the +* specified type. +* @private +* @param {String} p_sType String specifying the type of +* <input> element to create. +* @param {String} p_sName String specifying the name of +* <input> element to create. +* @param {String} p_sValue String specifying the value of +* <input> element to create. +* @param {String} p_bChecked Boolean specifying if the +* <input> element is to be checked. +* @return {HTMLInputElement} +*/ +function createInputElement(p_sType, p_sName, p_sValue, p_bChecked) { + + var oInput; + + if(navigator.userAgent.indexOf("MSIE") != -1) { + + /* + For IE it is necessary to create the element with the + "type," "name," "value," and "checked" properties set all at once. + */ + + var sInput = "<input> or <a>) that map to +* Button configuration attributes and sets them into a collection that is +* passed to the Button constructor. +* @private +* @param {HTMLInputElement|HTMLAnchorElement} p_oElement Object reference to the HTML +* element (either <input> or <span>) +* used to create the button. +* @param {Object} p_oAttributes Object reference for the collection of +* configuration attributes used to create the button. +*/ +function setAttributesFromSrcElement(p_oElement, p_oAttributes) { + + var me = this; + + /** + * @method setAttributeFromDOMAttribute + * @description Gets the value of the specified DOM attribute and sets it + * into the collection of configuration attributes used to configure + * the button. + * @private + * @param {String} p_sAttribute String representing the name of the + * attribute to retrieve from the DOM element. + */ + function setAttributeFromDOMAttribute(p_sAttribute) { + + if( !(p_sAttribute in p_oAttributes) ) { + + /* + Need to use "getAttributeNode" instead of "getAttribute" + because using "getAttribute," IE will return the innerText of + a <button> for the value attribute rather + than the value of the "value" attribute. + */ + + var oAttribute = p_oElement.getAttributeNode(p_sAttribute); + + + if(oAttribute && ("value" in oAttribute)) { + + me.logger.log( + "Setting attribute \"" + p_sAttribute + "\" using " + + "source element's attribute value of \"" + + oAttribute.value + "\"" + ); + + p_oAttributes[p_sAttribute] = oAttribute.value; + + } + + } + + } + + + /** + * @method setFormElementProperties + * @description Gets the value of the attributes from the form element and + * sets them into the collection of configuration attributes used to + * configure the button. + * @private + */ + function setFormElementProperties() { + + setAttributeFromDOMAttribute("type"); + + if( !("disabled" in p_oAttributes) ) { + + p_oAttributes.disabled = p_oElement.disabled; + + } + + setAttributeFromDOMAttribute("name"); + setAttributeFromDOMAttribute("value"); + setAttributeFromDOMAttribute("title"); + + } + + + var sSrcElementTagName = p_oElement.tagName.toUpperCase(); + + + if( !("label" in p_oAttributes) ) { + + // Set the "label" property + + var sText = sSrcElementTagName == "INPUT" ? + p_oElement.value : p_oElement.innerHTML; + + + if(sText && sText.length > 0) { + + p_oAttributes.label = sText; + + } + + } + + + setAttributeFromDOMAttribute("tabindex"); + setAttributeFromDOMAttribute("accesskey"); + + + switch(sSrcElementTagName) { + + case "A": + + p_oAttributes.type = "link"; + + setAttributeFromDOMAttribute("href"); + setAttributeFromDOMAttribute("target"); + + break; + + case "INPUT": + + setFormElementProperties(); + + if( !("checked" in p_oAttributes) ) { + + p_oAttributes.checked = p_oElement.checked; + + } + + break; + + case "BUTTON": + + setFormElementProperties(); + + var oRootNode = p_oElement.parentNode.parentNode; + + if(Dom.hasClass(oRootNode, "checked")) { + + p_oAttributes.checked = true; + + } + + if(Dom.hasClass(oRootNode, "disabled")) { + + p_oAttributes.disabled = true; + + } + + p_oElement.removeAttribute("name"); + p_oElement.removeAttribute("value"); + + p_oElement.setAttribute("type", "button"); + + break; + + } + +} + + +/** +* @method initConfig +* @description Initializes the set of configuration attributes that are used to +* instantiate the button. +* @private +* @param {Object} Object representing the button's set of +* configuration attributes. +*/ +function initConfig(p_oConfig) { + + var oAttributes = p_oConfig.attributes, + oSrcElement = oAttributes.srcelement, + sSrcElementTagName = oSrcElement.tagName.toUpperCase(); + + + if(sSrcElementTagName == this.TAG_NAME) { + + p_oConfig.element = oSrcElement; + + var oFirstChild = getFirstElement(p_oConfig.element); + + Dom.addClass(oFirstChild, "first-child"); + + if(oFirstChild) { + + var oButton = getFirstElement(oFirstChild); + + + if(oButton) { + + var sButtonTagName = oButton.tagName.toUpperCase(); + + + if(sButtonTagName == "A" || sButtonTagName == "BUTTON") { + + setAttributesFromSrcElement.call( + this, + oButton, + oAttributes + ); + + } + + } + + } + + } + else if(sSrcElementTagName == "INPUT") { + + setAttributesFromSrcElement.call(this, oSrcElement, oAttributes); + + } + +} + + +YAHOO.extend(YAHOO.widget.Button, YAHOO.util.Element, { + + +// Protected properties + + +/** +* @property _button +* @description Object reference to the button's internal +* <a> or <button> element. +* @default null +* @protected +* @type HTMLAnchorElement|HTMLButtonElement +*/ +_button: null, + + +/** +* @property _menu +* @description Object reference to the button's menu. +* @default null +* @protected +* @type YAHOO.widget.Menu +*/ +_menu: null, + + +/** +* @property _onclickAttributeValue +* @description Object reference to the button's current value for the "onclick" +* configuration attribute. +* @default null +* @protected +* @type Object +*/ +_onclickAttributeValue: null, + + +/** +* @property _oninitAttributeValue +* @description Object reference to the button's current value for the "oninit" +* configuration attribute. +* @default null +* @protected +* @type Object +*/ +_oninitAttributeValue: null, + + +/** +* @property _activationKeyPressed +* @description Boolean indicating if the key(s) that toggle the button's +* "active" state have been pressed. +* @default false +* @protected +* @type Boolean +*/ +_activationKeyPressed: false, + + +/** +* @property _activationButtonPressed +* @description Boolean indicating if the mouse button that toggles the button's +* "active" state has been pressed. +* @default false +* @protected +* @type Boolean +*/ +_activationButtonPressed: false, + + +/** +* @property _hasKeyEventHandlers +* @description Boolean indicating if the button's "blur", "keydown" and +* "keyup" event handlers are assigned +* @default false +* @protected +* @type Boolean +*/ +_hasKeyEventHandlers: false, + + +/** +* @property _hasMouseEventHandlers +* @description Boolean indicating if the button's "mouseout" and "mousedown" +* and "mouseup" event handlers are assigned +* @default false +* @protected +* @type Boolean +*/ +_hasMouseEventHandlers: false, + + + +// Constants + + +/** +* @property TAG_NAME +* @description The name of the tag to be used for the button's root element. +* @default "SPAN" +* @final +* @type String +*/ +TAG_NAME: "SPAN", + + +/** +* @property CHECK_ACTIVATION_KEYS +* @description Array of numbers representing keys that (when pressed) toggle +* the button's "checked" attribute. +* @default [32] +* @final +* @type Array +*/ +CHECK_ACTIVATION_KEYS: [32], + + +/** +* @property ACTIVATION_KEYS +* @description Array of numbers representing keys that (when presed) toggle +* the button's "active" state. +* @default [13, 32] +* @final +* @type Array +*/ +ACTIVATION_KEYS: [13, 32], + + +/** +* @property OPTION_AREA_WIDTH +* @description Width (in pixels) of the area of a split button that when +* pressed will display a menu. +* @default 20 +* @final +* @type Number +*/ +OPTION_AREA_WIDTH: 20, + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* button's root element. +* @default "yuibutton" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuibutton", + + +/** +* @property RADIO_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "radio." +* @default "Unchecked. Click to check." +* @final +* @type String +*/ +RADIO_DEFAULT_TITLE: "Unchecked. Click to check.", + + +/** +* @property RADIO_CHECKED_TITLE +* @description String representing the title applied to buttons of type "radio" +* when checked. +* @default "Checked. Click to uncheck." +* @final +* @type String +*/ +RADIO_CHECKED_TITLE: "Checked. Click to uncheck.", + + +/** +* @property CHECKBOX_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "checkbox." +* @default "Unchecked. Click to check." +* @final +* @type String +*/ +CHECKBOX_DEFAULT_TITLE: "Unchecked. Click to check.", + + +/** +* @property CHECKBOX_CHECKED_TITLE +* @description String representing the title applied to buttons of type +* "checkbox" when checked. +* @default "Checked. Click to uncheck." +* @final +* @type String +*/ +CHECKBOX_CHECKED_TITLE: "Checked. Click to uncheck.", + + +/** +* @property MENUBUTTON_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "menubutton." +* @default "Menu collapsed. Click to expand." +* @final +* @type String +*/ +MENUBUTTON_DEFAULT_TITLE: "Menu collapsed. Click to expand.", + + +/** +* @property MENUBUTTON_MENU_VISIBLE_TITLE +* @description String representing the title applied to buttons of type +* "menubutton" when the button's menu is visible. +* @default "Menu expanded. Click or press Esc to collapse." +* @final +* @type String +*/ +MENUBUTTON_MENU_VISIBLE_TITLE: + "Menu expanded. Click or press Esc to collapse.", + + +/** +* @property SPLITBUTTON_DEFAULT_TITLE +* @description String representing the default title applied to buttons of +* type "splitebutton." +* @default "Menu collapsed. Click inside option region or press +* Ctrl + Shift + M to show the menu." +* @final +* @type String +*/ +SPLITBUTTON_DEFAULT_TITLE: + "Menu collapsed. Click inside option region or press Ctrl + Shift + M to show the menu.", + + +/** +* @property SPLITBUTTON_OPTION_VISIBLE_TITLE +* @description String representing the title applied to buttons of type +* "splitbutton" when the button's menu is visible. +* @default "Menu expanded. Press Esc or Ctrl + Shift + M to hide the menu." +* @final +* @type String +*/ +SPLITBUTTON_OPTION_VISIBLE_TITLE: + "Menu expanded. Press Esc or Ctrl + Shift + M to hide the menu.", + + +/** +* @property SUBMIT_TITLE +* @description String representing the title applied to buttons of +* type "submit." +* @default "Click to submit form." +* @final +* @type String +*/ +SUBMIT_TITLE: "Click to submit form.", + + + +// Protected attribute setter methods + + +/** +* @method _setType +* @description Sets the value of the button's "type" attribute. +* @protected +* @param {String} p_sType String indicating the value for the button's +* "type" attribute. +*/ +_setType: function(p_sType) { + + if(p_sType == "splitbutton") { + + this.on("option", this._onOption); + + } + +}, + + +/** +* @method _setLabel +* @description Sets the value of the button's "label" attribute. +* @protected +* @param {String} p_sLabel String indicating the value for the button's +* "label" attribute. +*/ +_setLabel: function(p_sLabel) { + + this._button.innerHTML = p_sLabel; + +}, + + +/** +* @method _setTabIndex +* @description Sets the value of the button's "tabindex" attribute. +* @protected +* @param {Number} p_nTabIndex Number indicating the value for the button's +* "tabindex" attribute. +*/ +_setTabIndex: function(p_nTabIndex) { + + this._button.tabIndex = p_nTabIndex; + +}, + + +/** +* @method _setTitle +* @description Sets the value of the button's "title" attribute. +* @protected +* @param {String} p_nTabIndex Number indicating the value for the button's +* "title" attribute. +*/ +_setTitle: function(p_sTitle) { + + if(this.get("type") != "link") { + + var sTitle = p_sTitle; + + if(!sTitle) { + + + var sType = this.get("type"); + + switch(sType) { + + case "radio": + + sTitle = this.RADIO_DEFAULT_TITLE; + + break; + + case "checkbox": + + sTitle = this.CHECKBOX_DEFAULT_TITLE; + + break; + + case "menubutton": + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + + break; + + case "splitbutton": + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + + break; + + case "submit": + + sTitle = this.SUBMIT_TITLE; + + break; + + } + + } + + this._button.title = sTitle; + + } + +}, + + +/** +* @method _setDisabled +* @description Sets the value of the button's "disabled" attribute. +* @protected +* @param {Boolean} p_bDisabled Boolean indicating the value for the button's +* "disabled" attribute. +*/ +_setDisabled: function(p_bDisabled) { + + if(this.get("type") != "link") { + + if(p_bDisabled) { + + if(this.hasFocus()) { + + this.blur(); + + } + + this._button.setAttribute("disabled", "disabled"); + + this.addClass("disabled"); + + } + else { + + this._button.removeAttribute("disabled"); + + this.removeClass("disabled"); + + } + + } + +}, + + +/** +* @method _setAccessKey +* @description Sets the value of the button's "accesskey" attribute. +* @protected +* @param {String} p_sAccessKey String indicating the value for the button's +* "accesskey" attribute. +*/ +_setAccessKey: function(p_sAccessKey) { + + this._button.accessKey = p_sAccessKey; + +}, + + +/** +* @method _setHref +* @description Sets the value of the button's "href" attribute. +* @protected +* @param {String} p_sHref String indicating the value for the button's +* "href" attribute. +*/ +_setHref: function(p_sHref) { + + if(this.get("type") == "link") { + + this._button.href = p_sHref; + + } + +}, + + +/** +* @method _setTarget +* @description Sets the value of the button's "target" attribute. +* @protected +* @param {String} p_sTarget String indicating the value for the button's +* "target" attribute. +*/ +_setTarget: function(p_sTarget) { + + if(this.get("type") == "link") { + + this._button.setAttribute("target", p_sTarget); + + } + +}, + + +/** +* @method _setChecked +* @description Sets the value of the button's "target" attribute. +* @protected +* @param {Boolean} p_bChecked Boolean indicating the value for the button's +* "checked" attribute. +*/ +_setChecked: function(p_bChecked) { + + var sType = this.get("type"), + sTitle; + + if(sType == "checkbox" || sType == "radio") { + + if(p_bChecked) { + + this.addClass("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + this.removeClass("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + } + +}, + + +/** +* @method _setMenu +* @description Sets the value of the button's "menu" attribute. +* @protected +* @param {Object} p_oMenu Object indicating the value for the button's +* "menu" attribute. +*/ +_setMenu: function(p_oMenu) { + + var Menu = YAHOO.widget.Menu, + oMenu, + me = this; + + if(!Menu) { + + this.logger.log("YAHOO.widget.Menu dependency not met.", "error"); + + return false; + + } + + + function initMenu() { + + if(oMenu) { + + oMenu.showEvent.subscribe(this._onMenuShow, this, true); + oMenu.hideEvent.subscribe(this._onMenuHide, this, true); + oMenu.keyDownEvent.subscribe(this._onMenuKeyDown, this, true); + oMenu.renderEvent.subscribe(this._onMenuRender, this, true); + oMenu.clickEvent.subscribe(this._onMenuClick, this, true); + oMenu.itemAddedEvent.subscribe(this._onMenuItemAdded, this, true); + + var oSrcElement = oMenu.srcElement; + + if(oSrcElement && oSrcElement.tagName.toUpperCase() == "SELECT") { + + oSrcElement.style.display = "none"; + oSrcElement.parentNode.removeChild(oSrcElement); + + } + + this._menu = oMenu; + + } + else { + + this._menu.destroy(); + this._menu = null; + + } + + } + + + if(p_oMenu instanceof Menu) { + + oMenu = p_oMenu; + + var aItems = oMenu.getItems(), + nItems = aItems.length, + oItem; + + if(nItems > 0) { + + var i = nItems - 1; + + do { + + oItem = aItems[i]; + + if(oItem) { + + oItem.cfg.subscribeToConfigEvent( + "selected", + this._onMenuItemSelected, + oItem, + this + ); + + } + + } + while(i--); + + } + + initMenu.call(this); + + } + else if(Lang.isArray(p_oMenu)) { + + this.on("appendTo", function() { + + oMenu = new Menu( + Dom.generateId(), + { lazyload: true, itemdata: p_oMenu } + ); + + initMenu.call(me); + + }); + + } + else if(Lang.isString(p_oMenu)) { + + Event.onContentReady(p_oMenu, function() { + + oMenu = new Menu(this, { lazyload: true }); + + initMenu.call(me); + + }); + + } + else if(p_oMenu && p_oMenu.nodeName) { + + oMenu = new Menu(p_oMenu, { lazyload: true }); + + initMenu.call(this); + + } + +}, + + +/** +* @method _setOnClick +* @description Sets the value of the button's "onclick" attribute. +* @protected +* @param {Object} p_oObject Object indicating the value for the button's +* "onclick" attribute. +*/ +_setOnClick: function(p_oObject) { + + /* + Remove any existing listeners if a "click" event handler has already + been specified. + */ + + if( + this._onclickAttributeValue && + (this._onclickAttributeValue != p_oObject) + ) { + + this.removeListener("click", this._onclickAttributeValue.fn); + + this._onclickAttributeValue = null; + + } + + + if( + !this._onclickAttributeValue && + Lang.isObject(p_oObject) && + Lang.isFunction(p_oObject.fn) + ) { + + this.on("click", p_oObject.fn, p_oObject.obj, p_oObject.scope); + + this._onclickAttributeValue = p_oObject; + + } + +}, + +/** +* @method _setOnInit +* @description Sets the value of the button's "init" attribute. +* @protected +* @param {Object} p_oObject Object indicating the value for the button's +* "oninit" attribute. +*/ +_setOnInit: function(p_oObject) { + + /* + Remove any existing listeners if a "init" event handler has already + been specified. + */ + + if( + this._oninitAttributeValue && + (this._oninitAttributeValue != p_oObject) + ) { + + this.removeListener("init", this._oninitAttributeValue.fn); + + this._oninitAttributeValue = null; + + } + + + if( + !this._oninitAttributeValue && + Lang.isObject(p_oObject) && + Lang.isFunction(p_oObject.fn) + ) { + + this.on("init", p_oObject.fn, p_oObject.obj, p_oObject.scope); + + this._oninitAttributeValue = p_oObject; + + } + +}, + + + +// Protected methods + + +/** +* @method _createButtonElement +* @description Creates the button's element. +* @protected +* @param {String} p_sType String indicating the type of element to create. +* @return {HTMLElement} +*/ +_createButtonElement: function(p_sType) { + + var sTagName = this.TAG_NAME, + oElement = document.createElement(sTagName); + + oElement.innerHTML = + + "<" + sTagName + " class=\"first-child\">" + + (p_sType == "link" ? "" : "") + + ""; + + return oElement; + +}, + + +/** +* @method _isActivationKey +* @description Determines if the specified keycode is one that toggles the +* button's "active" state. +* @protected +* @param {Number} p_nKeyCode Number representing the keycode to be evaluated. +* @return {Boolean} +*/ +_isActivationKey: function(p_nKeyCode) { + + var sType = this.get("type"), + aKeyCodes = (sType == "checkbox" || sType == "radio") ? + this.CHECK_ACTIVATION_KEYS : this.ACTIVATION_KEYS, + + nKeyCodes = aKeyCodes.length; + + if(nKeyCodes > 0) { + + var i = nKeyCodes - 1; + + do { + + if(p_nKeyCode == aKeyCodes[i]) { + + return true; + + } + + } + while(i--); + + } + +}, + + +/** +* @method _isSplitButtonOptionKey +* @description Determines if the specified keycode is one that toggles the +* display of the split button's menu. +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @return {Boolean} +*/ +_isSplitButtonOptionKey: function(p_oEvent) { + + return ( + p_oEvent.ctrlKey && + p_oEvent.shiftKey && + Event.getCharCode(p_oEvent) == 77 + ); + +}, + + +_originalMaxHeight: -1, + + +/** +* @method _showMenu +* @description Shows the button's menu. +* @protected +*/ +_showMenu: function() { + + var oMenu = this._menu; + + if(oMenu) { + + YAHOO.widget.MenuManager.hideVisible(); + + oMenu.cfg.applyConfig({ + context:[this.get("id"), "tl", "bl"], + clicktohide: false, + constraintoviewport: false, + visible: true + }); + + oMenu.cfg.fireQueue(); + + var nViewportHeight = Dom.getViewportHeight(), + nMenuHeight = oMenu.element.offsetHeight; + + + if((oMenu.cfg.getProperty("y") + nMenuHeight) > nViewportHeight) { + + this.logger.log("Current menu position will place a portion, or " + + "the entire menu outside the boundary of the viewport. " + + "Repositioning the menu to stay inside the viewport."); + + oMenu.align("bl", "tl"); + + var nY = oMenu.cfg.getProperty("y"), + + nScrollTop = ( + document.documentElement.scrollTop || + document.body.scrollTop + ); + + + if(nScrollTop >= nY) { + + if(this._originalMaxHeight == -1) { + + this._originalMaxHeight = + oMenu.cfg.getProperty("maxheight"); + + } + + oMenu.cfg.setProperty( + "maxheight", + (nMenuHeight - ((nScrollTop - nY) + 20)) + ); + + oMenu.align("bl", "tl"); + + } + + } + + oMenu.cfg.setProperty("constraintoviewport", true); + + } + +}, + + +/** +* @method _hideMenu +* @description Hides the button's menu. +* @protected +*/ +_hideMenu: function() { + + var oMenu = this._menu; + + if(oMenu && oMenu.cfg.getProperty("visible")) { + + oMenu.hide(); + + } + +}, + + +/** +* @method _submitForm +* @description Submits the form to which the button belongs. +* @protected +*/ +_submitForm: function() { + + var oForm = this.getForm(); + + if(oForm) { + + YAHOO.widget.Button.addHiddenFieldsToForm(oForm); + + this.createHiddenField(); + + oForm.submit(); + + } + +}, + + + +// Protected event handlers + + +/** +* @method _onMouseOver +* @description "mouseover" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseOver: function(p_oEvent) { + + if(!this.get("disabled")) { + + if(!this._hasMouseEventHandlers) { + + this.on("mouseout", this._onMouseOut); + this.on("mousedown", this._onMouseDown); + this.on("mouseup", this._onMouseUp); + + this._hasMouseEventHandlers = true; + + } + + this.addClass("hover"); + + if(this._activationButtonPressed) { + + this.addClass("active"); + + } + + + if(this._bOptionPressed) { + + this.addClass("activeoption"); + + } + + } + +}, + + +/** +* @method _onMouseOut +* @description "mouseout" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseOut: function(p_oEvent) { + + if(!this.get("disabled")) { + + this.removeClass("hover"); + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + if(this._activationButtonPressed || this._bOptionPressed) { + + Event.on(document, "mouseup", this._onDocumentMouseUp, this, true); + + } + + } + +}, + + +/** +* @method _onDocumentMouseUp +* @description "mouseup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onDocumentMouseUp: function(p_oEvent, p_oButton) { + + this._activationButtonPressed = false; + this._bOptionPressed = false; + + var sType = this.get("type"); + + if(sType == "menubutton" || sType == "splitbutton") { + + this.removeClass((sType == "menubutton" ? "active" : "activeoption")); + + this._hideMenu(); + + } + + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + +}, + + +/** +* @method _onMouseDown +* @description "mousedown" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseDown: function(p_oEvent) { + + if(!this.get("disabled")) { + + if((p_oEvent.which || p_oEvent.button) == 1) { + + if(!this.hasFocus()) { + + this.focus(); + + } + + + var sType = this.get("type"); + + + if(sType == "splitbutton") { + + var oElement = this.get("element"), + nX = Event.getPageX(p_oEvent) - Dom.getX(oElement); + + if((oElement.offsetWidth - this.OPTION_AREA_WIDTH) < nX) { + + this.fireEvent("option", p_oEvent); + + } + else { + + this.addClass("active"); + + this._activationButtonPressed = true; + + } + + } + else if(sType == "menubutton") { + + if(this.hasClass("active")) { + + this._hideMenu(); + + this._activationButtonPressed = false; + + } + else { + + this._showMenu(); + + this._activationButtonPressed = true; + + } + + } + else { + + this.addClass("active"); + + this._activationButtonPressed = true; + + } + + + + if(sType == "splitbutton" || sType == "menubutton") { + + var me = this; + + + function onMouseUp() { + + me._hideMenu(); + me.removeListener("mouseup", onMouseUp); + + } + + + this._hideMenuTimerId = window.setTimeout(function() { + + me.on("mouseup", onMouseUp); + + }, 250); + + } + + } + + } + +}, + + +/** +* @method _onMouseUp +* @description "mouseup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onMouseUp: function(p_oEvent) { + + if(!this.get("disabled")) { + + + if(this._hideMenuTimerId) { + + window.clearTimeout(this._hideMenuTimerId); + + } + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + + this._activationButtonPressed = false; + + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + } + +}, + + +/** +* @method _onFocus +* @description "focus" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button that +* fired the event. +*/ +_onFocus: function(p_oEvent, p_oButton) { + + if(!this.get("disabled")) { + + this.addClass("focus"); + + if(this._activationKeyPressed) { + + this.addClass("active"); + + } + + m_oFocusedButton = this; + + + if(!this._hasKeyEventHandlers) { + + var oElement = this._button; + + Event.on(oElement, "blur", this._onBlur, this, true); + Event.on(oElement, "keydown", this._onKeyDown, this, true); + Event.on(oElement, "keyup", this._onKeyUp, this, true); + + this._hasKeyEventHandlers = true; + + } + + + this.fireEvent("focus", p_oEvent); + + } + +}, + + +/** +* @method _onBlur +* @description "blur" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onBlur: function(p_oEvent, p_oButton) { + + if(!this.get("disabled")) { + + this.removeClass("focus"); + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + if(this._activationKeyPressed) { + + Event.on(document, "keyup", this._onDocumentKeyUp, this, true); + + } + + + m_oFocusedButton = null; + + this.fireEvent("blur", p_oEvent); + + } + +}, + + +/** +* @method _onDocumentKeyUp +* @description "keyup" event handler for the document. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onDocumentKeyUp: function(p_oEvent, p_oButton) { + + if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + this._activationKeyPressed = false; + + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + + } + +}, + + +/** +* @method _onKeyDown +* @description "keydown" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onKeyDown: function(p_oEvent, p_oButton) { + + if(!this.get("disabled")) { + + if( + this.get("type") == "splitbutton" && + this._isSplitButtonOptionKey(p_oEvent) + ) { + + this.fireEvent("option", p_oEvent); + + } + else if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + if(this.get("type") == "menubutton") { + + this._showMenu(); + + } + else { + + this._activationKeyPressed = true; + + this.addClass("active"); + + } + + } + + + var oMenu = this._menu; + + if( + oMenu && oMenu.cfg.getProperty("visible") && + Event.getCharCode(p_oEvent) == 27 + ) { + + oMenu.hide(); + this.focus(); + + } + + } + +}, + + +/** +* @method _onKeyUp +* @description "keyup" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onKeyUp: function(p_oEvent, p_oButton) { + + if(!this.get("disabled")) { + + if(this._isActivationKey(Event.getCharCode(p_oEvent))) { + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + this._activationKeyPressed = false; + + if(this.get("type") != "menubutton") { + + this.removeClass("active"); + + } + + } + + } + +}, + + +/** +* @method _onClick +* @description "click" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onClick: function(p_oEvent) { + + var sType = this.get("type"), + sTitle; + + switch(sType) { + + case "radio": + case "checkbox": + + if(this.get("checked")) { + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + break; + + case "submit": + + this._submitForm(); + + break; + + case "reset": + + var oForm = this.getForm(); + + if(oForm) { + + oForm.reset(); + + } + + break; + + case "menubutton": + + sTitle = this._menu.cfg.getProperty("visible") ? + this.MENUBUTTON_MENU_VISIBLE_TITLE : + this.MENUBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + case "splitbutton": + + var oElement = this.get("element"), + nX = Event.getPageX(p_oEvent) - Dom.getX(oElement); + + if((oElement.offsetWidth - this.OPTION_AREA_WIDTH) < nX) { + + return false; + + } + else { + + this._hideMenu(); + + var oSrcElement = this.get("srcelement"); + + if(oSrcElement && oSrcElement.type == "submit") { + + this._submitForm(); + + } + + } + + sTitle = this._menu.cfg.getProperty("visible") ? + this.SPLITBUTTON_OPTION_VISIBLE_TITLE : + this.SPLITBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + } + +}, + + +/** +* @method _onAppendTo +* @description "appendTo" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onAppendTo: function(p_oEvent) { + + /* + It is necessary to call "getForm" using "setTimeout" to make sure that + the button's "form" property returns a node reference. Sometimes, if + you try to get the reference immediately after appending the field, it + is null. + */ + + var me = this; + + window.setTimeout(function() { + + var oForm = me.getForm(); + + if(oForm) { + + Event.on(oForm, "reset", me._onFormReset, me, true); + Event.on(oForm, "submit", me._onFormSubmit, me, true); + + } + + }, 0); + +}, + + +/** +* @method _onFormSubmit +* @description "submit" event handler for the button's form. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onFormSubmit: function(p_oEvent, p_oButton) { + + var sType = this.get("type"), + oMenuItem = this.get("selectedMenuItem"), + oForm = this.getForm(); + + + if(sType == "radio" || sType == "checkbox") { + + YAHOO.log("Creating hidden field for button: " + this); + + this.createHiddenField(); + + } + else if(oMenuItem) { + + var oSrcElement = this._menu.srcElement; + + if(oSrcElement && oSrcElement.tagName.toUpperCase() == "SELECT") { + + oForm.appendChild(oSrcElement); + oSrcElement.selectedIndex = oMenuItem.index; + + } + else { + + var oValue = (oMenuItem.value === null || oMenuItem.value === "") ? + oMenuItem.cfg.getProperty("text") : + oMenuItem.value; + + + if(oValue) { + + var oField = createInputElement( + "hidden", + (this.get("name") + "_options"), + oValue + ); + + oForm.appendChild(oField); + + } + + } + + } + +}, + + +/** +* @method _onFormReset +* @description "reset" event handler for the button's form. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onFormReset: function(p_oEvent, p_oButton) { + + var sType = this.get("type"); + + if(sType == "checkbox" || sType == "radio") { + + this.resetValue("checked"); + + } + + if(this._menu) { + + this.resetValue("selectedMenuItem"); + + } + +}, + + +/** +* @method _onDocumentMouseDown +* @description "mousedown" event handler for the document. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onDocumentMouseDown: function(p_oEvent, p_oButton) { + + var oTarget = Event.getTarget(p_oEvent), + oButtonElement = this.get("element"), + oMenuElement = this._menu.element; + + if( + oTarget != oButtonElement && + !Dom.isAncestor(oButtonElement, oTarget) && + oTarget != oMenuElement && + !Dom.isAncestor(oMenuElement, oTarget) + ) { + + this._hideMenu(); + + Event.removeListener( + document, + "mousedown", + this._onDocumentMouseDown + ); + + } + +}, + + +/** +* @method _onOption +* @description "option" event handler for the button. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +*/ +_onOption: function(p_oEvent) { + + if(this.hasClass("activeoption")) { + + this._hideMenu(); + + this._bOptionPressed = false; + + } + else { + + this._showMenu(); + + this._bOptionPressed = true; + + } + +}, + + +/** +* @method _onMenuShow +* @description "show" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onMenuShow: function(p_sType, p_aArgs, p_oButton) { + + Event.on(document, "mousedown", this._onDocumentMouseDown, this, true); + + var sTitle, + sClass; + + if(this.get("type") == "splitbutton") { + + sTitle = this.SPLITBUTTON_OPTION_VISIBLE_TITLE; + sClass = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_MENU_VISIBLE_TITLE; + sClass = "active"; + + } + + this.addClass(sClass); + this.set("title", sTitle); + +}, + + +/** +* @method _onMenuHide +* @description "hide" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onMenuHide: function(p_sType, p_aArgs, p_oButton) { + + if(this._originalMaxHeight != -1) { + + this._menu.cfg.setProperty("maxheight", this._originalMaxHeight); + + } + + + var sTitle, + sClass; + + if(this.get("type") == "splitbutton") { + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + sClass = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + sClass = "active"; + } + + + this.removeClass(sClass); + this.set("title", sTitle); + +}, + + +/** +* @method _onMenuKeyDown +* @description "keydown" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onMenuKeyDown: function(p_sType, p_aArgs, p_oButton) { + + var oEvent = p_aArgs[0]; + + if(Event.getCharCode(oEvent) == 27) { + + this.focus(); + + if(this.get("type") == "splitbutton") { + + this._bOptionPressed = false; + + } + + } + +}, + + +/** +* @method _onMenuRender +* @description "render" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Button} p_oButton Object representing the button. +*/ +_onMenuRender: function(p_sType, p_aArgs, p_oButton) { + + this.get("element").parentNode.appendChild(this._menu.element); + +}, + + +/** +* @method _onMenuItemSelected +* @description "selectedchange" event handler for each item in the +* button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} +* p_oItem Object representing the menu item that subscribed to the event. +*/ +_onMenuItemSelected: function(p_sType, p_aArgs, p_oItem) { + + this.set("selectedMenuItem", p_oItem); + +}, + + +/** +* @method _onMenuItemAdded +* @description "itemadded" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} +* p_oItem Object representing the menu item that subscribed to the event. +*/ +_onMenuItemAdded: function(p_sType, p_aArgs, p_oItem) { + + var oItem = p_aArgs[0]; + + oItem.cfg.subscribeToConfigEvent( + "selected", + this._onMenuItemSelected, + oItem, + this + ); + +}, + + +/** +* @method _onMenuClick +* @description "click" event handler for the button's menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Button} p_oButton Object representing the menu's button. +*/ +_onMenuClick: function(p_sType, p_aArgs, p_oButton) { + + var oItem = p_aArgs[0]; + + if(oItem) { + + var oSrcElement = this.get("srcelement"); + + if(oSrcElement && oSrcElement.type == "submit") { + + this._submitForm(); + + } + + this._hideMenu(); + + } + +}, + + + +// Public methods + + +/** +* @method createHiddenField +* @description Creates the button's hidden form field and appends it to its +* parent form. +* @return {HTMLInputElement} +*/ +createHiddenField: function () { + + if(!this.get("disabled")) { + + var sType = this.get("type"), + + bCheckable = (sType == "checkbox" || sType == "radio"), + + oField = createInputElement( + (bCheckable ? this.get("type") : "hidden"), + this.get("name"), + this.get("value"), + this.get("checked") + ), + + oForm = this.getForm(); + + + if(oField && bCheckable) { + + oField.style.display = "none"; + + } + + + if(oForm) { + + oForm.appendChild(oField); + + } + + + return oField; + + } + +}, + + +/** +* @method init +* @description The Button class's initialization method. +* @param {String} p_oElement String specifying the id attribute of the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {HTMLInputElement|HTMLElement} p_oElement Object reference for the +* <input>, <a> or +* <span> element to be used to create the button. +* @param {Object} p_oElement Object literal specifying a set of configuration +* attributes used to create the button. +* @param {Object} p_oAttributes Optional. Object literal specifying a set of +* configuration attributes used to create the button. +*/ +init: function(p_oElement, p_oAttributes) { + + var sTagName = p_oAttributes.type == "link" ? "A" : "BUTTON", + oSrcElement = p_oAttributes.srcelement; + + + this._button = p_oElement.getElementsByTagName(sTagName)[0]; + + + YAHOO.widget.Button.superclass.init.call( + this, p_oElement, + p_oAttributes + ); + + + m_oButtons[this.get("id")] = this; + + + this.addClass(this.CSS_CLASS_NAME); + this.addClass(this.get("type")); + + Event.on(this._button, "focus", this._onFocus, this, true); + this.on("mouseover", this._onMouseOver); + this.on("click", this._onClick); + this.on("appendTo", this._onAppendTo); + + var oContainer = this.get("container"), + oElement = this.get("element"); + + + if(oContainer) { + + if(Lang.isString(oContainer)) { + + var me = this; + + Event.onContentReady(oContainer, function() { + + me.appendTo(this); + + }); + + } + else { + + this.appendTo(oContainer); + + } + + } + else if( + !Dom.inDocument(oElement) && + oSrcElement && + oSrcElement.tagName.toUpperCase() == "INPUT" + ) { + + var oParentNode = oSrcElement.parentNode; + + if(oParentNode) { + + this.fireEvent("beforeAppendTo", { + type: "beforeAppendTo", + target: oParentNode + }); + + oParentNode.replaceChild(oElement, oSrcElement); + + this.fireEvent("appendTo", { + type: "appendTo", + target: oParentNode + }); + + } + + } + else if( + Dom.inDocument(oElement) && + oSrcElement.tagName.toUpperCase() == "SPAN" + ) { + + var oForm = this.getForm(); + + if(oForm) { + + Event.on(oForm, "reset", this._onFormReset, this, true); + Event.on(oForm, "submit", this._onFormSubmit, this, true); + + } + + } + + this.fireEvent("init"); + + this.logger.log("Initialization completed."); + +}, + + +/** +* @method initAttributes +* @description Initializes all of the configuration attributes used to create +* the button. +* @param {Object} p_oAttributes Object literal specifying a set of +* configuration attributes used to create the button. +*/ +initAttributes: function(p_oAttributes) { + + var oAttributes = p_oAttributes || {}; + + YAHOO.widget.Button.superclass.initAttributes.call(this, oAttributes); + + + /** + * @config type + * @description String specifying the button's type. Possible values are: + * "button," "link," "submit," "reset," "checkbox," "radio," "menubutton," + * and "splitbutton." + * @default "button" + * @type String + */ + this.setAttributeConfig("type", { + + value: (oAttributes.type || "button"), + validator: Lang.isString, + writeOnce: true, + method: this._setType + + }); + + + /** + * @config label + * @description String specifying the button's text label or innerHTML. + * @default null + * @type String + */ + this.setAttributeConfig("label", { + + value: oAttributes.label, + validator: Lang.isString, + method: this._setLabel + + }); + + + /** + * @config value + * @description Object specifying the value for the button. + * @default null + * @type Object + */ + this.setAttributeConfig("value", { + + value: oAttributes.value + + }); + + + /** + * @config name + * @description String specifying the name for the button. + * @default null + * @type String + */ + this.setAttributeConfig("name", { + + value: oAttributes.name, + validator: Lang.isString + + }); + + + /** + * @config tabindex + * @description Number specifying the tabindex for the button. + * @default null + * @type Number + */ + this.setAttributeConfig("tabindex", { + + value: oAttributes.tabindex, + validator: Lang.isNumber, + method: this._setTabIndex + + }); + + + /** + * @config title + * @description String specifying the title for the button. + * @default null + * @type String + */ + this.configureAttribute("title", { + + value: oAttributes.title, + validator: Lang.isString, + method: this._setTitle + + }); + + + /** + * @config disabled + * @description Boolean indicating if the button should be disabled. + * (Disabled buttons are dimmed and will not respond to user input + * or fire events.) + * @default false + * @type Boolean + */ + this.setAttributeConfig("disabled", { + + value: (oAttributes.disabled || false), + validator: Lang.isBoolean, + method: this._setDisabled + + }); + + + /** + * @config href + * @description String specifying the href for the button. Applies only to + * buttons of type "link." + * @type String + */ + this.setAttributeConfig("href", { + + value: oAttributes.href, + validator: Lang.isString, + method: this._setHref + + }); + + + /** + * @config target + * @description String specifying the target for the button. Applies only + * to buttons of type "link." + * @type String + */ + this.setAttributeConfig("target", { + + value: oAttributes.target, + validator: Lang.isString, + method: this._setTarget + + }); + + + /** + * @config checked + * @description Boolean indicating if the button is checked. Applies only + * to buttons of type "radio" and "checkbox." + * @default false + * @type Boolean + */ + this.setAttributeConfig("checked", { + + value: (oAttributes.checked || false), + validator: Lang.isBoolean, + method: this._setChecked + + }); + + + /** + * @config container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the button's markup should be + * rendered into. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("container", { + + value: oAttributes.container + + }); + + + /** + * @config srcelement + * @description Object reference to the HTML element (either + * <input> or <span>) used to + * create the button. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("srcelement", { + + value: oAttributes.srcelement, + writeOnce: true + + }); + + + /** + * @config menu + * @description Object specifying the menu for the button. The value can be + * one of the following: + *
    + *
  • Object specifying a + * YAHOO.widget.Menu instance.
  • + *
  • String specifying the id attribute of the <div> + * element used to create the menu.
  • + *
  • String specifying the id attribute of the + * <select> element used to create the menu.
  • + *
  • Object specifying the <div> element used to + * create the menu.
  • + *
  • Object specifying the <select> element used to + * create the menu.
  • + *
  • Array of object literals, each representing a set of + * YAHOO.widget.MenuItem + * configuration attributes.
  • + *
  • Array of strings representing the text labels for each menu item in + * the menu.
  • + *
+ * @type HTMLElement|String|Array + * @default null + */ + this.setAttributeConfig("menu", { + + value: null, + method: this._setMenu + + }); + + + /** + * @config selectedMenuItem + * @description Reference to the item in the button's menu that is + * currently selected. + * @type YAHOO.widget.MenuItem + * @default null + */ + this.setAttributeConfig("selectedMenuItem", { + + value: null + + }); + + + /** + * @config onclick + * @description Object literal representing the code to be executed when + * the button is clicked. Format:
{
+ * fn: Function, // The handler to call when the + * event fires.
obj: Object, // An object to + * pass back to the handler.
scope: Object // + * The object to use for the scope of the handler.
}
+ * @type Object + * @default null + */ + this.setAttributeConfig("onclick", { + + value: oAttributes.onclick, + method: this._setOnClick + + }); + + + /** + * @config oninit + * @description Object literal representing the code to be executed when + * the button is initialized. Format:
{
+ * fn: Function, // The handler to call when the + * event fires.
obj: Object, // An object to + * pass back to the handler.
scope: Object // + * The object to use for the scope of the handler.
}
+ * @type Object + * @default null + */ + this.setAttributeConfig("oninit", { + + value: oAttributes.oninit, + method: this._setOnInit + + }); + +}, + + +/** +* @method focus +* @description Causes the button to receive the focus and fires the button's +* "focus" event. +*/ +focus: function() { + + if(!this.get("disabled")) { + + this._button.focus(); + + } + +}, + + +/** +* @method blur +* @description Causes the button to lose focus and fires the button's +* "blur" event. +*/ +blur: function() { + + if(!this.get("disabled")) { + + this._button.blur(); + + } + +}, + + +/** +* @method hasFocus +* @description Returns a boolean indicating whether or not the button has focus. +* @return {Boolean} +*/ +hasFocus: function() { + + return (m_oFocusedButton == this); + +}, + + +/** +* @method isActive +* @description Returns a boolean indicating whether or not the button is active. +* @return {Boolean} +*/ +isActive: function() { + + return this.hasClass("active"); + +}, + + +/** +* @method getMenu +* @description Returns a reference to the button's menu. +* @return {YAHOO.widget.Menu} +*/ +getMenu: function() { + + return this._menu; + +}, + + +/** +* @method getForm +* @description Returns a reference to the button's menu. +* @return {HTMLFormElement} +*/ +getForm: function() { + + return this._button.form; + +}, + + +/** +* @method destroy +* @description Removes the button's element from its parent element and +* removes all event handlers. +*/ +destroy: function() { + + this.logger.log("Destroying ..."); + + var oElement = this.get("element"), + oParentNode = oElement.parentNode, + oMenu = this._menu; + + if(oMenu) { + + this.logger.log("Destroying menu."); + + oMenu.destroy(); + + } + + this.logger.log("Removing DOM event handlers."); + + Event.purgeElement(oElement); + Event.purgeElement(this._button); + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + Event.removeListener(document, "mousedown", this._onDocumentMouseDown); + + var oForm = this.getForm(); + + if(oForm) { + + Event.removeListener(oForm, "reset", this._onFormReset); + + } + + + oParentNode.removeChild(oElement); + + this.logger.log("Removing from document."); + + delete m_oButtons[this.get("id")]; + + this.logger.log("Destroyed."); + +}, + + +/** +* @method toString +* @description Returns a string representing the button. +* @return {String} +*/ +toString: function() { + + return ("Button " + this.get("id")); + +} + +}); + + +/** +* @method addHiddenFieldsToForm +* @description Searches the specified form and adds hidden fields for instances +* of YAHOO.widget.Button that are of type "radio," "checkbox," "menubutton," +* and "splitbutton." +* @param {HTMLFormElement} p_oForm Object reference +* for the form to search. +*/ +YAHOO.widget.Button.addHiddenFieldsToForm = function(p_oForm) { + + var aButtons = Dom.getElementsByClassName("yuibutton", "*", p_oForm), + nButtons = aButtons.length; + + + if(nButtons > 0) { + + YAHOO.log("Form contains " + nButtons + " YUI buttons."); + + var oButton = null, + sType = null, + oMenuItem = null, + oMenu = null; + + for(var i=0; i
 tag (for wrapping)
+            var container = (this.verboseOutput) ? "CODE" : "PRE";
+            var oNewElement = (this.newestOnTop) ?
+                this._elConsole.insertBefore(
+                    document.createElement(container),this._elConsole.firstChild):
+                this._elConsole.appendChild(document.createElement(container));
+
+            oNewElement.innerHTML = output;
+            this._consoleMsgCount++;
+            this._lastTime = entry.time.getTime();
+        }
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private event handlers
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Handles Logger's categoryCreateEvent.
+ *
+ * @method _onCategoryCreate
+ * @param sType {String} The event.
+ * @param aArgs {Object[]} Data passed from event firer.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onCategoryCreate = function(sType, aArgs, oSelf) {
+    var category = aArgs[0];
+    if(oSelf._elFt) {
+        oSelf._createCategoryCheckbox(category);
+    }
+};
+
+/**
+ * Handles Logger's sourceCreateEvent.
+ *
+ * @method _onSourceCreate
+ * @param sType {String} The event.
+ * @param aArgs {Object[]} Data passed from event firer.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onSourceCreate = function(sType, aArgs, oSelf) {
+    var source = aArgs[0];
+    if(oSelf._elFt) {
+        oSelf._createSourceCheckbox(source);
+    }
+};
+
+/**
+ * Handles check events on the category filter checkboxes.
+ *
+ * @method _onCheckCategory
+ * @param v {HTMLEvent} The click event.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onCheckCategory = function(v, oSelf) {
+    var newFilter = this.category;
+    var filtersArray = oSelf._categoryFilters;
+
+    if(!this.checked) { // Remove category from filters
+        for(var i=0; i 0) {
+                // Substring until first space
+                sClass = sSource.substring(0,spaceIndex);
+                // The rest of the source
+                sDetail = sSource.substring(spaceIndex,sSource.length);
+            }
+            else {
+                sClass = sSource;
+            }
+            if(this._isNewSource(sClass)) {
+                this._createNewSource(sClass);
+            }
+        }
+
+        var timestamp = new Date();
+        var logEntry = new YAHOO.widget.LogMsg({
+            msg: sMsg,
+            time: timestamp,
+            category: sCategory,
+            source: sClass,
+            sourceDetail: sDetail
+        });
+
+        var stack = this._stack;
+        var maxStackEntries = this.maxStackEntries;
+        if(maxStackEntries && !isNaN(maxStackEntries) &&
+            (stack.length >= maxStackEntries)) {
+            stack.shift();
+        }
+        stack.push(logEntry);
+        this.newLogEvent.fire(logEntry);
+
+        if(this._browserConsoleEnabled) {
+            this._printToBrowserConsole(logEntry);
+        }
+        return true;
+    }
+    else {
+        return false;
+    }
+};
+
+/**
+ * Resets internal stack and startTime, enables Logger, and fires logResetEvent.
+ *
+ * @method reset
+ */
+YAHOO.widget.Logger.reset = function() {
+    this._stack = [];
+    this._startTime = new Date().getTime();
+    this.loggerEnabled = true;
+    this.log("Logger reset");
+    this.logResetEvent.fire();
+};
+
+/**
+ * Public accessor to internal stack of log message objects.
+ *
+ * @method getStack
+ * @return {Object[]} Array of log message objects.
+ */
+YAHOO.widget.Logger.getStack = function() {
+    return this._stack;
+};
+
+/**
+ * Public accessor to internal start time.
+ *
+ * @method getStartTime
+ * @return {Date} Internal date of when Logger singleton was initialized.
+ */
+YAHOO.widget.Logger.getStartTime = function() {
+    return this._startTime;
+};
+
+/**
+ * Disables output to the browser's global console.log() function, which is used
+ * by the Firebug extension to Firefox as well as Safari.
+ *
+ * @method disableBrowserConsole
+ */
+YAHOO.widget.Logger.disableBrowserConsole = function() {
+    YAHOO.log("Logger output to the function console.log() has been disabled.");
+    this._browserConsoleEnabled = false;
+};
+
+/**
+ * Enables output to the browser's global console.log() function, which is used
+ * by the Firebug extension to Firefox as well as Safari.
+ *
+ * @method enableBrowserConsole
+ */
+YAHOO.widget.Logger.enableBrowserConsole = function() {
+    this._browserConsoleEnabled = true;
+    YAHOO.log("Logger output to the function console.log() has been enabled.");
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Public events
+//
+/////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Fired when a new category has been created.
+ *
+ * @event categoryCreateEvent
+ * @param sCategory {String} Category name.
+ */
+YAHOO.widget.Logger.categoryCreateEvent =
+    new YAHOO.util.CustomEvent("categoryCreate", this, true);
+
+ /**
+ * Fired when a new source has been named.
+ *
+ * @event sourceCreateEvent
+ * @param sSource {String} Source name.
+ */
+YAHOO.widget.Logger.sourceCreateEvent =
+    new YAHOO.util.CustomEvent("sourceCreate", this, true);
+
+ /**
+ * Fired when a new log message has been created.
+ *
+ * @event newLogEvent
+ * @param sMsg {String} Log message.
+ */
+YAHOO.widget.Logger.newLogEvent = new YAHOO.util.CustomEvent("newLog", this, true);
+
+/**
+ * Fired when the Logger has been reset has been created.
+ *
+ * @event logResetEvent
+ */
+YAHOO.widget.Logger.logResetEvent = new YAHOO.util.CustomEvent("logReset", this, true);
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private methods
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Creates a new category of log messages and fires categoryCreateEvent.
+ *
+ * @method _createNewCategory
+ * @param sCategory {String} Category name.
+ * @private
+ */
+YAHOO.widget.Logger._createNewCategory = function(sCategory) {
+    this.categories.push(sCategory);
+    this.categoryCreateEvent.fire(sCategory);
+};
+
+/**
+ * Checks to see if a category has already been created.
+ *
+ * @method _isNewCategory
+ * @param sCategory {String} Category name.
+ * @return {Boolean} Returns true if category is unknown, else returns false.
+ * @private
+ */
+YAHOO.widget.Logger._isNewCategory = function(sCategory) {
+    for(var i=0; i < this.categories.length; i++) {
+        if(sCategory == this.categories[i]) {
+            return false;
+        }
+    }
+    return true;
+};
+
+/**
+ * Creates a new source of log messages and fires sourceCreateEvent.
+ *
+ * @method _createNewSource
+ * @param sSource {String} Source name.
+ * @private
+ */
+YAHOO.widget.Logger._createNewSource = function(sSource) {
+    this.sources.push(sSource);
+    this.sourceCreateEvent.fire(sSource);
+};
+
+/**
+ * Checks to see if a source already exists.
+ *
+ * @method _isNewSource
+ * @param sSource {String} Source name.
+ * @return {Boolean} Returns true if source is unknown, else returns false.
+ * @private
+ */
+YAHOO.widget.Logger._isNewSource = function(sSource) {
+    if(sSource) {
+        for(var i=0; i < this.sources.length; i++) {
+            if(sSource == this.sources[i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+};
+
+/**
+ * Outputs a log message to global console.log() function.
+ *
+ * @method _printToBrowserConsole
+ * @param oEntry {Object} Log entry object.
+ * @private
+ */
+YAHOO.widget.Logger._printToBrowserConsole = function(oEntry) {
+    if(window.console && console.log) {
+        var category = oEntry.category;
+        var label = oEntry.category.substring(0,4).toUpperCase();
+
+        var time = oEntry.time;
+        if (time.toLocaleTimeString) {
+            var localTime  = time.toLocaleTimeString();
+        }
+        else {
+            localTime = time.toString();
+        }
+
+        var msecs = time.getTime();
+        var elapsedTime = (YAHOO.widget.Logger._lastTime) ?
+            (msecs - YAHOO.widget.Logger._lastTime) : 0;
+        YAHOO.widget.Logger._lastTime = msecs;
+
+        var output =
+            localTime + " (" +
+            elapsedTime + "ms): " +
+            oEntry.source + ": " +
+            oEntry.msg;
+
+        console.log(output);
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private event handlers
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Handles logging of messages due to window error events.
+ *
+ * @method _onWindowError
+ * @param sMsg {String} The error message.
+ * @param sUrl {String} URL of the error.
+ * @param sLine {String} Line number of the error.
+ * @private
+ */
+YAHOO.widget.Logger._onWindowError = function(sMsg,sUrl,sLine) {
+    // Logger is not in scope of this event handler
+    try {
+        YAHOO.widget.Logger.log(sMsg+' ('+sUrl+', line '+sLine+')', "window");
+        if(YAHOO.widget.Logger._origOnWindowError) {
+            YAHOO.widget.Logger._origOnWindowError();
+        }
+    }
+    catch(e) {
+        return false;
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Enable handling of native JavaScript errors
+// NB: Not all browsers support the window.onerror event
+//
+/////////////////////////////////////////////////////////////////////////////
+
+if(window.onerror) {
+    // Save any previously defined handler to call
+    YAHOO.widget.Logger._origOnWindowError = window.onerror;
+}
+window.onerror = YAHOO.widget.Logger._onWindowError;
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// First log
+//
+/////////////////////////////////////////////////////////////////////////////
+
+YAHOO.widget.Logger.log("Logger initialized");
+
+
+YAHOO.register("logger", YAHOO.widget.Logger, {version: "2.2.0", build: "127"});
diff --git a/interface/ispconfig/interface/js/yui/logger/logger-min.js b/interface/ispconfig/interface/js/yui/logger/logger-min.js
new file mode 100644
index 000000000..a633e1b15
--- /dev/null
+++ b/interface/ispconfig/interface/js/yui/logger/logger-min.js
@@ -0,0 +1,63 @@
+/*
+Copyright (c) 2007, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.2.0
+*/
+
+YAHOO.widget.LogMsg=function(oConfigs){if(typeof oConfigs=="object"){for(var param in oConfigs){this[param]=oConfigs[param];}}};YAHOO.widget.LogMsg.prototype.msg=null;YAHOO.widget.LogMsg.prototype.time=null;YAHOO.widget.LogMsg.prototype.category=null;YAHOO.widget.LogMsg.prototype.source=null;YAHOO.widget.LogMsg.prototype.sourceDetail=null;YAHOO.widget.LogWriter=function(sSource){if(!sSource){YAHOO.log("Could not instantiate LogWriter due to invalid source.","error","LogWriter");return;}
+this._source=sSource;};YAHOO.widget.LogWriter.prototype.toString=function(){return"LogWriter "+this._sSource;};YAHOO.widget.LogWriter.prototype.log=function(sMsg,sCategory){YAHOO.widget.Logger.log(sMsg,sCategory,this._source);};YAHOO.widget.LogWriter.prototype.getSource=function(){return this._sSource;};YAHOO.widget.LogWriter.prototype.setSource=function(sSource){if(!sSource){YAHOO.log("Could not set source due to invalid source.","error",this.toString());return;}
+else{this._sSource=sSource;}};YAHOO.widget.LogWriter.prototype._source=null;YAHOO.widget.LogReader=function(elContainer,oConfigs){var oSelf=this;this._sName=YAHOO.widget.LogReader._index;YAHOO.widget.LogReader._index++;if(typeof oConfigs=="object"){for(var param in oConfigs){this[param]=oConfigs[param];}}
+if(elContainer){if(typeof elContainer=="string"){this._elContainer=document.getElementById(elContainer);}
+else if(elContainer.tagName){this._elContainer=elContainer;}
+this._elContainer.className="yui-log";}
+if(!this._elContainer){if(YAHOO.widget.LogReader._elDefaultContainer){this._elContainer=YAHOO.widget.LogReader._elDefaultContainer;}
+else{this._elContainer=document.body.appendChild(document.createElement("div"));this._elContainer.id="yui-log";this._elContainer.className="yui-log";YAHOO.widget.LogReader._elDefaultContainer=this._elContainer;}
+var containerStyle=this._elContainer.style;if(this.width){containerStyle.width=this.width;}
+if(this.right){containerStyle.right=this.right;}
+if(this.top){containerStyle.top=this.top;}
+if(this.left){containerStyle.left=this.left;containerStyle.right="auto";}
+if(this.bottom){containerStyle.bottom=this.bottom;containerStyle.top="auto";}
+if(this.fontSize){containerStyle.fontSize=this.fontSize;}
+if(navigator.userAgent.toLowerCase().indexOf("opera")!=-1){document.body.style+='';}}
+if(this._elContainer){if(!this._elHd){this._elHd=this._elContainer.appendChild(document.createElement("div"));this._elHd.id="yui-log-hd"+this._sName;this._elHd.className="yui-log-hd";this._elCollapse=this._elHd.appendChild(document.createElement("div"));this._elCollapse.className="yui-log-btns";this._btnCollapse=document.createElement("input");this._btnCollapse.type="button";this._btnCollapse.style.fontSize=YAHOO.util.Dom.getStyle(this._elContainer,"fontSize");this._btnCollapse.className="yui-log-button";this._btnCollapse.value="Collapse";this._btnCollapse=this._elCollapse.appendChild(this._btnCollapse);YAHOO.util.Event.addListener(oSelf._btnCollapse,'click',oSelf._onClickCollapseBtn,oSelf);this._title=this._elHd.appendChild(document.createElement("h4"));this._title.innerHTML="Logger Console";if(YAHOO.util.DD&&(YAHOO.widget.LogReader._elDefaultContainer==this._elContainer)){var ylog_dd=new YAHOO.util.DD(this._elContainer.id);ylog_dd.setHandleElId(this._elHd.id);this._elHd.style.cursor="move";}}
+if(!this._elConsole){this._elConsole=this._elContainer.appendChild(document.createElement("div"));this._elConsole.className="yui-log-bd";if(this.height){this._elConsole.style.height=this.height;}}
+if(!this._elFt&&this.footerEnabled){this._elFt=this._elContainer.appendChild(document.createElement("div"));this._elFt.className="yui-log-ft";this._elBtns=this._elFt.appendChild(document.createElement("div"));this._elBtns.className="yui-log-btns";this._btnPause=document.createElement("input");this._btnPause.type="button";this._btnPause.style.fontSize=YAHOO.util.Dom.getStyle(this._elContainer,"fontSize");this._btnPause.className="yui-log-button";this._btnPause.value="Pause";this._btnPause=this._elBtns.appendChild(this._btnPause);YAHOO.util.Event.addListener(oSelf._btnPause,'click',oSelf._onClickPauseBtn,oSelf);this._btnClear=document.createElement("input");this._btnClear.type="button";this._btnClear.style.fontSize=YAHOO.util.Dom.getStyle(this._elContainer,"fontSize");this._btnClear.className="yui-log-button";this._btnClear.value="Clear";this._btnClear=this._elBtns.appendChild(this._btnClear);YAHOO.util.Event.addListener(oSelf._btnClear,'click',oSelf._onClickClearBtn,oSelf);this._elCategoryFilters=this._elFt.appendChild(document.createElement("div"));this._elCategoryFilters.className="yui-log-categoryfilters";this._elSourceFilters=this._elFt.appendChild(document.createElement("div"));this._elSourceFilters.className="yui-log-sourcefilters";}}
+if(!this._buffer){this._buffer=[];}
+this._lastTime=YAHOO.widget.Logger.getStartTime();YAHOO.widget.Logger.newLogEvent.subscribe(this._onNewLog,this);YAHOO.widget.Logger.logResetEvent.subscribe(this._onReset,this);this._categoryFilters=[];var catsLen=YAHOO.widget.Logger.categories.length;if(this._elCategoryFilters){for(var i=0;i",label," ",totalTime,"ms (+",elapsedTime,") ",localTime,": ","

",sourceAndDetail,":

",msg,"

"]:["

",label," ",totalTime,"ms (+",elapsedTime,") ",localTime,": ",sourceAndDetail,": ",msg,"

"];return output.join("");};YAHOO.widget.LogReader.prototype.html2Text=function(sHtml){if(sHtml){sHtml+="";return sHtml.replace(/&/g,"&").replace(//g,">");} +return"";};YAHOO.widget.LogReader._index=0;YAHOO.widget.LogReader.prototype._sName=null;YAHOO.widget.LogReader._elDefaultContainer=null;YAHOO.widget.LogReader.prototype._buffer=null;YAHOO.widget.LogReader.prototype._consoleMsgCount=0;YAHOO.widget.LogReader.prototype._lastTime=null;YAHOO.widget.LogReader.prototype._timeout=null;YAHOO.widget.LogReader.prototype._categoryFilters=null;YAHOO.widget.LogReader.prototype._sourceFilters=null;YAHOO.widget.LogReader.prototype._elContainer=null;YAHOO.widget.LogReader.prototype._elHd=null;YAHOO.widget.LogReader.prototype._elCollapse=null;YAHOO.widget.LogReader.prototype._btnCollapse=null;YAHOO.widget.LogReader.prototype._title=null;YAHOO.widget.LogReader.prototype._elConsole=null;YAHOO.widget.LogReader.prototype._elFt=null;YAHOO.widget.LogReader.prototype._elBtns=null;YAHOO.widget.LogReader.prototype._elCategoryFilters=null;YAHOO.widget.LogReader.prototype._elSourceFilters=null;YAHOO.widget.LogReader.prototype._btnPause=null;YAHOO.widget.LogReader.prototype._btnClear=null;YAHOO.widget.LogReader.prototype._createCategoryCheckbox=function(sCategory){var oSelf=this;if(this._elFt){var elParent=this._elCategoryFilters;var filters=this._categoryFilters;var elFilter=elParent.appendChild(document.createElement("span"));elFilter.className="yui-log-filtergrp";var chkCategory=document.createElement("input");chkCategory.id="yui-log-filter-"+sCategory+this._sName;chkCategory.className="yui-log-filter-"+sCategory;chkCategory.type="checkbox";chkCategory.category=sCategory;chkCategory=elFilter.appendChild(chkCategory);chkCategory.checked=true;filters.push(sCategory);YAHOO.util.Event.addListener(chkCategory,'click',oSelf._onCheckCategory,oSelf);var lblCategory=elFilter.appendChild(document.createElement("label"));lblCategory.htmlFor=chkCategory.id;lblCategory.className=sCategory;lblCategory.innerHTML=sCategory;}};YAHOO.widget.LogReader.prototype._createSourceCheckbox=function(sSource){var oSelf=this;if(this._elFt){var elParent=this._elSourceFilters;var filters=this._sourceFilters;var elFilter=elParent.appendChild(document.createElement("span"));elFilter.className="yui-log-filtergrp";var chkSource=document.createElement("input");chkSource.id="yui-log-filter"+sSource+this._sName;chkSource.className="yui-log-filter"+sSource;chkSource.type="checkbox";chkSource.source=sSource;chkSource=elFilter.appendChild(chkSource);chkSource.checked=true;filters.push(sSource);YAHOO.util.Event.addListener(chkSource,'click',oSelf._onCheckSource,oSelf);var lblSource=elFilter.appendChild(document.createElement("label"));lblSource.htmlFor=chkSource.id;lblSource.className=sSource;lblSource.innerHTML=sSource;}};YAHOO.widget.LogReader.prototype._filterLogs=function(){if(this._elConsole!==null){this._clearConsole();this._printToConsole(YAHOO.widget.Logger.getStack());}};YAHOO.widget.LogReader.prototype._clearConsole=function(){this._timeout=null;this._buffer=[];this._consoleMsgCount=0;this._lastTime=YAHOO.widget.Logger.getStartTime();var elConsole=this._elConsole;while(elConsole.hasChildNodes()){elConsole.removeChild(elConsole.firstChild);}};YAHOO.widget.LogReader.prototype._printBuffer=function(){this._timeout=null;if(this._elConsole!==null){var thresholdMax=this.thresholdMax;thresholdMax=(thresholdMax&&!isNaN(thresholdMax))?thresholdMax:500;if(this._consoleMsgCountthis.thresholdMax)){thresholdMin=0;} +var entriesStartIndex=(entriesLen>thresholdMin)?(entriesLen-thresholdMin):0;var sourceFiltersLen=this._sourceFilters.length;var categoryFiltersLen=this._categoryFilters.length;for(var i=entriesStartIndex;i0){sClass=sSource.substring(0,spaceIndex);sDetail=sSource.substring(spaceIndex,sSource.length);} +else{sClass=sSource;} +if(this._isNewSource(sClass)){this._createNewSource(sClass);}} +var timestamp=new Date();var logEntry=new YAHOO.widget.LogMsg({msg:sMsg,time:timestamp,category:sCategory,source:sClass,sourceDetail:sDetail});var stack=this._stack;var maxStackEntries=this.maxStackEntries;if(maxStackEntries&&!isNaN(maxStackEntries)&&(stack.length>=maxStackEntries)){stack.shift();} +stack.push(logEntry);this.newLogEvent.fire(logEntry);if(this._browserConsoleEnabled){this._printToBrowserConsole(logEntry);} +return true;} +else{return false;}};YAHOO.widget.Logger.reset=function(){this._stack=[];this._startTime=new Date().getTime();this.loggerEnabled=true;this.log("Logger reset");this.logResetEvent.fire();};YAHOO.widget.Logger.getStack=function(){return this._stack;};YAHOO.widget.Logger.getStartTime=function(){return this._startTime;};YAHOO.widget.Logger.disableBrowserConsole=function(){YAHOO.log("Logger output to the function console.log() has been disabled.");this._browserConsoleEnabled=false;};YAHOO.widget.Logger.enableBrowserConsole=function(){this._browserConsoleEnabled=true;YAHOO.log("Logger output to the function console.log() has been enabled.");};YAHOO.widget.Logger.categoryCreateEvent=new YAHOO.util.CustomEvent("categoryCreate",this,true);YAHOO.widget.Logger.sourceCreateEvent=new YAHOO.util.CustomEvent("sourceCreate",this,true);YAHOO.widget.Logger.newLogEvent=new YAHOO.util.CustomEvent("newLog",this,true);YAHOO.widget.Logger.logResetEvent=new YAHOO.util.CustomEvent("logReset",this,true);YAHOO.widget.Logger._createNewCategory=function(sCategory){this.categories.push(sCategory);this.categoryCreateEvent.fire(sCategory);};YAHOO.widget.Logger._isNewCategory=function(sCategory){for(var i=0;i", label, " ", + totalTime, "ms (+", elapsedTime, ") ", + localTime, ": ", + "

", + sourceAndDetail, + ":

", + msg, + "

"] : + + ["

", label, " ", + totalTime, "ms (+", elapsedTime, ") ", + localTime, ": ", + sourceAndDetail, ": ", + msg,"

"]; + + return output.join(""); +}; + +/** + * Converts input chars "<", ">", and "&" to HTML entities. + * + * @method html2Text + * @param sHtml {String} String to convert. + * @private + */ +YAHOO.widget.LogReader.prototype.html2Text = function(sHtml) { + if(sHtml) { + sHtml += ""; + return sHtml.replace(/&/g, "&").replace(//g, ">"); + } + return ""; +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class member to index multiple LogReader instances. + * + * @property _memberName + * @static + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.LogReader._index = 0; + +/** + * Name of LogReader instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.LogReader.prototype._sName = null; + +/** + * A class member shared by all LogReaders if a container needs to be + * created during instantiation. Will be null if a container element never needs to + * be created on the fly, such as when the implementer passes in their own element. + * + * @property _elDefaultContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader._elDefaultContainer = null; + +/** + * Buffer of log message objects for batch output. + * + * @property _buffer + * @type Object[] + * @private + */ +YAHOO.widget.LogReader.prototype._buffer = null; + +/** + * Number of log messages output to console. + * + * @property _consoleMsgCount + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.LogReader.prototype._consoleMsgCount = 0; + +/** + * Date of last output log message. + * + * @property _lastTime + * @type Date + * @private + */ +YAHOO.widget.LogReader.prototype._lastTime = null; + +/** + * Batched output timeout ID. + * + * @property _timeout + * @type Number + * @private + */ +YAHOO.widget.LogReader.prototype._timeout = null; + +/** + * Array of filters for log message categories. + * + * @property _categoryFilters + * @type String[] + * @private + */ +YAHOO.widget.LogReader.prototype._categoryFilters = null; + +/** + * Array of filters for log message sources. + * + * @property _sourceFilters + * @type String[] + * @private + */ +YAHOO.widget.LogReader.prototype._sourceFilters = null; + +/** + * LogReader container element. + * + * @property _elContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elContainer = null; + +/** + * LogReader header element. + * + * @property _elHd + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elHd = null; + +/** + * LogReader collapse element. + * + * @property _elCollapse + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elCollapse = null; + +/** + * LogReader collapse button element. + * + * @property _btnCollapse + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnCollapse = null; + +/** + * LogReader title header element. + * + * @property _title + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._title = null; + +/** + * LogReader console element. + * + * @property _elConsole + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elConsole = null; + +/** + * LogReader footer element. + * + * @property _elFt + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elFt = null; + +/** + * LogReader buttons container element. + * + * @property _elBtns + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elBtns = null; + +/** + * Container element for LogReader category filter checkboxes. + * + * @property _elCategoryFilters + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elCategoryFilters = null; + +/** + * Container element for LogReader source filter checkboxes. + * + * @property _elSourceFilters + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elSourceFilters = null; + +/** + * LogReader pause button element. + * + * @property _btnPause + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnPause = null; + +/** + * Clear button element. + * + * @property _btnClear + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnClear = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Creates the UI for a category filter in the LogReader footer element. + * + * @method _createCategoryCheckbox + * @param sCategory {String} Category name. + * @private + */ +YAHOO.widget.LogReader.prototype._createCategoryCheckbox = function(sCategory) { + var oSelf = this; + + if(this._elFt) { + var elParent = this._elCategoryFilters; + var filters = this._categoryFilters; + + var elFilter = elParent.appendChild(document.createElement("span")); + elFilter.className = "yui-log-filtergrp"; + // Append el at the end so IE 5.5 can set "type" attribute + // and THEN set checked property + var chkCategory = document.createElement("input"); + chkCategory.id = "yui-log-filter-" + sCategory + this._sName; + chkCategory.className = "yui-log-filter-" + sCategory; + chkCategory.type = "checkbox"; + chkCategory.category = sCategory; + chkCategory = elFilter.appendChild(chkCategory); + chkCategory.checked = true; + + // Add this checked filter to the internal array of filters + filters.push(sCategory); + // Subscribe to the click event + YAHOO.util.Event.addListener(chkCategory,'click',oSelf._onCheckCategory,oSelf); + + // Create and class the text label + var lblCategory = elFilter.appendChild(document.createElement("label")); + lblCategory.htmlFor = chkCategory.id; + lblCategory.className = sCategory; + lblCategory.innerHTML = sCategory; + } +}; + +/** + * Creates a checkbox in the LogReader footer element to filter by source. + * + * @method _createSourceCheckbox + * @param sSource {String} Source name. + * @private + */ +YAHOO.widget.LogReader.prototype._createSourceCheckbox = function(sSource) { + var oSelf = this; + + if(this._elFt) { + var elParent = this._elSourceFilters; + var filters = this._sourceFilters; + + var elFilter = elParent.appendChild(document.createElement("span")); + elFilter.className = "yui-log-filtergrp"; + + // Append el at the end so IE 5.5 can set "type" attribute + // and THEN set checked property + var chkSource = document.createElement("input"); + chkSource.id = "yui-log-filter" + sSource + this._sName; + chkSource.className = "yui-log-filter" + sSource; + chkSource.type = "checkbox"; + chkSource.source = sSource; + chkSource = elFilter.appendChild(chkSource); + chkSource.checked = true; + + // Add this checked filter to the internal array of filters + filters.push(sSource); + // Subscribe to the click event + YAHOO.util.Event.addListener(chkSource,'click',oSelf._onCheckSource,oSelf); + + // Create and class the text label + var lblSource = elFilter.appendChild(document.createElement("label")); + lblSource.htmlFor = chkSource.id; + lblSource.className = sSource; + lblSource.innerHTML = sSource; + } +}; + +/** + * Reprints all log messages in the stack through filters. + * + * @method _filterLogs + * @private + */ +YAHOO.widget.LogReader.prototype._filterLogs = function() { + // Reprint stack with new filters + if (this._elConsole !== null) { + this._clearConsole(); + this._printToConsole(YAHOO.widget.Logger.getStack()); + } +}; + +/** + * Clears all outputted log messages from the console and resets the time of the + * last output log message. + * + * @method _clearConsole + * @private + */ +YAHOO.widget.LogReader.prototype._clearConsole = function() { + // Clear the buffer of any pending messages + this._timeout = null; + this._buffer = []; + this._consoleMsgCount = 0; + + // Reset the rolling timer + this._lastTime = YAHOO.widget.Logger.getStartTime(); + + var elConsole = this._elConsole; + while(elConsole.hasChildNodes()) { + elConsole.removeChild(elConsole.firstChild); + } +}; + +/** + * Sends buffer of log messages to output and clears buffer. + * + * @method _printBuffer + * @private + */ +YAHOO.widget.LogReader.prototype._printBuffer = function() { + this._timeout = null; + + if(this._elConsole !== null) { + var thresholdMax = this.thresholdMax; + thresholdMax = (thresholdMax && !isNaN(thresholdMax)) ? thresholdMax : 500; + if(this._consoleMsgCount < thresholdMax) { + var entries = []; + for (var i=0; i this.thresholdMax)) { + thresholdMin = 0; + } + var entriesStartIndex = (entriesLen > thresholdMin) ? (entriesLen - thresholdMin) : 0; + + // Iterate through all log entries + var sourceFiltersLen = this._sourceFilters.length; + var categoryFiltersLen = this._categoryFilters.length; + for(var i=entriesStartIndex; i tag instead of
 tag (for wrapping)
+            var container = (this.verboseOutput) ? "CODE" : "PRE";
+            var oNewElement = (this.newestOnTop) ?
+                this._elConsole.insertBefore(
+                    document.createElement(container),this._elConsole.firstChild):
+                this._elConsole.appendChild(document.createElement(container));
+
+            oNewElement.innerHTML = output;
+            this._consoleMsgCount++;
+            this._lastTime = entry.time.getTime();
+        }
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private event handlers
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Handles Logger's categoryCreateEvent.
+ *
+ * @method _onCategoryCreate
+ * @param sType {String} The event.
+ * @param aArgs {Object[]} Data passed from event firer.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onCategoryCreate = function(sType, aArgs, oSelf) {
+    var category = aArgs[0];
+    if(oSelf._elFt) {
+        oSelf._createCategoryCheckbox(category);
+    }
+};
+
+/**
+ * Handles Logger's sourceCreateEvent.
+ *
+ * @method _onSourceCreate
+ * @param sType {String} The event.
+ * @param aArgs {Object[]} Data passed from event firer.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onSourceCreate = function(sType, aArgs, oSelf) {
+    var source = aArgs[0];
+    if(oSelf._elFt) {
+        oSelf._createSourceCheckbox(source);
+    }
+};
+
+/**
+ * Handles check events on the category filter checkboxes.
+ *
+ * @method _onCheckCategory
+ * @param v {HTMLEvent} The click event.
+ * @param oSelf {Object} The LogReader instance.
+ * @private
+ */
+YAHOO.widget.LogReader.prototype._onCheckCategory = function(v, oSelf) {
+    var newFilter = this.category;
+    var filtersArray = oSelf._categoryFilters;
+
+    if(!this.checked) { // Remove category from filters
+        for(var i=0; i 0) {
+                // Substring until first space
+                sClass = sSource.substring(0,spaceIndex);
+                // The rest of the source
+                sDetail = sSource.substring(spaceIndex,sSource.length);
+            }
+            else {
+                sClass = sSource;
+            }
+            if(this._isNewSource(sClass)) {
+                this._createNewSource(sClass);
+            }
+        }
+
+        var timestamp = new Date();
+        var logEntry = new YAHOO.widget.LogMsg({
+            msg: sMsg,
+            time: timestamp,
+            category: sCategory,
+            source: sClass,
+            sourceDetail: sDetail
+        });
+
+        var stack = this._stack;
+        var maxStackEntries = this.maxStackEntries;
+        if(maxStackEntries && !isNaN(maxStackEntries) &&
+            (stack.length >= maxStackEntries)) {
+            stack.shift();
+        }
+        stack.push(logEntry);
+        this.newLogEvent.fire(logEntry);
+
+        if(this._browserConsoleEnabled) {
+            this._printToBrowserConsole(logEntry);
+        }
+        return true;
+    }
+    else {
+        return false;
+    }
+};
+
+/**
+ * Resets internal stack and startTime, enables Logger, and fires logResetEvent.
+ *
+ * @method reset
+ */
+YAHOO.widget.Logger.reset = function() {
+    this._stack = [];
+    this._startTime = new Date().getTime();
+    this.loggerEnabled = true;
+    this.log("Logger reset");
+    this.logResetEvent.fire();
+};
+
+/**
+ * Public accessor to internal stack of log message objects.
+ *
+ * @method getStack
+ * @return {Object[]} Array of log message objects.
+ */
+YAHOO.widget.Logger.getStack = function() {
+    return this._stack;
+};
+
+/**
+ * Public accessor to internal start time.
+ *
+ * @method getStartTime
+ * @return {Date} Internal date of when Logger singleton was initialized.
+ */
+YAHOO.widget.Logger.getStartTime = function() {
+    return this._startTime;
+};
+
+/**
+ * Disables output to the browser's global console.log() function, which is used
+ * by the Firebug extension to Firefox as well as Safari.
+ *
+ * @method disableBrowserConsole
+ */
+YAHOO.widget.Logger.disableBrowserConsole = function() {
+    YAHOO.log("Logger output to the function console.log() has been disabled.");
+    this._browserConsoleEnabled = false;
+};
+
+/**
+ * Enables output to the browser's global console.log() function, which is used
+ * by the Firebug extension to Firefox as well as Safari.
+ *
+ * @method enableBrowserConsole
+ */
+YAHOO.widget.Logger.enableBrowserConsole = function() {
+    this._browserConsoleEnabled = true;
+    YAHOO.log("Logger output to the function console.log() has been enabled.");
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Public events
+//
+/////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Fired when a new category has been created.
+ *
+ * @event categoryCreateEvent
+ * @param sCategory {String} Category name.
+ */
+YAHOO.widget.Logger.categoryCreateEvent =
+    new YAHOO.util.CustomEvent("categoryCreate", this, true);
+
+ /**
+ * Fired when a new source has been named.
+ *
+ * @event sourceCreateEvent
+ * @param sSource {String} Source name.
+ */
+YAHOO.widget.Logger.sourceCreateEvent =
+    new YAHOO.util.CustomEvent("sourceCreate", this, true);
+
+ /**
+ * Fired when a new log message has been created.
+ *
+ * @event newLogEvent
+ * @param sMsg {String} Log message.
+ */
+YAHOO.widget.Logger.newLogEvent = new YAHOO.util.CustomEvent("newLog", this, true);
+
+/**
+ * Fired when the Logger has been reset has been created.
+ *
+ * @event logResetEvent
+ */
+YAHOO.widget.Logger.logResetEvent = new YAHOO.util.CustomEvent("logReset", this, true);
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private methods
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Creates a new category of log messages and fires categoryCreateEvent.
+ *
+ * @method _createNewCategory
+ * @param sCategory {String} Category name.
+ * @private
+ */
+YAHOO.widget.Logger._createNewCategory = function(sCategory) {
+    this.categories.push(sCategory);
+    this.categoryCreateEvent.fire(sCategory);
+};
+
+/**
+ * Checks to see if a category has already been created.
+ *
+ * @method _isNewCategory
+ * @param sCategory {String} Category name.
+ * @return {Boolean} Returns true if category is unknown, else returns false.
+ * @private
+ */
+YAHOO.widget.Logger._isNewCategory = function(sCategory) {
+    for(var i=0; i < this.categories.length; i++) {
+        if(sCategory == this.categories[i]) {
+            return false;
+        }
+    }
+    return true;
+};
+
+/**
+ * Creates a new source of log messages and fires sourceCreateEvent.
+ *
+ * @method _createNewSource
+ * @param sSource {String} Source name.
+ * @private
+ */
+YAHOO.widget.Logger._createNewSource = function(sSource) {
+    this.sources.push(sSource);
+    this.sourceCreateEvent.fire(sSource);
+};
+
+/**
+ * Checks to see if a source already exists.
+ *
+ * @method _isNewSource
+ * @param sSource {String} Source name.
+ * @return {Boolean} Returns true if source is unknown, else returns false.
+ * @private
+ */
+YAHOO.widget.Logger._isNewSource = function(sSource) {
+    if(sSource) {
+        for(var i=0; i < this.sources.length; i++) {
+            if(sSource == this.sources[i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+};
+
+/**
+ * Outputs a log message to global console.log() function.
+ *
+ * @method _printToBrowserConsole
+ * @param oEntry {Object} Log entry object.
+ * @private
+ */
+YAHOO.widget.Logger._printToBrowserConsole = function(oEntry) {
+    if(window.console && console.log) {
+        var category = oEntry.category;
+        var label = oEntry.category.substring(0,4).toUpperCase();
+
+        var time = oEntry.time;
+        if (time.toLocaleTimeString) {
+            var localTime  = time.toLocaleTimeString();
+        }
+        else {
+            localTime = time.toString();
+        }
+
+        var msecs = time.getTime();
+        var elapsedTime = (YAHOO.widget.Logger._lastTime) ?
+            (msecs - YAHOO.widget.Logger._lastTime) : 0;
+        YAHOO.widget.Logger._lastTime = msecs;
+
+        var output =
+            localTime + " (" +
+            elapsedTime + "ms): " +
+            oEntry.source + ": " +
+            oEntry.msg;
+
+        console.log(output);
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Private event handlers
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Handles logging of messages due to window error events.
+ *
+ * @method _onWindowError
+ * @param sMsg {String} The error message.
+ * @param sUrl {String} URL of the error.
+ * @param sLine {String} Line number of the error.
+ * @private
+ */
+YAHOO.widget.Logger._onWindowError = function(sMsg,sUrl,sLine) {
+    // Logger is not in scope of this event handler
+    try {
+        YAHOO.widget.Logger.log(sMsg+' ('+sUrl+', line '+sLine+')', "window");
+        if(YAHOO.widget.Logger._origOnWindowError) {
+            YAHOO.widget.Logger._origOnWindowError();
+        }
+    }
+    catch(e) {
+        return false;
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Enable handling of native JavaScript errors
+// NB: Not all browsers support the window.onerror event
+//
+/////////////////////////////////////////////////////////////////////////////
+
+if(window.onerror) {
+    // Save any previously defined handler to call
+    YAHOO.widget.Logger._origOnWindowError = window.onerror;
+}
+window.onerror = YAHOO.widget.Logger._onWindowError;
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// First log
+//
+/////////////////////////////////////////////////////////////////////////////
+
+YAHOO.widget.Logger.log("Logger initialized");
+
+
+YAHOO.register("logger", YAHOO.widget.Logger, {version: "2.2.0", build: "127"});
diff --git a/interface/ispconfig/interface/js/yui/menu/README b/interface/ispconfig/interface/js/yui/menu/README
new file mode 100644
index 000000000..34689ef95
--- /dev/null
+++ b/interface/ispconfig/interface/js/yui/menu/README
@@ -0,0 +1,385 @@
+*** version 2.2.0 ***
+
+Added the following features:
+-----------------------------
+
+* Added two new methods to YAHOO.widget.Menu:
+
+    * "getItems" - Returns a flat array of the items in a menu.
+
+    * "clearContent" - Removes all of the content from the menu, including the 
+      menu items, group titles, header and footer.
+
+
+* Added three new configuration attributes to YAHOO.widget.Menu:
+
+    * "submenuhidedelay" - Number indicating the time (in milliseconds) that 
+      should expire before a submenu is hidden when the user mouses out of a 
+      menu item heading in the direction of a submenu. The value must be 
+      greater than or equal to the value specified for the "showdelay" 
+      configuration property.
+
+    * "maxheight" - Defines the maximum height (in pixels) for a menu before 
+      the contents of the body are scrolled. 
+
+    * "classname" - CSS class to be applied to the menu's root 
element. + The specified class(es) are appended in addition to the default class as + specified by the menu's CSS_CLASS_NAME constant. + + +* Added new constants to YAHOO.widget.MenuItem: + + * COLLAPSED_SUBMENU_INDICATOR_TEXT - String representing the text for the + element used for the submenu arrow indicator. + + * EXPANDED_SUBMENU_INDICATOR_TEXT - String representing the text for the + submenu arrow indicator element () when the submenu is visible. + + * DISABLED_SUBMENU_INDICATOR_ALT_TEXT - String representing the text for + the submenu arrow indicator element () when the menu item is disabled. + + * CHECKED_TEXT - String representing the text to be used for the checked + indicator element (). + + * DISABLED_CHECKED_TEXT - String representing the text to be used for the + checked indicator element () when the menu item is disabled. + + +* Added two new configuration attributes to YAHOO.widget.MenuItem: + + * "onclick" - Object literal representing the code to be executed when the + button is clicked. Format: + + { + fn: Function, // The handler to call when the event fires. + obj: Object, // An object to pass back to the handler. + scope: Object // The object to use for the scope of the handler. + } + + * "classname" - CSS class to be applied to the menu item's root
  • + element. The specified class(es) are appended in addition to the default + class as specified by the menu item's CSS_CLASS_NAME constant. + + +* Added an "id" property to YAHOO.widget.MenuItem that represents the id of + the menu item's root
  • node. Although not a configuration attribute, this + property should be set via the object literal of configuration attributes + passed as the second argument to the constructor. If no value is + specified, then one will be generated using the "generateId" method of the + Dom utility (YAHOO.widget.Dom). + +* Added a "trigger context menu event" + (YAHOO.widget.ContextMenu.triggerContextMenuEvent) that fires when the DOM + "contextmenu" event ("mousedown" for Opera) is fired by one of the elemeents + defined as a YAHOO.widget.ContextMenu instance's trigger. + +* Added a "cancel" method to YAHOO.widget.ContextMenu that can be used to + cancel the display of a YAHOO.widget.ContextMen instance. This method + should be called within the scope of a "context menu" event handler for + one of the context menu's triggers + (YAHOO.widget.ContextMenu.triggerContextMenuEvent). + + +Fixed the following bugs: +------------------------- + +* Users can now move diagonally from a menu item to its corresponding submenu + without the submenu hiding immediately. + +* "destroy" method of YAHOO.widget.Menu now unsubscribes from the "text resize" + event (YAHOO.widget.Module.textResizeEvent). + +* Browser progress bar no longer flashes when hovering over checked menu items + or menu items with submenus. + +* Menu item submenu indicator image no longer jumps to the next line in + quirks mode. + +* Mouse events no longer fire in Firefox if a YAHOO.widget.Menu instance is + moved by script into a stationary mouse pointer. + +* Modified "toString" method of YAHOO.widget.ContextMenuItem to return the + correct class name, as it was reporting as YAHOO.widget.MenuBarItem. + + +Changes: +-------- + +* Default value for the "showdelay" configuration attribute is now 250 + +* Modified code so that all Menu images are added via CSS background images. + As a result, the following constants and properties have been deprecated: + + * YAHOO.widget.MenuItem.SUBMENU_INDICATOR_IMAGE_PATH + * YAHOO.widget.MenuItem.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH + * YAHOO.widget.MenuItem.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH + * YAHOO.widget.MenuItem.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT + * YAHOO.widget.MenuItem.EXPANDED_SUBMENU_INDICATOR_ALT_TEXT + * YAHOO.widget.MenuItem.DISABLED_SUBMENU_INDICATOR_ALT_TEXT + * YAHOO.widget.MenuItem.CHECKED_IMAGE_PATH + * YAHOO.widget.MenuItem.SELECTED_CHECKED_IMAGE_PATH + * YAHOO.widget.MenuItem.DISABLED_CHECKED_IMAGE_PATH + * YAHOO.widget.MenuItem.CHECKED_IMAGE_ALT_TEXT + * YAHOO.widget.MenuItem.DISABLED_CHECKED_IMAGE_ALT_TEXT + * YAHOO.widget.MenuItem.IMG_ROOT + * YAHOO.widget.MenuItem.IMG_ROOT_SSL + * YAHOO.widget.MenuItem.imageRoot + * YAHOO.widget.MenuItem.isSecure + + + +*** version 0.12.2 *** + +* No changes + + + +*** version 0.12.1 *** + +Fixed the following bugs: +------------------------- + +* Placed the call to the DOM "focus" method used by the MenuItem class inside + a zero-second timeout to resolve a race condition between menu positioning + and focusing of a menu item that resulted in the browser viewport + scrolling unnecessarily. + +* Switched to JSMin for JavaScript compression to resolve issues with the + minified version. + +* Disabled menu item instances will no longer display a submenu if the item is + clicked or moused over. + +* Can no longer select more than one item in a menu if using the keyboard and + mouse simultaneously. + +* Calling the "destory" method on a menu will now unregister all of the menu's + submenus from the MenuManager. + + + +*** version 0.12 *** + +Added the following features: +----------------------------- + +* Added the YAHOO.widget.MenuManager singleton class. + +* Added two new methods to YAHOO.widget.Menu: + + * "addItems" - Adds an array of items to a menu. + + * "getRoot" - Returns the root menu in a menu hierarchy. + +* Added two new events to YAHOO.widget.Menu: + + * "itemAddedEvent" - Fires when an item is added to a menu. + + * "itemRemovedEvent" - Fires when an item is removed from a menu. + +* Added two new properties to YAHOO.widget.Menu: + + * "itemData" - Array of items to be added to the menu. + + * "lazyLoad" - Boolean indicating if the menu's "lazy load" feature + is enabled. + +* Added new configuration properties to YAHOO.widget.Menu: + + * "hidedelay" - Hides the menu after the specified number of milliseconds. + + * "showdelay" - Shows the menu after the specified number of milliseconds. + + * "container" - The containing element the menu should be rendered into. + + * "clicktohide" - Boolean indicating if the menu will automatically be + hidden if the user clicks outside of it. + + * "autosubmenudisplay" - Boolean indicating if submenus are automatically + made visible when the user mouses over the menu's items. + +* Added a "toString" method to YAHOO.widget.MenuItem, YAHOO.widget.MenuBarItem + and YAHOO.widget.ContextMenuItem that returns the class name followed by the + value of the item's "text" configuration property. + + +Fixed the following bugs: +------------------------- + +* Setting a YAHOO.widget.ContextMenu instance's "trigger" configuration + property will remove all previous triggers before setting up the new ones. + +* "destroy" method of YAHOO.widget.ContextMenu cleans up all DOM event handlers. + +* Clicking on a menu item with a submenu no longer hides/collapses the + entire menu. + +* Clicking an item's submenu indicator image no longer collapses the + entire menu. + + +Changes: +-------- + +* Deprecated the YAHOO.widget.MenuModule and YAHOO.widget.MenuModuleItem + classes. The Base classes are now YAHOO.widget.Menu and + YAHOO.widget.MenuItem. + +* "addItem" and "insertItem" methods of YAHOO.widget.Menu now accept an + object literal representing YAHOO.widget.MenuItem configuration properties. + +* "clearActiveItem" now takes an argument: flag indicating if the Menu + instance's active item should be blurred. + +* Switched the default value of the "visible" configuration property for + YAHOO.widget.Menu to "false." + +* Switched the default value of the "constraintoviewport" configuration + property for YAHOO.widget.Menu to "true." + +* Overloaded the "submenu" configuration property for YAHOO.widget.MenuItem + so that it now can accept any of the following: + + * YAHOO.widget.Menu instance + * Object literal representation of a menu + * Element id + * Element reference + +* "hide" and "show" methods of statically positioned menus now toggle the their + element's "display" style property between "block" and "none." + + + +*** version 0.10.0 *** + +* Initial release + +* Known issues: + + * Some Firefox extensions disable the ability for JavaScript to prevent + the display of the browser's default context menu. These extensions + can cause the YUI ContextMenu to stop working. If you encounter this + problem, you can reset the context menu preference in Firefox back to + the default by making sure the "Disable or replace context menus" + preference is checked: + + Mac Firefox 1.0: + ------------------- + Preferences > Web Features > + Advanced... > Disable or replace context menus + + Mac Firefox 1.5 + ------------------- + Preferences > Context > + Advanced... > Disable or replace context menus + + Windows Firefox 1.0 + ------------------- + Tools > Options > Web Features > + Advanced... > Disable or replace context menus + + Windows Firefox 1.5 + ------------------- + Tools > Options > Context > + Advanced... > Disable or replace context menus + + + +*** version 0.11.3 *** + +Added the following features: +----------------------------- + +* Added a "target" configuration property to the MenuModuleItem object that + allows the user to specify the target of an item's anchor element. Items + that make use of the "target" configuration property will require the user + to click exactly on the item's anchor element to navigate to the specified + URL. + +* Items without a "url" property set will automatically hide their parent + menu instance(s) when clicked. + + +Fixed the following bugs: +------------------------- + +* Items in a submenu should now navigate to their specified URL when clicked. + +* Removed MenuBar's use of "overflow:hidden." This fixes an issue in Firefox + 1.5 in which submenus of a Menubar instance cannot overlay other absolutely + positioned elements on the page. + +* Submenus of a Menubar instance will now automatically have their iframe shim + enabled in IE<7. + +* Statically positioned Menubar and Menu instances will now render with the + correct position and dimensions in Safari. + +* MenuModuleItem's "focus" method now checks to make sure that an item's + "display" style property is not "none" before trying to set focus to its + anchor element. + +* A ContextMenu instance will now hide all other ContextMenu instances before + displaying itself. + +* Removed the dead space in front of an item's submenu indicator image in IE. + This space was causing an item's submenu to flicker when the user hovered + over it. + + +Changes: +-------- + +* Moved the DOM event handlers for every menu from the root DIV node of each + instance to the document object. This change reduces the number of DOM event + handlers used by Menu to eight, improving the cleanup time required by the + Event utility. + + + +*** version 0.11.0 *** + +Added the following features: +----------------------------- +* Overloaded the "addItem" and "insertItem" methods of MenuModule to accept a + string or a MenuModuleItem instance + +* Added the ability to define a MenuItem instance as being "checked" + + +Fixed the following bugs: +------------------------- +* Changing the path for the submenu indicator image of one MenuModuleItem + subclass will no longer affect other subclasses + +* MenuItem instances built from existing markup without anchor tags will no + longer trigger a JavaScript error when clicked + +* Modified the implementation of the "imageRoot" property for the + MenuModuleItem class so that it is set to a secure/non-secure path when the + object is instantiated + +* Menu instances now resize in response to changes to the browser's font size + +* Modified the propagation of the MenuModule class's "submenualignment" + configuration property so that it only applies to instances of the same type + +* Adjusted the specificity of the style rule that controls the position of a + MenuItem instance's submenu indicator image to prevent it from wrapping in IE + +* Specified a width and height for submenu indicator images in the Menu + stylesheet to ensure that Menu instances are always rendered at the correct + width + +* Clicking a MenuItem instance will no longer trigger two HTTP GET requests + +* Users can now control or shift-click on MenuItem links + + +Changes: +-------- +* In the Menu stylesheet (menu.css), switched from using "first" class to + "first-of-type" class + +* Changed case of MenuModuleItem class's "subMenuIndicator" property + to "submenuIndicator" \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/menu/assets/map.gif b/interface/ispconfig/interface/js/yui/menu/assets/map.gif new file mode 100644 index 0000000000000000000000000000000000000000..715859aa8b7e006cce52c4533c659e0bc022b868 GIT binary patch literal 264 zcmZ?wbhEHbTNsJ9jQJGU7iNFkl0UKUo+V7&sVo zK$0Lc7+AInC?+qN`sLP|^s9Hibw0?Db#Gswb$h3{&dF@4+u?yLtoE1N`d%=aA|mKM z)#%8{78|vmBColJVss?A%2!qGKb)|B#qX#4G929*E^J_AFn#3Psr*2mStj9# zEK3YWi$+tMh6sC8w?uR;dwsoBr#Q=Wp_y}L&tznr*~Y>sv~a%o!lhEo8SB=EO!4=t vRQBJnW9P2j9u6tiNok&YjvU?NvsF%9WXiE~=l3MqC#QLMUcInOkii-N{U~MY literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menu.css b/interface/ispconfig/interface/js/yui/menu/assets/menu.css new file mode 100644 index 000000000..2fc2f6303 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/menu/assets/menu.css @@ -0,0 +1,384 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* Menu styles */ + +div.yuimenu { + + background-color:#f6f7ee; + border:solid 1px #c4c4be; + padding:1px; + +} + +/* Submenus are positioned absolute and hidden by default */ + +div.yuimenu div.yuimenu, +div.yuimenubar div.yuimenu { + + position:absolute; + visibility:hidden; + +} + +/* MenuBar Styles */ + +div.yuimenubar { + + background-color:#f6f7ee; + +} + +/* + Applying a width triggers "haslayout" in IE so that the module's + body clears its floated elements +*/ +div.yuimenubar div.bd { + + width:100%; + +} + +/* + Clear the module body for other browsers +*/ +div.yuimenubar div.bd:after { + + content:'.'; + display:block; + clear:both; + visibility:hidden; + height:0; + +} + +/* Matches the group title (H6) inside a Menu or MenuBar instance */ + +div.yuimenu h6, +div.yuimenubar h6 { + + font-size:100%; + font-weight:normal; + margin:0; + border:solid 1px #c4c4be; + color:#b9b9b9; + +} + +div.yuimenubar h6 { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + padding:4px 12px; + border-width:0 1px 0 0; + +} + +div.yuimenu h6 { + + float:none; + display:block; + border-width:1px 0 0 0; + padding:5px 10px 0 10px; + +} + +/* Matches the UL inside a Menu or MenuBar instance */ + +div.yuimenubar ul { + + list-style-type:none; + margin:0; + padding:0; + +} + +div.yuimenu ul { + + list-style-type:none; + border:solid 1px #c4c4be; + border-width:1px 0 0 0; + margin:0; + padding:10px 0; + +} + +div.yuimenu ul.first-of-type, +div.yuimenu ul.hastitle, +div.yuimenu h6.first-of-type { + + border-width:0; + +} + +/* + Styles for the menu's header and footer elements that are used as controls + to scroll the menu's body element when the menu's height exceeds the + value of the "maxheight" configuration property. +*/ + +div.yuimenu div.topscrollbar, +div.yuimenu div.bottomscrollbar { + + height:16px; + background-image:url(map.gif); + background-repeat:no-repeat; + +} + + +div.yuimenu div.topscrollbar { + + background-image:url(map.gif); + background-position:center -72px; + +} + + +div.yuimenu div.topscrollbar_disabled { + + background-image:url(map.gif); + background-position:center -88px; + +} + + +div.yuimenu div.bottomscrollbar { + + background-image:url(map.gif); + background-position:center -104px; + +} + + +div.yuimenu div.bottomscrollbar_disabled { + + background-image:url(map.gif); + background-position:center -120px; + +} + + +/* MenuItem and MenuBarItem styles */ + +div.yuimenu li, +div.yuimenubar li { + + font-size:85%; + cursor:pointer; + cursor:hand; + white-space:nowrap; + text-align:left; + +} + +div.yuimenu li.yuimenuitem { + + padding:2px 24px; + +} + +div.yuimenu li li, +div.yuimenubar li li { + + font-size:100%; + +} + + +/* Matches the help text for a menu item */ + +div.yuimenu li.hashelptext em.helptext { + + font-style:normal; + margin:0 0 0 40px; + +} + +div.yuimenu li a, +div.yuimenubar li a { + + /* + "zoom:1" triggers "haslayout" in IE to ensure that the mouseover and + mouseout events bubble to the parent LI in IE. + */ + zoom:1; + color:#000; + text-decoration:none; + +} + +div.yuimenu li.hassubmenu, +div.yuimenu li.hashelptext { + + text-align:right; + +} + +div.yuimenu li.hassubmenu a.hassubmenu, +div.yuimenu li.hashelptext a.hashelptext { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + text-align:left; + +} + + +/* Matches selected menu items */ + +div.yuimenu li.selected, +div.yuimenubar li.selected { + + background-color:#8c8ad0; + +} + +div.yuimenu li.selected a.selected, +div.yuimenubar li.selected a.selected { + + text-decoration:underline; + +} + +div.yuimenu li.selected a.selected, +div.yuimenu li.selected em.selected, +div.yuimenubar li.selected a.selected { + + color:#fff; + +} + + +/* Matches disabled menu items */ + +div.yuimenu li.disabled, +div.yuimenubar li.disabled { + + cursor:default; + +} + +div.yuimenu li.disabled a.disabled, +div.yuimenu li.disabled em.disabled, +div.yuimenubar li.disabled a.disabled { + + color:#b9b9b9; + cursor:default; + +} + +div.yuimenubar li.yuimenubaritem { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + border-width:0 0 0 1px; + border-style:solid; + border-color:#c4c4be; + padding:4px 24px; + margin:0; + +} + +div.yuimenubar li.yuimenubaritem.first-of-type { + + border-width:0; + +} + + +/* Styles for the the submenu indicator for menu items */ + +div.yuimenu li.hassubmenu em.submenuindicator, +div.yuimenubar li.hassubmenu em.submenuindicator { + + display:-moz-inline-box; /* Mozilla */ + display:inline-block; /* IE, Opera and Safari */ + vertical-align:middle; + height:8px; + width:8px; + text-indent:9px; + font:0/0 arial; + overflow:hidden; + background-image:url(map.gif); + background-repeat:no-repeat; + +} + +div.yuimenubar li.hassubmenu em.submenuindicator { + + background-position:0 -24px; + margin:0 0 0 10px; + +} + +div.yuimenubar li.hassubmenu em.submenuindicator.selected { + + background-position:0 -32px; + +} + +div.yuimenubar li.hassubmenu em.submenuindicator.disabled { + + background-position:0 -40px; + +} + +div.yuimenu li.hassubmenu em.submenuindicator { + + background-position:0 0; + margin:0 -16px 0 10px; + +} + +div.yuimenu li.hassubmenu em.submenuindicator.selected { + + background-position:0 -8px; + +} + +div.yuimenu li.hassubmenu em.submenuindicator.disabled { + + background-position:0 -16px; + +} + + +/* Styles for a menu item's "checked" state */ + +div.yuimenu li.checked { + + position:relative; + +} + +div.yuimenu li.checked em.checkedindicator { + + height:8px; + width:8px; + text-indent:9px; + overflow:hidden; + background-image:url(map.gif); + background-position:0 -48px; + background-repeat:no-repeat; + position:absolute; + left:6px; + _left:-16px; /* Underscore hack b/c this is for IE 6 only */ + top:.5em; + +} + +div.yuimenu li.checked em.checkedindicator.selected { + + background-position:0 -56px; + +} + +div.yuimenu li.checked em.checkedindicator.disabled { + + background-position:0 -64px; + +} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_dim_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuarodwn8_dim_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..60b38365a203237a6cfd8b95002bbd0b4322fe99 GIT binary patch literal 53 zcmZ?wbhEHb{|1&T!DE?$&WME)s&;hc6vK$NyOd@ma8`w7K Vws;w`SgzXn>&^zA2Z0O>)&O?c6EFY( literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_nrm_1.gif b/interface/ispconfig/interface/js/yui/menu/assets/menuchk8_nrm_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..9732837a7755b6bee23b95f32eb998c487daa53c GIT binary patch literal 67 zcmZ?wbhEHbThe Menu family of components features a collection of +* controls that make it easy to add menus to your website or web application. +* With the Menu Controls you can create website fly-out menus, customized +* context menus, or application-style menu bars with just a small amount of +* scripting.

    The Menu family of controls features:

    +*
      +*
    • Screen-reader accessibility.
    • +*
    • Keyboard and mouse navigation.
    • +*
    • A rich event model that provides access to all of a menu's +* interesting moments.
    • +*
    • Support for +* Progressive +* Enhancement; Menus can be created from simple, +* semantic markup on the page or purely through JavaScript.
    • +*
    +* @title Menu +* @namespace YAHOO.widget +* @requires Event, Dom, Container +*/ +(function() { + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + +/** +* Singleton that manages a collection of all menus and menu items. Listens for +* DOM events at the document level and dispatches the events to the +* corresponding menu or menu item. +* +* @namespace YAHOO.widget +* @class MenuManager +* @static +*/ +YAHOO.widget.MenuManager = function() { + + // Private member variables + + + // Flag indicating if the DOM event handlers have been attached + + var m_bInitializedEventHandlers = false, + + + // Collection of menus + + m_oMenus = {}, + + + // Collection of menu items + + m_oItems = {}, + + + // Collection of visible menus + + m_oVisibleMenus = {}, + + me = this; + + + var m_oLogger = new YAHOO.widget.LogWriter(this.toString()); + + + // Private methods + + + /** + * @method addItem + * @description Adds an item to the collection of known menu items. + * @private + * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem + * instance to be added. + */ + function addItem(p_oItem) { + + var sId = p_oItem.id; + + if(p_oItem && m_oItems[sId] != p_oItem) { + + m_oItems[sId] = p_oItem; + + p_oItem.destroyEvent.subscribe(onItemDestroy, p_oItem); + + m_oLogger.log("Item: " + + p_oItem.toString() + " successfully registered."); + + } + + } + + + /** + * @method removeItem + * @description Removes an item from the collection of known menu items. + * @private + * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem + * instance to be removed. + */ + function removeItem(p_oItem) { + + var sId = p_oItem.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + m_oLogger.log("Item: " + + p_oItem.toString() + " successfully unregistered."); + + } + + } + + + /** + * @method getMenuRootElement + * @description Finds the root DIV node of a menu or the root LI node of a + * menu item. + * @private + * @param {HTMLElement} p_oElement Object specifying + * an HTML element. + */ + function getMenuRootElement(p_oElement) { + + var oParentNode; + + if(p_oElement && p_oElement.tagName) { + + switch(p_oElement.tagName.toUpperCase()) { + + case "DIV": + + oParentNode = p_oElement.parentNode; + + // Check if the DIV is the inner "body" node of a menu + + if( + ( + Dom.hasClass(p_oElement, "hd") || + Dom.hasClass(p_oElement, "bd") || + Dom.hasClass(p_oElement, "ft") + ) + && + oParentNode && + oParentNode.tagName && + oParentNode.tagName.toUpperCase() == "DIV" + ) { + + return oParentNode; + + } + else { + + return p_oElement; + + } + + break; + + case "LI": + + return p_oElement; + + default: + + oParentNode = p_oElement.parentNode; + + if(oParentNode) { + + return getMenuRootElement(oParentNode); + + } + + break; + + } + + } + + } + + + + // Private event handlers + + + /** + * @method onDOMEvent + * @description Generic, global event handler for all of a menu's DOM-based + * events. This listens for events against the document object. If the + * target of a given event is a member of a menu or menu item's DOM, the + * instance's corresponding Custom Event is fired. + * @private + * @param {Event} p_oEvent Object representing the DOM event object passed + * back by the event utility (YAHOO.util.Event). + */ + function onDOMEvent(p_oEvent) { + + // Get the target node of the DOM event + + var oTarget = Event.getTarget(p_oEvent), + + + // See if the target of the event was a menu, or a menu item + + oElement = getMenuRootElement(oTarget), + oMenuItem, + oMenu; + + + if(oElement) { + + var sTagName = oElement.tagName.toUpperCase(); + + if(sTagName == "LI") { + + var sId = oElement.id; + + if(sId && m_oItems[sId]) { + + oMenuItem = m_oItems[sId]; + oMenu = oMenuItem.parent; + + } + + } + else if(sTagName == "DIV") { + + if(oElement.id) { + + oMenu = m_oMenus[oElement.id]; + + } + + } + + } + + if(oMenu) { + + // Map of DOM event names to CustomEvent names + + var oEventTypes = { + "click": "clickEvent", + "mousedown": "mouseDownEvent", + "mouseup": "mouseUpEvent", + "mouseover": "mouseOverEvent", + "mouseout": "mouseOutEvent", + "keydown": "keyDownEvent", + "keyup": "keyUpEvent", + "keypress": "keyPressEvent" + }, + + sCustomEventType = oEventTypes[p_oEvent.type]; + + + // Fire the Custom Even that corresponds the current DOM event + + if(oMenuItem && !oMenuItem.cfg.getProperty("disabled")) { + + oMenuItem[sCustomEventType].fire(p_oEvent); + + } + + oMenu[sCustomEventType].fire(p_oEvent, oMenuItem); + + } + else if(p_oEvent.type == "mousedown") { + + + /* + If the target of the event wasn't a menu, hide all + dynamically positioned menus + */ + + var oActiveItem; + + for(var i in m_oMenus) { + + if(m_oMenus.hasOwnProperty(i)) { + + oMenu = m_oMenus[i]; + + if( + oMenu.cfg.getProperty("clicktohide") && + oMenu.cfg.getProperty("position") == "dynamic" + ) { + + oMenu.hide(); + + } + else { + + oMenu.clearActiveItem(true); + + } + + } + + } + + } + + } + + + /** + * @method onMenuDestroy + * @description "destroy" event handler for a menu. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that + * fired the event. + */ + function onMenuDestroy(p_sType, p_aArgs, p_oMenu) { + + if(p_oMenu && m_oMenus[p_oMenu.id]) { + + delete m_oMenus[p_oMenu.id]; + + m_oLogger.log("Menu: " + + p_oMenu.toString() + " successfully unregistered."); + + } + + } + + + /** + * @method onItemDestroy + * @description "destroy" event handler for a MenuItem instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + function onItemDestroy(p_sType, p_aArgs, p_oItem) { + + var sId = p_oItem.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + } + + } + + + /** + * @method onMenuVisibleConfigChange + * @description Event handler for when the "visible" configuration property + * of a Menu instance changes. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that + * fired the event. + */ + function onMenuVisibleConfigChange(p_sType, p_aArgs, p_oMenu) { + + var bVisible = p_aArgs[0]; + + if(bVisible) { + + m_oVisibleMenus[p_oMenu.id] = p_oMenu; + + m_oLogger.log("Menu: " + + p_oMenu.toString() + + " registered with the collection of visible menus."); + + } + else if(m_oVisibleMenus[p_oMenu.id]) { + + delete m_oVisibleMenus[p_oMenu.id]; + + m_oLogger.log("Menu: " + + p_oMenu.toString() + + " unregistered from the collection of visible menus."); + + } + + } + + + /** + * @method onItemAdded + * @description "itemadded" event handler for a Menu instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + */ + function onItemAdded(p_sType, p_aArgs) { + + addItem(p_aArgs[0]); + + } + + + /** + * @method onItemRemoved + * @description "itemremoved" event handler for a Menu instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + */ + function onItemRemoved(p_sType, p_aArgs) { + + removeItem(p_aArgs[0]); + + } + + + + return { + + // Privileged methods + + + /** + * @method addMenu + * @description Adds a menu to the collection of known menus. + * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu + * instance to be added. + */ + addMenu: function(p_oMenu) { + + if(p_oMenu && p_oMenu.id && !m_oMenus[p_oMenu.id]) { + + m_oMenus[p_oMenu.id] = p_oMenu; + + + if(!m_bInitializedEventHandlers) { + + var oDoc = document; + + Event.addListener(oDoc, "mouseover", onDOMEvent, me, true); + Event.addListener(oDoc, "mouseout", onDOMEvent, me, true); + Event.addListener(oDoc, "mousedown", onDOMEvent, me, true); + Event.addListener(oDoc, "mouseup", onDOMEvent, me, true); + Event.addListener(oDoc, "click", onDOMEvent, me, true); + Event.addListener(oDoc, "keydown", onDOMEvent, me, true); + Event.addListener(oDoc, "keyup", onDOMEvent, me, true); + Event.addListener(oDoc, "keypress", onDOMEvent, me, true); + + m_bInitializedEventHandlers = true; + + m_oLogger.log("DOM event handlers initialized."); + + } + + p_oMenu.destroyEvent.subscribe(onMenuDestroy, p_oMenu, me); + + p_oMenu.cfg.subscribeToConfigEvent( + "visible", + onMenuVisibleConfigChange, + p_oMenu + ); + + p_oMenu.itemAddedEvent.subscribe(onItemAdded); + p_oMenu.itemRemovedEvent.subscribe(onItemRemoved); + + m_oLogger.log("Menu: " + + p_oMenu.toString() + " successfully registered."); + + } + + }, + + + /** + * @method removeMenu + * @description Removes a menu from the collection of known menus. + * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu + * instance to be removed. + */ + removeMenu: function(p_oMenu) { + + if(p_oMenu && m_oMenus[p_oMenu.id]) { + + delete m_oMenus[p_oMenu.id]; + + m_oLogger.log("Menu: " + + p_oMenu.toString() + " successfully unregistered."); + + } + + }, + + + /** + * @method hideVisible + * @description Hides all visible, dynamically positioned menus. + */ + hideVisible: function() { + + var oMenu; + + for(var i in m_oVisibleMenus) { + + if(m_oVisibleMenus.hasOwnProperty(i)) { + + oMenu = m_oVisibleMenus[i]; + + if(oMenu.cfg.getProperty("position") == "dynamic") { + + oMenu.hide(); + + } + + } + + } + + }, + + + /** + * @method getMenus + * @description Returns an array of all menus registered with the + * menu manger. + * @return {Array} + */ + getMenus: function() { + + return m_oMenus; + + }, + + + /** + * @method getMenu + * @description Returns a menu with the specified id. + * @param {String} p_sId String specifying the id of the menu to + * be retrieved. + * @return {YAHOO.widget.Menu} + */ + getMenu: function(p_sId) { + + if(m_oMenus[p_sId]) { + + return m_oMenus[p_sId]; + + } + + }, + + + /** + * @method toString + * @description Returns a string representing the menu manager. + * @return {String} + */ + toString: function() { + + return ("MenuManager"); + + } + + }; + +}(); + +})(); + + + +/** +* The Menu class creates a container that holds a vertical list representing +* a set of options or commands. Menu is the base class for all +* menu containers. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> element to be used as +* the data source for the menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu. See configuration class documentation for +* more details. +* @namespace YAHOO.widget +* @class Menu +* @constructor +* @extends YAHOO.widget.Overlay +*/ +(function() { + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang; + + +YAHOO.widget.Menu = function(p_oElement, p_oConfig) { + + if(p_oConfig) { + + this.parent = p_oConfig.parent; + this.lazyLoad = p_oConfig.lazyLoad || p_oConfig.lazyload; + this.itemData = p_oConfig.itemData || p_oConfig.itemdata; + + } + + + YAHOO.widget.Menu.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + + +YAHOO.lang.extend(YAHOO.widget.Menu, YAHOO.widget.Overlay, { + + +// Constants + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* menu's <div> element. +* @default "yuimenu" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenu", + + +/** +* @property ITEM_TYPE +* @description Object representing the type of menu item to instantiate and +* add when parsing the child nodes (either <li> element, +* <optgroup> element or <option>) +* of the menu's source HTML element. +* @default YAHOO.widget.MenuItem +* @final +* @type YAHOO.widget.MenuItem +*/ +ITEM_TYPE: null, + + +/** +* @property GROUP_TITLE_TAG_NAME +* @description String representing the tagname of the HTML element used to +* title the menu's item groups. +* @default H6 +* @final +* @type String +*/ +GROUP_TITLE_TAG_NAME: "h6", + + + +// Private properties + + +/** +* @property _nHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a menu. +* @default null +* @private +* @type Number +*/ +_nHideDelayId: null, + + +/** +* @property _nShowDelayId +* @description Number representing the time-out setting used to cancel the +* showing of a menu. +* @default null +* @private +* @type Number +*/ +_nShowDelayId: null, + + +/** +* @property _nSubmenuHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a submenu. +* @default null +* @private +* @type Number +*/ +_nSubmenuHideDelayId: null, + + +/** +* @property _nBodyScrollId +* @description Number representing the time-out setting used to cancel the +* scrolling of the menu's body element. +* @default null +* @private +* @type Number +*/ +_nBodyScrollId: null, + + +/** +* @property _bHideDelayEventHandlersAssigned +* @description Boolean indicating if the "mouseover" and "mouseout" event +* handlers used for hiding the menu via a call to "window.setTimeout" have +* already been assigned. +* @default false +* @private +* @type Boolean +*/ +_bHideDelayEventHandlersAssigned: false, + + +/** +* @property _bHandledMouseOverEvent +* @description Boolean indicating the current state of the menu's +* "mouseover" event. +* @default false +* @private +* @type Boolean +*/ +_bHandledMouseOverEvent: false, + + +/** +* @property _bHandledMouseOutEvent +* @description Boolean indicating the current state of the menu's +* "mouseout" event. +* @default false +* @private +* @type Boolean +*/ +_bHandledMouseOutEvent: false, + + +/** +* @property _aGroupTitleElements +* @description Array of HTML element used to title groups of menu items. +* @default [] +* @private +* @type Array +*/ +_aGroupTitleElements: null, + + +/** +* @property _aItemGroups +* @description Multi-dimensional Array representing the menu items as they +* are grouped in the menu. +* @default [] +* @private +* @type Array +*/ +_aItemGroups: null, + + +/** +* @property _aListElements +* @description Array of <ul> elements, each of which is +* the parent node for each item's <li> element. +* @default [] +* @private +* @type Array +*/ +_aListElements: null, + + +/** +* @property _nCurrentMouseX +* @description The current x coordinate of the mouse inside the area of +* the menu. +* @default 0 +* @private +* @type Number +*/ +_nCurrentMouseX: 0, + + +/** +* @property _nMaxHeight +* @description The original value of the "maxheight" configuration property +* as set by the user. +* @default -1 +* @private +* @type Number +*/ +_nMaxHeight: -1, + + +/** +* @property _bStopMouseEventHandlers +* @description Stops "mouseover," "mouseout," and "mousemove" event handlers +* from executing. +* @default false +* @private +* @type Boolean +*/ +_bStopMouseEventHandlers: false, + + +/** +* @property _sClassName +* @description The current value of the "classname" configuration attribute. +* @default null +* @private +* @type String +*/ +_sClassName: null, + + + +// Public properties + + +/** +* @property lazyLoad +* @description Boolean indicating if the menu's "lazy load" feature is +* enabled. If set to "true," initialization and rendering of the menu's +* items will be deferred until the first time it is made visible. This +* property should be set via the constructor using the configuration +* object literal. +* @default false +* @type Boolean +*/ +lazyLoad: false, + + +/** +* @property itemData +* @description Array of items to be added to the menu. The array can contain +* strings representing the text for each item to be created, object literals +* representing the menu item configuration properties, or MenuItem instances. +* This property should be set via the constructor using the configuration +* object literal. +* @default null +* @type Array +*/ +itemData: null, + + +/** +* @property activeItem +* @description Object reference to the item in the menu that has focus. +* @default null +* @type YAHOO.widget.MenuItem +*/ +activeItem: null, + + +/** +* @property parent +* @description Object reference to the menu's parent menu or menu item. +* This property can be set via the constructor using the configuration +* object literal. +* @default null +* @type YAHOO.widget.MenuItem +*/ +parent: null, + + +/** +* @property srcElement +* @description Object reference to the HTML element (either +* <select> or <div>) used to +* create the menu. +* @default null +* @type HTMLSelectElement|HTMLDivElement +*/ +srcElement: null, + + + +// Events + + +/** +* @event mouseOverEvent +* @description Fires when the mouse has entered the menu. Passes back +* the DOM Event object as an argument. +*/ +mouseOverEvent: null, + + +/** +* @event mouseOutEvent +* @description Fires when the mouse has left the menu. Passes back the DOM +* Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseOutEvent: null, + + +/** +* @event mouseDownEvent +* @description Fires when the user mouses down on the menu. Passes back the +* DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseDownEvent: null, + + +/** +* @event mouseUpEvent +* @description Fires when the user releases a mouse button while the mouse is +* over the menu. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseUpEvent: null, + + +/** +* @event clickEvent +* @description Fires when the user clicks the on the menu. Passes back the +* DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +clickEvent: null, + + +/** +* @event keyPressEvent +* @description Fires when the user presses an alphanumeric key when one of the +* menu's items has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyPressEvent: null, + + +/** +* @event keyDownEvent +* @description Fires when the user presses a key when one of the menu's items +* has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyDownEvent: null, + + +/** +* @event keyUpEvent +* @description Fires when the user releases a key when one of the menu's items +* has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyUpEvent: null, + + +/** +* @event itemAddedEvent +* @description Fires when an item is added to the menu. +* @type YAHOO.util.CustomEvent +*/ +itemAddedEvent: null, + + +/** +* @event itemRemovedEvent +* @description Fires when an item is removed to the menu. +* @type YAHOO.util.CustomEvent +*/ +itemRemovedEvent: null, + + +/** +* @method init +* @description The Menu class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references +* for pre-existing markup, and creates required markup if it is not +* already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> element to be used as +* the data source for the menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu. See configuration class documentation for +* more details. +*/ +init: function(p_oElement, p_oConfig) { + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.MenuItem; + + } + + + var oElement; + + if(typeof p_oElement == "string") { + + oElement = document.getElementById(p_oElement); + + } + else if(p_oElement.tagName) { + + oElement = p_oElement; + + } + + + if(oElement && oElement.tagName) { + + switch(oElement.tagName.toUpperCase()) { + + case "DIV": + + this.srcElement = oElement; + + if(!oElement.id) { + + oElement.setAttribute("id", Dom.generateId()); + + } + + + /* + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, oElement); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("Source element: " + this.srcElement.tagName); + + break; + + case "SELECT": + + this.srcElement = oElement; + + + /* + The source element is not something that we can use + outright, so we need to create a new Overlay + + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, Dom.generateId()); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("Source element: " + this.srcElement.tagName); + + break; + + } + + } + else { + + /* + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, p_oElement); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("No source element found. " + + "Created element with id: " + this.id); + + } + + + if(this.element) { + + var oEl = this.element; + + Dom.addClass(oEl, this.CSS_CLASS_NAME); + + + // Subscribe to Custom Events + + this.initEvent.subscribe(this._onInit, this, true); + this.beforeRenderEvent.subscribe(this._onBeforeRender, this, true); + this.renderEvent.subscribe(this._setWidth, this, true); + this.beforeShowEvent.subscribe(this._onBeforeShow, this, true); + this.showEvent.subscribe(this._onShow, this, true); + this.beforeHideEvent.subscribe(this._onBeforeHide, this, true); + this.hideEvent.subscribe(this._onHide, this, true); + this.mouseOverEvent.subscribe(this._onMouseOver, this, true); + this.mouseOutEvent.subscribe(this._onMouseOut, this, true); + this.clickEvent.subscribe(this._onClick, this, true); + this.keyDownEvent.subscribe(this._onKeyDown, this, true); + this.keyPressEvent.subscribe(this._onKeyPress, this, true); + + YAHOO.widget.Module.textResizeEvent.subscribe( + this._onTextResize, + this, + true + ); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + + // Register the Menu instance with the MenuManager + + YAHOO.widget.MenuManager.addMenu(this); + + + this.initEvent.fire(YAHOO.widget.Menu); + + } + +}, + + + +// Private methods + + +/** +* @method _initSubTree +* @description Iterates the childNodes of the source element to find nodes +* used to instantiate menu and menu items. +* @private +*/ +_initSubTree: function() { + + var oNode; + + if(this.srcElement.tagName.toUpperCase() == "DIV") { + + /* + Populate the collection of item groups and item + group titles + */ + + oNode = this.body.firstChild; + + var nGroup = 0, + sGroupTitleTagName = this.GROUP_TITLE_TAG_NAME.toUpperCase(); + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case sGroupTitleTagName: + + this._aGroupTitleElements[nGroup] = oNode; + + break; + + case "UL": + + this._aListElements[nGroup] = oNode; + this._aItemGroups[nGroup] = []; + nGroup++; + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + + /* + Apply the "first-of-type" class to the first UL to mimic + the "first-of-type" CSS3 psuedo class. + */ + + if(this._aListElements[0]) { + + Dom.addClass(this._aListElements[0], "first-of-type"); + + } + + } + + + oNode = null; + + this.logger.log("Searching DOM for items to initialize."); + + if(this.srcElement.tagName) { + + var sSrcElementTagName = this.srcElement.tagName.toUpperCase(); + + + switch(sSrcElementTagName) { + + case "DIV": + + if(this._aListElements.length > 0) { + + this.logger.log("Found " + + this._aListElements.length + + " item groups to initialize."); + + var i = this._aListElements.length - 1; + + do { + + oNode = this._aListElements[i].firstChild; + + this.logger.log("Scanning " + + this._aListElements[i].childNodes.length + + " child nodes for items to initialize."); + + do { + + if( + oNode && + oNode.tagName && + oNode.tagName.toUpperCase() == "LI" + ) { + + this.logger.log("Initializing " + + oNode.tagName + " node."); + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ), + i + ); + + } + + } + while((oNode = oNode.nextSibling)); + + } + while(i--); + + } + + break; + + case "SELECT": + + this.logger.log("Scanning " + + this.srcElement.childNodes.length + + " child nodes for items to initialize."); + + oNode = this.srcElement.firstChild; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "OPTGROUP": + case "OPTION": + + this.logger.log("Initializing " + + oNode.tagName + " node."); + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ) + ); + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + break; + + } + + } + +}, + + +/** +* @method _getFirstEnabledItem +* @description Returns the first enabled item in the menu. +* @return {YAHOO.widget.MenuItem} +* @private +*/ +_getFirstEnabledItem: function() { + + var aItems = this.getItems(), + nItems = aItems.length, + oItem; + + for(var i=0; i= aGroup.length); + + + if(aGroup[p_nItemIndex]) { + + aGroup.splice(p_nItemIndex, 0, oItem); + + } + else { + + aGroup[p_nItemIndex] = oItem; + + } + + + oGroupItem = aGroup[p_nItemIndex]; + + if(oGroupItem) { + + if( + bAppend && + ( + !oGroupItem.element.parentNode || + oGroupItem.element.parentNode.nodeType == 11 + ) + ) { + + this._aListElements[nGroupIndex].appendChild( + oGroupItem.element + ); + + } + else { + + function getNextItemSibling(p_aArray, p_nStartIndex) { + + return ( + p_aArray[p_nStartIndex] || + getNextItemSibling( + p_aArray, + (p_nStartIndex+1) + ) + ); + + } + + + var oNextItemSibling = + getNextItemSibling(aGroup, (p_nItemIndex+1)); + + if( + oNextItemSibling && + ( + !oGroupItem.element.parentNode || + oGroupItem.element.parentNode.nodeType == 11 + ) + ) { + + this._aListElements[nGroupIndex].insertBefore( + oGroupItem.element, + oNextItemSibling.element + ); + + } + + } + + + oGroupItem.parent = this; + + this._subscribeToItemEvents(oGroupItem); + + this._configureSubmenu(oGroupItem); + + this._updateItemProperties(nGroupIndex); + + this.logger.log("Item inserted." + + " Text: " + oGroupItem.cfg.getProperty("text") + ", " + + " Index: " + oGroupItem.index + ", " + + " Group Index: " + oGroupItem.groupIndex); + + this.itemAddedEvent.fire(oGroupItem); + + return oGroupItem; + + } + + } + else { + + var nItemIndex = aGroup.length; + + aGroup[nItemIndex] = oItem; + + oGroupItem = aGroup[nItemIndex]; + + + if(oGroupItem) { + + if( + !Dom.isAncestor( + this._aListElements[nGroupIndex], + oGroupItem.element + ) + ) { + + this._aListElements[nGroupIndex].appendChild( + oGroupItem.element + ); + + } + + oGroupItem.element.setAttribute("groupindex", nGroupIndex); + oGroupItem.element.setAttribute("index", nItemIndex); + + oGroupItem.parent = this; + + oGroupItem.index = nItemIndex; + oGroupItem.groupIndex = nGroupIndex; + + this._subscribeToItemEvents(oGroupItem); + + this._configureSubmenu(oGroupItem); + + if(nItemIndex === 0) { + + Dom.addClass(oGroupItem.element, "first-of-type"); + + } + + this.logger.log("Item added." + + " Text: " + oGroupItem.cfg.getProperty("text") + ", " + + " Index: " + oGroupItem.index + ", " + + " Group Index: " + oGroupItem.groupIndex); + + + this.itemAddedEvent.fire(oGroupItem); + + return oGroupItem; + + } + + } + + } + +}, + + +/** +* @method _removeItemFromGroupByIndex +* @description Removes a menu item from a group by index. Returns the menu +* item that was removed. +* @private +* @param {Number} p_nGroupIndex Number indicating the group to which the menu +* item belongs. +* @param {Number} p_nItemIndex Number indicating the index of the menu item +* to be removed. +* @return {YAHOO.widget.MenuItem} +*/ +_removeItemFromGroupByIndex: function(p_nGroupIndex, p_nItemIndex) { + + var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0, + aGroup = this._getItemGroup(nGroupIndex); + + if(aGroup) { + + var aArray = aGroup.splice(p_nItemIndex, 1), + oItem = aArray[0]; + + if(oItem) { + + // Update the index and className properties of each member + + this._updateItemProperties(nGroupIndex); + + if(aGroup.length === 0) { + + // Remove the UL + + var oUL = this._aListElements[nGroupIndex]; + + if(this.body && oUL) { + + this.body.removeChild(oUL); + + } + + // Remove the group from the array of items + + this._aItemGroups.splice(nGroupIndex, 1); + + + // Remove the UL from the array of ULs + + this._aListElements.splice(nGroupIndex, 1); + + + /* + Assign the "first-of-type" class to the new first UL + in the collection + */ + + oUL = this._aListElements[0]; + + if(oUL) { + + Dom.addClass(oUL, "first-of-type"); + + } + + } + + + this.itemRemovedEvent.fire(oItem); + + + // Return a reference to the item that was removed + + return oItem; + + } + + } + +}, + + +/** +* @method _removeItemFromGroupByValue +* @description Removes a menu item from a group by reference. Returns the +* menu item that was removed. +* @private +* @param {Number} p_nGroupIndex Number indicating the group to which the +* menu item belongs. +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance to be removed. +* @return {YAHOO.widget.MenuItem} +*/ +_removeItemFromGroupByValue: function(p_nGroupIndex, p_oItem) { + + var aGroup = this._getItemGroup(p_nGroupIndex); + + if(aGroup) { + + var nItems = aGroup.length, + nItemIndex = -1; + + if(nItems > 0) { + + var i = nItems-1; + + do { + + if(aGroup[i] == p_oItem) { + + nItemIndex = i; + break; + + } + + } + while(i--); + + if(nItemIndex > -1) { + + return this._removeItemFromGroupByIndex( + p_nGroupIndex, + nItemIndex + ); + + } + + } + + } + +}, + + +/** +* @method _updateItemProperties +* @description Updates the "index," "groupindex," and "className" properties +* of the menu items in the specified group. +* @private +* @param {Number} p_nGroupIndex Number indicating the group of items to update. +*/ +_updateItemProperties: function(p_nGroupIndex) { + + var aGroup = this._getItemGroup(p_nGroupIndex), + nItems = aGroup.length; + + if(nItems > 0) { + + var i = nItems - 1, + oItem, + oLI; + + // Update the index and className properties of each member + + do { + + oItem = aGroup[i]; + + if(oItem) { + + oLI = oItem.element; + + oItem.index = i; + oItem.groupIndex = p_nGroupIndex; + + oLI.setAttribute("groupindex", p_nGroupIndex); + oLI.setAttribute("index", i); + + Dom.removeClass(oLI, "first-of-type"); + + } + + } + while(i--); + + + if(oLI) { + + Dom.addClass(oLI, "first-of-type"); + + } + + } + +}, + + +/** +* @method _createItemGroup +* @description Creates a new menu item group (array) and its associated +* <ul> element. Returns an aray of menu item groups. +* @private +* @param {Number} p_nIndex Number indicating the group to create. +* @return {Array} +*/ +_createItemGroup: function(p_nIndex) { + + if(!this._aItemGroups[p_nIndex]) { + + this._aItemGroups[p_nIndex] = []; + + var oUL = document.createElement("ul"); + + this._aListElements[p_nIndex] = oUL; + + return this._aItemGroups[p_nIndex]; + + } + +}, + + +/** +* @method _getItemGroup +* @description Returns the menu item group at the specified index. +* @private +* @param {Number} p_nIndex Number indicating the index of the menu item group +* to be retrieved. +* @return {Array} +*/ +_getItemGroup: function(p_nIndex) { + + var nIndex = ((typeof p_nIndex == "number") ? p_nIndex : 0); + + return this._aItemGroups[nIndex]; + +}, + + +/** +* @method _configureSubmenu +* @description Subscribes the menu item's submenu to its parent menu's events. +* @private +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance with the submenu to be configured. +*/ +_configureSubmenu: function(p_oItem) { + + var oSubmenu = p_oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + /* + Listen for configuration changes to the parent menu + so they they can be applied to the submenu. + */ + + this.cfg.configChangedEvent.subscribe( + this._onParentMenuConfigChange, + oSubmenu, + true + ); + + this.renderEvent.subscribe( + this._onParentMenuRender, + oSubmenu, + true + ); + + oSubmenu.beforeShowEvent.subscribe( + this._onSubmenuBeforeShow, + oSubmenu, + true + ); + + oSubmenu.showEvent.subscribe( + this._onSubmenuShow, + oSubmenu, + true + ); + + oSubmenu.hideEvent.subscribe( + this._onSubmenuHide, + oSubmenu, + true + ); + + } + +}, + + +/** +* @method _subscribeToItemEvents +* @description Subscribes a menu to a menu item's event. +* @private +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance whose events should be subscribed to. +*/ +_subscribeToItemEvents: function(p_oItem) { + + p_oItem.focusEvent.subscribe(this._onMenuItemFocus, p_oItem, this); + + p_oItem.blurEvent.subscribe(this._onMenuItemBlur, this, true); + + p_oItem.cfg.configChangedEvent.subscribe( + this._onMenuItemConfigChange, + p_oItem, + this + ); + +}, + + +/** +* @method _getOffsetWidth +* @description Returns the offset width of the menu's +* <div> element. +* @private +*/ +_getOffsetWidth: function() { + + var oClone = this.element.cloneNode(true); + + Dom.setStyle(oClone, "width", ""); + + document.body.appendChild(oClone); + + var sWidth = oClone.offsetWidth; + + document.body.removeChild(oClone); + + return sWidth; + +}, + + +/** +* @method _setWidth +* @description Sets the width of the menu's root <div> +* element to its offsetWidth. +* @private +*/ +_setWidth: function() { + + if(this.cfg.getProperty("position") == "dynamic") { + + var sWidth; + + if(this.element.parentNode.tagName.toUpperCase() == "BODY") { + + if(this.browser == "opera") { + + sWidth = this._getOffsetWidth(); + + } + else { + + Dom.setStyle(this.element, "width", "auto"); + + sWidth = this.element.offsetWidth; + + } + + } + else { + + sWidth = this._getOffsetWidth(); + + } + + this.cfg.setProperty("width", (sWidth + "px")); + + } + +}, + + +/** +* @method _cancelHideDelay +* @description Cancels the call to "hideMenu." +* @private +*/ +_cancelHideDelay: function() { + + var oRoot = this.getRoot(); + + if(oRoot._nHideDelayId) { + + window.clearTimeout(oRoot._nHideDelayId); + + } + +}, + + +/** +* @method _execHideDelay +* @description Hides the menu after the number of milliseconds specified by +* the "hidedelay" configuration property. +* @private +*/ +_execHideDelay: function() { + + this._cancelHideDelay(); + + var oRoot = this.getRoot(), + me = this; + + function hideMenu() { + + if(oRoot.activeItem) { + + oRoot.clearActiveItem(); + + } + + if(oRoot == me && me.cfg.getProperty("position") == "dynamic") { + + me.hide(); + + } + + } + + + oRoot._nHideDelayId = + window.setTimeout(hideMenu, oRoot.cfg.getProperty("hidedelay")); + +}, + + +/** +* @method _cancelShowDelay +* @description Cancels the call to the "showMenu." +* @private +*/ +_cancelShowDelay: function() { + + var oRoot = this.getRoot(); + + if(oRoot._nShowDelayId) { + + window.clearTimeout(oRoot._nShowDelayId); + + } + +}, + + +/** +* @method _execShowDelay +* @description Shows the menu after the number of milliseconds specified by +* the "showdelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oMenu Object specifying the menu that should +* be made visible. +*/ +_execShowDelay: function(p_oMenu) { + + var oRoot = this.getRoot(); + + function showMenu() { + + if(p_oMenu.parent.cfg.getProperty("selected")) { + + p_oMenu.show(); + + } + + } + + + oRoot._nShowDelayId = + window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay")); + +}, + + +/** +* @method _execSubmenuHideDelay +* @description Hides a submenu after the number of milliseconds specified by +* the "submenuhidedelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oSubmenu Object specifying the submenu that +* should be hidden. +* @param {Number} p_nMouseX The x coordinate of the mouse when it left +* the specified submenu's parent menu item. +* @param {Number} p_nHideDelay The number of milliseconds that should ellapse +* before the submenu is hidden. +*/ +_execSubmenuHideDelay: function(p_oSubmenu, p_nMouseX, p_nHideDelay) { + + var me = this; + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + if(me._nCurrentMouseX > (p_nMouseX + 10)) { + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + p_oSubmenu.hide(); + + }, p_nHideDelay); + + } + else { + + p_oSubmenu.hide(); + + } + + }, 50); + +}, + + + +// Protected methods + + +/** +* @method _disableScrollHeader +* @description Disables the header used for scrolling the body of the menu. +* @protected +*/ +_disableScrollHeader: function() { + + if(!this._bHeaderDisabled) { + + Dom.addClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = true; + + } + +}, + + +/** +* @method _disableScrollFooter +* @description Disables the footer used for scrolling the body of the menu. +* @protected +*/ +_disableScrollFooter: function() { + + if(!this._bFooterDisabled) { + + Dom.addClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = true; + + } + +}, + + +/** +* @method _enableScrollHeader +* @description Enables the header used for scrolling the body of the menu. +* @protected +*/ +_enableScrollHeader: function() { + + if(this._bHeaderDisabled) { + + Dom.removeClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = false; + + } + +}, + + +/** +* @method _enableScrollFooter +* @description Enables the footer used for scrolling the body of the menu. +* @protected +*/ +_enableScrollFooter: function() { + + if(this._bFooterDisabled) { + + Dom.removeClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = false; + + } + +}, + + + +/** +* @method _onMouseOver +* @description "mouseover" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseOver: function(p_sType, p_aArgs, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + + if( + !this._bHandledMouseOverEvent && + (oTarget == this.element || Dom.isAncestor(this.element, oTarget)) + ) { + + // Menu mouseover logic + + this._nCurrentMouseX = 0; + + Event.addListener( + this.element, + "mousemove", + this._onMouseMove, + this, + true + ); + + + this.clearActiveItem(); + + + if(this.parent && this._nSubmenuHideDelayId) { + + window.clearTimeout(this._nSubmenuHideDelayId); + + this.parent.cfg.setProperty("selected", true); + + var oParentMenu = this.parent.parent; + + oParentMenu.activeItem = this.parent; + + oParentMenu._bHandledMouseOutEvent = true; + oParentMenu._bHandledMouseOverEvent = false; + + } + + + this._bHandledMouseOverEvent = true; + this._bHandledMouseOutEvent = false; + + } + + + if( + oItem && !oItem.handledMouseOverEvent && + !oItem.cfg.getProperty("disabled") && + (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget)) + ) { + + // Menu Item mouseover logic + + var nShowDelay = this.cfg.getProperty("showdelay"), + bShowDelay = (nShowDelay > 0); + + + if(bShowDelay) { + + this._cancelShowDelay(); + + } + + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + oActiveItem.cfg.setProperty("selected", false); + + } + + + var oItemCfg = oItem.cfg; + + // Select and focus the current menu item + + oItemCfg.setProperty("selected", true); + oItem.focus(); + + + if(this.cfg.getProperty("autosubmenudisplay")) { + + // Show the submenu this menu item + + var oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(bShowDelay) { + + this._execShowDelay(oSubmenu); + + } + else { + + oSubmenu.show(); + + } + + } + + } + + oItem.handledMouseOverEvent = true; + oItem.handledMouseOutEvent = false; + + } + +}, + + +/** +* @method _onMouseOut +* @description "mouseout" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseOut: function(p_sType, p_aArgs, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oRelatedTarget = Event.getRelatedTarget(oEvent), + bMovingToSubmenu = false; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oSubmenu = oItemCfg.getProperty("submenu"); + + + if( + oSubmenu && + ( + oRelatedTarget == oSubmenu.element || + Dom.isAncestor(oSubmenu.element, oRelatedTarget) + ) + ) { + + bMovingToSubmenu = true; + + } + + + if( + !oItem.handledMouseOutEvent && + ( + ( + oRelatedTarget != oItem.element && + !Dom.isAncestor(oItem.element, oRelatedTarget) + ) || bMovingToSubmenu + ) + ) { + + // Menu Item mouseout logic + + if(!bMovingToSubmenu) { + + oItem.cfg.setProperty("selected", false); + + + if(oSubmenu) { + + var nSubmenuHideDelay = + this.cfg.getProperty("submenuhidedelay"), + + nShowDelay = this.cfg.getProperty("showdelay"); + + if( + !(this instanceof YAHOO.widget.MenuBar) && + nSubmenuHideDelay > 0 && + nShowDelay >= nSubmenuHideDelay + ) { + + this._execSubmenuHideDelay( + oSubmenu, + Event.getPageX(oEvent), + nSubmenuHideDelay + ); + + } + else { + + oSubmenu.hide(); + + } + + } + + } + + + oItem.handledMouseOutEvent = true; + oItem.handledMouseOverEvent = false; + + } + + } + + + if( + !this._bHandledMouseOutEvent && + ( + ( + oRelatedTarget != this.element && + !Dom.isAncestor(this.element, oRelatedTarget) + ) + || bMovingToSubmenu + ) + ) { + + // Menu mouseout logic + + Event.removeListener(this.element, "mousemove", this._onMouseMove); + + this._nCurrentMouseX = Event.getPageX(oEvent); + + this._bHandledMouseOutEvent = true; + this._bHandledMouseOverEvent = false; + + } + +}, + + +/** +* @method _onMouseMove +* @description "click" event handler for the menu. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseMove: function(p_oEvent, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + this._nCurrentMouseX = Event.getPageX(p_oEvent); + +}, + + +/** +* @method _onClick +* @description "click" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onClick: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oSubmenu = oItemCfg.getProperty("submenu"); + + + /* + ACCESSIBILITY FEATURE FOR SCREEN READERS: + Expand/collapse the submenu when the user clicks + on the submenu indicator image. + */ + + if(oTarget == oItem.submenuIndicator && oSubmenu) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + + oSubmenu.parent.focus(); + + } + else { + + this.clearActiveItem(); + + this.activeItem = oItem; + + oItem.cfg.setProperty("selected", true); + + oSubmenu.show(); + + } + + } + else { + + var sURL = oItemCfg.getProperty("url"), + bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#"), + sTarget = oItemCfg.getProperty("target"), + bHasTarget = (sTarget && sTarget.length > 0); + + /* + Prevent the browser from following links + equal to "#" + */ + + if( + oTarget.tagName.toUpperCase() == "A" && + bCurrentPageURL && !bHasTarget + ) { + + Event.preventDefault(oEvent); + + } + + if( + oTarget.tagName.toUpperCase() != "A" && + !bCurrentPageURL && !bHasTarget + ) { + + /* + Follow the URL of the item regardless of + whether or not the user clicked specifically + on the anchor element. + */ + + document.location = sURL; + + } + + + /* + If the item doesn't navigate to a URL and it doesn't have + a submenu, then collapse the menu tree. + */ + + if(bCurrentPageURL && !oSubmenu) { + + var oRoot = this.getRoot(); + + if(oRoot.cfg.getProperty("position") == "static") { + + oRoot.clearActiveItem(); + + } + else if(oRoot.cfg.getProperty("clicktohide")) { + + oRoot.hide(); + + } + + } + + } + + } + +}, + + +/** +* @method _onKeyDown +* @description "keydown" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onKeyDown: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + me = this, + oSubmenu; + + + /* + This function is called to prevent a bug in Firefox. In Firefox, + moving a DOM element into a stationary mouse pointer will cause the + browser to fire mouse events. This can result in the menu mouse + event handlers being called uncessarily, especially when menus are + moved into a stationary mouse pointer as a result of a + key event handler. + */ + function stopMouseEventHandlers() { + + me._bStopMouseEventHandlers = true; + + window.setTimeout(function() { + + me._bStopMouseEventHandlers = false; + + }, 10); + + } + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oParentItem = this.parent, + oRoot, + oNextItem; + + + switch(oEvent.keyCode) { + + case 38: // Up arrow + case 40: // Down arrow + + if( + oItem == this.activeItem && + !oItemCfg.getProperty("selected") + ) { + + oItemCfg.setProperty("selected", true); + + } + else { + + oNextItem = (oEvent.keyCode == 38) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + oNextItem.focus(); + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + oBody.scrollTop = + + ( + oNextItem.element.offsetTop + + oNextItem.element.offsetHeight + ) - oBody.offsetHeight; + + + var nScrollTop = oBody.scrollTop, + nScrollTarget = + oBody.scrollHeight - oBody.offsetHeight; + + if(nScrollTop === 0) { + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + else if(nScrollTop == nScrollTarget) { + + this._enableScrollHeader(); + this._disableScrollFooter(); + + } + else { + + this._enableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + } + + } + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + + case 39: // Right arrow + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(!oItemCfg.getProperty("selected")) { + + oItemCfg.setProperty("selected", true); + + } + + oSubmenu.show(); + + oSubmenu.setInitialSelection(); + + } + else { + + oRoot = this.getRoot(); + + if(oRoot instanceof YAHOO.widget.MenuBar) { + + oNextItem = oRoot.activeItem.getNextEnabledSibling(); + + if(oNextItem) { + + oRoot.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + + } + + oNextItem.focus(); + + } + + } + + } + + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + + case 37: // Left arrow + + if(oParentItem) { + + var oParentMenu = oParentItem.parent; + + if(oParentMenu instanceof YAHOO.widget.MenuBar) { + + oNextItem = + oParentMenu.activeItem.getPreviousEnabledSibling(); + + if(oNextItem) { + + oParentMenu.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + + } + + oNextItem.focus(); + + } + + } + else { + + this.hide(); + + oParentItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + } + + + } + + + if(oEvent.keyCode == 27) { // Esc key + + if(this.cfg.getProperty("position") == "dynamic") { + + this.hide(); + + if(this.parent) { + + this.parent.focus(); + + } + + } + else if(this.activeItem) { + + oSubmenu = this.activeItem.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + this.activeItem.focus(); + + } + else { + + this.activeItem.cfg.setProperty("selected", false); + this.activeItem.blur(); + + } + + } + + + Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onKeyPress +* @description "keypress" event handler for a Menu instance. +* @protected +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance that fired the event. +*/ +_onKeyPress: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0]; + + + if(oEvent.keyCode == 40 || oEvent.keyCode == 38) { + + YAHOO.util.Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onTextResize +* @description "textresize" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onTextResize: function(p_sType, p_aArgs, p_oMenu) { + + if(this.browser == "gecko" && !this._handleResize) { + + this._handleResize = true; + return; + + } + + + var oConfig = this.cfg; + + if(oConfig.getProperty("position") == "dynamic") { + + oConfig.setProperty("width", (this._getOffsetWidth() + "px")); + + } + +}, + + +/** +* @method _onScrollTargetMouseOver +* @description "mouseover" event handler for the menu's "header" and "footer" +* elements. Used to scroll the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOver: function(p_oEvent, p_oMenu) { + + this._cancelHideDelay(); + + var oTarget = Event.getTarget(p_oEvent), + oBody = this.body, + me = this, + nScrollTarget, + fnScrollFunction; + + + function scrollBodyDown() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop < nScrollTarget) { + + oBody.scrollTop = (nScrollTop + 1); + + me._enableScrollHeader(); + + } + else { + + oBody.scrollTop = nScrollTarget; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollFooter(); + + } + + } + + + function scrollBodyUp() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop > 0) { + + oBody.scrollTop = (nScrollTop - 1); + + me._enableScrollFooter(); + + } + else { + + oBody.scrollTop = 0; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollHeader(); + + } + + } + + + if(Dom.hasClass(oTarget, "hd")) { + + fnScrollFunction = scrollBodyUp; + + } + else { + + nScrollTarget = oBody.scrollHeight - oBody.offsetHeight; + + fnScrollFunction = scrollBodyDown; + + } + + + this._nBodyScrollId = window.setInterval(fnScrollFunction, 10); + +}, + + +/** +* @method _onScrollTargetMouseOut +* @description "mouseout" event handler for the menu's "header" and "footer" +* elements. Used to stop scrolling the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOut: function(p_oEvent, p_oMenu) { + + window.clearInterval(this._nBodyScrollId); + + this._cancelHideDelay(); + +}, + + + +// Private methods + + +/** +* @method _onInit +* @description "init" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onInit: function(p_sType, p_aArgs, p_oMenu) { + + if( + ( + (this.parent && !this.lazyLoad) || + (!this.parent && this.cfg.getProperty("position") == "static") || + ( + !this.parent && + !this.lazyLoad && + this.cfg.getProperty("position") == "dynamic" + ) + ) && + this.getItemGroups().length === 0 + ) { + + if(this.srcElement) { + + this._initSubTree(); + + } + + + if(this.itemData) { + + this.addItems(this.itemData); + + } + + } + else if(this.lazyLoad) { + + this.cfg.fireQueue(); + + } + +}, + + +/** +* @method _onBeforeRender +* @description "beforerender" event handler for the menu. Appends all of the +* <ul>, <li> and their accompanying +* title elements to the body element of the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onBeforeRender: function(p_sType, p_aArgs, p_oMenu) { + + var oConfig = this.cfg, + oEl = this.element, + nListElements = this._aListElements.length; + + + if(nListElements > 0) { + + var i = 0, + bFirstList = true, + oUL, + oGroupTitle; + + + do { + + oUL = this._aListElements[i]; + + if(oUL) { + + if(bFirstList) { + + Dom.addClass(oUL, "first-of-type"); + bFirstList = false; + + } + + + if(!Dom.isAncestor(oEl, oUL)) { + + this.appendToBody(oUL); + + } + + + oGroupTitle = this._aGroupTitleElements[i]; + + if(oGroupTitle) { + + if(!Dom.isAncestor(oEl, oGroupTitle)) { + + oUL.parentNode.insertBefore(oGroupTitle, oUL); + + } + + + Dom.addClass(oUL, "hastitle"); + + } + + } + + i++; + + } + while(i < nListElements); + + } + +}, + + +/** +* @method _onBeforeShow +* @description "beforeshow" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onBeforeShow: function(p_sType, p_aArgs, p_oMenu) { + + if(this.lazyLoad && this.getItemGroups().length === 0) { + + if(this.srcElement) { + + this._initSubTree(); + + } + + + if(this.itemData) { + + if( + this.parent && this.parent.parent && + this.parent.parent.srcElement && + this.parent.parent.srcElement.tagName.toUpperCase() == "SELECT" + ) { + + var nOptions = this.itemData.length; + + for(var n=0; n= nViewportHeight) { + + var nMaxHeight = this.cfg.getProperty("maxheight"); + + /* + Cache the original value for the "maxheight" configuration + property so that we can set it back when the menu is hidden. + */ + + this._nMaxHeight = nMaxHeight; + + this.cfg.setProperty("maxheight", (nViewportHeight - 20)); + + } + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + if(oBody.scrollTop > 0) { + + oBody.scrollTop = 0; + + } + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + +}, + + +/** +* @method _onShow +* @description "show" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onShow: function(p_sType, p_aArgs, p_oMenu) { + + this.setInitialFocus(); + + var oParent = this.parent; + + if(oParent) { + + var oParentMenu = oParent.parent, + aParentAlignment = oParentMenu.cfg.getProperty("submenualignment"), + aAlignment = this.cfg.getProperty("submenualignment"); + + + if( + (aParentAlignment[0] != aAlignment[0]) && + (aParentAlignment[1] != aAlignment[1]) + ) { + + this.cfg.setProperty( + "submenualignment", + [ aParentAlignment[0], aParentAlignment[1] ] + ); + + } + + + if( + !oParentMenu.cfg.getProperty("autosubmenudisplay") && + oParentMenu.cfg.getProperty("position") == "static" + ) { + + oParentMenu.cfg.setProperty("autosubmenudisplay", true); + + + function disableAutoSubmenuDisplay(p_oEvent) { + + if( + p_oEvent.type == "mousedown" || + (p_oEvent.type == "keydown" && p_oEvent.keyCode == 27) + ) { + + /* + Set the "autosubmenudisplay" to "false" if the user + clicks outside the menu bar. + */ + + var oTarget = Event.getTarget(p_oEvent); + + if( + oTarget != oParentMenu.element || + !YAHOO.util.Dom.isAncestor(oParentMenu.element, oTarget) + ) { + + oParentMenu.cfg.setProperty( + "autosubmenudisplay", + false + ); + + Event.removeListener( + document, + "mousedown", + disableAutoSubmenuDisplay + ); + + Event.removeListener( + document, + "keydown", + disableAutoSubmenuDisplay + ); + + } + + } + + } + + Event.addListener(document, "mousedown", disableAutoSubmenuDisplay); + Event.addListener(document, "keydown", disableAutoSubmenuDisplay); + + } + + } + else if(!oParent && this.lazyLoad) { + + this.cfg.refireEvent("xy"); + + } + +}, + + +/** +* @method _onBeforeHide +* @description "beforehide" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onBeforeHide: function(p_sType, p_aArgs, p_oMenu) { + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + oActiveItem.blur(); + + } + +}, + + +/** +* @method _onHide +* @description "hide" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onHide: function(p_sType, p_aArgs, p_oMenu) { + + if(this._nMaxHeight != -1) { + + this.cfg.setProperty("maxheight", this._nMaxHeight); + + this._nMaxHeight = -1; + + } + +}, + + +/** +* @method _onParentMenuConfigChange +* @description "configchange" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onParentMenuConfigChange: function(p_sType, p_aArgs, p_oSubmenu) { + + var sPropertyName = p_aArgs[0][0], + oPropertyValue = p_aArgs[0][1]; + + switch(sPropertyName) { + + case "iframe": + case "constraintoviewport": + case "hidedelay": + case "showdelay": + case "submenuhidedelay": + case "clicktohide": + case "effect": + case "classname": + + p_oSubmenu.cfg.setProperty(sPropertyName, oPropertyValue); + + break; + + } + +}, + + +/** +* @method _onParentMenuRender +* @description "render" event handler for a submenu. Renders a +* submenu in response to the firing of its parent's "render" event. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onParentMenuRender: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParentMenu = p_oSubmenu.parent.parent, + + oConfig = { + + constraintoviewport: + oParentMenu.cfg.getProperty("constraintoviewport"), + + xy: [0,0], + + clicktohide: oParentMenu.cfg.getProperty("clicktohide"), + + effect: oParentMenu.cfg.getProperty("effect"), + + showdelay: oParentMenu.cfg.getProperty("showdelay"), + + hidedelay: oParentMenu.cfg.getProperty("hidedelay"), + + submenuhidedelay: oParentMenu.cfg.getProperty("submenuhidedelay"), + + classname: oParentMenu.cfg.getProperty("classname") + + }; + + + /* + Only sync the "iframe" configuration property if the parent + menu's "position" configuration is the same. + */ + + if( + this.cfg.getProperty("position") == + oParentMenu.cfg.getProperty("position") + ) { + + oConfig.iframe = oParentMenu.cfg.getProperty("iframe"); + + } + + + p_oSubmenu.cfg.applyConfig(oConfig); + + + if(!this.lazyLoad) { + + var oLI = this.parent.element; + + if(this.element.parentNode == oLI) { + + this.render(); + + } + else { + + this.render(oLI); + + } + + } + +}, + + +/** +* @method _onSubmenuBeforeShow +* @description "beforeshow" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuBeforeShow: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent, + aAlignment = oParent.parent.cfg.getProperty("submenualignment"); + + this.cfg.setProperty( + "context", + [oParent.element, aAlignment[0], aAlignment[1]] + ); + + + var nScrollTop = oParent.parent.body.scrollTop; + + if( + (this.browser == "gecko" || this.browser == "safari") + && nScrollTop > 0 + ) { + + this.cfg.setProperty("y", (this.cfg.getProperty("y") - nScrollTop)); + + } + +}, + + +/** +* @method _onSubmenuShow +* @description "show" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuShow: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + + oParent.submenuIndicator.firstChild.nodeValue = + oParent.EXPANDED_SUBMENU_INDICATOR_TEXT; + +}, + + +/** +* @method _onSubmenuHide +* @description "hide" Custom Event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuHide: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + + oParent.submenuIndicator.firstChild.nodeValue = + oParent.COLLAPSED_SUBMENU_INDICATOR_TEXT; + +}, + + +/** +* @method _onMenuItemFocus +* @description "focus" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item +* that fired the event. +*/ +_onMenuItemFocus: function(p_sType, p_aArgs, p_oItem) { + + this.activeItem = p_oItem; + +}, + + +/** +* @method _onMenuItemBlur +* @description "blur" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event +* that was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +*/ +_onMenuItemBlur: function(p_sType, p_aArgs) { + + this.activeItem = null; + +}, + + +/** +* @method _onMenuItemConfigChange +* @description "configchange" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item +* that fired the event. +*/ +_onMenuItemConfigChange: function(p_sType, p_aArgs, p_oItem) { + + var sProperty = p_aArgs[0][0]; + + switch(sProperty) { + + case "submenu": + + var oSubmenu = p_aArgs[0][1]; + + if(oSubmenu) { + + this._configureSubmenu(p_oItem); + + } + + break; + + case "text": + case "helptext": + + /* + A change to an item's "text" or "helptext" + configuration properties requires the width of the parent + menu to be recalculated. + */ + + if(this.element.style.width) { + + var sWidth = this._getOffsetWidth() + "px"; + + Dom.setStyle(this.element, "width", sWidth); + + } + + break; + + } + +}, + + + +// Public event handlers for configuration properties + + +/** +* @method enforceConstraints +* @description The default event handler executed when the moveEvent is fired, +* if the "constraintoviewport" configuration property is set to true. +* @param {String} type The name of the event that was fired. +* @param {Array} args Collection of arguments sent when the +* event was fired. +* @param {Array} obj Array containing the current Menu instance +* and the item that fired the event. +*/ +enforceConstraints: function(type, args, obj) { + + var oConfig = this.cfg, + pos = args[0], + + x = pos[0], + y = pos[1], + + offsetHeight = this.element.offsetHeight, + offsetWidth = this.element.offsetWidth, + + viewPortWidth = YAHOO.util.Dom.getViewportWidth(), + viewPortHeight = YAHOO.util.Dom.getViewportHeight(), + + scrollX = Math.max( + document.documentElement.scrollLeft, + document.body.scrollLeft + ), + + scrollY = Math.max( + document.documentElement.scrollTop, + document.body.scrollTop + ), + + nPadding = ( + this.parent && + this.parent.parent instanceof YAHOO.widget.MenuBar + ) ? 0 : 10, + + topConstraint = scrollY + nPadding, + leftConstraint = scrollX + nPadding, + bottomConstraint = scrollY + viewPortHeight - offsetHeight - nPadding, + rightConstraint = scrollX + viewPortWidth - offsetWidth - nPadding, + + aContext = oConfig.getProperty("context"), + oContextElement = aContext ? aContext[0] : null; + + + if (x < 10) { + + x = leftConstraint; + + } else if ((x + offsetWidth) > viewPortWidth) { + + if( + oContextElement && + ((x - oContextElement.offsetWidth) > offsetWidth) + ) { + + x = (x - (oContextElement.offsetWidth + offsetWidth)); + + } + else { + + x = rightConstraint; + + } + + } + + if (y < 10) { + + y = topConstraint; + + } else if (y > bottomConstraint) { + + if(oContextElement && (y > offsetHeight)) { + + y = ((y + oContextElement.offsetHeight) - offsetHeight); + + } + else { + + y = bottomConstraint; + + } + + } + + oConfig.setProperty("x", x, true); + oConfig.setProperty("y", y, true); + oConfig.setProperty("xy", [x,y], true); + +}, + + +/** +* @method configVisible +* @description Event handler for when the "visible" configuration property +* the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configVisible: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + YAHOO.widget.Menu.superclass.configVisible.call( + this, + p_sType, + p_aArgs, + p_oMenu + ); + + } + else { + + var bVisible = p_aArgs[0], + sDisplay = Dom.getStyle(this.element, "display"); + + if(bVisible) { + + if(sDisplay != "block") { + this.beforeShowEvent.fire(); + Dom.setStyle(this.element, "display", "block"); + this.showEvent.fire(); + } + + } + else { + + if(sDisplay == "block") { + this.beforeHideEvent.fire(); + Dom.setStyle(this.element, "display", "none"); + this.hideEvent.fire(); + } + + } + + } + +}, + + +/** +* @method configPosition +* @description Event handler for when the "position" configuration property +* of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configPosition: function(p_sType, p_aArgs, p_oMenu) { + + var sCSSPosition = p_aArgs[0] == "static" ? "static" : "absolute", + oCfg = this.cfg; + + Dom.setStyle(this.element, "position", sCSSPosition); + + + if(sCSSPosition == "static") { + + /* + Remove the iframe for statically positioned menus since it will + intercept mouse events. + */ + + oCfg.setProperty("iframe", false); + + + // Statically positioned menus are visible by default + + Dom.setStyle(this.element, "display", "block"); + + oCfg.setProperty("visible", true); + + } + else { + + /* + Even though the "visible" property is queued to + "false" by default, we need to set the "visibility" property to + "hidden" since Overlay's "configVisible" implementation checks the + element's "visibility" style property before deciding whether + or not to show an Overlay instance. + */ + + Dom.setStyle(this.element, "visibility", "hidden"); + + } + + + if(sCSSPosition == "absolute") { + + var nZIndex = oCfg.getProperty("zindex"); + + if(!nZIndex || nZIndex === 0) { + + nZIndex = this.parent ? + (this.parent.parent.cfg.getProperty("zindex") + 1) : 1; + + oCfg.setProperty("zindex", nZIndex); + + } + + } + +}, + + +/** +* @method configIframe +* @description Event handler for when the "iframe" configuration property of +* the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configIframe: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + YAHOO.widget.Menu.superclass.configIframe.call( + this, + p_sType, + p_aArgs, + p_oMenu + ); + + } + +}, + + +/** +* @method configHideDelay +* @description Event handler for when the "hidedelay" configuration property +* of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configHideDelay: function(p_sType, p_aArgs, p_oMenu) { + + var nHideDelay = p_aArgs[0], + oMouseOutEvent = this.mouseOutEvent, + oMouseOverEvent = this.mouseOverEvent, + oKeyDownEvent = this.keyDownEvent; + + if(nHideDelay > 0) { + + /* + Only assign event handlers once. This way the user change + the value for the hidedelay as many times as they want. + */ + + if(!this._bHideDelayEventHandlersAssigned) { + + oMouseOutEvent.subscribe(this._execHideDelay, true); + oMouseOverEvent.subscribe(this._cancelHideDelay, this, true); + oKeyDownEvent.subscribe(this._cancelHideDelay, this, true); + + this._bHideDelayEventHandlersAssigned = true; + + } + + } + else { + + oMouseOutEvent.unsubscribe(this._execHideDelay, this); + oMouseOverEvent.unsubscribe(this._cancelHideDelay, this); + oKeyDownEvent.unsubscribe(this._cancelHideDelay, this); + + this._bHideDelayEventHandlersAssigned = false; + + } + +}, + + +/** +* @method configContainer +* @description Event handler for when the "container" configuration property +of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configContainer: function(p_sType, p_aArgs, p_oMenu) { + + var oElement = p_aArgs[0]; + + if(typeof oElement == 'string') { + + this.cfg.setProperty( + "container", + document.getElementById(oElement), + true + ); + + } + +}, + + +/** +* @method configMaxHeight +* @description Event handler for when the "maxheight" configuration property of +* a Menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired +* the event. +*/ +configMaxHeight: function(p_sType, p_aArgs, p_oMenu) { + + var nMaxHeight = p_aArgs[0], + oBody = this.body, + oHeader = this.header, + oFooter = this.footer, + fnMouseOver = this._onScrollTargetMouseOver, + fnMouseOut = this._onScrollTargetMouseOut; + + + if((nMaxHeight > 0) && (oBody.offsetHeight > nMaxHeight)) { + + if(!this.cfg.getProperty("width")) { + + this._setWidth(); + + } + + if(!oHeader && !oFooter) { + + this.setHeader(" "); + this.setFooter(" "); + + oHeader = this.header; + oFooter = this.footer; + + Dom.addClass(oHeader, "topscrollbar"); + Dom.addClass(oFooter, "bottomscrollbar"); + + this.element.insertBefore(oHeader, oBody); + this.element.appendChild(oFooter); + + Event.addListener(oHeader, "mouseover", fnMouseOver, this, true); + Event.addListener(oHeader, "mouseout", fnMouseOut, this, true); + Event.addListener(oFooter, "mouseover", fnMouseOver, this, true); + Event.addListener(oFooter, "mouseout", fnMouseOut, this, true); + + } + + var nHeight = + + ( + nMaxHeight - + (this.footer.offsetHeight + this.header.offsetHeight) + ); + + Dom.setStyle(oBody, "height", (nHeight + "px")); + Dom.setStyle(oBody, "overflow", "hidden"); + + } + else if(oHeader && oFooter) { + + Dom.setStyle(oBody, "height", "auto"); + Dom.setStyle(oBody, "overflow", "visible"); + + Event.removeListener(oHeader, "mouseover", fnMouseOver); + Event.removeListener(oHeader, "mouseout", fnMouseOut); + Event.removeListener(oFooter, "mouseover", fnMouseOver); + Event.removeListener(oFooter, "mouseout", fnMouseOut); + + this.element.removeChild(oHeader); + this.element.removeChild(oFooter); + + this.header = null; + this.footer = null; + + } + +}, + + +/** +* @method configClassName +* @description Event handler for when the "classname" configuration property of +* a menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired the event. +*/ +configClassName: function(p_sType, p_aArgs, p_oMenu) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + +}, + + +// Public methods + + +/** +* @method initEvents +* @description Initializes the custom events for the menu. +*/ +initEvents: function() { + + YAHOO.widget.Menu.superclass.initEvents.call(this); + + // Create custom events + + var CustomEvent = YAHOO.util.CustomEvent; + + this.mouseOverEvent = new CustomEvent("mouseOverEvent", this); + this.mouseOutEvent = new CustomEvent("mouseOutEvent", this); + this.mouseDownEvent = new CustomEvent("mouseDownEvent", this); + this.mouseUpEvent = new CustomEvent("mouseUpEvent", this); + this.clickEvent = new CustomEvent("clickEvent", this); + this.keyPressEvent = new CustomEvent("keyPressEvent", this); + this.keyDownEvent = new CustomEvent("keyDownEvent", this); + this.keyUpEvent = new CustomEvent("keyUpEvent", this); + this.itemAddedEvent = new CustomEvent("itemAddedEvent", this); + this.itemRemovedEvent = new CustomEvent("itemRemovedEvent", this); + +}, + + +/** +* @method getRoot +* @description Finds the menu's root menu. +*/ +getRoot: function() { + + var oItem = this.parent; + + if(oItem) { + + var oParentMenu = oItem.parent; + + return oParentMenu ? oParentMenu.getRoot() : this; + + } + else { + + return this; + + } + +}, + + +/** +* @method toString +* @description Returns a string representing the menu. +* @return {String} +*/ +toString: function() { + + return ("Menu " + this.id); + +}, + + +/** +* @method setItemGroupTitle +* @description Sets the title of a group of menu items. +* @param {String} p_sGroupTitle String specifying the title of the group. +* @param {Number} p_nGroupIndex Optional. Number specifying the group to which +* the title belongs. +*/ +setItemGroupTitle: function(p_sGroupTitle, p_nGroupIndex) { + + if(typeof p_sGroupTitle == "string" && p_sGroupTitle.length > 0) { + + var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0, + oTitle = this._aGroupTitleElements[nGroupIndex]; + + + if(oTitle) { + + oTitle.innerHTML = p_sGroupTitle; + + } + else { + + oTitle = document.createElement(this.GROUP_TITLE_TAG_NAME); + + oTitle.innerHTML = p_sGroupTitle; + + this._aGroupTitleElements[nGroupIndex] = oTitle; + + } + + + var i = this._aGroupTitleElements.length - 1, + nFirstIndex; + + do { + + if(this._aGroupTitleElements[i]) { + + Dom.removeClass(this._aGroupTitleElements[i], "first-of-type"); + + nFirstIndex = i; + + } + + } + while(i--); + + + if(nFirstIndex !== null) { + + Dom.addClass( + this._aGroupTitleElements[nFirstIndex], + "first-of-type" + ); + + } + + } + +}, + + + +/** +* @method addItem +* @description Appends an item to the menu. +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance to be added to the menu. +* @param {String} p_oItem String specifying the text of the item to be added +* to the menu. +* @param {Object} p_oItem Object literal containing a set of menu item +* configuration properties. +* @param {Number} p_nGroupIndex Optional. Number indicating the group to +* which the item belongs. +* @return {YAHOO.widget.MenuItem} +*/ +addItem: function(p_oItem, p_nGroupIndex) { + + if(p_oItem) { + + return this._addItemToGroup(p_nGroupIndex, p_oItem); + + } + +}, + + +/** +* @method addItems +* @description Adds an array of items to the menu. +* @param {Array} p_aItems Array of items to be added to the menu. The array +* can contain strings specifying the text for each item to be created, object +* literals specifying each of the menu item configuration properties, +* or MenuItem instances. +* @param {Number} p_nGroupIndex Optional. Number specifying the group to +* which the items belongs. +* @return {Array} +*/ +addItems: function(p_aItems, p_nGroupIndex) { + + if(Lang.isArray(p_aItems)) { + + var nItems = p_aItems.length, + aItems = [], + oItem; + + + for(var i=0; i 0) { + + var i = nItems - 1, + oItem, + oSubmenu; + + do { + + oItem = aItems[i]; + + if(oItem) { + + oSubmenu = oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + this.cfg.configChangedEvent.unsubscribe( + this._onParentMenuConfigChange, + oSubmenu + ); + + this.renderEvent.unsubscribe( + this._onParentMenuRender, + oSubmenu + ); + + } + + oItem.destroy(); + + } + + } + while(i--); + + } + + + if(oHeader) { + + Event.purgeElement(oHeader); + oElement.removeChild(oHeader); + + } + + + if(oFooter) { + + Event.purgeElement(oFooter); + oElement.removeChild(oFooter); + } + + + if(oBody) { + + Event.purgeElement(oBody); + + oBody.innerHTML = ""; + + } + + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + +}, + + +/** +* @method destroy +* @description Removes the menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove all DOM event listeners + + Event.purgeElement(this.element); + + + // Remove Custom Event listeners + + this.mouseOverEvent.unsubscribeAll(); + this.mouseOutEvent.unsubscribeAll(); + this.mouseDownEvent.unsubscribeAll(); + this.mouseUpEvent.unsubscribeAll(); + this.clickEvent.unsubscribeAll(); + this.keyPressEvent.unsubscribeAll(); + this.keyDownEvent.unsubscribeAll(); + this.keyUpEvent.unsubscribeAll(); + this.itemAddedEvent.unsubscribeAll(); + this.itemRemovedEvent.unsubscribeAll(); + + YAHOO.widget.Module.textResizeEvent.unsubscribe(this._onTextResize, this); + + + // Remove all items + + this.clearContent(); + + + this._aItemGroups = null; + this._aListElements = null; + this._aGroupTitleElements = null; + + + // Continue with the superclass implementation of this method + + YAHOO.widget.Menu.superclass.destroy.call(this); + + this.logger.log("Destroyed."); + +}, + + +/** +* @method setInitialFocus +* @description Sets focus to the menu's first enabled item. +*/ +setInitialFocus: function() { + + var oItem = this._getFirstEnabledItem(); + + if(oItem) { + + oItem.focus(); + } + +}, + + +/** +* @method setInitialSelection +* @description Sets the "selected" configuration property of the menu's first +* enabled item to "true." +*/ +setInitialSelection: function() { + + var oItem = this._getFirstEnabledItem(); + + if(oItem) { + + oItem.cfg.setProperty("selected", true); + } + +}, + + +/** +* @method clearActiveItem +* @description Sets the "selected" configuration property of the menu's active +* item to "false" and hides the item's submenu. +* @param {Boolean} p_bBlur Boolean indicating if the menu's active item +* should be blurred. +*/ +clearActiveItem: function(p_bBlur) { + + if(this.cfg.getProperty("showdelay") > 0) { + + this._cancelShowDelay(); + + } + + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + if(p_bBlur) { + + oActiveItem.blur(); + + } + + } + +}, + + +/** +* @description Initializes the class's configurable properties which can be +* changed using the menu's Config object ("cfg"). +* @method initDefaultConfig +*/ +initDefaultConfig: function() { + + YAHOO.widget.Menu.superclass.initDefaultConfig.call(this); + + var oConfig = this.cfg; + + // Add configuration attributes + + /* + Change the default value for the "visible" configuration + property to "false" by re-adding the property. + */ + + /** + * @config visible + * @description Boolean indicating whether or not the menu is visible. If + * the menu's "position" configuration property is set to "dynamic" (the + * default), this property toggles the menu's <div> + * element's "visibility" style property between "visible" (true) or + * "hidden" (false). If the menu's "position" configuration property is + * set to "static" this property toggles the menu's + * <div> element's "display" style property + * between "block" (true) or "none" (false). + * @default false + * @type Boolean + */ + oConfig.addProperty( + "visible", + { + value:false, + handler:this.configVisible, + validator:this.cfg.checkBoolean + } + ); + + + /* + Change the default value for the "constraintoviewport" configuration + property to "true" by re-adding the property. + */ + + /** + * @config constraintoviewport + * @description Boolean indicating if the menu will try to remain inside + * the boundaries of the size of viewport. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "constraintoviewport", + { + value:true, + handler:this.configConstrainToViewport, + validator:this.cfg.checkBoolean, + supercedes:["iframe","x","y","xy"] + } + ); + + + /** + * @config position + * @description String indicating how a menu should be positioned on the + * screen. Possible values are "static" and "dynamic." Static menus are + * visible by default and reside in the normal flow of the document + * (CSS position: static). Dynamic menus are hidden by default, reside + * out of the normal flow of the document (CSS position: absolute), and + * can overlay other elements on the screen. + * @default dynamic + * @type String + */ + oConfig.addProperty( + "position", + { + value: "dynamic", + handler: this.configPosition, + validator: this._checkPosition, + supercedes: ["visible"] + } + ); + + + /** + * @config submenualignment + * @description Array defining how submenus should be aligned to their + * parent menu item. The format is: [itemCorner, submenuCorner]. By default + * a submenu's top left corner is aligned to its parent menu item's top + * right corner. + * @default ["tl","tr"] + * @type Array + */ + oConfig.addProperty("submenualignment", { value: ["tl","tr"] } ); + + + /** + * @config autosubmenudisplay + * @description Boolean indicating if submenus are automatically made + * visible when the user mouses over the menu's items. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "autosubmenudisplay", + { + value: true, + validator: oConfig.checkBoolean + } + ); + + + /** + * @config showdelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is made visible when the user mouses over + * the menu's items. + * @default 250 + * @type Number + */ + oConfig.addProperty( + "showdelay", + { + value: 250, + validator: oConfig.checkNumber + } + ); + + + /** + * @config hidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before the menu is hidden. + * @default 0 + * @type Number + */ + oConfig.addProperty( + "hidedelay", + { + value: 0, + validator: oConfig.checkNumber, + handler: this.configHideDelay, + suppressEvent: true + } + ); + + + /** + * @config submenuhidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is hidden when the user mouses out of a menu item + * heading in the direction of a submenu. The value must be greater than or + * equal to the value specified for the "showdelay" configuration property. + * @default 250 + * @type Number + */ + oConfig.addProperty( + "submenuhidedelay", + { + value: 250, + validator: oConfig.checkNumber + } + ); + + + /** + * @config clicktohide + * @description Boolean indicating if the menu will automatically be + * hidden if the user clicks outside of it. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "clicktohide", + { + value: true, + validator: oConfig.checkBoolean + } + ); + + + /** + * @config container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the menu's markup should be + * rendered into. + * @type HTMLElement|String + * @default document.body + */ + oConfig.addProperty( + "container", + { + value:document.body, + handler:this.configContainer + } + ); + + + /** + * @config maxheight + * @description Defines the maximum height (in pixels) for a menu before the + * contents of the body are scrolled. + * @default 0 + * @type Number + */ + oConfig.addProperty( + "maxheight", + { + value: 0, + validator: oConfig.checkNumber, + handler: this.configMaxHeight + } + ); + + + /** + * @config classname + * @description CSS class to be applied to the menu's root + * <div> element. The specified class(es) are + * appended in addition to the default class as specified by the menu's + * CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + "classname", + { + value: null, + handler: this.configClassName, + validator: this._checkString + } + ); + +} + +}); // END YAHOO.lang.extend + +})(); + + + +(function() { + +var Dom = YAHOO.util.Dom, + Module = YAHOO.widget.Module, + Menu = YAHOO.widget.Menu, + + m_oMenuItemElement = null, + m_oSubmenuIndicator = null, + m_oCheckedIndicator = null; + + +/** +* Creates an item for a menu. +* +* @param {String} p_oObject String specifying the text of the menu item. +* @param {HTMLLIElement} p_oObject Object specifying +* the <li> element of the menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu item. +* @param {HTMLOptionElement} p_oObject Object +* specifying the <option> element of the menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu item. See configuration class documentation +* for more details. +* @class MenuItem +* @constructor +*/ +YAHOO.widget.MenuItem = function(p_oObject, p_oConfig) { + + if(p_oObject) { + + if(p_oConfig) { + + this.parent = p_oConfig.parent; + this.value = p_oConfig.value; + this.id = p_oConfig.id; + + } + + this.init(p_oObject, p_oConfig); + + } + +}; + + +YAHOO.widget.MenuItem.prototype = { + + // Constants + + + /** + * @property SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * menu item's submenu arrow indicator. + * @default "nt/ic/ut/alt1/menuarorght8_nrm_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarorght8_nrm_1.gif", + + + /** + * @property SELECTED_SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * submenu arrow indicator when the menu item is selected. + * @default "nt/ic/ut/alt1/menuarorght8_hov_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + SELECTED_SUBMENU_INDICATOR_IMAGE_PATH: + "nt/ic/ut/alt1/menuarorght8_hov_1.gif", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * submenu arrow indicator when the menu item is disabled. + * @default "nt/ic/ut/alt1/menuarorght8_dim_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + DISABLED_SUBMENU_INDICATOR_IMAGE_PATH: + "nt/ic/ut/alt1/menuarorght8_dim_1.gif", + + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator. + * @default "Collapsed. Click to expand." + * @final + * @type String + * @deprecated Use COLLAPSED_SUBMENU_INDICATOR_TEXT. + */ + COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT: "Collapsed. Click to expand.", + + + /** + * @property EXPANDED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator when the submenu is visible. + * @default "Expanded. Click to collapse." + * @final + * @type String + * @deprecated Use EXPANDED_SUBMENU_INDICATOR_TEXT. + */ + EXPANDED_SUBMENU_INDICATOR_ALT_TEXT: "Expanded. Click to collapse.", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator when the menu item is disabled. + * @default "Disabled." + * @final + * @type String + * @deprecated Use DISABLED_SUBMENU_INDICATOR_TEXT. + */ + DISABLED_SUBMENU_INDICATOR_ALT_TEXT: "Disabled.", + + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the <em> + * element used for the submenu arrow indicator. + * @default "Submenu collapsed. Click to expand submenu." + * @final + * @type String + */ + COLLAPSED_SUBMENU_INDICATOR_TEXT: + "Submenu collapsed. Click to expand submenu.", + + + /** + * @property EXPANDED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the submenu is visible. + * @default "Submenu expanded. Click to collapse submenu." + * @final + * @type String + */ + EXPANDED_SUBMENU_INDICATOR_TEXT: + "Submenu expanded. Click to collapse submenu.", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the menu item is disabled. + * @default "Submenu collapsed. (Item disabled.)." + * @final + * @type String + */ + DISABLED_SUBMENU_INDICATOR_TEXT: "Submenu collapsed. (Item disabled.)", + + + /** + * @property CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the checked state. + * @default "nt/ic/ut/bsc/menuchk8_nrm_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. See "checkedindicator" class name in menu.css. + */ + CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_nrm_1.gif", + + + /** + * @property SELECTED_CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the selected checked state. + * @default "nt/ic/ut/bsc/menuchk8_hov_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. See "checkedindicator" class name in menu.css. + */ + SELECTED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_hov_1.gif", + + + /** + * @property DISABLED_CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the disabled checked state. + * @default "nt/ic/ut/bsc/menuchk8_dim_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. + */ + DISABLED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_dim_1.gif", + + + /** + * @property CHECKED_IMAGE_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the checked image. + * @default "Checked." + * @final + * @type String + * @deprecated Use CHECKED_TEXT. + */ + CHECKED_IMAGE_ALT_TEXT: "Checked.", + + + /** + * @property DISABLED_CHECKED_IMAGE_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the checked image when the item is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + * @deprecated Use DISABLED_CHECKED_TEXT. + */ + DISABLED_CHECKED_IMAGE_ALT_TEXT: "Checked. (Item disabled.)", + + + /** + * @property CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>). + * @default "Checked." + * @final + * @type String + */ + CHECKED_TEXT: "Menu item checked.", + + + /** + * @property DISABLED_CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>) when the menu item + * is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + */ + DISABLED_CHECKED_TEXT: "Checked. (Item disabled.)", + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied to the + * <li> element of the menu item. + * @default "yuimenuitem" + * @final + * @type String + */ + CSS_CLASS_NAME: "yuimenuitem", + + + /** + * @property SUBMENU_TYPE + * @description Object representing the type of menu to instantiate and + * add when parsing the child nodes of the menu item's source HTML element. + * @final + * @type YAHOO.widget.Menu + */ + SUBMENU_TYPE: null, + + + /** + * @property IMG_ROOT + * @description String representing the prefix path to use for + * non-secure images. + * @default "http://us.i1.yimg.com/us.yimg.com/i/" + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + IMG_ROOT: "http://us.i1.yimg.com/us.yimg.com/i/", + + + /** + * @property IMG_ROOT_SSL + * @description String representing the prefix path to use for securely + * served images. + * @default "https://a248.e.akamai.net/sec.yimg.com/i/" + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + IMG_ROOT_SSL: "https://a248.e.akamai.net/sec.yimg.com/i/", + + + + // Private member variables + + + /** + * @property _oAnchor + * @description Object reference to the menu item's + * <a> element. + * @default null + * @private + * @type HTMLAnchorElement + */ + _oAnchor: null, + + + /** + * @property _oText + * @description Object reference to the menu item's text node. + * @default null + * @private + * @type TextNode + */ + _oText: null, + + + /** + * @property _oHelpTextEM + * @description Object reference to the menu item's help text + * <em> element. + * @default null + * @private + * @type HTMLElement + */ + _oHelpTextEM: null, + + + /** + * @property _oSubmenu + * @description Object reference to the menu item's submenu. + * @default null + * @private + * @type YAHOO.widget.Menu + */ + _oSubmenu: null, + + + /** + * @property _checkImage + * @description Object reference to the menu item's checkmark image. + * @default null + * @private + * @type HTMLImageElement + * @deprecated Use _oCheckedIndicator. + */ + _checkImage: null, + + + /** + * @property _oCheckedIndicator + * @description Object reference to the menu item's checkmark image. + * @default HTMLElement + * @private + * @type HTMLElement + */ + _oCheckedIndicator: null, + + + /** + * @property _oOnclickAttributeValue + * @description Object reference to the menu item's current value for the + * "onclick" configuration attribute. + * @default null + * @private + * @type Object + */ + _oOnclickAttributeValue: null, + + + /** + * @property _sClassName + * @description The current value of the "classname" configuration attribute. + * @default null + * @private + * @type String + */ + _sClassName: null, + + + + // Public properties + + + /** + * @property constructor + * @description Object reference to the menu item's constructor function. + * @default YAHOO.widget.MenuItem + * @type YAHOO.widget.MenuItem + */ + constructor: YAHOO.widget.MenuItem, + + + /** + * @property imageRoot + * @description String representing the root path for all of the menu + * item's images. + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + imageRoot: null, + + + /** + * @property isSecure + * @description Boolean representing whether or not the current browsing + * context is secure (HTTPS). + * @type Boolean + * @deprecated All menu item images are now applied via CSS + * background images. + */ + isSecure: Module.prototype.isSecure, + + + /** + * @property index + * @description Number indicating the ordinal position of the menu item in + * its group. + * @default null + * @type Number + */ + index: null, + + + /** + * @property groupIndex + * @description Number indicating the index of the group to which the menu + * item belongs. + * @default null + * @type Number + */ + groupIndex: null, + + + /** + * @property parent + * @description Object reference to the menu item's parent menu. + * @default null + * @type YAHOO.widget.Menu + */ + parent: null, + + + /** + * @property element + * @description Object reference to the menu item's + * <li> element. + * @default HTMLLIElement + * @type HTMLLIElement + */ + element: null, + + + /** + * @property srcElement + * @description Object reference to the HTML element (either + * <li>, <optgroup> or + * <option>) used create the menu item. + * @default HTMLLIElement|HTMLOptGroupElement|HTMLOptionElement + * @type HTMLLIElement| + * HTMLOptGroupElement|HTMLOptionElement + */ + srcElement: null, + + + /** + * @property value + * @description Object reference to the menu item's value. + * @default null + * @type Object + */ + value: null, + + + /** + * @property submenuIndicator + * @description Object reference to the <em> element + * used to create the submenu indicator for the menu item. + * @default HTMLElement + * @type HTMLElement + */ + submenuIndicator: null, + + + /** + * @property browser + * @description String representing the browser. + * @type String + */ + browser: Module.prototype.browser, + + + /** + * @property id + * @description Id of the menu item's root <li> + * element. This property should be set via the constructor using the + * configuration object literal. If an id is not specified, then one will + * be created using the "generateId" method of the Dom utility. + * @default null + * @type String + */ + id: null, + + + + // Events + + + /** + * @event destroyEvent + * @description Fires when the menu item's <li> + * element is removed from its parent <ul> element. + * @type YAHOO.util.CustomEvent + */ + destroyEvent: null, + + + /** + * @event mouseOverEvent + * @description Fires when the mouse has entered the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseOverEvent: null, + + + /** + * @event mouseOutEvent + * @description Fires when the mouse has left the menu item. Passes back + * the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseOutEvent: null, + + + /** + * @event mouseDownEvent + * @description Fires when the user mouses down on the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseDownEvent: null, + + + /** + * @event mouseUpEvent + * @description Fires when the user releases a mouse button while the mouse + * is over the menu item. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseUpEvent: null, + + + /** + * @event clickEvent + * @description Fires when the user clicks the on the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + clickEvent: null, + + + /** + * @event keyPressEvent + * @description Fires when the user presses an alphanumeric key when the + * menu item has focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyPressEvent: null, + + + /** + * @event keyDownEvent + * @description Fires when the user presses a key when the menu item has + * focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyDownEvent: null, + + + /** + * @event keyUpEvent + * @description Fires when the user releases a key when the menu item has + * focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyUpEvent: null, + + + /** + * @event focusEvent + * @description Fires when the menu item receives focus. + * @type YAHOO.util.CustomEvent + */ + focusEvent: null, + + + /** + * @event blurEvent + * @description Fires when the menu item loses the input focus. + * @type YAHOO.util.CustomEvent + */ + blurEvent: null, + + + /** + * @method init + * @description The MenuItem class's initialization method. This method is + * automatically called by the constructor, and sets up all DOM references + * for pre-existing markup, and creates required markup if it is not + * already present. + * @param {String} p_oObject String specifying the text of the menu item. + * @param {HTMLLIElement} p_oObject Object specifying + * the <li> element of the menu item. + * @param {HTMLOptGroupElement} p_oObject Object + * specifying the <optgroup> element of the menu item. + * @param {HTMLOptionElement} p_oObject Object + * specifying the <option> element of the menu item. + * @param {Object} p_oConfig Optional. Object literal specifying the + * configuration for the menu item. See configuration class documentation + * for more details. + */ + init: function(p_oObject, p_oConfig) { + + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = Menu; + + } + + + // Create the config object + + this.cfg = new YAHOO.util.Config(this); + + this.initDefaultConfig(); + + var oConfig = this.cfg; + + + if(this._checkString(p_oObject)) { + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject); + + } + else if(this._checkDOMNode(p_oObject)) { + + switch(p_oObject.tagName.toUpperCase()) { + + case "OPTION": + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject.text); + + this.srcElement = p_oObject; + + break; + + case "OPTGROUP": + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject.label); + + this.srcElement = p_oObject; + + this._initSubTree(); + + break; + + case "LI": + + // Get the anchor node (if it exists) + + var oAnchor = this._getFirstElement(p_oObject, "A"), + sURL = "#", + sTarget, + sText; + + + // Capture the "text" and/or the "URL" + + if(oAnchor) { + + sURL = oAnchor.getAttribute("href"); + sTarget = oAnchor.getAttribute("target"); + + if(oAnchor.innerText) { + + sText = oAnchor.innerText; + + } + else { + + var oRange = oAnchor.ownerDocument.createRange(); + + oRange.selectNodeContents(oAnchor); + + sText = oRange.toString(); + + } + + } + else { + + var oText = p_oObject.firstChild; + + sText = oText.nodeValue; + + oAnchor = document.createElement("a"); + + oAnchor.setAttribute("href", sURL); + + p_oObject.replaceChild(oAnchor, oText); + + oAnchor.appendChild(oText); + + } + + + this.srcElement = p_oObject; + this.element = p_oObject; + this._oAnchor = oAnchor; + + + // Check if emphasis has been applied to the MenuItem + + var oEmphasisNode = this._getFirstElement(oAnchor), + bEmphasis = false, + bStrongEmphasis = false; + + if(oEmphasisNode) { + + // Set a reference to the text node + + this._oText = oEmphasisNode.firstChild; + + switch(oEmphasisNode.tagName.toUpperCase()) { + + case "EM": + + bEmphasis = true; + + break; + + case "STRONG": + + bStrongEmphasis = true; + + break; + + } + + } + else { + + // Set a reference to the text node + + this._oText = oAnchor.firstChild; + + } + + + /* + Set these properties silently to sync up the + configuration object without making changes to the + element's DOM + */ + + oConfig.setProperty("text", sText, true); + oConfig.setProperty("url", sURL, true); + oConfig.setProperty("target", sTarget, true); + oConfig.setProperty("emphasis", bEmphasis, true); + oConfig.setProperty( + "strongemphasis", + bStrongEmphasis, + true + ); + + this._initSubTree(); + + break; + + } + + } + + + if(this.element) { + + var sId = this.element.id; + + if(!sId) { + + sId = this.id || Dom.generateId(); + + this.element.id = sId; + + } + + this.id = sId; + + + Dom.addClass(this.element, this.CSS_CLASS_NAME); + + + // Create custom events + + var CustomEvent = YAHOO.util.CustomEvent; + + this.destroyEvent = new CustomEvent("destroyEvent", this); + this.mouseOverEvent = new CustomEvent("mouseOverEvent", this); + this.mouseOutEvent = new CustomEvent("mouseOutEvent", this); + this.mouseDownEvent = new CustomEvent("mouseDownEvent", this); + this.mouseUpEvent = new CustomEvent("mouseUpEvent", this); + this.clickEvent = new CustomEvent("clickEvent", this); + this.keyPressEvent = new CustomEvent("keyPressEvent", this); + this.keyDownEvent = new CustomEvent("keyDownEvent", this); + this.keyUpEvent = new CustomEvent("keyUpEvent", this); + this.focusEvent = new CustomEvent("focusEvent", this); + this.blurEvent = new CustomEvent("blurEvent", this); + + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig); + + } + + oConfig.fireQueue(); + + + + + } + + }, + + + + // Private methods + + + /** + * @method _getFirstElement + * @description Returns an HTML element's first HTML element node. + * @private + * @param {HTMLElement} p_oElement Object + * reference specifying the element to be evaluated. + * @param {String} p_sTagName Optional. String specifying the tagname of + * the element to be retrieved. + * @return {HTMLElement} + */ + _getFirstElement: function(p_oElement, p_sTagName) { + + var oFirstChild = p_oElement.firstChild, + oElement; + + if(oFirstChild) { + + if(oFirstChild.nodeType == 1) { + + oElement = oFirstChild; + + } + else { + + var oNextSibling = oFirstChild.nextSibling; + + if(oNextSibling && oNextSibling.nodeType == 1) { + + oElement = oNextSibling; + + } + + } + + } + + + if(p_sTagName) { + + return (oElement && oElement.tagName.toUpperCase() == p_sTagName) ? + oElement : false; + + } + + return oElement; + + }, + + + /** + * @method _checkString + * @description Determines if an object is a string. + * @private + * @param {Object} p_oObject Object to be evaluated. + * @return {Boolean} + */ + _checkString: function(p_oObject) { + + return (typeof p_oObject == "string"); + + }, + + + /** + * @method _checkDOMNode + * @description Determines if an object is an HTML element. + * @private + * @param {Object} p_oObject Object to be evaluated. + * @return {Boolean} + */ + _checkDOMNode: function(p_oObject) { + + return (p_oObject && p_oObject.tagName); + + }, + + + /** + * @method _createRootNodeStructure + * @description Creates the core DOM structure for the menu item. + * @private + */ + _createRootNodeStructure: function () { + + if(!m_oMenuItemElement) { + + m_oMenuItemElement = document.createElement("li"); + m_oMenuItemElement.innerHTML = "s"; + + } + + this.element = m_oMenuItemElement.cloneNode(true); + this._oAnchor = this.element.firstChild; + this._oText = this._oAnchor.firstChild; + + this.element.appendChild(this._oAnchor); + + }, + + + /** + * @method _initSubTree + * @description Iterates the source element's childNodes collection and uses + * the child nodes to instantiate other menus. + * @private + */ + _initSubTree: function() { + + var oSrcEl = this.srcElement, + oConfig = this.cfg; + + + if(oSrcEl.childNodes.length > 0) { + + if( + this.parent.lazyLoad && + this.parent.srcElement && + this.parent.srcElement.tagName.toUpperCase() == "SELECT" + ) { + + oConfig.setProperty( + "submenu", + { id: Dom.generateId(), itemdata: oSrcEl.childNodes } + ); + + } + else { + + var oNode = oSrcEl.firstChild, + aOptions = []; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "DIV": + + oConfig.setProperty("submenu", oNode); + + break; + + case "OPTION": + + aOptions[aOptions.length] = oNode; + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + + var nOptions = aOptions.length; + + if(nOptions > 0) { + + var oMenu = new this.SUBMENU_TYPE(Dom.generateId()); + + oConfig.setProperty("submenu", oMenu); + + for(var n=0; n 0) { + + oAnchor.setAttribute("target", sTarget); + + } + else { + + oAnchor.removeAttribute("target"); + + } + + }, + + + /** + * @method configEmphasis + * @description Event handler for when the "emphasis" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configEmphasis: function(p_sType, p_aArgs, p_oItem) { + + var bEmphasis = p_aArgs[0], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + oEM; + + + if(bEmphasis && oConfig.getProperty("strongemphasis")) { + + oConfig.setProperty("strongemphasis", false); + + } + + + if(oAnchor) { + + if(bEmphasis) { + + oEM = document.createElement("em"); + oEM.appendChild(oText); + + oAnchor.appendChild(oEM); + + } + else { + + oEM = this._getFirstElement(oAnchor, "EM"); + + if(oEM) { + + oAnchor.removeChild(oEM); + oAnchor.appendChild(oText); + + } + + } + + } + + }, + + + /** + * @method configStrongEmphasis + * @description Event handler for when the "strongemphasis" configuration + * property of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configStrongEmphasis: function(p_sType, p_aArgs, p_oItem) { + + var bStrongEmphasis = p_aArgs[0], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + oStrong; + + if(bStrongEmphasis && oConfig.getProperty("emphasis")) { + + oConfig.setProperty("emphasis", false); + + } + + if(oAnchor) { + + if(bStrongEmphasis) { + + oStrong = document.createElement("strong"); + oStrong.appendChild(oText); + + oAnchor.appendChild(oStrong); + + } + else { + + oStrong = this._getFirstElement(oAnchor, "STRONG"); + + if(oStrong) { + + oAnchor.removeChild(oStrong); + oAnchor.appendChild(oText); + + } + + } + + } + + }, + + + /** + * @method configChecked + * @description Event handler for when the "checked" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configChecked: function(p_sType, p_aArgs, p_oItem) { + + var bChecked = p_aArgs[0], + oEl = this.element, + oConfig = this.cfg, + oEM; + + + if(bChecked) { + + if(!m_oCheckedIndicator) { + + m_oCheckedIndicator = document.createElement("em"); + m_oCheckedIndicator.innerHTML = this.CHECKED_TEXT; + m_oCheckedIndicator.className = "checkedindicator"; + + } + + oEM = m_oCheckedIndicator.cloneNode(true); + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.element) { + + oEl.insertBefore(oEM, oSubmenu.element); + + } + else { + + oEl.appendChild(oEM); + + } + + + Dom.addClass(oEl, "checked"); + + this._oCheckedIndicator = oEM; + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + else { + + oEM = this._oCheckedIndicator; + + Dom.removeClass(oEl, "checked"); + + if(oEM) { + + oEl.removeChild(oEM); + + } + + this._oCheckedIndicator = null; + + } + + }, + + + + /** + * @method configDisabled + * @description Event handler for when the "disabled" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configDisabled: function(p_sType, p_aArgs, p_oItem) { + + var bDisabled = p_aArgs[0], + oConfig = this.cfg, + oAnchor = this._oAnchor, + aNodes = [this.element, oAnchor], + oHelpText = this._oHelpTextEM, + oCheckedIndicator = this._oCheckedIndicator, + oSubmenuIndicator = this.submenuIndicator, + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oCheckedIndicator) { + + oCheckedIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_CHECKED_TEXT : + this.CHECKED_TEXT; + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(oSubmenuIndicator) { + + oSubmenuIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_SUBMENU_INDICATOR_TEXT : + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(bDisabled) { + + if(oConfig.getProperty("selected")) { + + oConfig.setProperty("selected", false); + + } + + oAnchor.removeAttribute("href"); + + Dom.addClass(aNodes, "disabled"); + + } + else { + + oAnchor.setAttribute("href", oConfig.getProperty("url")); + + Dom.removeClass(aNodes, "disabled"); + + } + + }, + + + /** + * @method configSelected + * @description Event handler for when the "selected" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configSelected: function(p_sType, p_aArgs, p_oItem) { + + if(!this.cfg.getProperty("disabled")) { + + var bSelected = p_aArgs[0], + oHelpText = this._oHelpTextEM, + oSubmenuIndicator = this.submenuIndicator, + oCheckedIndicator = this._oCheckedIndicator, + aNodes = [this.element, this._oAnchor], + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oSubmenuIndicator) { + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(oCheckedIndicator) { + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(bSelected) { + + Dom.addClass(aNodes, "selected"); + + } + else { + + Dom.removeClass(aNodes, "selected"); + + } + + } + + }, + + + /** + * @method configSubmenu + * @description Event handler for when the "submenu" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configSubmenu: function(p_sType, p_aArgs, p_oItem) { + + var oEl = this.element, + oSubmenu = p_aArgs[0], + oSubmenuIndicator = this.submenuIndicator, + oConfig = this.cfg, + aNodes = [this.element, this._oAnchor], + bLazyLoad = this.parent && this.parent.lazyLoad, + oMenu; + + + if(oSubmenu) { + + if(oSubmenu instanceof Menu) { + + oMenu = oSubmenu; + oMenu.parent = this; + oMenu.lazyLoad = bLazyLoad; + + } + else if( + typeof oSubmenu == "object" && + oSubmenu.id && + !oSubmenu.nodeType + ) { + + var sSubmenuId = oSubmenu.id, + oSubmenuConfig = oSubmenu; + + oSubmenuConfig.lazyload = bLazyLoad; + oSubmenuConfig.parent = this; + + oMenu = new this.SUBMENU_TYPE(sSubmenuId, oSubmenuConfig); + + + // Set the value of the property to the Menu instance + + this.cfg.setProperty("submenu", oMenu, true); + + } + else { + + oMenu = new this.SUBMENU_TYPE( + oSubmenu, + { lazyload: bLazyLoad, parent: this } + ); + + + // Set the value of the property to the Menu instance + + this.cfg.setProperty("submenu", oMenu, true); + + } + + + if(oMenu) { + + this._oSubmenu = oMenu; + + + if(!oSubmenuIndicator) { + + + if(!m_oSubmenuIndicator) { + + m_oSubmenuIndicator = document.createElement("em"); + m_oSubmenuIndicator.innerHTML = + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + m_oSubmenuIndicator.className = "submenuindicator"; + + } + + + oSubmenuIndicator = m_oSubmenuIndicator.cloneNode(true); + + + if(oMenu.element.parentNode == oEl) { + + if(this.browser == "opera") { + + oEl.appendChild(oSubmenuIndicator); + + oMenu.renderEvent.subscribe(function() { + + oSubmenuIndicator.parentNode.insertBefore( + oSubmenuIndicator, + oMenu.element + ); + + }); + + } + else { + + oEl.insertBefore(oSubmenuIndicator, oMenu.element); + + } + + } + else { + + oEl.appendChild(oSubmenuIndicator); + + } + + this.submenuIndicator = oSubmenuIndicator; + + } + + + Dom.addClass(aNodes, "hassubmenu"); + + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + + } + else { + + Dom.removeClass(aNodes, "hassubmenu"); + + if(oSubmenuIndicator) { + + oEl.removeChild(oSubmenuIndicator); + + } + + if(this._oSubmenu) { + + this._oSubmenu.destroy(); + + } + + } + + }, + + + /** + * @method configOnClick + * @description Event handler for when the "onclick" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configOnClick: function(p_sType, p_aArgs, p_oItem) { + + var oObject = p_aArgs[0]; + + /* + Remove any existing listeners if a "click" event handler has + already been specified. + */ + + if( + this._oOnclickAttributeValue && + (this._oOnclickAttributeValue != oObject) + ) { + + this.clickEvent.unsubscribe( + this._oOnclickAttributeValue.fn, + this._oOnclickAttributeValue.obj + ); + + this._oOnclickAttributeValue = null; + + } + + + if( + !this._oOnclickAttributeValue && + typeof oObject == "object" && + typeof oObject.fn == "function" + ) { + + this.clickEvent.subscribe( + oObject.fn, + (oObject.obj || this), + oObject.scope + ); + + this._oOnclickAttributeValue = oObject; + + } + + }, + + + /** + * @method configClassName + * @description Event handler for when the "classname" configuration + * property of a menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configClassName: function(p_sType, p_aArgs, p_oItem) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + + }, + + + + // Public methods + + + /** + * @method initDefaultConfig + * @description Initializes an item's configurable properties. + */ + initDefaultConfig : function() { + + var oConfig = this.cfg, + CheckBoolean = oConfig.checkBoolean; + + + // Define the configuration attributes + + /** + * @config text + * @description String specifying the text label for the menu item. + * When building a menu from existing HTML the value of this property + * will be interpreted from the menu's markup. + * @default "" + * @type String + */ + oConfig.addProperty( + "text", + { + value: "", + handler: this.configText, + validator: this._checkString, + suppressEvent: true + } + ); + + + /** + * @config helptext + * @description String specifying additional instructional text to + * accompany the text for the nenu item. + * @default null + * @type String| + * HTMLElement + */ + oConfig.addProperty("helptext", { handler: this.configHelpText }); + + + /** + * @config url + * @description String specifying the URL for the menu item's anchor's + * "href" attribute. When building a menu from existing HTML the value + * of this property will be interpreted from the menu's markup. + * @default "#" + * @type String + */ + oConfig.addProperty( + "url", + { value: "#", handler: this.configURL, suppressEvent: true } + ); + + + /** + * @config target + * @description String specifying the value for the "target" attribute + * of the menu item's anchor element. Specifying a target will + * require the user to click directly on the menu item's anchor node in + * order to cause the browser to navigate to the specified URL. + * When building a menu from existing HTML the value of this property + * will be interpreted from the menu's markup. + * @default null + * @type String + */ + oConfig.addProperty( + "target", + { handler: this.configTarget, suppressEvent: true } + ); + + + /** + * @config emphasis + * @description Boolean indicating if the text of the menu item will be + * rendered with emphasis. When building a menu from existing HTML the + * value of this property will be interpreted from the menu's markup. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "emphasis", + { + value: false, + handler: this.configEmphasis, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config strongemphasis + * @description Boolean indicating if the text of the menu item will be + * rendered with strong emphasis. When building a menu from existing + * HTML the value of this property will be interpreted from the + * menu's markup. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "strongemphasis", + { + value: false, + handler: this.configStrongEmphasis, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config checked + * @description Boolean indicating if the menu item should be rendered + * with a checkmark. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "checked", + { + value: false, + handler: this.configChecked, + validator: this.cfg.checkBoolean, + suppressEvent: true, + supercedes:["disabled"] + } + ); + + + /** + * @config disabled + * @description Boolean indicating if the menu item should be disabled. + * (Disabled menu items are dimmed and will not respond to user input + * or fire events.) + * @default false + * @type Boolean + */ + oConfig.addProperty( + "disabled", + { + value: false, + handler: this.configDisabled, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config selected + * @description Boolean indicating if the menu item should + * be highlighted. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "selected", + { + value: false, + handler: this.configSelected, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config submenu + * @description Object specifying the submenu to be appended to the + * menu item. The value can be one of the following:
    • Object + * specifying a Menu instance.
    • Object literal specifying the + * menu to be created. Format: { id: [menu id], itemdata: + * [array of values for + * items] }.
    • String specifying the id attribute + * of the <div> element of the menu.
    • + * Object specifying the <div> element of the + * menu.
    + * @default null + * @type Menu|String|Object| + * HTMLElement + */ + oConfig.addProperty("submenu", { handler: this.configSubmenu }); + + + /** + * @config onclick + * @description Object literal representing the code to be executed when + * the button is clicked. Format:
    {
    + * fn: Function, // The handler to call when + * the event fires.
    obj: Object, // An + * object to pass back to the handler.
    scope: + * Object // The object to use for the scope of the handler. + *
    }
    + * @type Object + * @default null + */ + oConfig.addProperty("onclick", { handler: this.configOnClick }); + + + /** + * @config classname + * @description CSS class to be applied to the menu item's root + * <li> element. The specified class(es) are + * appended in addition to the default class as specified by the menu + * item's CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + "classname", + { + value: null, + handler: this.configClassName, + validator: this._checkString + } + ); + + }, + + + /** + * @method getNextEnabledSibling + * @description Finds the menu item's next enabled sibling. + * @return YAHOO.widget.MenuItem + */ + getNextEnabledSibling: function() { + + if(this.parent instanceof Menu) { + + var nGroupIndex = this.groupIndex; + + function getNextArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getNextArrayItem(p_aArray, (p_nStartIndex+1)); + + } + + + var aItemGroups = this.parent.getItemGroups(), + oNextItem; + + + if(this.index < (aItemGroups[nGroupIndex].length - 1)) { + + oNextItem = getNextArrayItem( + aItemGroups[nGroupIndex], + (this.index+1) + ); + + } + else { + + var nNextGroupIndex; + + if(nGroupIndex < (aItemGroups.length - 1)) { + + nNextGroupIndex = nGroupIndex + 1; + + } + else { + + nNextGroupIndex = 0; + + } + + var aNextGroup = getNextArrayItem(aItemGroups, nNextGroupIndex); + + // Retrieve the first menu item in the next group + + oNextItem = getNextArrayItem(aNextGroup, 0); + + } + + return ( + oNextItem.cfg.getProperty("disabled") || + oNextItem.element.style.display == "none" + ) ? + oNextItem.getNextEnabledSibling() : oNextItem; + + } + + }, + + + /** + * @method getPreviousEnabledSibling + * @description Finds the menu item's previous enabled sibling. + * @return {YAHOO.widget.MenuItem} + */ + getPreviousEnabledSibling: function() { + + if(this.parent instanceof Menu) { + + var nGroupIndex = this.groupIndex; + + function getPreviousArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getPreviousArrayItem(p_aArray, (p_nStartIndex-1)); + + } + + function getFirstItemIndex(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] ? + p_nStartIndex : + getFirstItemIndex(p_aArray, (p_nStartIndex+1)); + + } + + var aItemGroups = this.parent.getItemGroups(), + oPreviousItem; + + if( + this.index > getFirstItemIndex(aItemGroups[nGroupIndex], 0) + ) { + + oPreviousItem = + getPreviousArrayItem( + aItemGroups[nGroupIndex], + (this.index-1) + ); + + } + else { + + var nPreviousGroupIndex; + + if(nGroupIndex > getFirstItemIndex(aItemGroups, 0)) { + + nPreviousGroupIndex = nGroupIndex - 1; + + } + else { + + nPreviousGroupIndex = aItemGroups.length - 1; + + } + + var aPreviousGroup = + getPreviousArrayItem(aItemGroups, nPreviousGroupIndex); + + oPreviousItem = + getPreviousArrayItem( + aPreviousGroup, + (aPreviousGroup.length - 1) + ); + + } + + return ( + oPreviousItem.cfg.getProperty("disabled") || + oPreviousItem.element.style.display == "none" + ) ? + oPreviousItem.getPreviousEnabledSibling() : oPreviousItem; + + } + + }, + + + /** + * @method focus + * @description Causes the menu item to receive the focus and fires the + * focus event. + */ + focus: function() { + + var oParent = this.parent, + oAnchor = this._oAnchor, + oActiveItem = oParent.activeItem; + + + function setFocus() { + + try { + + oAnchor.focus(); + + } + catch(e) { + + } + + } + + + if( + !this.cfg.getProperty("disabled") && + oParent && + oParent.cfg.getProperty("visible") && + this.element.style.display != "none" + ) { + + if(oActiveItem) { + + oActiveItem.blur(); + + } + + + /* + Setting focus via a timer fixes a race condition in Firefox, IE + and Opera where the browser viewport jumps as it trys to + position and focus the menu. + */ + + window.setTimeout(setFocus, 0); + + this.focusEvent.fire(); + + } + + }, + + + /** + * @method blur + * @description Causes the menu item to lose focus and fires the + * onblur event. + */ + blur: function() { + + var oParent = this.parent; + + if( + !this.cfg.getProperty("disabled") && + oParent && + Dom.getStyle(oParent.element, "visibility") == "visible" + ) { + + this._oAnchor.blur(); + + this.blurEvent.fire(); + + } + + }, + + + /** + * @method destroy + * @description Removes the menu item's <li> element + * from its parent <ul> element. + */ + destroy: function() { + + var oEl = this.element; + + if(oEl) { + + + // If the item has a submenu, destroy it first + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.destroy(); + + } + + + // Remove CustomEvent listeners + + this.mouseOverEvent.unsubscribeAll(); + this.mouseOutEvent.unsubscribeAll(); + this.mouseDownEvent.unsubscribeAll(); + this.mouseUpEvent.unsubscribeAll(); + this.clickEvent.unsubscribeAll(); + this.keyPressEvent.unsubscribeAll(); + this.keyDownEvent.unsubscribeAll(); + this.keyUpEvent.unsubscribeAll(); + this.focusEvent.unsubscribeAll(); + this.blurEvent.unsubscribeAll(); + this.cfg.configChangedEvent.unsubscribeAll(); + + + // Remove the element from the parent node + + var oParentNode = oEl.parentNode; + + if(oParentNode) { + + oParentNode.removeChild(oEl); + + this.destroyEvent.fire(); + + } + + this.destroyEvent.unsubscribeAll(); + + } + + }, + + + /** + * @method toString + * @description Returns a string representing the menu item. + * @return {String} + */ + toString: function() { + + return ("MenuItem: " + this.cfg.getProperty("text")); + + } + +}; + +})(); + + + +/** +* Creates a list of options or commands which are made visible in response to +* an HTML element's "contextmenu" event ("mousedown" for Opera). +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> element to be used as the data source for +* the context menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu. See configuration class documentation +* for more details. +* @class ContextMenu +* @constructor +* @extends YAHOO.widget.Menu +* @namespace YAHOO.widget +*/ +YAHOO.widget.ContextMenu = function(p_oElement, p_oConfig) { + + YAHOO.widget.ContextMenu.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + + +YAHOO.lang.extend(YAHOO.widget.ContextMenu, YAHOO.widget.Menu, { + + + +// Private properties + + +/** +* @property _oTrigger +* @description Object reference to the current value of the "trigger" +* configuration property. +* @default null +* @private +* @type String|HTMLElement|Array +*/ +_oTrigger: null, + + +/** +* @property _bCancelled +* @description Boolean indicating if the display of the context menu should +* be cancelled. +* @default false +* @private +* @type Boolean +*/ +_bCancelled: false, + + +// Public properties + + +/** +* @property contextEventTarget +* @description Object reference for the HTML element that was the target of the +* "contextmenu" DOM event ("mousedown" for Opera) that triggered the display of +* the context menu. +* @default null +* @type HTMLElement +*/ +contextEventTarget: null, + + + +// Events + + +/** +* @event triggerContextMenuEvent +* @description Custom Event wrapper for the "contextmenu" DOM event +* ("mousedown" for Opera) fired by the element(s) that trigger the display of +* the context menu. +*/ +triggerContextMenuEvent: null, + + + + + +/** +* @method init +* @description The ContextMenu class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for +* the context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> element to be used as the data source for +* the context menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu. See configuration class documentation +* for more details. +*/ +init: function(p_oElement, p_oConfig) { + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.ContextMenuItem; + + } + + + // Call the init of the superclass (YAHOO.widget.Menu) + + YAHOO.widget.ContextMenu.superclass.init.call(this, p_oElement); + + + this.beforeInitEvent.fire(YAHOO.widget.ContextMenu); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + + this.initEvent.fire(YAHOO.widget.ContextMenu); + +}, + + +/** +* @method initEvents +* @description Initializes the custom events for the context menu. +*/ +initEvents: function() { + + YAHOO.widget.ContextMenu.superclass.initEvents.call(this); + + // Create custom events + + this.triggerContextMenuEvent = + new YAHOO.util.CustomEvent("triggerContextMenuEvent", this); + +}, + + +/** +* @method cancel +* @description Cancels the display of the context menu. +*/ +cancel: function() { + + this._bCancelled = true; + +}, + + + +// Private methods + + +/** +* @method _removeEventHandlers +* @description Removes all of the DOM event handlers from the HTML element(s) +* whose "context menu" event ("click" for Opera) trigger the display of +* the context menu. +* @private +*/ +_removeEventHandlers: function() { + + var Event = YAHOO.util.Event, + oTrigger = this._oTrigger, + bOpera = (this.browser == "opera"); + + + // Remove the event handlers from the trigger(s) + + Event.removeListener( + oTrigger, + (bOpera ? "mousedown" : "contextmenu"), + this._onTriggerContextMenu + ); + + if(bOpera) { + + Event.removeListener(oTrigger, "click", this._onTriggerClick); + + } + +}, + + + +// Private event handlers + + +/** +* @method _onTriggerClick +* @description "click" event handler for the HTML element(s) identified as the +* "trigger" for the context menu. Used to cancel default behaviors in Opera. +* @private +* @param {Event} p_oEvent Object representing the DOM event object passed back +* by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that is handling the event. +*/ +_onTriggerClick: function(p_oEvent, p_oMenu) { + + if(p_oEvent.ctrlKey) { + + YAHOO.util.Event.stopEvent(p_oEvent); + + } + +}, + + +/** +* @method _onTriggerContextMenu +* @description "contextmenu" event handler ("mousedown" for Opera) for the HTML +* element(s) that trigger the display of the context menu. +* @private +* @param {Event} p_oEvent Object representing the DOM event object passed back +* by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that is handling the event. +*/ +_onTriggerContextMenu: function(p_oEvent, p_oMenu) { + + var Event = YAHOO.util.Event; + + if(p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) { + + return; + + } + + + /* + Prevent the browser's default context menu from appearing and + stop the propagation of the "contextmenu" event so that + other ContextMenu instances are not displayed. + */ + + Event.stopEvent(p_oEvent); + + + // Hide any other ContextMenu instances that might be visible + + YAHOO.widget.MenuManager.hideVisible(); + + + this.contextEventTarget = Event.getTarget(p_oEvent); + + this.triggerContextMenuEvent.fire(p_oEvent); + + + if(!this._bCancelled) { + + // Position and display the context menu + + this.cfg.setProperty("xy", Event.getXY(p_oEvent)); + + this.show(); + + } + + this._bCancelled = false; + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the context menu. +* @return {String} +*/ +toString: function() { + + return ("ContextMenu " + this.id); + +}, + + +/** +* @method initDefaultConfig +* @description Initializes the class's configurable properties which can be +* changed using the context menu's Config object ("cfg"). +*/ +initDefaultConfig: function() { + + YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this); + + /** + * @config trigger + * @description The HTML element(s) whose "contextmenu" event ("mousedown" + * for Opera) trigger the display of the context menu. Can be a string + * representing the id attribute of the HTML element, an object reference + * for the HTML element, or an array of strings or HTML element references. + * @default null + * @type String|HTMLElement|Array + */ + this.cfg.addProperty("trigger", { handler: this.configTrigger }); + +}, + + +/** +* @method destroy +* @description Removes the context menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove the DOM event handlers from the current trigger(s) + + this._removeEventHandlers(); + + + // Continue with the superclass implementation of this method + + YAHOO.widget.ContextMenu.superclass.destroy.call(this); + +}, + + + +// Public event handlers for configuration properties + + +/** +* @method configTrigger +* @description Event handler for when the value of the "trigger" configuration +* property changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that fired the event. +*/ +configTrigger: function(p_sType, p_aArgs, p_oMenu) { + + var Event = YAHOO.util.Event, + oTrigger = p_aArgs[0]; + + if(oTrigger) { + + /* + If there is a current "trigger" - remove the event handlers + from that element(s) before assigning new ones + */ + + if(this._oTrigger) { + + this._removeEventHandlers(); + + } + + this._oTrigger = oTrigger; + + + /* + Listen for the "mousedown" event in Opera b/c it does not + support the "contextmenu" event + */ + + var bOpera = (this.browser == "opera"); + + Event.addListener( + oTrigger, + (bOpera ? "mousedown" : "contextmenu"), + this._onTriggerContextMenu, + this, + true + ); + + + /* + Assign a "click" event handler to the trigger element(s) for + Opera to prevent default browser behaviors. + */ + + if(bOpera) { + + Event.addListener( + oTrigger, + "click", + this._onTriggerClick, + this, + true + ); + + } + + } + else { + + this._removeEventHandlers(); + + } + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a context menu. +* +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the context menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu item. See configuration class +* documentation for more details. +* @class ContextMenuItem +* @constructor +* @extends YAHOO.widget.MenuItem +*/ +YAHOO.widget.ContextMenuItem = function(p_oObject, p_oConfig) { + + YAHOO.widget.ContextMenuItem.superclass.constructor.call( + this, + p_oObject, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.ContextMenuItem, YAHOO.widget.MenuItem, { + + +/** +* @method init +* @description The ContextMenuItem class's initialization method. This method +* is automatically called by the constructor, and sets up all DOM references +* for pre-existing markup, and creates required markup if it is not +* already present. +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the context menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu item. See configuration class +* documentation for more details. +*/ +init: function(p_oObject, p_oConfig) { + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = YAHOO.widget.ContextMenu; + + } + + + /* + Call the init of the superclass (YAHOO.widget.MenuItem) + Note: We don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.ContextMenuItem.superclass.init.call(this, p_oObject); + + var oConfig = this.cfg; + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig, true); + + } + + oConfig.fireQueue(); + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the context menu item. +* @return {String} +*/ +toString: function() { + + return ("ContextMenuItem: " + this.cfg.getProperty("text")); + +} + +}); // END YAHOO.lang.extend + + + +/** +* Horizontal collection of items, each of which can contain a submenu. +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu bar. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar. See configuration class documentation for +* more details. +* @class Menubar +* @constructor +* @extends YAHOO.widget.Menu +* @namespace YAHOO.widget +*/ +YAHOO.widget.MenuBar = function(p_oElement, p_oConfig) { + + YAHOO.widget.MenuBar.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.MenuBar, YAHOO.widget.Menu, { + +/** +* @method init +* @description The MenuBar class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu bar. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar. See configuration class documentation for +* more details. +*/ +init: function(p_oElement, p_oConfig) { + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.MenuBarItem; + + } + + + // Call the init of the superclass (YAHOO.widget.Menu) + + YAHOO.widget.MenuBar.superclass.init.call(this, p_oElement); + + + this.beforeInitEvent.fire(YAHOO.widget.MenuBar); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + this.initEvent.fire(YAHOO.widget.MenuBar); + +}, + + + +// Constants + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the menu +* bar's <div> element. +* @default "yuimenubar" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubar", + + + +// Protected event handlers + + +/** +* @method _onKeyDown +* @description "keydown" Custom Event handler for the menu bar. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar +* that fired the event. +*/ +_onKeyDown: function(p_sType, p_aArgs, p_oMenuBar) { + + var Event = YAHOO.util.Event, + oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oSubmenu; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg; + + switch(oEvent.keyCode) { + + case 37: // Left arrow + case 39: // Right arrow + + if( + oItem == this.activeItem && + !oItemCfg.getProperty("selected") + ) { + + oItemCfg.setProperty("selected", true); + + } + else { + + var oNextItem = (oEvent.keyCode == 37) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + + if(this.cfg.getProperty("autosubmenudisplay")) { + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + oSubmenu.activeItem.blur(); + oSubmenu.activeItem = null; + + } + + } + + oNextItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + case 40: // Down arrow + + if(this.activeItem != oItem) { + + this.clearActiveItem(); + + oItemCfg.setProperty("selected", true); + oItem.focus(); + + } + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.setInitialSelection(); + oSubmenu.setInitialFocus(); + + } + else { + + oSubmenu.show(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + } + + } + + + if(oEvent.keyCode == 27 && this.activeItem) { // Esc key + + oSubmenu = this.activeItem.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + this.activeItem.focus(); + + } + else { + + this.activeItem.cfg.setProperty("selected", false); + this.activeItem.blur(); + + } + + Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onClick +* @description "click" event handler for the menu bar. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar +* that fired the event. +*/ +_onClick: function(p_sType, p_aArgs, p_oMenuBar) { + + YAHOO.widget.MenuBar.superclass._onClick.call( + this, + p_sType, + p_aArgs, + p_oMenuBar + ); + + + var oItem = p_aArgs[1]; + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var Event = YAHOO.util.Event, + Dom = YAHOO.util.Dom, + + oEvent = p_aArgs[0], + oTarget = Event.getTarget(oEvent), + + oActiveItem = this.activeItem, + oConfig = this.cfg; + + + // Hide any other submenus that might be visible + + if(oActiveItem && oActiveItem != oItem) { + + this.clearActiveItem(); + + } + + + // Select and focus the current item + + oItem.cfg.setProperty("selected", true); + oItem.focus(); + + + // Show the submenu for the item + + var oSubmenu = oItem.cfg.getProperty("submenu"); + + + if(oSubmenu && oTarget != oItem.submenuIndicator) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + + } + else { + + oSubmenu.show(); + + } + + } + + } + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the menu bar. +* @return {String} +*/ +toString: function() { + + return ("MenuBar " + this.id); + +}, + + +/** +* @description Initializes the class's configurable properties which can be +* changed using the menu bar's Config object ("cfg"). +* @method initDefaultConfig +*/ +initDefaultConfig: function() { + + YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this); + + var oConfig = this.cfg; + + // Add configuration properties + + + /* + Set the default value for the "position" configuration property + to "static" by re-adding the property. + */ + + /** + * @config position + * @description String indicating how a menu bar should be positioned on the + * screen. Possible values are "static" and "dynamic." Static menu bars + * are visible by default and reside in the normal flow of the document + * (CSS position: static). Dynamic menu bars are hidden by default, reside + * out of the normal flow of the document (CSS position: absolute), and can + * overlay other elements on the screen. + * @default static + * @type String + */ + oConfig.addProperty( + "position", + { + value: "static", + handler: this.configPosition, + validator: this._checkPosition, + supercedes: ["visible"] + } + ); + + + /* + Set the default value for the "submenualignment" configuration property + to ["tl","bl"] by re-adding the property. + */ + + /** + * @config submenualignment + * @description Array defining how submenus should be aligned to their + * parent menu bar item. The format is: [itemCorner, submenuCorner]. + * @default ["tl","bl"] + * @type Array + */ + oConfig.addProperty("submenualignment", { value: ["tl","bl"] } ); + + + /* + Change the default value for the "autosubmenudisplay" configuration + property to "false" by re-adding the property. + */ + + /** + * @config autosubmenudisplay + * @description Boolean indicating if submenus are automatically made + * visible when the user mouses over the menu bar's items. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "autosubmenudisplay", + { value: false, validator: oConfig.checkBoolean } + ); + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a menu bar. +* +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the menu bar item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar item. See configuration class documentation +* for more details. +* @class MenuBarItem +* @constructor +* @extends YAHOO.widget.MenuItem +*/ +YAHOO.widget.MenuBarItem = function(p_oObject, p_oConfig) { + + YAHOO.widget.MenuBarItem.superclass.constructor.call( + this, + p_oObject, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.MenuBarItem, YAHOO.widget.MenuItem, { + + +/** +* @method init +* @description The MenuBarItem class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the menu bar item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar item. See configuration class documentation +* for more details. +*/ +init: function(p_oObject, p_oConfig) { + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = YAHOO.widget.Menu; + + } + + + /* + Call the init of the superclass (YAHOO.widget.MenuItem) + Note: We don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.MenuBarItem.superclass.init.call(this, p_oObject); + + + var oConfig = this.cfg; + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig, true); + + } + + oConfig.fireQueue(); + +}, + + + +// Constants + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* <li> element of the menu bar item. +* @default "yuimenubaritem" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubaritem", + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the menu bar item. +* @return {String} +*/ +toString: function() { + + return ("MenuBarItem: " + this.cfg.getProperty("text")); + +} + +}); // END YAHOO.lang.extend +YAHOO.register("menu", YAHOO.widget.Menu, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/menu/menu-min.js b/interface/ispconfig/interface/js/yui/menu/menu-min.js new file mode 100644 index 000000000..d4ca1d7ad --- /dev/null +++ b/interface/ispconfig/interface/js/yui/menu/menu-min.js @@ -0,0 +1,260 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +(function(){var Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;YAHOO.widget.MenuManager=function(){var m_bInitializedEventHandlers=false,m_oMenus={},m_oItems={},m_oVisibleMenus={},me=this;function addItem(p_oItem){var sId=p_oItem.id;if(p_oItem&&m_oItems[sId]!=p_oItem){m_oItems[sId]=p_oItem;p_oItem.destroyEvent.subscribe(onItemDestroy,p_oItem);}} +function removeItem(p_oItem){var sId=p_oItem.id;if(sId&&m_oItems[sId]){delete m_oItems[sId];}} +function getMenuRootElement(p_oElement){var oParentNode;if(p_oElement&&p_oElement.tagName){switch(p_oElement.tagName.toUpperCase()){case"DIV":oParentNode=p_oElement.parentNode;if((Dom.hasClass(p_oElement,"hd")||Dom.hasClass(p_oElement,"bd")||Dom.hasClass(p_oElement,"ft"))&&oParentNode&&oParentNode.tagName&&oParentNode.tagName.toUpperCase()=="DIV"){return oParentNode;} +else{return p_oElement;} +break;case"LI":return p_oElement;default:oParentNode=p_oElement.parentNode;if(oParentNode){return getMenuRootElement(oParentNode);} +break;}}} +function onDOMEvent(p_oEvent){var oTarget=Event.getTarget(p_oEvent),oElement=getMenuRootElement(oTarget),oMenuItem,oMenu;if(oElement){var sTagName=oElement.tagName.toUpperCase();if(sTagName=="LI"){var sId=oElement.id;if(sId&&m_oItems[sId]){oMenuItem=m_oItems[sId];oMenu=oMenuItem.parent;}} +else if(sTagName=="DIV"){if(oElement.id){oMenu=m_oMenus[oElement.id];}}} +if(oMenu){var oEventTypes={"click":"clickEvent","mousedown":"mouseDownEvent","mouseup":"mouseUpEvent","mouseover":"mouseOverEvent","mouseout":"mouseOutEvent","keydown":"keyDownEvent","keyup":"keyUpEvent","keypress":"keyPressEvent"},sCustomEventType=oEventTypes[p_oEvent.type];if(oMenuItem&&!oMenuItem.cfg.getProperty("disabled")){oMenuItem[sCustomEventType].fire(p_oEvent);} +oMenu[sCustomEventType].fire(p_oEvent,oMenuItem);} +else if(p_oEvent.type=="mousedown"){var oActiveItem;for(var i in m_oMenus){if(m_oMenus.hasOwnProperty(i)){oMenu=m_oMenus[i];if(oMenu.cfg.getProperty("clicktohide")&&oMenu.cfg.getProperty("position")=="dynamic"){oMenu.hide();} +else{oMenu.clearActiveItem(true);}}}}} +function onMenuDestroy(p_sType,p_aArgs,p_oMenu){if(p_oMenu&&m_oMenus[p_oMenu.id]){delete m_oMenus[p_oMenu.id];}} +function onItemDestroy(p_sType,p_aArgs,p_oItem){var sId=p_oItem.id;if(sId&&m_oItems[sId]){delete m_oItems[sId];}} +function onMenuVisibleConfigChange(p_sType,p_aArgs,p_oMenu){var bVisible=p_aArgs[0];if(bVisible){m_oVisibleMenus[p_oMenu.id]=p_oMenu;} +else if(m_oVisibleMenus[p_oMenu.id]){delete m_oVisibleMenus[p_oMenu.id];}} +function onItemAdded(p_sType,p_aArgs){addItem(p_aArgs[0]);} +function onItemRemoved(p_sType,p_aArgs){removeItem(p_aArgs[0]);} +return{addMenu:function(p_oMenu){if(p_oMenu&&p_oMenu.id&&!m_oMenus[p_oMenu.id]){m_oMenus[p_oMenu.id]=p_oMenu;if(!m_bInitializedEventHandlers){var oDoc=document;Event.addListener(oDoc,"mouseover",onDOMEvent,me,true);Event.addListener(oDoc,"mouseout",onDOMEvent,me,true);Event.addListener(oDoc,"mousedown",onDOMEvent,me,true);Event.addListener(oDoc,"mouseup",onDOMEvent,me,true);Event.addListener(oDoc,"click",onDOMEvent,me,true);Event.addListener(oDoc,"keydown",onDOMEvent,me,true);Event.addListener(oDoc,"keyup",onDOMEvent,me,true);Event.addListener(oDoc,"keypress",onDOMEvent,me,true);m_bInitializedEventHandlers=true;} +p_oMenu.destroyEvent.subscribe(onMenuDestroy,p_oMenu,me);p_oMenu.cfg.subscribeToConfigEvent("visible",onMenuVisibleConfigChange,p_oMenu);p_oMenu.itemAddedEvent.subscribe(onItemAdded);p_oMenu.itemRemovedEvent.subscribe(onItemRemoved);}},removeMenu:function(p_oMenu){if(p_oMenu&&m_oMenus[p_oMenu.id]){delete m_oMenus[p_oMenu.id];}},hideVisible:function(){var oMenu;for(var i in m_oVisibleMenus){if(m_oVisibleMenus.hasOwnProperty(i)){oMenu=m_oVisibleMenus[i];if(oMenu.cfg.getProperty("position")=="dynamic"){oMenu.hide();}}}},getMenus:function(){return m_oMenus;},getMenu:function(p_sId){if(m_oMenus[p_sId]){return m_oMenus[p_sId];}},toString:function(){return("MenuManager");}};}();})();(function(){var Dom=YAHOO.util.Dom,Event=YAHOO.util.Event,Lang=YAHOO.lang;YAHOO.widget.Menu=function(p_oElement,p_oConfig){if(p_oConfig){this.parent=p_oConfig.parent;this.lazyLoad=p_oConfig.lazyLoad||p_oConfig.lazyload;this.itemData=p_oConfig.itemData||p_oConfig.itemdata;} +YAHOO.widget.Menu.superclass.constructor.call(this,p_oElement,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.Menu,YAHOO.widget.Overlay,{CSS_CLASS_NAME:"yuimenu",ITEM_TYPE:null,GROUP_TITLE_TAG_NAME:"h6",_nHideDelayId:null,_nShowDelayId:null,_nSubmenuHideDelayId:null,_nBodyScrollId:null,_bHideDelayEventHandlersAssigned:false,_bHandledMouseOverEvent:false,_bHandledMouseOutEvent:false,_aGroupTitleElements:null,_aItemGroups:null,_aListElements:null,_nCurrentMouseX:0,_nMaxHeight:-1,_bStopMouseEventHandlers:false,_sClassName:null,lazyLoad:false,itemData:null,activeItem:null,parent:null,srcElement:null,mouseOverEvent:null,mouseOutEvent:null,mouseDownEvent:null,mouseUpEvent:null,clickEvent:null,keyPressEvent:null,keyDownEvent:null,keyUpEvent:null,itemAddedEvent:null,itemRemovedEvent:null,init:function(p_oElement,p_oConfig){this._aItemGroups=[];this._aListElements=[];this._aGroupTitleElements=[];if(!this.ITEM_TYPE){this.ITEM_TYPE=YAHOO.widget.MenuItem;} +var oElement;if(typeof p_oElement=="string"){oElement=document.getElementById(p_oElement);} +else if(p_oElement.tagName){oElement=p_oElement;} +if(oElement&&oElement.tagName){switch(oElement.tagName.toUpperCase()){case"DIV":this.srcElement=oElement;if(!oElement.id){oElement.setAttribute("id",Dom.generateId());} +YAHOO.widget.Menu.superclass.init.call(this,oElement);this.beforeInitEvent.fire(YAHOO.widget.Menu);break;case"SELECT":this.srcElement=oElement;YAHOO.widget.Menu.superclass.init.call(this,Dom.generateId());this.beforeInitEvent.fire(YAHOO.widget.Menu);break;}} +else{YAHOO.widget.Menu.superclass.init.call(this,p_oElement);this.beforeInitEvent.fire(YAHOO.widget.Menu);} +if(this.element){var oEl=this.element;Dom.addClass(oEl,this.CSS_CLASS_NAME);this.initEvent.subscribe(this._onInit,this,true);this.beforeRenderEvent.subscribe(this._onBeforeRender,this,true);this.renderEvent.subscribe(this._setWidth,this,true);this.beforeShowEvent.subscribe(this._onBeforeShow,this,true);this.showEvent.subscribe(this._onShow,this,true);this.beforeHideEvent.subscribe(this._onBeforeHide,this,true);this.hideEvent.subscribe(this._onHide,this,true);this.mouseOverEvent.subscribe(this._onMouseOver,this,true);this.mouseOutEvent.subscribe(this._onMouseOut,this,true);this.clickEvent.subscribe(this._onClick,this,true);this.keyDownEvent.subscribe(this._onKeyDown,this,true);this.keyPressEvent.subscribe(this._onKeyPress,this,true);YAHOO.widget.Module.textResizeEvent.subscribe(this._onTextResize,this,true);if(p_oConfig){this.cfg.applyConfig(p_oConfig,true);} +YAHOO.widget.MenuManager.addMenu(this);this.initEvent.fire(YAHOO.widget.Menu);}},_initSubTree:function(){var oNode;if(this.srcElement.tagName.toUpperCase()=="DIV"){oNode=this.body.firstChild;var nGroup=0,sGroupTitleTagName=this.GROUP_TITLE_TAG_NAME.toUpperCase();do{if(oNode&&oNode.tagName){switch(oNode.tagName.toUpperCase()){case sGroupTitleTagName:this._aGroupTitleElements[nGroup]=oNode;break;case"UL":this._aListElements[nGroup]=oNode;this._aItemGroups[nGroup]=[];nGroup++;break;}}} +while((oNode=oNode.nextSibling));if(this._aListElements[0]){Dom.addClass(this._aListElements[0],"first-of-type");}} +oNode=null;if(this.srcElement.tagName){var sSrcElementTagName=this.srcElement.tagName.toUpperCase();switch(sSrcElementTagName){case"DIV":if(this._aListElements.length>0){var i=this._aListElements.length-1;do{oNode=this._aListElements[i].firstChild;do{if(oNode&&oNode.tagName&&oNode.tagName.toUpperCase()=="LI"){this.addItem(new this.ITEM_TYPE(oNode,{parent:this}),i);}} +while((oNode=oNode.nextSibling));} +while(i--);} +break;case"SELECT":oNode=this.srcElement.firstChild;do{if(oNode&&oNode.tagName){switch(oNode.tagName.toUpperCase()){case"OPTGROUP":case"OPTION":this.addItem(new this.ITEM_TYPE(oNode,{parent:this}));break;}}} +while((oNode=oNode.nextSibling));break;}}},_getFirstEnabledItem:function(){var aItems=this.getItems(),nItems=aItems.length,oItem;for(var i=0;i=aGroup.length);if(aGroup[p_nItemIndex]){aGroup.splice(p_nItemIndex,0,oItem);} +else{aGroup[p_nItemIndex]=oItem;} +oGroupItem=aGroup[p_nItemIndex];if(oGroupItem){if(bAppend&&(!oGroupItem.element.parentNode||oGroupItem.element.parentNode.nodeType==11)){this._aListElements[nGroupIndex].appendChild(oGroupItem.element);} +else{function getNextItemSibling(p_aArray,p_nStartIndex){return(p_aArray[p_nStartIndex]||getNextItemSibling(p_aArray,(p_nStartIndex+1)));} +var oNextItemSibling=getNextItemSibling(aGroup,(p_nItemIndex+1));if(oNextItemSibling&&(!oGroupItem.element.parentNode||oGroupItem.element.parentNode.nodeType==11)){this._aListElements[nGroupIndex].insertBefore(oGroupItem.element,oNextItemSibling.element);}} +oGroupItem.parent=this;this._subscribeToItemEvents(oGroupItem);this._configureSubmenu(oGroupItem);this._updateItemProperties(nGroupIndex);this.itemAddedEvent.fire(oGroupItem);return oGroupItem;}} +else{var nItemIndex=aGroup.length;aGroup[nItemIndex]=oItem;oGroupItem=aGroup[nItemIndex];if(oGroupItem){if(!Dom.isAncestor(this._aListElements[nGroupIndex],oGroupItem.element)){this._aListElements[nGroupIndex].appendChild(oGroupItem.element);} +oGroupItem.element.setAttribute("groupindex",nGroupIndex);oGroupItem.element.setAttribute("index",nItemIndex);oGroupItem.parent=this;oGroupItem.index=nItemIndex;oGroupItem.groupIndex=nGroupIndex;this._subscribeToItemEvents(oGroupItem);this._configureSubmenu(oGroupItem);if(nItemIndex===0){Dom.addClass(oGroupItem.element,"first-of-type");} +this.itemAddedEvent.fire(oGroupItem);return oGroupItem;}}}},_removeItemFromGroupByIndex:function(p_nGroupIndex,p_nItemIndex){var nGroupIndex=typeof p_nGroupIndex=="number"?p_nGroupIndex:0,aGroup=this._getItemGroup(nGroupIndex);if(aGroup){var aArray=aGroup.splice(p_nItemIndex,1),oItem=aArray[0];if(oItem){this._updateItemProperties(nGroupIndex);if(aGroup.length===0){var oUL=this._aListElements[nGroupIndex];if(this.body&&oUL){this.body.removeChild(oUL);} +this._aItemGroups.splice(nGroupIndex,1);this._aListElements.splice(nGroupIndex,1);oUL=this._aListElements[0];if(oUL){Dom.addClass(oUL,"first-of-type");}} +this.itemRemovedEvent.fire(oItem);return oItem;}}},_removeItemFromGroupByValue:function(p_nGroupIndex,p_oItem){var aGroup=this._getItemGroup(p_nGroupIndex);if(aGroup){var nItems=aGroup.length,nItemIndex=-1;if(nItems>0){var i=nItems-1;do{if(aGroup[i]==p_oItem){nItemIndex=i;break;}} +while(i--);if(nItemIndex>-1){return this._removeItemFromGroupByIndex(p_nGroupIndex,nItemIndex);}}}},_updateItemProperties:function(p_nGroupIndex){var aGroup=this._getItemGroup(p_nGroupIndex),nItems=aGroup.length;if(nItems>0){var i=nItems-1,oItem,oLI;do{oItem=aGroup[i];if(oItem){oLI=oItem.element;oItem.index=i;oItem.groupIndex=p_nGroupIndex;oLI.setAttribute("groupindex",p_nGroupIndex);oLI.setAttribute("index",i);Dom.removeClass(oLI,"first-of-type");}} +while(i--);if(oLI){Dom.addClass(oLI,"first-of-type");}}},_createItemGroup:function(p_nIndex){if(!this._aItemGroups[p_nIndex]){this._aItemGroups[p_nIndex]=[];var oUL=document.createElement("ul");this._aListElements[p_nIndex]=oUL;return this._aItemGroups[p_nIndex];}},_getItemGroup:function(p_nIndex){var nIndex=((typeof p_nIndex=="number")?p_nIndex:0);return this._aItemGroups[nIndex];},_configureSubmenu:function(p_oItem){var oSubmenu=p_oItem.cfg.getProperty("submenu");if(oSubmenu){this.cfg.configChangedEvent.subscribe(this._onParentMenuConfigChange,oSubmenu,true);this.renderEvent.subscribe(this._onParentMenuRender,oSubmenu,true);oSubmenu.beforeShowEvent.subscribe(this._onSubmenuBeforeShow,oSubmenu,true);oSubmenu.showEvent.subscribe(this._onSubmenuShow,oSubmenu,true);oSubmenu.hideEvent.subscribe(this._onSubmenuHide,oSubmenu,true);}},_subscribeToItemEvents:function(p_oItem){p_oItem.focusEvent.subscribe(this._onMenuItemFocus,p_oItem,this);p_oItem.blurEvent.subscribe(this._onMenuItemBlur,this,true);p_oItem.cfg.configChangedEvent.subscribe(this._onMenuItemConfigChange,p_oItem,this);},_getOffsetWidth:function(){var oClone=this.element.cloneNode(true);Dom.setStyle(oClone,"width","");document.body.appendChild(oClone);var sWidth=oClone.offsetWidth;document.body.removeChild(oClone);return sWidth;},_setWidth:function(){if(this.cfg.getProperty("position")=="dynamic"){var sWidth;if(this.element.parentNode.tagName.toUpperCase()=="BODY"){if(this.browser=="opera"){sWidth=this._getOffsetWidth();} +else{Dom.setStyle(this.element,"width","auto");sWidth=this.element.offsetWidth;}} +else{sWidth=this._getOffsetWidth();} +this.cfg.setProperty("width",(sWidth+"px"));}},_cancelHideDelay:function(){var oRoot=this.getRoot();if(oRoot._nHideDelayId){window.clearTimeout(oRoot._nHideDelayId);}},_execHideDelay:function(){this._cancelHideDelay();var oRoot=this.getRoot(),me=this;function hideMenu(){if(oRoot.activeItem){oRoot.clearActiveItem();} +if(oRoot==me&&me.cfg.getProperty("position")=="dynamic"){me.hide();}} +oRoot._nHideDelayId=window.setTimeout(hideMenu,oRoot.cfg.getProperty("hidedelay"));},_cancelShowDelay:function(){var oRoot=this.getRoot();if(oRoot._nShowDelayId){window.clearTimeout(oRoot._nShowDelayId);}},_execShowDelay:function(p_oMenu){var oRoot=this.getRoot();function showMenu(){if(p_oMenu.parent.cfg.getProperty("selected")){p_oMenu.show();}} +oRoot._nShowDelayId=window.setTimeout(showMenu,oRoot.cfg.getProperty("showdelay"));},_execSubmenuHideDelay:function(p_oSubmenu,p_nMouseX,p_nHideDelay){var me=this;p_oSubmenu._nSubmenuHideDelayId=window.setTimeout(function(){if(me._nCurrentMouseX>(p_nMouseX+10)){p_oSubmenu._nSubmenuHideDelayId=window.setTimeout(function(){p_oSubmenu.hide();},p_nHideDelay);} +else{p_oSubmenu.hide();}},50);},_disableScrollHeader:function(){if(!this._bHeaderDisabled){Dom.addClass(this.header,"topscrollbar_disabled");this._bHeaderDisabled=true;}},_disableScrollFooter:function(){if(!this._bFooterDisabled){Dom.addClass(this.footer,"bottomscrollbar_disabled");this._bFooterDisabled=true;}},_enableScrollHeader:function(){if(this._bHeaderDisabled){Dom.removeClass(this.header,"topscrollbar_disabled");this._bHeaderDisabled=false;}},_enableScrollFooter:function(){if(this._bFooterDisabled){Dom.removeClass(this.footer,"bottomscrollbar_disabled");this._bFooterDisabled=false;}},_onMouseOver:function(p_sType,p_aArgs,p_oMenu){if(this._bStopMouseEventHandlers){return false;} +var oEvent=p_aArgs[0],oItem=p_aArgs[1],oTarget=Event.getTarget(oEvent);if(!this._bHandledMouseOverEvent&&(oTarget==this.element||Dom.isAncestor(this.element,oTarget))){this._nCurrentMouseX=0;Event.addListener(this.element,"mousemove",this._onMouseMove,this,true);this.clearActiveItem();if(this.parent&&this._nSubmenuHideDelayId){window.clearTimeout(this._nSubmenuHideDelayId);this.parent.cfg.setProperty("selected",true);var oParentMenu=this.parent.parent;oParentMenu.activeItem=this.parent;oParentMenu._bHandledMouseOutEvent=true;oParentMenu._bHandledMouseOverEvent=false;} +this._bHandledMouseOverEvent=true;this._bHandledMouseOutEvent=false;} +if(oItem&&!oItem.handledMouseOverEvent&&!oItem.cfg.getProperty("disabled")&&(oTarget==oItem.element||Dom.isAncestor(oItem.element,oTarget))){var nShowDelay=this.cfg.getProperty("showdelay"),bShowDelay=(nShowDelay>0);if(bShowDelay){this._cancelShowDelay();} +var oActiveItem=this.activeItem;if(oActiveItem){oActiveItem.cfg.setProperty("selected",false);} +var oItemCfg=oItem.cfg;oItemCfg.setProperty("selected",true);oItem.focus();if(this.cfg.getProperty("autosubmenudisplay")){var oSubmenu=oItemCfg.getProperty("submenu");if(oSubmenu){if(bShowDelay){this._execShowDelay(oSubmenu);} +else{oSubmenu.show();}}} +oItem.handledMouseOverEvent=true;oItem.handledMouseOutEvent=false;}},_onMouseOut:function(p_sType,p_aArgs,p_oMenu){if(this._bStopMouseEventHandlers){return false;} +var oEvent=p_aArgs[0],oItem=p_aArgs[1],oRelatedTarget=Event.getRelatedTarget(oEvent),bMovingToSubmenu=false;if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg,oSubmenu=oItemCfg.getProperty("submenu");if(oSubmenu&&(oRelatedTarget==oSubmenu.element||Dom.isAncestor(oSubmenu.element,oRelatedTarget))){bMovingToSubmenu=true;} +if(!oItem.handledMouseOutEvent&&((oRelatedTarget!=oItem.element&&!Dom.isAncestor(oItem.element,oRelatedTarget))||bMovingToSubmenu)){if(!bMovingToSubmenu){oItem.cfg.setProperty("selected",false);if(oSubmenu){var nSubmenuHideDelay=this.cfg.getProperty("submenuhidedelay"),nShowDelay=this.cfg.getProperty("showdelay");if(!(this instanceof YAHOO.widget.MenuBar)&&nSubmenuHideDelay>0&&nShowDelay>=nSubmenuHideDelay){this._execSubmenuHideDelay(oSubmenu,Event.getPageX(oEvent),nSubmenuHideDelay);} +else{oSubmenu.hide();}}} +oItem.handledMouseOutEvent=true;oItem.handledMouseOverEvent=false;}} +if(!this._bHandledMouseOutEvent&&((oRelatedTarget!=this.element&&!Dom.isAncestor(this.element,oRelatedTarget))||bMovingToSubmenu)){Event.removeListener(this.element,"mousemove",this._onMouseMove);this._nCurrentMouseX=Event.getPageX(oEvent);this._bHandledMouseOutEvent=true;this._bHandledMouseOverEvent=false;}},_onMouseMove:function(p_oEvent,p_oMenu){if(this._bStopMouseEventHandlers){return false;} +this._nCurrentMouseX=Event.getPageX(p_oEvent);},_onClick:function(p_sType,p_aArgs,p_oMenu){var oEvent=p_aArgs[0],oItem=p_aArgs[1],oTarget=Event.getTarget(oEvent);if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg,oSubmenu=oItemCfg.getProperty("submenu");if(oTarget==oItem.submenuIndicator&&oSubmenu){if(oSubmenu.cfg.getProperty("visible")){oSubmenu.hide();oSubmenu.parent.focus();} +else{this.clearActiveItem();this.activeItem=oItem;oItem.cfg.setProperty("selected",true);oSubmenu.show();}} +else{var sURL=oItemCfg.getProperty("url"),bCurrentPageURL=(sURL.substr((sURL.length-1),1)=="#"),sTarget=oItemCfg.getProperty("target"),bHasTarget=(sTarget&&sTarget.length>0);if(oTarget.tagName.toUpperCase()=="A"&&bCurrentPageURL&&!bHasTarget){Event.preventDefault(oEvent);} +if(oTarget.tagName.toUpperCase()!="A"&&!bCurrentPageURL&&!bHasTarget){document.location=sURL;} +if(bCurrentPageURL&&!oSubmenu){var oRoot=this.getRoot();if(oRoot.cfg.getProperty("position")=="static"){oRoot.clearActiveItem();} +else if(oRoot.cfg.getProperty("clicktohide")){oRoot.hide();}}}}},_onKeyDown:function(p_sType,p_aArgs,p_oMenu){var oEvent=p_aArgs[0],oItem=p_aArgs[1],me=this,oSubmenu;function stopMouseEventHandlers(){me._bStopMouseEventHandlers=true;window.setTimeout(function(){me._bStopMouseEventHandlers=false;},10);} +if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg,oParentItem=this.parent,oRoot,oNextItem;switch(oEvent.keyCode){case 38:case 40:if(oItem==this.activeItem&&!oItemCfg.getProperty("selected")){oItemCfg.setProperty("selected",true);} +else{oNextItem=(oEvent.keyCode==38)?oItem.getPreviousEnabledSibling():oItem.getNextEnabledSibling();if(oNextItem){this.clearActiveItem();oNextItem.cfg.setProperty("selected",true);oNextItem.focus();if(this.cfg.getProperty("maxheight")>0){var oBody=this.body;oBody.scrollTop=(oNextItem.element.offsetTop+ +oNextItem.element.offsetHeight)-oBody.offsetHeight;var nScrollTop=oBody.scrollTop,nScrollTarget=oBody.scrollHeight-oBody.offsetHeight;if(nScrollTop===0){this._disableScrollHeader();this._enableScrollFooter();} +else if(nScrollTop==nScrollTarget){this._enableScrollHeader();this._disableScrollFooter();} +else{this._enableScrollHeader();this._enableScrollFooter();}}}} +Event.preventDefault(oEvent);stopMouseEventHandlers();break;case 39:oSubmenu=oItemCfg.getProperty("submenu");if(oSubmenu){if(!oItemCfg.getProperty("selected")){oItemCfg.setProperty("selected",true);} +oSubmenu.show();oSubmenu.setInitialSelection();} +else{oRoot=this.getRoot();if(oRoot instanceof YAHOO.widget.MenuBar){oNextItem=oRoot.activeItem.getNextEnabledSibling();if(oNextItem){oRoot.clearActiveItem();oNextItem.cfg.setProperty("selected",true);oSubmenu=oNextItem.cfg.getProperty("submenu");if(oSubmenu){oSubmenu.show();} +oNextItem.focus();}}} +Event.preventDefault(oEvent);stopMouseEventHandlers();break;case 37:if(oParentItem){var oParentMenu=oParentItem.parent;if(oParentMenu instanceof YAHOO.widget.MenuBar){oNextItem=oParentMenu.activeItem.getPreviousEnabledSibling();if(oNextItem){oParentMenu.clearActiveItem();oNextItem.cfg.setProperty("selected",true);oSubmenu=oNextItem.cfg.getProperty("submenu");if(oSubmenu){oSubmenu.show();} +oNextItem.focus();}} +else{this.hide();oParentItem.focus();}} +Event.preventDefault(oEvent);stopMouseEventHandlers();break;}} +if(oEvent.keyCode==27){if(this.cfg.getProperty("position")=="dynamic"){this.hide();if(this.parent){this.parent.focus();}} +else if(this.activeItem){oSubmenu=this.activeItem.cfg.getProperty("submenu");if(oSubmenu&&oSubmenu.cfg.getProperty("visible")){oSubmenu.hide();this.activeItem.focus();} +else{this.activeItem.cfg.setProperty("selected",false);this.activeItem.blur();}} +Event.preventDefault(oEvent);}},_onKeyPress:function(p_sType,p_aArgs,p_oMenu){var oEvent=p_aArgs[0];if(oEvent.keyCode==40||oEvent.keyCode==38){YAHOO.util.Event.preventDefault(oEvent);}},_onTextResize:function(p_sType,p_aArgs,p_oMenu){if(this.browser=="gecko"&&!this._handleResize){this._handleResize=true;return;} +var oConfig=this.cfg;if(oConfig.getProperty("position")=="dynamic"){oConfig.setProperty("width",(this._getOffsetWidth()+"px"));}},_onScrollTargetMouseOver:function(p_oEvent,p_oMenu){this._cancelHideDelay();var oTarget=Event.getTarget(p_oEvent),oBody=this.body,me=this,nScrollTarget,fnScrollFunction;function scrollBodyDown(){var nScrollTop=oBody.scrollTop;if(nScrollTop0){oBody.scrollTop=(nScrollTop-1);me._enableScrollFooter();} +else{oBody.scrollTop=0;window.clearInterval(me._nBodyScrollId);me._disableScrollHeader();}} +if(Dom.hasClass(oTarget,"hd")){fnScrollFunction=scrollBodyUp;} +else{nScrollTarget=oBody.scrollHeight-oBody.offsetHeight;fnScrollFunction=scrollBodyDown;} +this._nBodyScrollId=window.setInterval(fnScrollFunction,10);},_onScrollTargetMouseOut:function(p_oEvent,p_oMenu){window.clearInterval(this._nBodyScrollId);this._cancelHideDelay();},_onInit:function(p_sType,p_aArgs,p_oMenu){if(((this.parent&&!this.lazyLoad)||(!this.parent&&this.cfg.getProperty("position")=="static")||(!this.parent&&!this.lazyLoad&&this.cfg.getProperty("position")=="dynamic"))&&this.getItemGroups().length===0){if(this.srcElement){this._initSubTree();} +if(this.itemData){this.addItems(this.itemData);}} +else if(this.lazyLoad){this.cfg.fireQueue();}},_onBeforeRender:function(p_sType,p_aArgs,p_oMenu){var oConfig=this.cfg,oEl=this.element,nListElements=this._aListElements.length;if(nListElements>0){var i=0,bFirstList=true,oUL,oGroupTitle;do{oUL=this._aListElements[i];if(oUL){if(bFirstList){Dom.addClass(oUL,"first-of-type");bFirstList=false;} +if(!Dom.isAncestor(oEl,oUL)){this.appendToBody(oUL);} +oGroupTitle=this._aGroupTitleElements[i];if(oGroupTitle){if(!Dom.isAncestor(oEl,oGroupTitle)){oUL.parentNode.insertBefore(oGroupTitle,oUL);} +Dom.addClass(oUL,"hastitle");}} +i++;} +while(i=nViewportHeight){var nMaxHeight=this.cfg.getProperty("maxheight");this._nMaxHeight=nMaxHeight;this.cfg.setProperty("maxheight",(nViewportHeight-20));} +if(this.cfg.getProperty("maxheight")>0){var oBody=this.body;if(oBody.scrollTop>0){oBody.scrollTop=0;} +this._disableScrollHeader();this._enableScrollFooter();}}},_onShow:function(p_sType,p_aArgs,p_oMenu){this.setInitialFocus();var oParent=this.parent;if(oParent){var oParentMenu=oParent.parent,aParentAlignment=oParentMenu.cfg.getProperty("submenualignment"),aAlignment=this.cfg.getProperty("submenualignment");if((aParentAlignment[0]!=aAlignment[0])&&(aParentAlignment[1]!=aAlignment[1])){this.cfg.setProperty("submenualignment",[aParentAlignment[0],aParentAlignment[1]]);} +if(!oParentMenu.cfg.getProperty("autosubmenudisplay")&&oParentMenu.cfg.getProperty("position")=="static"){oParentMenu.cfg.setProperty("autosubmenudisplay",true);function disableAutoSubmenuDisplay(p_oEvent){if(p_oEvent.type=="mousedown"||(p_oEvent.type=="keydown"&&p_oEvent.keyCode==27)){var oTarget=Event.getTarget(p_oEvent);if(oTarget!=oParentMenu.element||!YAHOO.util.Dom.isAncestor(oParentMenu.element,oTarget)){oParentMenu.cfg.setProperty("autosubmenudisplay",false);Event.removeListener(document,"mousedown",disableAutoSubmenuDisplay);Event.removeListener(document,"keydown",disableAutoSubmenuDisplay);}}} +Event.addListener(document,"mousedown",disableAutoSubmenuDisplay);Event.addListener(document,"keydown",disableAutoSubmenuDisplay);}} +else if(!oParent&&this.lazyLoad){this.cfg.refireEvent("xy");}},_onBeforeHide:function(p_sType,p_aArgs,p_oMenu){var oActiveItem=this.activeItem;if(oActiveItem){var oConfig=oActiveItem.cfg;oConfig.setProperty("selected",false);var oSubmenu=oConfig.getProperty("submenu");if(oSubmenu){oSubmenu.hide();} +oActiveItem.blur();}},_onHide:function(p_sType,p_aArgs,p_oMenu){if(this._nMaxHeight!=-1){this.cfg.setProperty("maxheight",this._nMaxHeight);this._nMaxHeight=-1;}},_onParentMenuConfigChange:function(p_sType,p_aArgs,p_oSubmenu){var sPropertyName=p_aArgs[0][0],oPropertyValue=p_aArgs[0][1];switch(sPropertyName){case"iframe":case"constraintoviewport":case"hidedelay":case"showdelay":case"submenuhidedelay":case"clicktohide":case"effect":case"classname":p_oSubmenu.cfg.setProperty(sPropertyName,oPropertyValue);break;}},_onParentMenuRender:function(p_sType,p_aArgs,p_oSubmenu){var oParentMenu=p_oSubmenu.parent.parent,oConfig={constraintoviewport:oParentMenu.cfg.getProperty("constraintoviewport"),xy:[0,0],clicktohide:oParentMenu.cfg.getProperty("clicktohide"),effect:oParentMenu.cfg.getProperty("effect"),showdelay:oParentMenu.cfg.getProperty("showdelay"),hidedelay:oParentMenu.cfg.getProperty("hidedelay"),submenuhidedelay:oParentMenu.cfg.getProperty("submenuhidedelay"),classname:oParentMenu.cfg.getProperty("classname")};if(this.cfg.getProperty("position")==oParentMenu.cfg.getProperty("position")){oConfig.iframe=oParentMenu.cfg.getProperty("iframe");} +p_oSubmenu.cfg.applyConfig(oConfig);if(!this.lazyLoad){var oLI=this.parent.element;if(this.element.parentNode==oLI){this.render();} +else{this.render(oLI);}}},_onSubmenuBeforeShow:function(p_sType,p_aArgs,p_oSubmenu){var oParent=this.parent,aAlignment=oParent.parent.cfg.getProperty("submenualignment");this.cfg.setProperty("context",[oParent.element,aAlignment[0],aAlignment[1]]);var nScrollTop=oParent.parent.body.scrollTop;if((this.browser=="gecko"||this.browser=="safari")&&nScrollTop>0){this.cfg.setProperty("y",(this.cfg.getProperty("y")-nScrollTop));}},_onSubmenuShow:function(p_sType,p_aArgs,p_oSubmenu){var oParent=this.parent;oParent.submenuIndicator.firstChild.nodeValue=oParent.EXPANDED_SUBMENU_INDICATOR_TEXT;},_onSubmenuHide:function(p_sType,p_aArgs,p_oSubmenu){var oParent=this.parent;oParent.submenuIndicator.firstChild.nodeValue=oParent.COLLAPSED_SUBMENU_INDICATOR_TEXT;},_onMenuItemFocus:function(p_sType,p_aArgs,p_oItem){this.activeItem=p_oItem;},_onMenuItemBlur:function(p_sType,p_aArgs){this.activeItem=null;},_onMenuItemConfigChange:function(p_sType,p_aArgs,p_oItem){var sProperty=p_aArgs[0][0];switch(sProperty){case"submenu":var oSubmenu=p_aArgs[0][1];if(oSubmenu){this._configureSubmenu(p_oItem);} +break;case"text":case"helptext":if(this.element.style.width){var sWidth=this._getOffsetWidth()+"px";Dom.setStyle(this.element,"width",sWidth);} +break;}},enforceConstraints:function(type,args,obj){var oConfig=this.cfg,pos=args[0],x=pos[0],y=pos[1],offsetHeight=this.element.offsetHeight,offsetWidth=this.element.offsetWidth,viewPortWidth=YAHOO.util.Dom.getViewportWidth(),viewPortHeight=YAHOO.util.Dom.getViewportHeight(),scrollX=Math.max(document.documentElement.scrollLeft,document.body.scrollLeft),scrollY=Math.max(document.documentElement.scrollTop,document.body.scrollTop),nPadding=(this.parent&&this.parent.parent instanceof YAHOO.widget.MenuBar)?0:10,topConstraint=scrollY+nPadding,leftConstraint=scrollX+nPadding,bottomConstraint=scrollY+viewPortHeight-offsetHeight-nPadding,rightConstraint=scrollX+viewPortWidth-offsetWidth-nPadding,aContext=oConfig.getProperty("context"),oContextElement=aContext?aContext[0]:null;if(x<10){x=leftConstraint;}else if((x+offsetWidth)>viewPortWidth){if(oContextElement&&((x-oContextElement.offsetWidth)>offsetWidth)){x=(x-(oContextElement.offsetWidth+offsetWidth));} +else{x=rightConstraint;}} +if(y<10){y=topConstraint;}else if(y>bottomConstraint){if(oContextElement&&(y>offsetHeight)){y=((y+oContextElement.offsetHeight)-offsetHeight);} +else{y=bottomConstraint;}} +oConfig.setProperty("x",x,true);oConfig.setProperty("y",y,true);oConfig.setProperty("xy",[x,y],true);},configVisible:function(p_sType,p_aArgs,p_oMenu){if(this.cfg.getProperty("position")=="dynamic"){YAHOO.widget.Menu.superclass.configVisible.call(this,p_sType,p_aArgs,p_oMenu);} +else{var bVisible=p_aArgs[0],sDisplay=Dom.getStyle(this.element,"display");if(bVisible){if(sDisplay!="block"){this.beforeShowEvent.fire();Dom.setStyle(this.element,"display","block");this.showEvent.fire();}} +else{if(sDisplay=="block"){this.beforeHideEvent.fire();Dom.setStyle(this.element,"display","none");this.hideEvent.fire();}}}},configPosition:function(p_sType,p_aArgs,p_oMenu){var sCSSPosition=p_aArgs[0]=="static"?"static":"absolute",oCfg=this.cfg;Dom.setStyle(this.element,"position",sCSSPosition);if(sCSSPosition=="static"){oCfg.setProperty("iframe",false);Dom.setStyle(this.element,"display","block");oCfg.setProperty("visible",true);} +else{Dom.setStyle(this.element,"visibility","hidden");} +if(sCSSPosition=="absolute"){var nZIndex=oCfg.getProperty("zindex");if(!nZIndex||nZIndex===0){nZIndex=this.parent?(this.parent.parent.cfg.getProperty("zindex")+1):1;oCfg.setProperty("zindex",nZIndex);}}},configIframe:function(p_sType,p_aArgs,p_oMenu){if(this.cfg.getProperty("position")=="dynamic"){YAHOO.widget.Menu.superclass.configIframe.call(this,p_sType,p_aArgs,p_oMenu);}},configHideDelay:function(p_sType,p_aArgs,p_oMenu){var nHideDelay=p_aArgs[0],oMouseOutEvent=this.mouseOutEvent,oMouseOverEvent=this.mouseOverEvent,oKeyDownEvent=this.keyDownEvent;if(nHideDelay>0){if(!this._bHideDelayEventHandlersAssigned){oMouseOutEvent.subscribe(this._execHideDelay,true);oMouseOverEvent.subscribe(this._cancelHideDelay,this,true);oKeyDownEvent.subscribe(this._cancelHideDelay,this,true);this._bHideDelayEventHandlersAssigned=true;}} +else{oMouseOutEvent.unsubscribe(this._execHideDelay,this);oMouseOverEvent.unsubscribe(this._cancelHideDelay,this);oKeyDownEvent.unsubscribe(this._cancelHideDelay,this);this._bHideDelayEventHandlersAssigned=false;}},configContainer:function(p_sType,p_aArgs,p_oMenu){var oElement=p_aArgs[0];if(typeof oElement=='string'){this.cfg.setProperty("container",document.getElementById(oElement),true);}},configMaxHeight:function(p_sType,p_aArgs,p_oMenu){var nMaxHeight=p_aArgs[0],oBody=this.body,oHeader=this.header,oFooter=this.footer,fnMouseOver=this._onScrollTargetMouseOver,fnMouseOut=this._onScrollTargetMouseOut;if((nMaxHeight>0)&&(oBody.offsetHeight>nMaxHeight)){if(!this.cfg.getProperty("width")){this._setWidth();} +if(!oHeader&&!oFooter){this.setHeader(" ");this.setFooter(" ");oHeader=this.header;oFooter=this.footer;Dom.addClass(oHeader,"topscrollbar");Dom.addClass(oFooter,"bottomscrollbar");this.element.insertBefore(oHeader,oBody);this.element.appendChild(oFooter);Event.addListener(oHeader,"mouseover",fnMouseOver,this,true);Event.addListener(oHeader,"mouseout",fnMouseOut,this,true);Event.addListener(oFooter,"mouseover",fnMouseOver,this,true);Event.addListener(oFooter,"mouseout",fnMouseOut,this,true);} +var nHeight=(nMaxHeight- +(this.footer.offsetHeight+this.header.offsetHeight));Dom.setStyle(oBody,"height",(nHeight+"px"));Dom.setStyle(oBody,"overflow","hidden");} +else if(oHeader&&oFooter){Dom.setStyle(oBody,"height","auto");Dom.setStyle(oBody,"overflow","visible");Event.removeListener(oHeader,"mouseover",fnMouseOver);Event.removeListener(oHeader,"mouseout",fnMouseOut);Event.removeListener(oFooter,"mouseover",fnMouseOver);Event.removeListener(oFooter,"mouseout",fnMouseOut);this.element.removeChild(oHeader);this.element.removeChild(oFooter);this.header=null;this.footer=null;}},configClassName:function(p_sType,p_aArgs,p_oMenu){var sClassName=p_aArgs[0];if(this._sClassName){Dom.removeClass(this.element,this._sClassName);} +Dom.addClass(this.element,sClassName);this._sClassName=sClassName;},initEvents:function(){YAHOO.widget.Menu.superclass.initEvents.call(this);var CustomEvent=YAHOO.util.CustomEvent;this.mouseOverEvent=new CustomEvent("mouseOverEvent",this);this.mouseOutEvent=new CustomEvent("mouseOutEvent",this);this.mouseDownEvent=new CustomEvent("mouseDownEvent",this);this.mouseUpEvent=new CustomEvent("mouseUpEvent",this);this.clickEvent=new CustomEvent("clickEvent",this);this.keyPressEvent=new CustomEvent("keyPressEvent",this);this.keyDownEvent=new CustomEvent("keyDownEvent",this);this.keyUpEvent=new CustomEvent("keyUpEvent",this);this.itemAddedEvent=new CustomEvent("itemAddedEvent",this);this.itemRemovedEvent=new CustomEvent("itemRemovedEvent",this);},getRoot:function(){var oItem=this.parent;if(oItem){var oParentMenu=oItem.parent;return oParentMenu?oParentMenu.getRoot():this;} +else{return this;}},toString:function(){return("Menu "+this.id);},setItemGroupTitle:function(p_sGroupTitle,p_nGroupIndex){if(typeof p_sGroupTitle=="string"&&p_sGroupTitle.length>0){var nGroupIndex=typeof p_nGroupIndex=="number"?p_nGroupIndex:0,oTitle=this._aGroupTitleElements[nGroupIndex];if(oTitle){oTitle.innerHTML=p_sGroupTitle;} +else{oTitle=document.createElement(this.GROUP_TITLE_TAG_NAME);oTitle.innerHTML=p_sGroupTitle;this._aGroupTitleElements[nGroupIndex]=oTitle;} +var i=this._aGroupTitleElements.length-1,nFirstIndex;do{if(this._aGroupTitleElements[i]){Dom.removeClass(this._aGroupTitleElements[i],"first-of-type");nFirstIndex=i;}} +while(i--);if(nFirstIndex!==null){Dom.addClass(this._aGroupTitleElements[nFirstIndex],"first-of-type");}}},addItem:function(p_oItem,p_nGroupIndex){if(p_oItem){return this._addItemToGroup(p_nGroupIndex,p_oItem);}},addItems:function(p_aItems,p_nGroupIndex){if(Lang.isArray(p_aItems)){var nItems=p_aItems.length,aItems=[],oItem;for(var i=0;i0){var i=nItems-1,oItem,oSubmenu;do{oItem=aItems[i];if(oItem){oSubmenu=oItem.cfg.getProperty("submenu");if(oSubmenu){this.cfg.configChangedEvent.unsubscribe(this._onParentMenuConfigChange,oSubmenu);this.renderEvent.unsubscribe(this._onParentMenuRender,oSubmenu);} +oItem.destroy();}} +while(i--);} +if(oHeader){Event.purgeElement(oHeader);oElement.removeChild(oHeader);} +if(oFooter){Event.purgeElement(oFooter);oElement.removeChild(oFooter);} +if(oBody){Event.purgeElement(oBody);oBody.innerHTML="";} +this._aItemGroups=[];this._aListElements=[];this._aGroupTitleElements=[];},destroy:function(){Event.purgeElement(this.element);this.mouseOverEvent.unsubscribeAll();this.mouseOutEvent.unsubscribeAll();this.mouseDownEvent.unsubscribeAll();this.mouseUpEvent.unsubscribeAll();this.clickEvent.unsubscribeAll();this.keyPressEvent.unsubscribeAll();this.keyDownEvent.unsubscribeAll();this.keyUpEvent.unsubscribeAll();this.itemAddedEvent.unsubscribeAll();this.itemRemovedEvent.unsubscribeAll();YAHOO.widget.Module.textResizeEvent.unsubscribe(this._onTextResize,this);this.clearContent();this._aItemGroups=null;this._aListElements=null;this._aGroupTitleElements=null;YAHOO.widget.Menu.superclass.destroy.call(this);},setInitialFocus:function(){var oItem=this._getFirstEnabledItem();if(oItem){oItem.focus();}},setInitialSelection:function(){var oItem=this._getFirstEnabledItem();if(oItem){oItem.cfg.setProperty("selected",true);}},clearActiveItem:function(p_bBlur){if(this.cfg.getProperty("showdelay")>0){this._cancelShowDelay();} +var oActiveItem=this.activeItem;if(oActiveItem){var oConfig=oActiveItem.cfg;oConfig.setProperty("selected",false);var oSubmenu=oConfig.getProperty("submenu");if(oSubmenu){oSubmenu.hide();} +if(p_bBlur){oActiveItem.blur();}}},initDefaultConfig:function(){YAHOO.widget.Menu.superclass.initDefaultConfig.call(this);var oConfig=this.cfg;oConfig.addProperty("visible",{value:false,handler:this.configVisible,validator:this.cfg.checkBoolean});oConfig.addProperty("constraintoviewport",{value:true,handler:this.configConstrainToViewport,validator:this.cfg.checkBoolean,supercedes:["iframe","x","y","xy"]});oConfig.addProperty("position",{value:"dynamic",handler:this.configPosition,validator:this._checkPosition,supercedes:["visible"]});oConfig.addProperty("submenualignment",{value:["tl","tr"]});oConfig.addProperty("autosubmenudisplay",{value:true,validator:oConfig.checkBoolean});oConfig.addProperty("showdelay",{value:250,validator:oConfig.checkNumber});oConfig.addProperty("hidedelay",{value:0,validator:oConfig.checkNumber,handler:this.configHideDelay,suppressEvent:true});oConfig.addProperty("submenuhidedelay",{value:250,validator:oConfig.checkNumber});oConfig.addProperty("clicktohide",{value:true,validator:oConfig.checkBoolean});oConfig.addProperty("container",{value:document.body,handler:this.configContainer});oConfig.addProperty("maxheight",{value:0,validator:oConfig.checkNumber,handler:this.configMaxHeight});oConfig.addProperty("classname",{value:null,handler:this.configClassName,validator:this._checkString});}});})();(function(){var Dom=YAHOO.util.Dom,Module=YAHOO.widget.Module,Menu=YAHOO.widget.Menu,m_oMenuItemElement=null,m_oSubmenuIndicator=null,m_oCheckedIndicator=null;YAHOO.widget.MenuItem=function(p_oObject,p_oConfig){if(p_oObject){if(p_oConfig){this.parent=p_oConfig.parent;this.value=p_oConfig.value;this.id=p_oConfig.id;} +this.init(p_oObject,p_oConfig);}};YAHOO.widget.MenuItem.prototype={SUBMENU_INDICATOR_IMAGE_PATH:"nt/ic/ut/alt1/menuarorght8_nrm_1.gif",SELECTED_SUBMENU_INDICATOR_IMAGE_PATH:"nt/ic/ut/alt1/menuarorght8_hov_1.gif",DISABLED_SUBMENU_INDICATOR_IMAGE_PATH:"nt/ic/ut/alt1/menuarorght8_dim_1.gif",COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT:"Collapsed. Click to expand.",EXPANDED_SUBMENU_INDICATOR_ALT_TEXT:"Expanded. Click to collapse.",DISABLED_SUBMENU_INDICATOR_ALT_TEXT:"Disabled.",COLLAPSED_SUBMENU_INDICATOR_TEXT:"Submenu collapsed. Click to expand submenu.",EXPANDED_SUBMENU_INDICATOR_TEXT:"Submenu expanded. Click to collapse submenu.",DISABLED_SUBMENU_INDICATOR_TEXT:"Submenu collapsed. (Item disabled.)",CHECKED_IMAGE_PATH:"nt/ic/ut/bsc/menuchk8_nrm_1.gif",SELECTED_CHECKED_IMAGE_PATH:"nt/ic/ut/bsc/menuchk8_hov_1.gif",DISABLED_CHECKED_IMAGE_PATH:"nt/ic/ut/bsc/menuchk8_dim_1.gif",CHECKED_IMAGE_ALT_TEXT:"Checked.",DISABLED_CHECKED_IMAGE_ALT_TEXT:"Checked. (Item disabled.)",CHECKED_TEXT:"Menu item checked.",DISABLED_CHECKED_TEXT:"Checked. (Item disabled.)",CSS_CLASS_NAME:"yuimenuitem",SUBMENU_TYPE:null,IMG_ROOT:"http://us.i1.yimg.com/us.yimg.com/i/",IMG_ROOT_SSL:"https://a248.e.akamai.net/sec.yimg.com/i/",_oAnchor:null,_oText:null,_oHelpTextEM:null,_oSubmenu:null,_checkImage:null,_oCheckedIndicator:null,_oOnclickAttributeValue:null,_sClassName:null,constructor:YAHOO.widget.MenuItem,imageRoot:null,isSecure:Module.prototype.isSecure,index:null,groupIndex:null,parent:null,element:null,srcElement:null,value:null,submenuIndicator:null,browser:Module.prototype.browser,id:null,destroyEvent:null,mouseOverEvent:null,mouseOutEvent:null,mouseDownEvent:null,mouseUpEvent:null,clickEvent:null,keyPressEvent:null,keyDownEvent:null,keyUpEvent:null,focusEvent:null,blurEvent:null,init:function(p_oObject,p_oConfig){if(!this.SUBMENU_TYPE){this.SUBMENU_TYPE=Menu;} +this.cfg=new YAHOO.util.Config(this);this.initDefaultConfig();var oConfig=this.cfg;if(this._checkString(p_oObject)){this._createRootNodeStructure();oConfig.setProperty("text",p_oObject);} +else if(this._checkDOMNode(p_oObject)){switch(p_oObject.tagName.toUpperCase()){case"OPTION":this._createRootNodeStructure();oConfig.setProperty("text",p_oObject.text);this.srcElement=p_oObject;break;case"OPTGROUP":this._createRootNodeStructure();oConfig.setProperty("text",p_oObject.label);this.srcElement=p_oObject;this._initSubTree();break;case"LI":var oAnchor=this._getFirstElement(p_oObject,"A"),sURL="#",sTarget,sText;if(oAnchor){sURL=oAnchor.getAttribute("href");sTarget=oAnchor.getAttribute("target");if(oAnchor.innerText){sText=oAnchor.innerText;} +else{var oRange=oAnchor.ownerDocument.createRange();oRange.selectNodeContents(oAnchor);sText=oRange.toString();}} +else{var oText=p_oObject.firstChild;sText=oText.nodeValue;oAnchor=document.createElement("a");oAnchor.setAttribute("href",sURL);p_oObject.replaceChild(oAnchor,oText);oAnchor.appendChild(oText);} +this.srcElement=p_oObject;this.element=p_oObject;this._oAnchor=oAnchor;var oEmphasisNode=this._getFirstElement(oAnchor),bEmphasis=false,bStrongEmphasis=false;if(oEmphasisNode){this._oText=oEmphasisNode.firstChild;switch(oEmphasisNode.tagName.toUpperCase()){case"EM":bEmphasis=true;break;case"STRONG":bStrongEmphasis=true;break;}} +else{this._oText=oAnchor.firstChild;} +oConfig.setProperty("text",sText,true);oConfig.setProperty("url",sURL,true);oConfig.setProperty("target",sTarget,true);oConfig.setProperty("emphasis",bEmphasis,true);oConfig.setProperty("strongemphasis",bStrongEmphasis,true);this._initSubTree();break;}} +if(this.element){var sId=this.element.id;if(!sId){sId=this.id||Dom.generateId();this.element.id=sId;} +this.id=sId;Dom.addClass(this.element,this.CSS_CLASS_NAME);var CustomEvent=YAHOO.util.CustomEvent;this.destroyEvent=new CustomEvent("destroyEvent",this);this.mouseOverEvent=new CustomEvent("mouseOverEvent",this);this.mouseOutEvent=new CustomEvent("mouseOutEvent",this);this.mouseDownEvent=new CustomEvent("mouseDownEvent",this);this.mouseUpEvent=new CustomEvent("mouseUpEvent",this);this.clickEvent=new CustomEvent("clickEvent",this);this.keyPressEvent=new CustomEvent("keyPressEvent",this);this.keyDownEvent=new CustomEvent("keyDownEvent",this);this.keyUpEvent=new CustomEvent("keyUpEvent",this);this.focusEvent=new CustomEvent("focusEvent",this);this.blurEvent=new CustomEvent("blurEvent",this);if(p_oConfig){oConfig.applyConfig(p_oConfig);} +oConfig.fireQueue();}},_getFirstElement:function(p_oElement,p_sTagName){var oFirstChild=p_oElement.firstChild,oElement;if(oFirstChild){if(oFirstChild.nodeType==1){oElement=oFirstChild;} +else{var oNextSibling=oFirstChild.nextSibling;if(oNextSibling&&oNextSibling.nodeType==1){oElement=oNextSibling;}}} +if(p_sTagName){return(oElement&&oElement.tagName.toUpperCase()==p_sTagName)?oElement:false;} +return oElement;},_checkString:function(p_oObject){return(typeof p_oObject=="string");},_checkDOMNode:function(p_oObject){return(p_oObject&&p_oObject.tagName);},_createRootNodeStructure:function(){if(!m_oMenuItemElement){m_oMenuItemElement=document.createElement("li");m_oMenuItemElement.innerHTML="s";} +this.element=m_oMenuItemElement.cloneNode(true);this._oAnchor=this.element.firstChild;this._oText=this._oAnchor.firstChild;this.element.appendChild(this._oAnchor);},_initSubTree:function(){var oSrcEl=this.srcElement,oConfig=this.cfg;if(oSrcEl.childNodes.length>0){if(this.parent.lazyLoad&&this.parent.srcElement&&this.parent.srcElement.tagName.toUpperCase()=="SELECT"){oConfig.setProperty("submenu",{id:Dom.generateId(),itemdata:oSrcEl.childNodes});} +else{var oNode=oSrcEl.firstChild,aOptions=[];do{if(oNode&&oNode.tagName){switch(oNode.tagName.toUpperCase()){case"DIV":oConfig.setProperty("submenu",oNode);break;case"OPTION":aOptions[aOptions.length]=oNode;break;}}} +while((oNode=oNode.nextSibling));var nOptions=aOptions.length;if(nOptions>0){var oMenu=new this.SUBMENU_TYPE(Dom.generateId());oConfig.setProperty("submenu",oMenu);for(var n=0;n0){oAnchor.setAttribute("target",sTarget);} +else{oAnchor.removeAttribute("target");}},configEmphasis:function(p_sType,p_aArgs,p_oItem){var bEmphasis=p_aArgs[0],oAnchor=this._oAnchor,oText=this._oText,oConfig=this.cfg,oEM;if(bEmphasis&&oConfig.getProperty("strongemphasis")){oConfig.setProperty("strongemphasis",false);} +if(oAnchor){if(bEmphasis){oEM=document.createElement("em");oEM.appendChild(oText);oAnchor.appendChild(oEM);} +else{oEM=this._getFirstElement(oAnchor,"EM");if(oEM){oAnchor.removeChild(oEM);oAnchor.appendChild(oText);}}}},configStrongEmphasis:function(p_sType,p_aArgs,p_oItem){var bStrongEmphasis=p_aArgs[0],oAnchor=this._oAnchor,oText=this._oText,oConfig=this.cfg,oStrong;if(bStrongEmphasis&&oConfig.getProperty("emphasis")){oConfig.setProperty("emphasis",false);} +if(oAnchor){if(bStrongEmphasis){oStrong=document.createElement("strong");oStrong.appendChild(oText);oAnchor.appendChild(oStrong);} +else{oStrong=this._getFirstElement(oAnchor,"STRONG");if(oStrong){oAnchor.removeChild(oStrong);oAnchor.appendChild(oText);}}}},configChecked:function(p_sType,p_aArgs,p_oItem){var bChecked=p_aArgs[0],oEl=this.element,oConfig=this.cfg,oEM;if(bChecked){if(!m_oCheckedIndicator){m_oCheckedIndicator=document.createElement("em");m_oCheckedIndicator.innerHTML=this.CHECKED_TEXT;m_oCheckedIndicator.className="checkedindicator";} +oEM=m_oCheckedIndicator.cloneNode(true);var oSubmenu=this.cfg.getProperty("submenu");if(oSubmenu&&oSubmenu.element){oEl.insertBefore(oEM,oSubmenu.element);} +else{oEl.appendChild(oEM);} +Dom.addClass(oEl,"checked");this._oCheckedIndicator=oEM;if(oConfig.getProperty("disabled")){oConfig.refireEvent("disabled");} +if(oConfig.getProperty("selected")){oConfig.refireEvent("selected");}} +else{oEM=this._oCheckedIndicator;Dom.removeClass(oEl,"checked");if(oEM){oEl.removeChild(oEM);} +this._oCheckedIndicator=null;}},configDisabled:function(p_sType,p_aArgs,p_oItem){var bDisabled=p_aArgs[0],oConfig=this.cfg,oAnchor=this._oAnchor,aNodes=[this.element,oAnchor],oHelpText=this._oHelpTextEM,oCheckedIndicator=this._oCheckedIndicator,oSubmenuIndicator=this.submenuIndicator,i=1;if(oHelpText){i++;aNodes[i]=oHelpText;} +if(oCheckedIndicator){oCheckedIndicator.firstChild.nodeValue=bDisabled?this.DISABLED_CHECKED_TEXT:this.CHECKED_TEXT;i++;aNodes[i]=oCheckedIndicator;} +if(oSubmenuIndicator){oSubmenuIndicator.firstChild.nodeValue=bDisabled?this.DISABLED_SUBMENU_INDICATOR_TEXT:this.COLLAPSED_SUBMENU_INDICATOR_TEXT;i++;aNodes[i]=oSubmenuIndicator;} +if(bDisabled){if(oConfig.getProperty("selected")){oConfig.setProperty("selected",false);} +oAnchor.removeAttribute("href");Dom.addClass(aNodes,"disabled");} +else{oAnchor.setAttribute("href",oConfig.getProperty("url"));Dom.removeClass(aNodes,"disabled");}},configSelected:function(p_sType,p_aArgs,p_oItem){if(!this.cfg.getProperty("disabled")){var bSelected=p_aArgs[0],oHelpText=this._oHelpTextEM,oSubmenuIndicator=this.submenuIndicator,oCheckedIndicator=this._oCheckedIndicator,aNodes=[this.element,this._oAnchor],i=1;if(oHelpText){i++;aNodes[i]=oHelpText;} +if(oSubmenuIndicator){i++;aNodes[i]=oSubmenuIndicator;} +if(oCheckedIndicator){i++;aNodes[i]=oCheckedIndicator;} +if(bSelected){Dom.addClass(aNodes,"selected");} +else{Dom.removeClass(aNodes,"selected");}}},configSubmenu:function(p_sType,p_aArgs,p_oItem){var oEl=this.element,oSubmenu=p_aArgs[0],oSubmenuIndicator=this.submenuIndicator,oConfig=this.cfg,aNodes=[this.element,this._oAnchor],bLazyLoad=this.parent&&this.parent.lazyLoad,oMenu;if(oSubmenu){if(oSubmenu instanceof Menu){oMenu=oSubmenu;oMenu.parent=this;oMenu.lazyLoad=bLazyLoad;} +else if(typeof oSubmenu=="object"&&oSubmenu.id&&!oSubmenu.nodeType){var sSubmenuId=oSubmenu.id,oSubmenuConfig=oSubmenu;oSubmenuConfig.lazyload=bLazyLoad;oSubmenuConfig.parent=this;oMenu=new this.SUBMENU_TYPE(sSubmenuId,oSubmenuConfig);this.cfg.setProperty("submenu",oMenu,true);} +else{oMenu=new this.SUBMENU_TYPE(oSubmenu,{lazyload:bLazyLoad,parent:this});this.cfg.setProperty("submenu",oMenu,true);} +if(oMenu){this._oSubmenu=oMenu;if(!oSubmenuIndicator){if(!m_oSubmenuIndicator){m_oSubmenuIndicator=document.createElement("em");m_oSubmenuIndicator.innerHTML=this.COLLAPSED_SUBMENU_INDICATOR_TEXT;m_oSubmenuIndicator.className="submenuindicator";} +oSubmenuIndicator=m_oSubmenuIndicator.cloneNode(true);if(oMenu.element.parentNode==oEl){if(this.browser=="opera"){oEl.appendChild(oSubmenuIndicator);oMenu.renderEvent.subscribe(function(){oSubmenuIndicator.parentNode.insertBefore(oSubmenuIndicator,oMenu.element);});} +else{oEl.insertBefore(oSubmenuIndicator,oMenu.element);}} +else{oEl.appendChild(oSubmenuIndicator);} +this.submenuIndicator=oSubmenuIndicator;} +Dom.addClass(aNodes,"hassubmenu");if(oConfig.getProperty("disabled")){oConfig.refireEvent("disabled");} +if(oConfig.getProperty("selected")){oConfig.refireEvent("selected");}}} +else{Dom.removeClass(aNodes,"hassubmenu");if(oSubmenuIndicator){oEl.removeChild(oSubmenuIndicator);} +if(this._oSubmenu){this._oSubmenu.destroy();}}},configOnClick:function(p_sType,p_aArgs,p_oItem){var oObject=p_aArgs[0];if(this._oOnclickAttributeValue&&(this._oOnclickAttributeValue!=oObject)){this.clickEvent.unsubscribe(this._oOnclickAttributeValue.fn,this._oOnclickAttributeValue.obj);this._oOnclickAttributeValue=null;} +if(!this._oOnclickAttributeValue&&typeof oObject=="object"&&typeof oObject.fn=="function"){this.clickEvent.subscribe(oObject.fn,(oObject.obj||this),oObject.scope);this._oOnclickAttributeValue=oObject;}},configClassName:function(p_sType,p_aArgs,p_oItem){var sClassName=p_aArgs[0];if(this._sClassName){Dom.removeClass(this.element,this._sClassName);} +Dom.addClass(this.element,sClassName);this._sClassName=sClassName;},initDefaultConfig:function(){var oConfig=this.cfg,CheckBoolean=oConfig.checkBoolean;oConfig.addProperty("text",{value:"",handler:this.configText,validator:this._checkString,suppressEvent:true});oConfig.addProperty("helptext",{handler:this.configHelpText});oConfig.addProperty("url",{value:"#",handler:this.configURL,suppressEvent:true});oConfig.addProperty("target",{handler:this.configTarget,suppressEvent:true});oConfig.addProperty("emphasis",{value:false,handler:this.configEmphasis,validator:CheckBoolean,suppressEvent:true});oConfig.addProperty("strongemphasis",{value:false,handler:this.configStrongEmphasis,validator:CheckBoolean,suppressEvent:true});oConfig.addProperty("checked",{value:false,handler:this.configChecked,validator:this.cfg.checkBoolean,suppressEvent:true,supercedes:["disabled"]});oConfig.addProperty("disabled",{value:false,handler:this.configDisabled,validator:CheckBoolean,suppressEvent:true});oConfig.addProperty("selected",{value:false,handler:this.configSelected,validator:CheckBoolean,suppressEvent:true});oConfig.addProperty("submenu",{handler:this.configSubmenu});oConfig.addProperty("onclick",{handler:this.configOnClick});oConfig.addProperty("classname",{value:null,handler:this.configClassName,validator:this._checkString});},getNextEnabledSibling:function(){if(this.parent instanceof Menu){var nGroupIndex=this.groupIndex;function getNextArrayItem(p_aArray,p_nStartIndex){return p_aArray[p_nStartIndex]||getNextArrayItem(p_aArray,(p_nStartIndex+1));} +var aItemGroups=this.parent.getItemGroups(),oNextItem;if(this.index<(aItemGroups[nGroupIndex].length-1)){oNextItem=getNextArrayItem(aItemGroups[nGroupIndex],(this.index+1));} +else{var nNextGroupIndex;if(nGroupIndex<(aItemGroups.length-1)){nNextGroupIndex=nGroupIndex+1;} +else{nNextGroupIndex=0;} +var aNextGroup=getNextArrayItem(aItemGroups,nNextGroupIndex);oNextItem=getNextArrayItem(aNextGroup,0);} +return(oNextItem.cfg.getProperty("disabled")||oNextItem.element.style.display=="none")?oNextItem.getNextEnabledSibling():oNextItem;}},getPreviousEnabledSibling:function(){if(this.parent instanceof Menu){var nGroupIndex=this.groupIndex;function getPreviousArrayItem(p_aArray,p_nStartIndex){return p_aArray[p_nStartIndex]||getPreviousArrayItem(p_aArray,(p_nStartIndex-1));} +function getFirstItemIndex(p_aArray,p_nStartIndex){return p_aArray[p_nStartIndex]?p_nStartIndex:getFirstItemIndex(p_aArray,(p_nStartIndex+1));} +var aItemGroups=this.parent.getItemGroups(),oPreviousItem;if(this.index>getFirstItemIndex(aItemGroups[nGroupIndex],0)){oPreviousItem=getPreviousArrayItem(aItemGroups[nGroupIndex],(this.index-1));} +else{var nPreviousGroupIndex;if(nGroupIndex>getFirstItemIndex(aItemGroups,0)){nPreviousGroupIndex=nGroupIndex-1;} +else{nPreviousGroupIndex=aItemGroups.length-1;} +var aPreviousGroup=getPreviousArrayItem(aItemGroups,nPreviousGroupIndex);oPreviousItem=getPreviousArrayItem(aPreviousGroup,(aPreviousGroup.length-1));} +return(oPreviousItem.cfg.getProperty("disabled")||oPreviousItem.element.style.display=="none")?oPreviousItem.getPreviousEnabledSibling():oPreviousItem;}},focus:function(){var oParent=this.parent,oAnchor=this._oAnchor,oActiveItem=oParent.activeItem;function setFocus(){try{oAnchor.focus();} +catch(e){}} +if(!this.cfg.getProperty("disabled")&&oParent&&oParent.cfg.getProperty("visible")&&this.element.style.display!="none"){if(oActiveItem){oActiveItem.blur();} +window.setTimeout(setFocus,0);this.focusEvent.fire();}},blur:function(){var oParent=this.parent;if(!this.cfg.getProperty("disabled")&&oParent&&Dom.getStyle(oParent.element,"visibility")=="visible"){this._oAnchor.blur();this.blurEvent.fire();}},destroy:function(){var oEl=this.element;if(oEl){var oSubmenu=this.cfg.getProperty("submenu");if(oSubmenu){oSubmenu.destroy();} +this.mouseOverEvent.unsubscribeAll();this.mouseOutEvent.unsubscribeAll();this.mouseDownEvent.unsubscribeAll();this.mouseUpEvent.unsubscribeAll();this.clickEvent.unsubscribeAll();this.keyPressEvent.unsubscribeAll();this.keyDownEvent.unsubscribeAll();this.keyUpEvent.unsubscribeAll();this.focusEvent.unsubscribeAll();this.blurEvent.unsubscribeAll();this.cfg.configChangedEvent.unsubscribeAll();var oParentNode=oEl.parentNode;if(oParentNode){oParentNode.removeChild(oEl);this.destroyEvent.fire();} +this.destroyEvent.unsubscribeAll();}},toString:function(){return("MenuItem: "+this.cfg.getProperty("text"));}};})();YAHOO.widget.ContextMenu=function(p_oElement,p_oConfig){YAHOO.widget.ContextMenu.superclass.constructor.call(this,p_oElement,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.ContextMenu,YAHOO.widget.Menu,{_oTrigger:null,_bCancelled:false,contextEventTarget:null,triggerContextMenuEvent:null,init:function(p_oElement,p_oConfig){if(!this.ITEM_TYPE){this.ITEM_TYPE=YAHOO.widget.ContextMenuItem;} +YAHOO.widget.ContextMenu.superclass.init.call(this,p_oElement);this.beforeInitEvent.fire(YAHOO.widget.ContextMenu);if(p_oConfig){this.cfg.applyConfig(p_oConfig,true);} +this.initEvent.fire(YAHOO.widget.ContextMenu);},initEvents:function(){YAHOO.widget.ContextMenu.superclass.initEvents.call(this);this.triggerContextMenuEvent=new YAHOO.util.CustomEvent("triggerContextMenuEvent",this);},cancel:function(){this._bCancelled=true;},_removeEventHandlers:function(){var Event=YAHOO.util.Event,oTrigger=this._oTrigger,bOpera=(this.browser=="opera");Event.removeListener(oTrigger,(bOpera?"mousedown":"contextmenu"),this._onTriggerContextMenu);if(bOpera){Event.removeListener(oTrigger,"click",this._onTriggerClick);}},_onTriggerClick:function(p_oEvent,p_oMenu){if(p_oEvent.ctrlKey){YAHOO.util.Event.stopEvent(p_oEvent);}},_onTriggerContextMenu:function(p_oEvent,p_oMenu){var Event=YAHOO.util.Event;if(p_oEvent.type=="mousedown"&&!p_oEvent.ctrlKey){return;} +Event.stopEvent(p_oEvent);YAHOO.widget.MenuManager.hideVisible();this.contextEventTarget=Event.getTarget(p_oEvent);this.triggerContextMenuEvent.fire(p_oEvent);if(!this._bCancelled){this.cfg.setProperty("xy",Event.getXY(p_oEvent));this.show();} +this._bCancelled=false;},toString:function(){return("ContextMenu "+this.id);},initDefaultConfig:function(){YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this);this.cfg.addProperty("trigger",{handler:this.configTrigger});},destroy:function(){this._removeEventHandlers();YAHOO.widget.ContextMenu.superclass.destroy.call(this);},configTrigger:function(p_sType,p_aArgs,p_oMenu){var Event=YAHOO.util.Event,oTrigger=p_aArgs[0];if(oTrigger){if(this._oTrigger){this._removeEventHandlers();} +this._oTrigger=oTrigger;var bOpera=(this.browser=="opera");Event.addListener(oTrigger,(bOpera?"mousedown":"contextmenu"),this._onTriggerContextMenu,this,true);if(bOpera){Event.addListener(oTrigger,"click",this._onTriggerClick,this,true);}} +else{this._removeEventHandlers();}}});YAHOO.widget.ContextMenuItem=function(p_oObject,p_oConfig){YAHOO.widget.ContextMenuItem.superclass.constructor.call(this,p_oObject,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.ContextMenuItem,YAHOO.widget.MenuItem,{init:function(p_oObject,p_oConfig){if(!this.SUBMENU_TYPE){this.SUBMENU_TYPE=YAHOO.widget.ContextMenu;} +YAHOO.widget.ContextMenuItem.superclass.init.call(this,p_oObject);var oConfig=this.cfg;if(p_oConfig){oConfig.applyConfig(p_oConfig,true);} +oConfig.fireQueue();},toString:function(){return("ContextMenuItem: "+this.cfg.getProperty("text"));}});YAHOO.widget.MenuBar=function(p_oElement,p_oConfig){YAHOO.widget.MenuBar.superclass.constructor.call(this,p_oElement,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.MenuBar,YAHOO.widget.Menu,{init:function(p_oElement,p_oConfig){if(!this.ITEM_TYPE){this.ITEM_TYPE=YAHOO.widget.MenuBarItem;} +YAHOO.widget.MenuBar.superclass.init.call(this,p_oElement);this.beforeInitEvent.fire(YAHOO.widget.MenuBar);if(p_oConfig){this.cfg.applyConfig(p_oConfig,true);} +this.initEvent.fire(YAHOO.widget.MenuBar);},CSS_CLASS_NAME:"yuimenubar",_onKeyDown:function(p_sType,p_aArgs,p_oMenuBar){var Event=YAHOO.util.Event,oEvent=p_aArgs[0],oItem=p_aArgs[1],oSubmenu;if(oItem&&!oItem.cfg.getProperty("disabled")){var oItemCfg=oItem.cfg;switch(oEvent.keyCode){case 37:case 39:if(oItem==this.activeItem&&!oItemCfg.getProperty("selected")){oItemCfg.setProperty("selected",true);} +else{var oNextItem=(oEvent.keyCode==37)?oItem.getPreviousEnabledSibling():oItem.getNextEnabledSibling();if(oNextItem){this.clearActiveItem();oNextItem.cfg.setProperty("selected",true);if(this.cfg.getProperty("autosubmenudisplay")){oSubmenu=oNextItem.cfg.getProperty("submenu");if(oSubmenu){oSubmenu.show();oSubmenu.activeItem.blur();oSubmenu.activeItem=null;}} +oNextItem.focus();}} +Event.preventDefault(oEvent);break;case 40:if(this.activeItem!=oItem){this.clearActiveItem();oItemCfg.setProperty("selected",true);oItem.focus();} +oSubmenu=oItemCfg.getProperty("submenu");if(oSubmenu){if(oSubmenu.cfg.getProperty("visible")){oSubmenu.setInitialSelection();oSubmenu.setInitialFocus();} +else{oSubmenu.show();}} +Event.preventDefault(oEvent);break;}} +if(oEvent.keyCode==27&&this.activeItem){oSubmenu=this.activeItem.cfg.getProperty("submenu");if(oSubmenu&&oSubmenu.cfg.getProperty("visible")){oSubmenu.hide();this.activeItem.focus();} +else{this.activeItem.cfg.setProperty("selected",false);this.activeItem.blur();} +Event.preventDefault(oEvent);}},_onClick:function(p_sType,p_aArgs,p_oMenuBar){YAHOO.widget.MenuBar.superclass._onClick.call(this,p_sType,p_aArgs,p_oMenuBar);var oItem=p_aArgs[1];if(oItem&&!oItem.cfg.getProperty("disabled")){var Event=YAHOO.util.Event,Dom=YAHOO.util.Dom,oEvent=p_aArgs[0],oTarget=Event.getTarget(oEvent),oActiveItem=this.activeItem,oConfig=this.cfg;if(oActiveItem&&oActiveItem!=oItem){this.clearActiveItem();} +oItem.cfg.setProperty("selected",true);oItem.focus();var oSubmenu=oItem.cfg.getProperty("submenu");if(oSubmenu&&oTarget!=oItem.submenuIndicator){if(oSubmenu.cfg.getProperty("visible")){oSubmenu.hide();} +else{oSubmenu.show();}}}},toString:function(){return("MenuBar "+this.id);},initDefaultConfig:function(){YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this);var oConfig=this.cfg;oConfig.addProperty("position",{value:"static",handler:this.configPosition,validator:this._checkPosition,supercedes:["visible"]});oConfig.addProperty("submenualignment",{value:["tl","bl"]});oConfig.addProperty("autosubmenudisplay",{value:false,validator:oConfig.checkBoolean});}});YAHOO.widget.MenuBarItem=function(p_oObject,p_oConfig){YAHOO.widget.MenuBarItem.superclass.constructor.call(this,p_oObject,p_oConfig);};YAHOO.lang.extend(YAHOO.widget.MenuBarItem,YAHOO.widget.MenuItem,{init:function(p_oObject,p_oConfig){if(!this.SUBMENU_TYPE){this.SUBMENU_TYPE=YAHOO.widget.Menu;} +YAHOO.widget.MenuBarItem.superclass.init.call(this,p_oObject);var oConfig=this.cfg;if(p_oConfig){oConfig.applyConfig(p_oConfig,true);} +oConfig.fireQueue();},CSS_CLASS_NAME:"yuimenubaritem",toString:function(){return("MenuBarItem: "+this.cfg.getProperty("text"));}});YAHOO.register("menu",YAHOO.widget.Menu,{version:"2.2.0",build:"127"}); \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/menu/menu.js b/interface/ispconfig/interface/js/yui/menu/menu.js new file mode 100644 index 000000000..37cb6048d --- /dev/null +++ b/interface/ispconfig/interface/js/yui/menu/menu.js @@ -0,0 +1,8265 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + + +/** +* @module menu +* @description

    The Menu family of components features a collection of +* controls that make it easy to add menus to your website or web application. +* With the Menu Controls you can create website fly-out menus, customized +* context menus, or application-style menu bars with just a small amount of +* scripting.

    The Menu family of controls features:

    +*
      +*
    • Screen-reader accessibility.
    • +*
    • Keyboard and mouse navigation.
    • +*
    • A rich event model that provides access to all of a menu's +* interesting moments.
    • +*
    • Support for +* Progressive +* Enhancement; Menus can be created from simple, +* semantic markup on the page or purely through JavaScript.
    • +*
    +* @title Menu +* @namespace YAHOO.widget +* @requires Event, Dom, Container +*/ +(function() { + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + +/** +* Singleton that manages a collection of all menus and menu items. Listens for +* DOM events at the document level and dispatches the events to the +* corresponding menu or menu item. +* +* @namespace YAHOO.widget +* @class MenuManager +* @static +*/ +YAHOO.widget.MenuManager = function() { + + // Private member variables + + + // Flag indicating if the DOM event handlers have been attached + + var m_bInitializedEventHandlers = false, + + + // Collection of menus + + m_oMenus = {}, + + + // Collection of menu items + + m_oItems = {}, + + + // Collection of visible menus + + m_oVisibleMenus = {}, + + me = this; + + + + + // Private methods + + + /** + * @method addItem + * @description Adds an item to the collection of known menu items. + * @private + * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem + * instance to be added. + */ + function addItem(p_oItem) { + + var sId = p_oItem.id; + + if(p_oItem && m_oItems[sId] != p_oItem) { + + m_oItems[sId] = p_oItem; + + p_oItem.destroyEvent.subscribe(onItemDestroy, p_oItem); + + + } + + } + + + /** + * @method removeItem + * @description Removes an item from the collection of known menu items. + * @private + * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem + * instance to be removed. + */ + function removeItem(p_oItem) { + + var sId = p_oItem.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + + } + + } + + + /** + * @method getMenuRootElement + * @description Finds the root DIV node of a menu or the root LI node of a + * menu item. + * @private + * @param {HTMLElement} p_oElement Object specifying + * an HTML element. + */ + function getMenuRootElement(p_oElement) { + + var oParentNode; + + if(p_oElement && p_oElement.tagName) { + + switch(p_oElement.tagName.toUpperCase()) { + + case "DIV": + + oParentNode = p_oElement.parentNode; + + // Check if the DIV is the inner "body" node of a menu + + if( + ( + Dom.hasClass(p_oElement, "hd") || + Dom.hasClass(p_oElement, "bd") || + Dom.hasClass(p_oElement, "ft") + ) + && + oParentNode && + oParentNode.tagName && + oParentNode.tagName.toUpperCase() == "DIV" + ) { + + return oParentNode; + + } + else { + + return p_oElement; + + } + + break; + + case "LI": + + return p_oElement; + + default: + + oParentNode = p_oElement.parentNode; + + if(oParentNode) { + + return getMenuRootElement(oParentNode); + + } + + break; + + } + + } + + } + + + + // Private event handlers + + + /** + * @method onDOMEvent + * @description Generic, global event handler for all of a menu's DOM-based + * events. This listens for events against the document object. If the + * target of a given event is a member of a menu or menu item's DOM, the + * instance's corresponding Custom Event is fired. + * @private + * @param {Event} p_oEvent Object representing the DOM event object passed + * back by the event utility (YAHOO.util.Event). + */ + function onDOMEvent(p_oEvent) { + + // Get the target node of the DOM event + + var oTarget = Event.getTarget(p_oEvent), + + + // See if the target of the event was a menu, or a menu item + + oElement = getMenuRootElement(oTarget), + oMenuItem, + oMenu; + + + if(oElement) { + + var sTagName = oElement.tagName.toUpperCase(); + + if(sTagName == "LI") { + + var sId = oElement.id; + + if(sId && m_oItems[sId]) { + + oMenuItem = m_oItems[sId]; + oMenu = oMenuItem.parent; + + } + + } + else if(sTagName == "DIV") { + + if(oElement.id) { + + oMenu = m_oMenus[oElement.id]; + + } + + } + + } + + if(oMenu) { + + // Map of DOM event names to CustomEvent names + + var oEventTypes = { + "click": "clickEvent", + "mousedown": "mouseDownEvent", + "mouseup": "mouseUpEvent", + "mouseover": "mouseOverEvent", + "mouseout": "mouseOutEvent", + "keydown": "keyDownEvent", + "keyup": "keyUpEvent", + "keypress": "keyPressEvent" + }, + + sCustomEventType = oEventTypes[p_oEvent.type]; + + + // Fire the Custom Even that corresponds the current DOM event + + if(oMenuItem && !oMenuItem.cfg.getProperty("disabled")) { + + oMenuItem[sCustomEventType].fire(p_oEvent); + + } + + oMenu[sCustomEventType].fire(p_oEvent, oMenuItem); + + } + else if(p_oEvent.type == "mousedown") { + + + /* + If the target of the event wasn't a menu, hide all + dynamically positioned menus + */ + + var oActiveItem; + + for(var i in m_oMenus) { + + if(m_oMenus.hasOwnProperty(i)) { + + oMenu = m_oMenus[i]; + + if( + oMenu.cfg.getProperty("clicktohide") && + oMenu.cfg.getProperty("position") == "dynamic" + ) { + + oMenu.hide(); + + } + else { + + oMenu.clearActiveItem(true); + + } + + } + + } + + } + + } + + + /** + * @method onMenuDestroy + * @description "destroy" event handler for a menu. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that + * fired the event. + */ + function onMenuDestroy(p_sType, p_aArgs, p_oMenu) { + + if(p_oMenu && m_oMenus[p_oMenu.id]) { + + delete m_oMenus[p_oMenu.id]; + + + } + + } + + + /** + * @method onItemDestroy + * @description "destroy" event handler for a MenuItem instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + function onItemDestroy(p_sType, p_aArgs, p_oItem) { + + var sId = p_oItem.id; + + if(sId && m_oItems[sId]) { + + delete m_oItems[sId]; + + } + + } + + + /** + * @method onMenuVisibleConfigChange + * @description Event handler for when the "visible" configuration property + * of a Menu instance changes. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that + * fired the event. + */ + function onMenuVisibleConfigChange(p_sType, p_aArgs, p_oMenu) { + + var bVisible = p_aArgs[0]; + + if(bVisible) { + + m_oVisibleMenus[p_oMenu.id] = p_oMenu; + + + } + else if(m_oVisibleMenus[p_oMenu.id]) { + + delete m_oVisibleMenus[p_oMenu.id]; + + + } + + } + + + /** + * @method onItemAdded + * @description "itemadded" event handler for a Menu instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + */ + function onItemAdded(p_sType, p_aArgs) { + + addItem(p_aArgs[0]); + + } + + + /** + * @method onItemRemoved + * @description "itemremoved" event handler for a Menu instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + */ + function onItemRemoved(p_sType, p_aArgs) { + + removeItem(p_aArgs[0]); + + } + + + + return { + + // Privileged methods + + + /** + * @method addMenu + * @description Adds a menu to the collection of known menus. + * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu + * instance to be added. + */ + addMenu: function(p_oMenu) { + + if(p_oMenu && p_oMenu.id && !m_oMenus[p_oMenu.id]) { + + m_oMenus[p_oMenu.id] = p_oMenu; + + + if(!m_bInitializedEventHandlers) { + + var oDoc = document; + + Event.addListener(oDoc, "mouseover", onDOMEvent, me, true); + Event.addListener(oDoc, "mouseout", onDOMEvent, me, true); + Event.addListener(oDoc, "mousedown", onDOMEvent, me, true); + Event.addListener(oDoc, "mouseup", onDOMEvent, me, true); + Event.addListener(oDoc, "click", onDOMEvent, me, true); + Event.addListener(oDoc, "keydown", onDOMEvent, me, true); + Event.addListener(oDoc, "keyup", onDOMEvent, me, true); + Event.addListener(oDoc, "keypress", onDOMEvent, me, true); + + m_bInitializedEventHandlers = true; + + + } + + p_oMenu.destroyEvent.subscribe(onMenuDestroy, p_oMenu, me); + + p_oMenu.cfg.subscribeToConfigEvent( + "visible", + onMenuVisibleConfigChange, + p_oMenu + ); + + p_oMenu.itemAddedEvent.subscribe(onItemAdded); + p_oMenu.itemRemovedEvent.subscribe(onItemRemoved); + + + } + + }, + + + /** + * @method removeMenu + * @description Removes a menu from the collection of known menus. + * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu + * instance to be removed. + */ + removeMenu: function(p_oMenu) { + + if(p_oMenu && m_oMenus[p_oMenu.id]) { + + delete m_oMenus[p_oMenu.id]; + + + } + + }, + + + /** + * @method hideVisible + * @description Hides all visible, dynamically positioned menus. + */ + hideVisible: function() { + + var oMenu; + + for(var i in m_oVisibleMenus) { + + if(m_oVisibleMenus.hasOwnProperty(i)) { + + oMenu = m_oVisibleMenus[i]; + + if(oMenu.cfg.getProperty("position") == "dynamic") { + + oMenu.hide(); + + } + + } + + } + + }, + + + /** + * @method getMenus + * @description Returns an array of all menus registered with the + * menu manger. + * @return {Array} + */ + getMenus: function() { + + return m_oMenus; + + }, + + + /** + * @method getMenu + * @description Returns a menu with the specified id. + * @param {String} p_sId String specifying the id of the menu to + * be retrieved. + * @return {YAHOO.widget.Menu} + */ + getMenu: function(p_sId) { + + if(m_oMenus[p_sId]) { + + return m_oMenus[p_sId]; + + } + + }, + + + /** + * @method toString + * @description Returns a string representing the menu manager. + * @return {String} + */ + toString: function() { + + return ("MenuManager"); + + } + + }; + +}(); + +})(); + + + +/** +* The Menu class creates a container that holds a vertical list representing +* a set of options or commands. Menu is the base class for all +* menu containers. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> element to be used as +* the data source for the menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu. See configuration class documentation for +* more details. +* @namespace YAHOO.widget +* @class Menu +* @constructor +* @extends YAHOO.widget.Overlay +*/ +(function() { + +var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang; + + +YAHOO.widget.Menu = function(p_oElement, p_oConfig) { + + if(p_oConfig) { + + this.parent = p_oConfig.parent; + this.lazyLoad = p_oConfig.lazyLoad || p_oConfig.lazyload; + this.itemData = p_oConfig.itemData || p_oConfig.itemdata; + + } + + + YAHOO.widget.Menu.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + + +YAHOO.lang.extend(YAHOO.widget.Menu, YAHOO.widget.Overlay, { + + +// Constants + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* menu's <div> element. +* @default "yuimenu" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenu", + + +/** +* @property ITEM_TYPE +* @description Object representing the type of menu item to instantiate and +* add when parsing the child nodes (either <li> element, +* <optgroup> element or <option>) +* of the menu's source HTML element. +* @default YAHOO.widget.MenuItem +* @final +* @type YAHOO.widget.MenuItem +*/ +ITEM_TYPE: null, + + +/** +* @property GROUP_TITLE_TAG_NAME +* @description String representing the tagname of the HTML element used to +* title the menu's item groups. +* @default H6 +* @final +* @type String +*/ +GROUP_TITLE_TAG_NAME: "h6", + + + +// Private properties + + +/** +* @property _nHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a menu. +* @default null +* @private +* @type Number +*/ +_nHideDelayId: null, + + +/** +* @property _nShowDelayId +* @description Number representing the time-out setting used to cancel the +* showing of a menu. +* @default null +* @private +* @type Number +*/ +_nShowDelayId: null, + + +/** +* @property _nSubmenuHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a submenu. +* @default null +* @private +* @type Number +*/ +_nSubmenuHideDelayId: null, + + +/** +* @property _nBodyScrollId +* @description Number representing the time-out setting used to cancel the +* scrolling of the menu's body element. +* @default null +* @private +* @type Number +*/ +_nBodyScrollId: null, + + +/** +* @property _bHideDelayEventHandlersAssigned +* @description Boolean indicating if the "mouseover" and "mouseout" event +* handlers used for hiding the menu via a call to "window.setTimeout" have +* already been assigned. +* @default false +* @private +* @type Boolean +*/ +_bHideDelayEventHandlersAssigned: false, + + +/** +* @property _bHandledMouseOverEvent +* @description Boolean indicating the current state of the menu's +* "mouseover" event. +* @default false +* @private +* @type Boolean +*/ +_bHandledMouseOverEvent: false, + + +/** +* @property _bHandledMouseOutEvent +* @description Boolean indicating the current state of the menu's +* "mouseout" event. +* @default false +* @private +* @type Boolean +*/ +_bHandledMouseOutEvent: false, + + +/** +* @property _aGroupTitleElements +* @description Array of HTML element used to title groups of menu items. +* @default [] +* @private +* @type Array +*/ +_aGroupTitleElements: null, + + +/** +* @property _aItemGroups +* @description Multi-dimensional Array representing the menu items as they +* are grouped in the menu. +* @default [] +* @private +* @type Array +*/ +_aItemGroups: null, + + +/** +* @property _aListElements +* @description Array of <ul> elements, each of which is +* the parent node for each item's <li> element. +* @default [] +* @private +* @type Array +*/ +_aListElements: null, + + +/** +* @property _nCurrentMouseX +* @description The current x coordinate of the mouse inside the area of +* the menu. +* @default 0 +* @private +* @type Number +*/ +_nCurrentMouseX: 0, + + +/** +* @property _nMaxHeight +* @description The original value of the "maxheight" configuration property +* as set by the user. +* @default -1 +* @private +* @type Number +*/ +_nMaxHeight: -1, + + +/** +* @property _bStopMouseEventHandlers +* @description Stops "mouseover," "mouseout," and "mousemove" event handlers +* from executing. +* @default false +* @private +* @type Boolean +*/ +_bStopMouseEventHandlers: false, + + +/** +* @property _sClassName +* @description The current value of the "classname" configuration attribute. +* @default null +* @private +* @type String +*/ +_sClassName: null, + + + +// Public properties + + +/** +* @property lazyLoad +* @description Boolean indicating if the menu's "lazy load" feature is +* enabled. If set to "true," initialization and rendering of the menu's +* items will be deferred until the first time it is made visible. This +* property should be set via the constructor using the configuration +* object literal. +* @default false +* @type Boolean +*/ +lazyLoad: false, + + +/** +* @property itemData +* @description Array of items to be added to the menu. The array can contain +* strings representing the text for each item to be created, object literals +* representing the menu item configuration properties, or MenuItem instances. +* This property should be set via the constructor using the configuration +* object literal. +* @default null +* @type Array +*/ +itemData: null, + + +/** +* @property activeItem +* @description Object reference to the item in the menu that has focus. +* @default null +* @type YAHOO.widget.MenuItem +*/ +activeItem: null, + + +/** +* @property parent +* @description Object reference to the menu's parent menu or menu item. +* This property can be set via the constructor using the configuration +* object literal. +* @default null +* @type YAHOO.widget.MenuItem +*/ +parent: null, + + +/** +* @property srcElement +* @description Object reference to the HTML element (either +* <select> or <div>) used to +* create the menu. +* @default null +* @type HTMLSelectElement|HTMLDivElement +*/ +srcElement: null, + + + +// Events + + +/** +* @event mouseOverEvent +* @description Fires when the mouse has entered the menu. Passes back +* the DOM Event object as an argument. +*/ +mouseOverEvent: null, + + +/** +* @event mouseOutEvent +* @description Fires when the mouse has left the menu. Passes back the DOM +* Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseOutEvent: null, + + +/** +* @event mouseDownEvent +* @description Fires when the user mouses down on the menu. Passes back the +* DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseDownEvent: null, + + +/** +* @event mouseUpEvent +* @description Fires when the user releases a mouse button while the mouse is +* over the menu. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseUpEvent: null, + + +/** +* @event clickEvent +* @description Fires when the user clicks the on the menu. Passes back the +* DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +clickEvent: null, + + +/** +* @event keyPressEvent +* @description Fires when the user presses an alphanumeric key when one of the +* menu's items has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyPressEvent: null, + + +/** +* @event keyDownEvent +* @description Fires when the user presses a key when one of the menu's items +* has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyDownEvent: null, + + +/** +* @event keyUpEvent +* @description Fires when the user releases a key when one of the menu's items +* has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyUpEvent: null, + + +/** +* @event itemAddedEvent +* @description Fires when an item is added to the menu. +* @type YAHOO.util.CustomEvent +*/ +itemAddedEvent: null, + + +/** +* @event itemRemovedEvent +* @description Fires when an item is removed to the menu. +* @type YAHOO.util.CustomEvent +*/ +itemRemovedEvent: null, + + +/** +* @method init +* @description The Menu class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references +* for pre-existing markup, and creates required markup if it is not +* already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> element to be used as +* the data source for the menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu. See configuration class documentation for +* more details. +*/ +init: function(p_oElement, p_oConfig) { + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.MenuItem; + + } + + + var oElement; + + if(typeof p_oElement == "string") { + + oElement = document.getElementById(p_oElement); + + } + else if(p_oElement.tagName) { + + oElement = p_oElement; + + } + + + if(oElement && oElement.tagName) { + + switch(oElement.tagName.toUpperCase()) { + + case "DIV": + + this.srcElement = oElement; + + if(!oElement.id) { + + oElement.setAttribute("id", Dom.generateId()); + + } + + + /* + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, oElement); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + + + break; + + case "SELECT": + + this.srcElement = oElement; + + + /* + The source element is not something that we can use + outright, so we need to create a new Overlay + + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, Dom.generateId()); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + + + break; + + } + + } + else { + + /* + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, p_oElement); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + + + } + + + if(this.element) { + + var oEl = this.element; + + Dom.addClass(oEl, this.CSS_CLASS_NAME); + + + // Subscribe to Custom Events + + this.initEvent.subscribe(this._onInit, this, true); + this.beforeRenderEvent.subscribe(this._onBeforeRender, this, true); + this.renderEvent.subscribe(this._setWidth, this, true); + this.beforeShowEvent.subscribe(this._onBeforeShow, this, true); + this.showEvent.subscribe(this._onShow, this, true); + this.beforeHideEvent.subscribe(this._onBeforeHide, this, true); + this.hideEvent.subscribe(this._onHide, this, true); + this.mouseOverEvent.subscribe(this._onMouseOver, this, true); + this.mouseOutEvent.subscribe(this._onMouseOut, this, true); + this.clickEvent.subscribe(this._onClick, this, true); + this.keyDownEvent.subscribe(this._onKeyDown, this, true); + this.keyPressEvent.subscribe(this._onKeyPress, this, true); + + YAHOO.widget.Module.textResizeEvent.subscribe( + this._onTextResize, + this, + true + ); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + + // Register the Menu instance with the MenuManager + + YAHOO.widget.MenuManager.addMenu(this); + + + this.initEvent.fire(YAHOO.widget.Menu); + + } + +}, + + + +// Private methods + + +/** +* @method _initSubTree +* @description Iterates the childNodes of the source element to find nodes +* used to instantiate menu and menu items. +* @private +*/ +_initSubTree: function() { + + var oNode; + + if(this.srcElement.tagName.toUpperCase() == "DIV") { + + /* + Populate the collection of item groups and item + group titles + */ + + oNode = this.body.firstChild; + + var nGroup = 0, + sGroupTitleTagName = this.GROUP_TITLE_TAG_NAME.toUpperCase(); + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case sGroupTitleTagName: + + this._aGroupTitleElements[nGroup] = oNode; + + break; + + case "UL": + + this._aListElements[nGroup] = oNode; + this._aItemGroups[nGroup] = []; + nGroup++; + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + + /* + Apply the "first-of-type" class to the first UL to mimic + the "first-of-type" CSS3 psuedo class. + */ + + if(this._aListElements[0]) { + + Dom.addClass(this._aListElements[0], "first-of-type"); + + } + + } + + + oNode = null; + + + if(this.srcElement.tagName) { + + var sSrcElementTagName = this.srcElement.tagName.toUpperCase(); + + + switch(sSrcElementTagName) { + + case "DIV": + + if(this._aListElements.length > 0) { + + + var i = this._aListElements.length - 1; + + do { + + oNode = this._aListElements[i].firstChild; + + + do { + + if( + oNode && + oNode.tagName && + oNode.tagName.toUpperCase() == "LI" + ) { + + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ), + i + ); + + } + + } + while((oNode = oNode.nextSibling)); + + } + while(i--); + + } + + break; + + case "SELECT": + + + oNode = this.srcElement.firstChild; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "OPTGROUP": + case "OPTION": + + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ) + ); + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + break; + + } + + } + +}, + + +/** +* @method _getFirstEnabledItem +* @description Returns the first enabled item in the menu. +* @return {YAHOO.widget.MenuItem} +* @private +*/ +_getFirstEnabledItem: function() { + + var aItems = this.getItems(), + nItems = aItems.length, + oItem; + + for(var i=0; i= aGroup.length); + + + if(aGroup[p_nItemIndex]) { + + aGroup.splice(p_nItemIndex, 0, oItem); + + } + else { + + aGroup[p_nItemIndex] = oItem; + + } + + + oGroupItem = aGroup[p_nItemIndex]; + + if(oGroupItem) { + + if( + bAppend && + ( + !oGroupItem.element.parentNode || + oGroupItem.element.parentNode.nodeType == 11 + ) + ) { + + this._aListElements[nGroupIndex].appendChild( + oGroupItem.element + ); + + } + else { + + function getNextItemSibling(p_aArray, p_nStartIndex) { + + return ( + p_aArray[p_nStartIndex] || + getNextItemSibling( + p_aArray, + (p_nStartIndex+1) + ) + ); + + } + + + var oNextItemSibling = + getNextItemSibling(aGroup, (p_nItemIndex+1)); + + if( + oNextItemSibling && + ( + !oGroupItem.element.parentNode || + oGroupItem.element.parentNode.nodeType == 11 + ) + ) { + + this._aListElements[nGroupIndex].insertBefore( + oGroupItem.element, + oNextItemSibling.element + ); + + } + + } + + + oGroupItem.parent = this; + + this._subscribeToItemEvents(oGroupItem); + + this._configureSubmenu(oGroupItem); + + this._updateItemProperties(nGroupIndex); + + + this.itemAddedEvent.fire(oGroupItem); + + return oGroupItem; + + } + + } + else { + + var nItemIndex = aGroup.length; + + aGroup[nItemIndex] = oItem; + + oGroupItem = aGroup[nItemIndex]; + + + if(oGroupItem) { + + if( + !Dom.isAncestor( + this._aListElements[nGroupIndex], + oGroupItem.element + ) + ) { + + this._aListElements[nGroupIndex].appendChild( + oGroupItem.element + ); + + } + + oGroupItem.element.setAttribute("groupindex", nGroupIndex); + oGroupItem.element.setAttribute("index", nItemIndex); + + oGroupItem.parent = this; + + oGroupItem.index = nItemIndex; + oGroupItem.groupIndex = nGroupIndex; + + this._subscribeToItemEvents(oGroupItem); + + this._configureSubmenu(oGroupItem); + + if(nItemIndex === 0) { + + Dom.addClass(oGroupItem.element, "first-of-type"); + + } + + + + this.itemAddedEvent.fire(oGroupItem); + + return oGroupItem; + + } + + } + + } + +}, + + +/** +* @method _removeItemFromGroupByIndex +* @description Removes a menu item from a group by index. Returns the menu +* item that was removed. +* @private +* @param {Number} p_nGroupIndex Number indicating the group to which the menu +* item belongs. +* @param {Number} p_nItemIndex Number indicating the index of the menu item +* to be removed. +* @return {YAHOO.widget.MenuItem} +*/ +_removeItemFromGroupByIndex: function(p_nGroupIndex, p_nItemIndex) { + + var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0, + aGroup = this._getItemGroup(nGroupIndex); + + if(aGroup) { + + var aArray = aGroup.splice(p_nItemIndex, 1), + oItem = aArray[0]; + + if(oItem) { + + // Update the index and className properties of each member + + this._updateItemProperties(nGroupIndex); + + if(aGroup.length === 0) { + + // Remove the UL + + var oUL = this._aListElements[nGroupIndex]; + + if(this.body && oUL) { + + this.body.removeChild(oUL); + + } + + // Remove the group from the array of items + + this._aItemGroups.splice(nGroupIndex, 1); + + + // Remove the UL from the array of ULs + + this._aListElements.splice(nGroupIndex, 1); + + + /* + Assign the "first-of-type" class to the new first UL + in the collection + */ + + oUL = this._aListElements[0]; + + if(oUL) { + + Dom.addClass(oUL, "first-of-type"); + + } + + } + + + this.itemRemovedEvent.fire(oItem); + + + // Return a reference to the item that was removed + + return oItem; + + } + + } + +}, + + +/** +* @method _removeItemFromGroupByValue +* @description Removes a menu item from a group by reference. Returns the +* menu item that was removed. +* @private +* @param {Number} p_nGroupIndex Number indicating the group to which the +* menu item belongs. +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance to be removed. +* @return {YAHOO.widget.MenuItem} +*/ +_removeItemFromGroupByValue: function(p_nGroupIndex, p_oItem) { + + var aGroup = this._getItemGroup(p_nGroupIndex); + + if(aGroup) { + + var nItems = aGroup.length, + nItemIndex = -1; + + if(nItems > 0) { + + var i = nItems-1; + + do { + + if(aGroup[i] == p_oItem) { + + nItemIndex = i; + break; + + } + + } + while(i--); + + if(nItemIndex > -1) { + + return this._removeItemFromGroupByIndex( + p_nGroupIndex, + nItemIndex + ); + + } + + } + + } + +}, + + +/** +* @method _updateItemProperties +* @description Updates the "index," "groupindex," and "className" properties +* of the menu items in the specified group. +* @private +* @param {Number} p_nGroupIndex Number indicating the group of items to update. +*/ +_updateItemProperties: function(p_nGroupIndex) { + + var aGroup = this._getItemGroup(p_nGroupIndex), + nItems = aGroup.length; + + if(nItems > 0) { + + var i = nItems - 1, + oItem, + oLI; + + // Update the index and className properties of each member + + do { + + oItem = aGroup[i]; + + if(oItem) { + + oLI = oItem.element; + + oItem.index = i; + oItem.groupIndex = p_nGroupIndex; + + oLI.setAttribute("groupindex", p_nGroupIndex); + oLI.setAttribute("index", i); + + Dom.removeClass(oLI, "first-of-type"); + + } + + } + while(i--); + + + if(oLI) { + + Dom.addClass(oLI, "first-of-type"); + + } + + } + +}, + + +/** +* @method _createItemGroup +* @description Creates a new menu item group (array) and its associated +* <ul> element. Returns an aray of menu item groups. +* @private +* @param {Number} p_nIndex Number indicating the group to create. +* @return {Array} +*/ +_createItemGroup: function(p_nIndex) { + + if(!this._aItemGroups[p_nIndex]) { + + this._aItemGroups[p_nIndex] = []; + + var oUL = document.createElement("ul"); + + this._aListElements[p_nIndex] = oUL; + + return this._aItemGroups[p_nIndex]; + + } + +}, + + +/** +* @method _getItemGroup +* @description Returns the menu item group at the specified index. +* @private +* @param {Number} p_nIndex Number indicating the index of the menu item group +* to be retrieved. +* @return {Array} +*/ +_getItemGroup: function(p_nIndex) { + + var nIndex = ((typeof p_nIndex == "number") ? p_nIndex : 0); + + return this._aItemGroups[nIndex]; + +}, + + +/** +* @method _configureSubmenu +* @description Subscribes the menu item's submenu to its parent menu's events. +* @private +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance with the submenu to be configured. +*/ +_configureSubmenu: function(p_oItem) { + + var oSubmenu = p_oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + /* + Listen for configuration changes to the parent menu + so they they can be applied to the submenu. + */ + + this.cfg.configChangedEvent.subscribe( + this._onParentMenuConfigChange, + oSubmenu, + true + ); + + this.renderEvent.subscribe( + this._onParentMenuRender, + oSubmenu, + true + ); + + oSubmenu.beforeShowEvent.subscribe( + this._onSubmenuBeforeShow, + oSubmenu, + true + ); + + oSubmenu.showEvent.subscribe( + this._onSubmenuShow, + oSubmenu, + true + ); + + oSubmenu.hideEvent.subscribe( + this._onSubmenuHide, + oSubmenu, + true + ); + + } + +}, + + +/** +* @method _subscribeToItemEvents +* @description Subscribes a menu to a menu item's event. +* @private +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance whose events should be subscribed to. +*/ +_subscribeToItemEvents: function(p_oItem) { + + p_oItem.focusEvent.subscribe(this._onMenuItemFocus, p_oItem, this); + + p_oItem.blurEvent.subscribe(this._onMenuItemBlur, this, true); + + p_oItem.cfg.configChangedEvent.subscribe( + this._onMenuItemConfigChange, + p_oItem, + this + ); + +}, + + +/** +* @method _getOffsetWidth +* @description Returns the offset width of the menu's +* <div> element. +* @private +*/ +_getOffsetWidth: function() { + + var oClone = this.element.cloneNode(true); + + Dom.setStyle(oClone, "width", ""); + + document.body.appendChild(oClone); + + var sWidth = oClone.offsetWidth; + + document.body.removeChild(oClone); + + return sWidth; + +}, + + +/** +* @method _setWidth +* @description Sets the width of the menu's root <div> +* element to its offsetWidth. +* @private +*/ +_setWidth: function() { + + if(this.cfg.getProperty("position") == "dynamic") { + + var sWidth; + + if(this.element.parentNode.tagName.toUpperCase() == "BODY") { + + if(this.browser == "opera") { + + sWidth = this._getOffsetWidth(); + + } + else { + + Dom.setStyle(this.element, "width", "auto"); + + sWidth = this.element.offsetWidth; + + } + + } + else { + + sWidth = this._getOffsetWidth(); + + } + + this.cfg.setProperty("width", (sWidth + "px")); + + } + +}, + + +/** +* @method _cancelHideDelay +* @description Cancels the call to "hideMenu." +* @private +*/ +_cancelHideDelay: function() { + + var oRoot = this.getRoot(); + + if(oRoot._nHideDelayId) { + + window.clearTimeout(oRoot._nHideDelayId); + + } + +}, + + +/** +* @method _execHideDelay +* @description Hides the menu after the number of milliseconds specified by +* the "hidedelay" configuration property. +* @private +*/ +_execHideDelay: function() { + + this._cancelHideDelay(); + + var oRoot = this.getRoot(), + me = this; + + function hideMenu() { + + if(oRoot.activeItem) { + + oRoot.clearActiveItem(); + + } + + if(oRoot == me && me.cfg.getProperty("position") == "dynamic") { + + me.hide(); + + } + + } + + + oRoot._nHideDelayId = + window.setTimeout(hideMenu, oRoot.cfg.getProperty("hidedelay")); + +}, + + +/** +* @method _cancelShowDelay +* @description Cancels the call to the "showMenu." +* @private +*/ +_cancelShowDelay: function() { + + var oRoot = this.getRoot(); + + if(oRoot._nShowDelayId) { + + window.clearTimeout(oRoot._nShowDelayId); + + } + +}, + + +/** +* @method _execShowDelay +* @description Shows the menu after the number of milliseconds specified by +* the "showdelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oMenu Object specifying the menu that should +* be made visible. +*/ +_execShowDelay: function(p_oMenu) { + + var oRoot = this.getRoot(); + + function showMenu() { + + if(p_oMenu.parent.cfg.getProperty("selected")) { + + p_oMenu.show(); + + } + + } + + + oRoot._nShowDelayId = + window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay")); + +}, + + +/** +* @method _execSubmenuHideDelay +* @description Hides a submenu after the number of milliseconds specified by +* the "submenuhidedelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oSubmenu Object specifying the submenu that +* should be hidden. +* @param {Number} p_nMouseX The x coordinate of the mouse when it left +* the specified submenu's parent menu item. +* @param {Number} p_nHideDelay The number of milliseconds that should ellapse +* before the submenu is hidden. +*/ +_execSubmenuHideDelay: function(p_oSubmenu, p_nMouseX, p_nHideDelay) { + + var me = this; + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + if(me._nCurrentMouseX > (p_nMouseX + 10)) { + + p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () { + + p_oSubmenu.hide(); + + }, p_nHideDelay); + + } + else { + + p_oSubmenu.hide(); + + } + + }, 50); + +}, + + + +// Protected methods + + +/** +* @method _disableScrollHeader +* @description Disables the header used for scrolling the body of the menu. +* @protected +*/ +_disableScrollHeader: function() { + + if(!this._bHeaderDisabled) { + + Dom.addClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = true; + + } + +}, + + +/** +* @method _disableScrollFooter +* @description Disables the footer used for scrolling the body of the menu. +* @protected +*/ +_disableScrollFooter: function() { + + if(!this._bFooterDisabled) { + + Dom.addClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = true; + + } + +}, + + +/** +* @method _enableScrollHeader +* @description Enables the header used for scrolling the body of the menu. +* @protected +*/ +_enableScrollHeader: function() { + + if(this._bHeaderDisabled) { + + Dom.removeClass(this.header, "topscrollbar_disabled"); + this._bHeaderDisabled = false; + + } + +}, + + +/** +* @method _enableScrollFooter +* @description Enables the footer used for scrolling the body of the menu. +* @protected +*/ +_enableScrollFooter: function() { + + if(this._bFooterDisabled) { + + Dom.removeClass(this.footer, "bottomscrollbar_disabled"); + this._bFooterDisabled = false; + + } + +}, + + + +/** +* @method _onMouseOver +* @description "mouseover" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseOver: function(p_sType, p_aArgs, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + + if( + !this._bHandledMouseOverEvent && + (oTarget == this.element || Dom.isAncestor(this.element, oTarget)) + ) { + + // Menu mouseover logic + + this._nCurrentMouseX = 0; + + Event.addListener( + this.element, + "mousemove", + this._onMouseMove, + this, + true + ); + + + this.clearActiveItem(); + + + if(this.parent && this._nSubmenuHideDelayId) { + + window.clearTimeout(this._nSubmenuHideDelayId); + + this.parent.cfg.setProperty("selected", true); + + var oParentMenu = this.parent.parent; + + oParentMenu.activeItem = this.parent; + + oParentMenu._bHandledMouseOutEvent = true; + oParentMenu._bHandledMouseOverEvent = false; + + } + + + this._bHandledMouseOverEvent = true; + this._bHandledMouseOutEvent = false; + + } + + + if( + oItem && !oItem.handledMouseOverEvent && + !oItem.cfg.getProperty("disabled") && + (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget)) + ) { + + // Menu Item mouseover logic + + var nShowDelay = this.cfg.getProperty("showdelay"), + bShowDelay = (nShowDelay > 0); + + + if(bShowDelay) { + + this._cancelShowDelay(); + + } + + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + oActiveItem.cfg.setProperty("selected", false); + + } + + + var oItemCfg = oItem.cfg; + + // Select and focus the current menu item + + oItemCfg.setProperty("selected", true); + oItem.focus(); + + + if(this.cfg.getProperty("autosubmenudisplay")) { + + // Show the submenu this menu item + + var oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(bShowDelay) { + + this._execShowDelay(oSubmenu); + + } + else { + + oSubmenu.show(); + + } + + } + + } + + oItem.handledMouseOverEvent = true; + oItem.handledMouseOutEvent = false; + + } + +}, + + +/** +* @method _onMouseOut +* @description "mouseout" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseOut: function(p_sType, p_aArgs, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oRelatedTarget = Event.getRelatedTarget(oEvent), + bMovingToSubmenu = false; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oSubmenu = oItemCfg.getProperty("submenu"); + + + if( + oSubmenu && + ( + oRelatedTarget == oSubmenu.element || + Dom.isAncestor(oSubmenu.element, oRelatedTarget) + ) + ) { + + bMovingToSubmenu = true; + + } + + + if( + !oItem.handledMouseOutEvent && + ( + ( + oRelatedTarget != oItem.element && + !Dom.isAncestor(oItem.element, oRelatedTarget) + ) || bMovingToSubmenu + ) + ) { + + // Menu Item mouseout logic + + if(!bMovingToSubmenu) { + + oItem.cfg.setProperty("selected", false); + + + if(oSubmenu) { + + var nSubmenuHideDelay = + this.cfg.getProperty("submenuhidedelay"), + + nShowDelay = this.cfg.getProperty("showdelay"); + + if( + !(this instanceof YAHOO.widget.MenuBar) && + nSubmenuHideDelay > 0 && + nShowDelay >= nSubmenuHideDelay + ) { + + this._execSubmenuHideDelay( + oSubmenu, + Event.getPageX(oEvent), + nSubmenuHideDelay + ); + + } + else { + + oSubmenu.hide(); + + } + + } + + } + + + oItem.handledMouseOutEvent = true; + oItem.handledMouseOverEvent = false; + + } + + } + + + if( + !this._bHandledMouseOutEvent && + ( + ( + oRelatedTarget != this.element && + !Dom.isAncestor(this.element, oRelatedTarget) + ) + || bMovingToSubmenu + ) + ) { + + // Menu mouseout logic + + Event.removeListener(this.element, "mousemove", this._onMouseMove); + + this._nCurrentMouseX = Event.getPageX(oEvent); + + this._bHandledMouseOutEvent = true; + this._bHandledMouseOverEvent = false; + + } + +}, + + +/** +* @method _onMouseMove +* @description "click" event handler for the menu. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseMove: function(p_oEvent, p_oMenu) { + + if(this._bStopMouseEventHandlers) { + + return false; + + } + + this._nCurrentMouseX = Event.getPageX(p_oEvent); + +}, + + +/** +* @method _onClick +* @description "click" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onClick: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oTarget = Event.getTarget(oEvent); + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oSubmenu = oItemCfg.getProperty("submenu"); + + + /* + ACCESSIBILITY FEATURE FOR SCREEN READERS: + Expand/collapse the submenu when the user clicks + on the submenu indicator image. + */ + + if(oTarget == oItem.submenuIndicator && oSubmenu) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + + oSubmenu.parent.focus(); + + } + else { + + this.clearActiveItem(); + + this.activeItem = oItem; + + oItem.cfg.setProperty("selected", true); + + oSubmenu.show(); + + } + + } + else { + + var sURL = oItemCfg.getProperty("url"), + bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#"), + sTarget = oItemCfg.getProperty("target"), + bHasTarget = (sTarget && sTarget.length > 0); + + /* + Prevent the browser from following links + equal to "#" + */ + + if( + oTarget.tagName.toUpperCase() == "A" && + bCurrentPageURL && !bHasTarget + ) { + + Event.preventDefault(oEvent); + + } + + if( + oTarget.tagName.toUpperCase() != "A" && + !bCurrentPageURL && !bHasTarget + ) { + + /* + Follow the URL of the item regardless of + whether or not the user clicked specifically + on the anchor element. + */ + + document.location = sURL; + + } + + + /* + If the item doesn't navigate to a URL and it doesn't have + a submenu, then collapse the menu tree. + */ + + if(bCurrentPageURL && !oSubmenu) { + + var oRoot = this.getRoot(); + + if(oRoot.cfg.getProperty("position") == "static") { + + oRoot.clearActiveItem(); + + } + else if(oRoot.cfg.getProperty("clicktohide")) { + + oRoot.hide(); + + } + + } + + } + + } + +}, + + +/** +* @method _onKeyDown +* @description "keydown" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onKeyDown: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0], + oItem = p_aArgs[1], + me = this, + oSubmenu; + + + /* + This function is called to prevent a bug in Firefox. In Firefox, + moving a DOM element into a stationary mouse pointer will cause the + browser to fire mouse events. This can result in the menu mouse + event handlers being called uncessarily, especially when menus are + moved into a stationary mouse pointer as a result of a + key event handler. + */ + function stopMouseEventHandlers() { + + me._bStopMouseEventHandlers = true; + + window.setTimeout(function() { + + me._bStopMouseEventHandlers = false; + + }, 10); + + } + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg, + oParentItem = this.parent, + oRoot, + oNextItem; + + + switch(oEvent.keyCode) { + + case 38: // Up arrow + case 40: // Down arrow + + if( + oItem == this.activeItem && + !oItemCfg.getProperty("selected") + ) { + + oItemCfg.setProperty("selected", true); + + } + else { + + oNextItem = (oEvent.keyCode == 38) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + oNextItem.focus(); + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + oBody.scrollTop = + + ( + oNextItem.element.offsetTop + + oNextItem.element.offsetHeight + ) - oBody.offsetHeight; + + + var nScrollTop = oBody.scrollTop, + nScrollTarget = + oBody.scrollHeight - oBody.offsetHeight; + + if(nScrollTop === 0) { + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + else if(nScrollTop == nScrollTarget) { + + this._enableScrollHeader(); + this._disableScrollFooter(); + + } + else { + + this._enableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + } + + } + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + + case 39: // Right arrow + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(!oItemCfg.getProperty("selected")) { + + oItemCfg.setProperty("selected", true); + + } + + oSubmenu.show(); + + oSubmenu.setInitialSelection(); + + } + else { + + oRoot = this.getRoot(); + + if(oRoot instanceof YAHOO.widget.MenuBar) { + + oNextItem = oRoot.activeItem.getNextEnabledSibling(); + + if(oNextItem) { + + oRoot.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + + } + + oNextItem.focus(); + + } + + } + + } + + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + + case 37: // Left arrow + + if(oParentItem) { + + var oParentMenu = oParentItem.parent; + + if(oParentMenu instanceof YAHOO.widget.MenuBar) { + + oNextItem = + oParentMenu.activeItem.getPreviousEnabledSibling(); + + if(oNextItem) { + + oParentMenu.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + + } + + oNextItem.focus(); + + } + + } + else { + + this.hide(); + + oParentItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + stopMouseEventHandlers(); + + break; + + } + + + } + + + if(oEvent.keyCode == 27) { // Esc key + + if(this.cfg.getProperty("position") == "dynamic") { + + this.hide(); + + if(this.parent) { + + this.parent.focus(); + + } + + } + else if(this.activeItem) { + + oSubmenu = this.activeItem.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + this.activeItem.focus(); + + } + else { + + this.activeItem.cfg.setProperty("selected", false); + this.activeItem.blur(); + + } + + } + + + Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onKeyPress +* @description "keypress" event handler for a Menu instance. +* @protected +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance that fired the event. +*/ +_onKeyPress: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0]; + + + if(oEvent.keyCode == 40 || oEvent.keyCode == 38) { + + YAHOO.util.Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onTextResize +* @description "textresize" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onTextResize: function(p_sType, p_aArgs, p_oMenu) { + + if(this.browser == "gecko" && !this._handleResize) { + + this._handleResize = true; + return; + + } + + + var oConfig = this.cfg; + + if(oConfig.getProperty("position") == "dynamic") { + + oConfig.setProperty("width", (this._getOffsetWidth() + "px")); + + } + +}, + + +/** +* @method _onScrollTargetMouseOver +* @description "mouseover" event handler for the menu's "header" and "footer" +* elements. Used to scroll the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOver: function(p_oEvent, p_oMenu) { + + this._cancelHideDelay(); + + var oTarget = Event.getTarget(p_oEvent), + oBody = this.body, + me = this, + nScrollTarget, + fnScrollFunction; + + + function scrollBodyDown() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop < nScrollTarget) { + + oBody.scrollTop = (nScrollTop + 1); + + me._enableScrollHeader(); + + } + else { + + oBody.scrollTop = nScrollTarget; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollFooter(); + + } + + } + + + function scrollBodyUp() { + + var nScrollTop = oBody.scrollTop; + + + if(nScrollTop > 0) { + + oBody.scrollTop = (nScrollTop - 1); + + me._enableScrollFooter(); + + } + else { + + oBody.scrollTop = 0; + + window.clearInterval(me._nBodyScrollId); + + me._disableScrollHeader(); + + } + + } + + + if(Dom.hasClass(oTarget, "hd")) { + + fnScrollFunction = scrollBodyUp; + + } + else { + + nScrollTarget = oBody.scrollHeight - oBody.offsetHeight; + + fnScrollFunction = scrollBodyDown; + + } + + + this._nBodyScrollId = window.setInterval(fnScrollFunction, 10); + +}, + + +/** +* @method _onScrollTargetMouseOut +* @description "mouseout" event handler for the menu's "header" and "footer" +* elements. Used to stop scrolling the body of the menu up and down when the +* menu's "maxheight" configuration property is set to a value greater than 0. +* @protected +* @param {Event} p_oEvent Object representing the DOM event object passed +* back by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onScrollTargetMouseOut: function(p_oEvent, p_oMenu) { + + window.clearInterval(this._nBodyScrollId); + + this._cancelHideDelay(); + +}, + + + +// Private methods + + +/** +* @method _onInit +* @description "init" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onInit: function(p_sType, p_aArgs, p_oMenu) { + + if( + ( + (this.parent && !this.lazyLoad) || + (!this.parent && this.cfg.getProperty("position") == "static") || + ( + !this.parent && + !this.lazyLoad && + this.cfg.getProperty("position") == "dynamic" + ) + ) && + this.getItemGroups().length === 0 + ) { + + if(this.srcElement) { + + this._initSubTree(); + + } + + + if(this.itemData) { + + this.addItems(this.itemData); + + } + + } + else if(this.lazyLoad) { + + this.cfg.fireQueue(); + + } + +}, + + +/** +* @method _onBeforeRender +* @description "beforerender" event handler for the menu. Appends all of the +* <ul>, <li> and their accompanying +* title elements to the body element of the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onBeforeRender: function(p_sType, p_aArgs, p_oMenu) { + + var oConfig = this.cfg, + oEl = this.element, + nListElements = this._aListElements.length; + + + if(nListElements > 0) { + + var i = 0, + bFirstList = true, + oUL, + oGroupTitle; + + + do { + + oUL = this._aListElements[i]; + + if(oUL) { + + if(bFirstList) { + + Dom.addClass(oUL, "first-of-type"); + bFirstList = false; + + } + + + if(!Dom.isAncestor(oEl, oUL)) { + + this.appendToBody(oUL); + + } + + + oGroupTitle = this._aGroupTitleElements[i]; + + if(oGroupTitle) { + + if(!Dom.isAncestor(oEl, oGroupTitle)) { + + oUL.parentNode.insertBefore(oGroupTitle, oUL); + + } + + + Dom.addClass(oUL, "hastitle"); + + } + + } + + i++; + + } + while(i < nListElements); + + } + +}, + + +/** +* @method _onBeforeShow +* @description "beforeshow" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onBeforeShow: function(p_sType, p_aArgs, p_oMenu) { + + if(this.lazyLoad && this.getItemGroups().length === 0) { + + if(this.srcElement) { + + this._initSubTree(); + + } + + + if(this.itemData) { + + if( + this.parent && this.parent.parent && + this.parent.parent.srcElement && + this.parent.parent.srcElement.tagName.toUpperCase() == "SELECT" + ) { + + var nOptions = this.itemData.length; + + for(var n=0; n= nViewportHeight) { + + var nMaxHeight = this.cfg.getProperty("maxheight"); + + /* + Cache the original value for the "maxheight" configuration + property so that we can set it back when the menu is hidden. + */ + + this._nMaxHeight = nMaxHeight; + + this.cfg.setProperty("maxheight", (nViewportHeight - 20)); + + } + + + if(this.cfg.getProperty("maxheight") > 0) { + + var oBody = this.body; + + if(oBody.scrollTop > 0) { + + oBody.scrollTop = 0; + + } + + this._disableScrollHeader(); + this._enableScrollFooter(); + + } + + } + + +}, + + +/** +* @method _onShow +* @description "show" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onShow: function(p_sType, p_aArgs, p_oMenu) { + + this.setInitialFocus(); + + var oParent = this.parent; + + if(oParent) { + + var oParentMenu = oParent.parent, + aParentAlignment = oParentMenu.cfg.getProperty("submenualignment"), + aAlignment = this.cfg.getProperty("submenualignment"); + + + if( + (aParentAlignment[0] != aAlignment[0]) && + (aParentAlignment[1] != aAlignment[1]) + ) { + + this.cfg.setProperty( + "submenualignment", + [ aParentAlignment[0], aParentAlignment[1] ] + ); + + } + + + if( + !oParentMenu.cfg.getProperty("autosubmenudisplay") && + oParentMenu.cfg.getProperty("position") == "static" + ) { + + oParentMenu.cfg.setProperty("autosubmenudisplay", true); + + + function disableAutoSubmenuDisplay(p_oEvent) { + + if( + p_oEvent.type == "mousedown" || + (p_oEvent.type == "keydown" && p_oEvent.keyCode == 27) + ) { + + /* + Set the "autosubmenudisplay" to "false" if the user + clicks outside the menu bar. + */ + + var oTarget = Event.getTarget(p_oEvent); + + if( + oTarget != oParentMenu.element || + !YAHOO.util.Dom.isAncestor(oParentMenu.element, oTarget) + ) { + + oParentMenu.cfg.setProperty( + "autosubmenudisplay", + false + ); + + Event.removeListener( + document, + "mousedown", + disableAutoSubmenuDisplay + ); + + Event.removeListener( + document, + "keydown", + disableAutoSubmenuDisplay + ); + + } + + } + + } + + Event.addListener(document, "mousedown", disableAutoSubmenuDisplay); + Event.addListener(document, "keydown", disableAutoSubmenuDisplay); + + } + + } + else if(!oParent && this.lazyLoad) { + + this.cfg.refireEvent("xy"); + + } + +}, + + +/** +* @method _onBeforeHide +* @description "beforehide" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onBeforeHide: function(p_sType, p_aArgs, p_oMenu) { + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + oActiveItem.blur(); + + } + +}, + + +/** +* @method _onHide +* @description "hide" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired +* the event. +*/ +_onHide: function(p_sType, p_aArgs, p_oMenu) { + + if(this._nMaxHeight != -1) { + + this.cfg.setProperty("maxheight", this._nMaxHeight); + + this._nMaxHeight = -1; + + } + +}, + + +/** +* @method _onParentMenuConfigChange +* @description "configchange" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onParentMenuConfigChange: function(p_sType, p_aArgs, p_oSubmenu) { + + var sPropertyName = p_aArgs[0][0], + oPropertyValue = p_aArgs[0][1]; + + switch(sPropertyName) { + + case "iframe": + case "constraintoviewport": + case "hidedelay": + case "showdelay": + case "submenuhidedelay": + case "clicktohide": + case "effect": + case "classname": + + p_oSubmenu.cfg.setProperty(sPropertyName, oPropertyValue); + + break; + + } + +}, + + +/** +* @method _onParentMenuRender +* @description "render" event handler for a submenu. Renders a +* submenu in response to the firing of its parent's "render" event. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onParentMenuRender: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParentMenu = p_oSubmenu.parent.parent, + + oConfig = { + + constraintoviewport: + oParentMenu.cfg.getProperty("constraintoviewport"), + + xy: [0,0], + + clicktohide: oParentMenu.cfg.getProperty("clicktohide"), + + effect: oParentMenu.cfg.getProperty("effect"), + + showdelay: oParentMenu.cfg.getProperty("showdelay"), + + hidedelay: oParentMenu.cfg.getProperty("hidedelay"), + + submenuhidedelay: oParentMenu.cfg.getProperty("submenuhidedelay"), + + classname: oParentMenu.cfg.getProperty("classname") + + }; + + + /* + Only sync the "iframe" configuration property if the parent + menu's "position" configuration is the same. + */ + + if( + this.cfg.getProperty("position") == + oParentMenu.cfg.getProperty("position") + ) { + + oConfig.iframe = oParentMenu.cfg.getProperty("iframe"); + + } + + + p_oSubmenu.cfg.applyConfig(oConfig); + + + if(!this.lazyLoad) { + + var oLI = this.parent.element; + + if(this.element.parentNode == oLI) { + + this.render(); + + } + else { + + this.render(oLI); + + } + + } + +}, + + +/** +* @method _onSubmenuBeforeShow +* @description "beforeshow" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuBeforeShow: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent, + aAlignment = oParent.parent.cfg.getProperty("submenualignment"); + + this.cfg.setProperty( + "context", + [oParent.element, aAlignment[0], aAlignment[1]] + ); + + + var nScrollTop = oParent.parent.body.scrollTop; + + if( + (this.browser == "gecko" || this.browser == "safari") + && nScrollTop > 0 + ) { + + this.cfg.setProperty("y", (this.cfg.getProperty("y") - nScrollTop)); + + } + +}, + + +/** +* @method _onSubmenuShow +* @description "show" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuShow: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + + oParent.submenuIndicator.firstChild.nodeValue = + oParent.EXPANDED_SUBMENU_INDICATOR_TEXT; + +}, + + +/** +* @method _onSubmenuHide +* @description "hide" Custom Event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuHide: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + + oParent.submenuIndicator.firstChild.nodeValue = + oParent.COLLAPSED_SUBMENU_INDICATOR_TEXT; + +}, + + +/** +* @method _onMenuItemFocus +* @description "focus" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item +* that fired the event. +*/ +_onMenuItemFocus: function(p_sType, p_aArgs, p_oItem) { + + this.activeItem = p_oItem; + +}, + + +/** +* @method _onMenuItemBlur +* @description "blur" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event +* that was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +*/ +_onMenuItemBlur: function(p_sType, p_aArgs) { + + this.activeItem = null; + +}, + + +/** +* @method _onMenuItemConfigChange +* @description "configchange" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item +* that fired the event. +*/ +_onMenuItemConfigChange: function(p_sType, p_aArgs, p_oItem) { + + var sProperty = p_aArgs[0][0]; + + switch(sProperty) { + + case "submenu": + + var oSubmenu = p_aArgs[0][1]; + + if(oSubmenu) { + + this._configureSubmenu(p_oItem); + + } + + break; + + case "text": + case "helptext": + + /* + A change to an item's "text" or "helptext" + configuration properties requires the width of the parent + menu to be recalculated. + */ + + if(this.element.style.width) { + + var sWidth = this._getOffsetWidth() + "px"; + + Dom.setStyle(this.element, "width", sWidth); + + } + + break; + + } + +}, + + + +// Public event handlers for configuration properties + + +/** +* @method enforceConstraints +* @description The default event handler executed when the moveEvent is fired, +* if the "constraintoviewport" configuration property is set to true. +* @param {String} type The name of the event that was fired. +* @param {Array} args Collection of arguments sent when the +* event was fired. +* @param {Array} obj Array containing the current Menu instance +* and the item that fired the event. +*/ +enforceConstraints: function(type, args, obj) { + + var oConfig = this.cfg, + pos = args[0], + + x = pos[0], + y = pos[1], + + offsetHeight = this.element.offsetHeight, + offsetWidth = this.element.offsetWidth, + + viewPortWidth = YAHOO.util.Dom.getViewportWidth(), + viewPortHeight = YAHOO.util.Dom.getViewportHeight(), + + scrollX = Math.max( + document.documentElement.scrollLeft, + document.body.scrollLeft + ), + + scrollY = Math.max( + document.documentElement.scrollTop, + document.body.scrollTop + ), + + nPadding = ( + this.parent && + this.parent.parent instanceof YAHOO.widget.MenuBar + ) ? 0 : 10, + + topConstraint = scrollY + nPadding, + leftConstraint = scrollX + nPadding, + bottomConstraint = scrollY + viewPortHeight - offsetHeight - nPadding, + rightConstraint = scrollX + viewPortWidth - offsetWidth - nPadding, + + aContext = oConfig.getProperty("context"), + oContextElement = aContext ? aContext[0] : null; + + + if (x < 10) { + + x = leftConstraint; + + } else if ((x + offsetWidth) > viewPortWidth) { + + if( + oContextElement && + ((x - oContextElement.offsetWidth) > offsetWidth) + ) { + + x = (x - (oContextElement.offsetWidth + offsetWidth)); + + } + else { + + x = rightConstraint; + + } + + } + + if (y < 10) { + + y = topConstraint; + + } else if (y > bottomConstraint) { + + if(oContextElement && (y > offsetHeight)) { + + y = ((y + oContextElement.offsetHeight) - offsetHeight); + + } + else { + + y = bottomConstraint; + + } + + } + + oConfig.setProperty("x", x, true); + oConfig.setProperty("y", y, true); + oConfig.setProperty("xy", [x,y], true); + +}, + + +/** +* @method configVisible +* @description Event handler for when the "visible" configuration property +* the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configVisible: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + YAHOO.widget.Menu.superclass.configVisible.call( + this, + p_sType, + p_aArgs, + p_oMenu + ); + + } + else { + + var bVisible = p_aArgs[0], + sDisplay = Dom.getStyle(this.element, "display"); + + if(bVisible) { + + if(sDisplay != "block") { + this.beforeShowEvent.fire(); + Dom.setStyle(this.element, "display", "block"); + this.showEvent.fire(); + } + + } + else { + + if(sDisplay == "block") { + this.beforeHideEvent.fire(); + Dom.setStyle(this.element, "display", "none"); + this.hideEvent.fire(); + } + + } + + } + +}, + + +/** +* @method configPosition +* @description Event handler for when the "position" configuration property +* of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configPosition: function(p_sType, p_aArgs, p_oMenu) { + + var sCSSPosition = p_aArgs[0] == "static" ? "static" : "absolute", + oCfg = this.cfg; + + Dom.setStyle(this.element, "position", sCSSPosition); + + + if(sCSSPosition == "static") { + + /* + Remove the iframe for statically positioned menus since it will + intercept mouse events. + */ + + oCfg.setProperty("iframe", false); + + + // Statically positioned menus are visible by default + + Dom.setStyle(this.element, "display", "block"); + + oCfg.setProperty("visible", true); + + } + else { + + /* + Even though the "visible" property is queued to + "false" by default, we need to set the "visibility" property to + "hidden" since Overlay's "configVisible" implementation checks the + element's "visibility" style property before deciding whether + or not to show an Overlay instance. + */ + + Dom.setStyle(this.element, "visibility", "hidden"); + + } + + + if(sCSSPosition == "absolute") { + + var nZIndex = oCfg.getProperty("zindex"); + + if(!nZIndex || nZIndex === 0) { + + nZIndex = this.parent ? + (this.parent.parent.cfg.getProperty("zindex") + 1) : 1; + + oCfg.setProperty("zindex", nZIndex); + + } + + } + +}, + + +/** +* @method configIframe +* @description Event handler for when the "iframe" configuration property of +* the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configIframe: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + YAHOO.widget.Menu.superclass.configIframe.call( + this, + p_sType, + p_aArgs, + p_oMenu + ); + + } + +}, + + +/** +* @method configHideDelay +* @description Event handler for when the "hidedelay" configuration property +* of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configHideDelay: function(p_sType, p_aArgs, p_oMenu) { + + var nHideDelay = p_aArgs[0], + oMouseOutEvent = this.mouseOutEvent, + oMouseOverEvent = this.mouseOverEvent, + oKeyDownEvent = this.keyDownEvent; + + if(nHideDelay > 0) { + + /* + Only assign event handlers once. This way the user change + the value for the hidedelay as many times as they want. + */ + + if(!this._bHideDelayEventHandlersAssigned) { + + oMouseOutEvent.subscribe(this._execHideDelay, true); + oMouseOverEvent.subscribe(this._cancelHideDelay, this, true); + oKeyDownEvent.subscribe(this._cancelHideDelay, this, true); + + this._bHideDelayEventHandlersAssigned = true; + + } + + } + else { + + oMouseOutEvent.unsubscribe(this._execHideDelay, this); + oMouseOverEvent.unsubscribe(this._cancelHideDelay, this); + oKeyDownEvent.unsubscribe(this._cancelHideDelay, this); + + this._bHideDelayEventHandlersAssigned = false; + + } + +}, + + +/** +* @method configContainer +* @description Event handler for when the "container" configuration property +of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configContainer: function(p_sType, p_aArgs, p_oMenu) { + + var oElement = p_aArgs[0]; + + if(typeof oElement == 'string') { + + this.cfg.setProperty( + "container", + document.getElementById(oElement), + true + ); + + } + +}, + + +/** +* @method configMaxHeight +* @description Event handler for when the "maxheight" configuration property of +* a Menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event +* was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired +* the event. +*/ +configMaxHeight: function(p_sType, p_aArgs, p_oMenu) { + + var nMaxHeight = p_aArgs[0], + oBody = this.body, + oHeader = this.header, + oFooter = this.footer, + fnMouseOver = this._onScrollTargetMouseOver, + fnMouseOut = this._onScrollTargetMouseOut; + + + if((nMaxHeight > 0) && (oBody.offsetHeight > nMaxHeight)) { + + if(!this.cfg.getProperty("width")) { + + this._setWidth(); + + } + + if(!oHeader && !oFooter) { + + this.setHeader(" "); + this.setFooter(" "); + + oHeader = this.header; + oFooter = this.footer; + + Dom.addClass(oHeader, "topscrollbar"); + Dom.addClass(oFooter, "bottomscrollbar"); + + this.element.insertBefore(oHeader, oBody); + this.element.appendChild(oFooter); + + Event.addListener(oHeader, "mouseover", fnMouseOver, this, true); + Event.addListener(oHeader, "mouseout", fnMouseOut, this, true); + Event.addListener(oFooter, "mouseover", fnMouseOver, this, true); + Event.addListener(oFooter, "mouseout", fnMouseOut, this, true); + + } + + var nHeight = + + ( + nMaxHeight - + (this.footer.offsetHeight + this.header.offsetHeight) + ); + + Dom.setStyle(oBody, "height", (nHeight + "px")); + Dom.setStyle(oBody, "overflow", "hidden"); + + } + else if(oHeader && oFooter) { + + Dom.setStyle(oBody, "height", "auto"); + Dom.setStyle(oBody, "overflow", "visible"); + + Event.removeListener(oHeader, "mouseover", fnMouseOver); + Event.removeListener(oHeader, "mouseout", fnMouseOut); + Event.removeListener(oFooter, "mouseover", fnMouseOver); + Event.removeListener(oFooter, "mouseout", fnMouseOut); + + this.element.removeChild(oHeader); + this.element.removeChild(oFooter); + + this.header = null; + this.footer = null; + + } + +}, + + +/** +* @method configClassName +* @description Event handler for when the "classname" configuration property of +* a menu changes. +* @param {String} p_sType The name of the event that was fired. +* @param {Array} p_aArgs Collection of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu The Menu instance fired the event. +*/ +configClassName: function(p_sType, p_aArgs, p_oMenu) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + +}, + + +// Public methods + + +/** +* @method initEvents +* @description Initializes the custom events for the menu. +*/ +initEvents: function() { + + YAHOO.widget.Menu.superclass.initEvents.call(this); + + // Create custom events + + var CustomEvent = YAHOO.util.CustomEvent; + + this.mouseOverEvent = new CustomEvent("mouseOverEvent", this); + this.mouseOutEvent = new CustomEvent("mouseOutEvent", this); + this.mouseDownEvent = new CustomEvent("mouseDownEvent", this); + this.mouseUpEvent = new CustomEvent("mouseUpEvent", this); + this.clickEvent = new CustomEvent("clickEvent", this); + this.keyPressEvent = new CustomEvent("keyPressEvent", this); + this.keyDownEvent = new CustomEvent("keyDownEvent", this); + this.keyUpEvent = new CustomEvent("keyUpEvent", this); + this.itemAddedEvent = new CustomEvent("itemAddedEvent", this); + this.itemRemovedEvent = new CustomEvent("itemRemovedEvent", this); + +}, + + +/** +* @method getRoot +* @description Finds the menu's root menu. +*/ +getRoot: function() { + + var oItem = this.parent; + + if(oItem) { + + var oParentMenu = oItem.parent; + + return oParentMenu ? oParentMenu.getRoot() : this; + + } + else { + + return this; + + } + +}, + + +/** +* @method toString +* @description Returns a string representing the menu. +* @return {String} +*/ +toString: function() { + + return ("Menu " + this.id); + +}, + + +/** +* @method setItemGroupTitle +* @description Sets the title of a group of menu items. +* @param {String} p_sGroupTitle String specifying the title of the group. +* @param {Number} p_nGroupIndex Optional. Number specifying the group to which +* the title belongs. +*/ +setItemGroupTitle: function(p_sGroupTitle, p_nGroupIndex) { + + if(typeof p_sGroupTitle == "string" && p_sGroupTitle.length > 0) { + + var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0, + oTitle = this._aGroupTitleElements[nGroupIndex]; + + + if(oTitle) { + + oTitle.innerHTML = p_sGroupTitle; + + } + else { + + oTitle = document.createElement(this.GROUP_TITLE_TAG_NAME); + + oTitle.innerHTML = p_sGroupTitle; + + this._aGroupTitleElements[nGroupIndex] = oTitle; + + } + + + var i = this._aGroupTitleElements.length - 1, + nFirstIndex; + + do { + + if(this._aGroupTitleElements[i]) { + + Dom.removeClass(this._aGroupTitleElements[i], "first-of-type"); + + nFirstIndex = i; + + } + + } + while(i--); + + + if(nFirstIndex !== null) { + + Dom.addClass( + this._aGroupTitleElements[nFirstIndex], + "first-of-type" + ); + + } + + } + +}, + + + +/** +* @method addItem +* @description Appends an item to the menu. +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance to be added to the menu. +* @param {String} p_oItem String specifying the text of the item to be added +* to the menu. +* @param {Object} p_oItem Object literal containing a set of menu item +* configuration properties. +* @param {Number} p_nGroupIndex Optional. Number indicating the group to +* which the item belongs. +* @return {YAHOO.widget.MenuItem} +*/ +addItem: function(p_oItem, p_nGroupIndex) { + + if(p_oItem) { + + return this._addItemToGroup(p_nGroupIndex, p_oItem); + + } + +}, + + +/** +* @method addItems +* @description Adds an array of items to the menu. +* @param {Array} p_aItems Array of items to be added to the menu. The array +* can contain strings specifying the text for each item to be created, object +* literals specifying each of the menu item configuration properties, +* or MenuItem instances. +* @param {Number} p_nGroupIndex Optional. Number specifying the group to +* which the items belongs. +* @return {Array} +*/ +addItems: function(p_aItems, p_nGroupIndex) { + + if(Lang.isArray(p_aItems)) { + + var nItems = p_aItems.length, + aItems = [], + oItem; + + + for(var i=0; i 0) { + + var i = nItems - 1, + oItem, + oSubmenu; + + do { + + oItem = aItems[i]; + + if(oItem) { + + oSubmenu = oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + this.cfg.configChangedEvent.unsubscribe( + this._onParentMenuConfigChange, + oSubmenu + ); + + this.renderEvent.unsubscribe( + this._onParentMenuRender, + oSubmenu + ); + + } + + oItem.destroy(); + + } + + } + while(i--); + + } + + + if(oHeader) { + + Event.purgeElement(oHeader); + oElement.removeChild(oHeader); + + } + + + if(oFooter) { + + Event.purgeElement(oFooter); + oElement.removeChild(oFooter); + } + + + if(oBody) { + + Event.purgeElement(oBody); + + oBody.innerHTML = ""; + + } + + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + +}, + + +/** +* @method destroy +* @description Removes the menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove all DOM event listeners + + Event.purgeElement(this.element); + + + // Remove Custom Event listeners + + this.mouseOverEvent.unsubscribeAll(); + this.mouseOutEvent.unsubscribeAll(); + this.mouseDownEvent.unsubscribeAll(); + this.mouseUpEvent.unsubscribeAll(); + this.clickEvent.unsubscribeAll(); + this.keyPressEvent.unsubscribeAll(); + this.keyDownEvent.unsubscribeAll(); + this.keyUpEvent.unsubscribeAll(); + this.itemAddedEvent.unsubscribeAll(); + this.itemRemovedEvent.unsubscribeAll(); + + YAHOO.widget.Module.textResizeEvent.unsubscribe(this._onTextResize, this); + + + // Remove all items + + this.clearContent(); + + + this._aItemGroups = null; + this._aListElements = null; + this._aGroupTitleElements = null; + + + // Continue with the superclass implementation of this method + + YAHOO.widget.Menu.superclass.destroy.call(this); + + +}, + + +/** +* @method setInitialFocus +* @description Sets focus to the menu's first enabled item. +*/ +setInitialFocus: function() { + + var oItem = this._getFirstEnabledItem(); + + if(oItem) { + + oItem.focus(); + } + +}, + + +/** +* @method setInitialSelection +* @description Sets the "selected" configuration property of the menu's first +* enabled item to "true." +*/ +setInitialSelection: function() { + + var oItem = this._getFirstEnabledItem(); + + if(oItem) { + + oItem.cfg.setProperty("selected", true); + } + +}, + + +/** +* @method clearActiveItem +* @description Sets the "selected" configuration property of the menu's active +* item to "false" and hides the item's submenu. +* @param {Boolean} p_bBlur Boolean indicating if the menu's active item +* should be blurred. +*/ +clearActiveItem: function(p_bBlur) { + + if(this.cfg.getProperty("showdelay") > 0) { + + this._cancelShowDelay(); + + } + + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + if(p_bBlur) { + + oActiveItem.blur(); + + } + + } + +}, + + +/** +* @description Initializes the class's configurable properties which can be +* changed using the menu's Config object ("cfg"). +* @method initDefaultConfig +*/ +initDefaultConfig: function() { + + YAHOO.widget.Menu.superclass.initDefaultConfig.call(this); + + var oConfig = this.cfg; + + // Add configuration attributes + + /* + Change the default value for the "visible" configuration + property to "false" by re-adding the property. + */ + + /** + * @config visible + * @description Boolean indicating whether or not the menu is visible. If + * the menu's "position" configuration property is set to "dynamic" (the + * default), this property toggles the menu's <div> + * element's "visibility" style property between "visible" (true) or + * "hidden" (false). If the menu's "position" configuration property is + * set to "static" this property toggles the menu's + * <div> element's "display" style property + * between "block" (true) or "none" (false). + * @default false + * @type Boolean + */ + oConfig.addProperty( + "visible", + { + value:false, + handler:this.configVisible, + validator:this.cfg.checkBoolean + } + ); + + + /* + Change the default value for the "constraintoviewport" configuration + property to "true" by re-adding the property. + */ + + /** + * @config constraintoviewport + * @description Boolean indicating if the menu will try to remain inside + * the boundaries of the size of viewport. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "constraintoviewport", + { + value:true, + handler:this.configConstrainToViewport, + validator:this.cfg.checkBoolean, + supercedes:["iframe","x","y","xy"] + } + ); + + + /** + * @config position + * @description String indicating how a menu should be positioned on the + * screen. Possible values are "static" and "dynamic." Static menus are + * visible by default and reside in the normal flow of the document + * (CSS position: static). Dynamic menus are hidden by default, reside + * out of the normal flow of the document (CSS position: absolute), and + * can overlay other elements on the screen. + * @default dynamic + * @type String + */ + oConfig.addProperty( + "position", + { + value: "dynamic", + handler: this.configPosition, + validator: this._checkPosition, + supercedes: ["visible"] + } + ); + + + /** + * @config submenualignment + * @description Array defining how submenus should be aligned to their + * parent menu item. The format is: [itemCorner, submenuCorner]. By default + * a submenu's top left corner is aligned to its parent menu item's top + * right corner. + * @default ["tl","tr"] + * @type Array + */ + oConfig.addProperty("submenualignment", { value: ["tl","tr"] } ); + + + /** + * @config autosubmenudisplay + * @description Boolean indicating if submenus are automatically made + * visible when the user mouses over the menu's items. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "autosubmenudisplay", + { + value: true, + validator: oConfig.checkBoolean + } + ); + + + /** + * @config showdelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is made visible when the user mouses over + * the menu's items. + * @default 250 + * @type Number + */ + oConfig.addProperty( + "showdelay", + { + value: 250, + validator: oConfig.checkNumber + } + ); + + + /** + * @config hidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before the menu is hidden. + * @default 0 + * @type Number + */ + oConfig.addProperty( + "hidedelay", + { + value: 0, + validator: oConfig.checkNumber, + handler: this.configHideDelay, + suppressEvent: true + } + ); + + + /** + * @config submenuhidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is hidden when the user mouses out of a menu item + * heading in the direction of a submenu. The value must be greater than or + * equal to the value specified for the "showdelay" configuration property. + * @default 250 + * @type Number + */ + oConfig.addProperty( + "submenuhidedelay", + { + value: 250, + validator: oConfig.checkNumber + } + ); + + + /** + * @config clicktohide + * @description Boolean indicating if the menu will automatically be + * hidden if the user clicks outside of it. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "clicktohide", + { + value: true, + validator: oConfig.checkBoolean + } + ); + + + /** + * @config container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the menu's markup should be + * rendered into. + * @type HTMLElement|String + * @default document.body + */ + oConfig.addProperty( + "container", + { + value:document.body, + handler:this.configContainer + } + ); + + + /** + * @config maxheight + * @description Defines the maximum height (in pixels) for a menu before the + * contents of the body are scrolled. + * @default 0 + * @type Number + */ + oConfig.addProperty( + "maxheight", + { + value: 0, + validator: oConfig.checkNumber, + handler: this.configMaxHeight + } + ); + + + /** + * @config classname + * @description CSS class to be applied to the menu's root + * <div> element. The specified class(es) are + * appended in addition to the default class as specified by the menu's + * CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + "classname", + { + value: null, + handler: this.configClassName, + validator: this._checkString + } + ); + +} + +}); // END YAHOO.lang.extend + +})(); + + + +(function() { + +var Dom = YAHOO.util.Dom, + Module = YAHOO.widget.Module, + Menu = YAHOO.widget.Menu, + + m_oMenuItemElement = null, + m_oSubmenuIndicator = null, + m_oCheckedIndicator = null; + + +/** +* Creates an item for a menu. +* +* @param {String} p_oObject String specifying the text of the menu item. +* @param {HTMLLIElement} p_oObject Object specifying +* the <li> element of the menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu item. +* @param {HTMLOptionElement} p_oObject Object +* specifying the <option> element of the menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu item. See configuration class documentation +* for more details. +* @class MenuItem +* @constructor +*/ +YAHOO.widget.MenuItem = function(p_oObject, p_oConfig) { + + if(p_oObject) { + + if(p_oConfig) { + + this.parent = p_oConfig.parent; + this.value = p_oConfig.value; + this.id = p_oConfig.id; + + } + + this.init(p_oObject, p_oConfig); + + } + +}; + + +YAHOO.widget.MenuItem.prototype = { + + // Constants + + + /** + * @property SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * menu item's submenu arrow indicator. + * @default "nt/ic/ut/alt1/menuarorght8_nrm_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarorght8_nrm_1.gif", + + + /** + * @property SELECTED_SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * submenu arrow indicator when the menu item is selected. + * @default "nt/ic/ut/alt1/menuarorght8_hov_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + SELECTED_SUBMENU_INDICATOR_IMAGE_PATH: + "nt/ic/ut/alt1/menuarorght8_hov_1.gif", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * submenu arrow indicator when the menu item is disabled. + * @default "nt/ic/ut/alt1/menuarorght8_dim_1.gif" + * @final + * @type String + * @deprecated All submenu indicator images are applied via a CSS + * background image. See "submenuindicator" class name in menu.css. + */ + DISABLED_SUBMENU_INDICATOR_IMAGE_PATH: + "nt/ic/ut/alt1/menuarorght8_dim_1.gif", + + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator. + * @default "Collapsed. Click to expand." + * @final + * @type String + * @deprecated Use COLLAPSED_SUBMENU_INDICATOR_TEXT. + */ + COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT: "Collapsed. Click to expand.", + + + /** + * @property EXPANDED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator when the submenu is visible. + * @default "Expanded. Click to collapse." + * @final + * @type String + * @deprecated Use EXPANDED_SUBMENU_INDICATOR_TEXT. + */ + EXPANDED_SUBMENU_INDICATOR_ALT_TEXT: "Expanded. Click to collapse.", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator when the menu item is disabled. + * @default "Disabled." + * @final + * @type String + * @deprecated Use DISABLED_SUBMENU_INDICATOR_TEXT. + */ + DISABLED_SUBMENU_INDICATOR_ALT_TEXT: "Disabled.", + + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the <em> + * element used for the submenu arrow indicator. + * @default "Submenu collapsed. Click to expand submenu." + * @final + * @type String + */ + COLLAPSED_SUBMENU_INDICATOR_TEXT: + "Submenu collapsed. Click to expand submenu.", + + + /** + * @property EXPANDED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the submenu is visible. + * @default "Submenu expanded. Click to collapse submenu." + * @final + * @type String + */ + EXPANDED_SUBMENU_INDICATOR_TEXT: + "Submenu expanded. Click to collapse submenu.", + + + /** + * @property DISABLED_SUBMENU_INDICATOR_TEXT + * @description String representing the text for the submenu arrow indicator + * element (<em>) when the menu item is disabled. + * @default "Submenu collapsed. (Item disabled.)." + * @final + * @type String + */ + DISABLED_SUBMENU_INDICATOR_TEXT: "Submenu collapsed. (Item disabled.)", + + + /** + * @property CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the checked state. + * @default "nt/ic/ut/bsc/menuchk8_nrm_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. See "checkedindicator" class name in menu.css. + */ + CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_nrm_1.gif", + + + /** + * @property SELECTED_CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the selected checked state. + * @default "nt/ic/ut/bsc/menuchk8_hov_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. See "checkedindicator" class name in menu.css. + */ + SELECTED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_hov_1.gif", + + + /** + * @property DISABLED_CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the disabled checked state. + * @default "nt/ic/ut/bsc/menuchk8_dim_1.gif" + * @final + * @type String + * @deprecated All checked indicator images are applied via a CSS + * background image. + */ + DISABLED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_dim_1.gif", + + + /** + * @property CHECKED_IMAGE_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the checked image. + * @default "Checked." + * @final + * @type String + * @deprecated Use CHECKED_TEXT. + */ + CHECKED_IMAGE_ALT_TEXT: "Checked.", + + + /** + * @property DISABLED_CHECKED_IMAGE_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the checked image when the item is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + * @deprecated Use DISABLED_CHECKED_TEXT. + */ + DISABLED_CHECKED_IMAGE_ALT_TEXT: "Checked. (Item disabled.)", + + + /** + * @property CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>). + * @default "Checked." + * @final + * @type String + */ + CHECKED_TEXT: "Menu item checked.", + + + /** + * @property DISABLED_CHECKED_TEXT + * @description String representing the text to be used for the checked + * indicator element (<em>) when the menu item + * is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + */ + DISABLED_CHECKED_TEXT: "Checked. (Item disabled.)", + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied to the + * <li> element of the menu item. + * @default "yuimenuitem" + * @final + * @type String + */ + CSS_CLASS_NAME: "yuimenuitem", + + + /** + * @property SUBMENU_TYPE + * @description Object representing the type of menu to instantiate and + * add when parsing the child nodes of the menu item's source HTML element. + * @final + * @type YAHOO.widget.Menu + */ + SUBMENU_TYPE: null, + + + /** + * @property IMG_ROOT + * @description String representing the prefix path to use for + * non-secure images. + * @default "http://us.i1.yimg.com/us.yimg.com/i/" + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + IMG_ROOT: "http://us.i1.yimg.com/us.yimg.com/i/", + + + /** + * @property IMG_ROOT_SSL + * @description String representing the prefix path to use for securely + * served images. + * @default "https://a248.e.akamai.net/sec.yimg.com/i/" + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + IMG_ROOT_SSL: "https://a248.e.akamai.net/sec.yimg.com/i/", + + + + // Private member variables + + + /** + * @property _oAnchor + * @description Object reference to the menu item's + * <a> element. + * @default null + * @private + * @type HTMLAnchorElement + */ + _oAnchor: null, + + + /** + * @property _oText + * @description Object reference to the menu item's text node. + * @default null + * @private + * @type TextNode + */ + _oText: null, + + + /** + * @property _oHelpTextEM + * @description Object reference to the menu item's help text + * <em> element. + * @default null + * @private + * @type HTMLElement + */ + _oHelpTextEM: null, + + + /** + * @property _oSubmenu + * @description Object reference to the menu item's submenu. + * @default null + * @private + * @type YAHOO.widget.Menu + */ + _oSubmenu: null, + + + /** + * @property _checkImage + * @description Object reference to the menu item's checkmark image. + * @default null + * @private + * @type HTMLImageElement + * @deprecated Use _oCheckedIndicator. + */ + _checkImage: null, + + + /** + * @property _oCheckedIndicator + * @description Object reference to the menu item's checkmark image. + * @default HTMLElement + * @private + * @type HTMLElement + */ + _oCheckedIndicator: null, + + + /** + * @property _oOnclickAttributeValue + * @description Object reference to the menu item's current value for the + * "onclick" configuration attribute. + * @default null + * @private + * @type Object + */ + _oOnclickAttributeValue: null, + + + /** + * @property _sClassName + * @description The current value of the "classname" configuration attribute. + * @default null + * @private + * @type String + */ + _sClassName: null, + + + + // Public properties + + + /** + * @property constructor + * @description Object reference to the menu item's constructor function. + * @default YAHOO.widget.MenuItem + * @type YAHOO.widget.MenuItem + */ + constructor: YAHOO.widget.MenuItem, + + + /** + * @property imageRoot + * @description String representing the root path for all of the menu + * item's images. + * @type String + * @deprecated All menu item images are now applied via CSS + * background images. + */ + imageRoot: null, + + + /** + * @property isSecure + * @description Boolean representing whether or not the current browsing + * context is secure (HTTPS). + * @type Boolean + * @deprecated All menu item images are now applied via CSS + * background images. + */ + isSecure: Module.prototype.isSecure, + + + /** + * @property index + * @description Number indicating the ordinal position of the menu item in + * its group. + * @default null + * @type Number + */ + index: null, + + + /** + * @property groupIndex + * @description Number indicating the index of the group to which the menu + * item belongs. + * @default null + * @type Number + */ + groupIndex: null, + + + /** + * @property parent + * @description Object reference to the menu item's parent menu. + * @default null + * @type YAHOO.widget.Menu + */ + parent: null, + + + /** + * @property element + * @description Object reference to the menu item's + * <li> element. + * @default HTMLLIElement + * @type HTMLLIElement + */ + element: null, + + + /** + * @property srcElement + * @description Object reference to the HTML element (either + * <li>, <optgroup> or + * <option>) used create the menu item. + * @default HTMLLIElement|HTMLOptGroupElement|HTMLOptionElement + * @type HTMLLIElement| + * HTMLOptGroupElement|HTMLOptionElement + */ + srcElement: null, + + + /** + * @property value + * @description Object reference to the menu item's value. + * @default null + * @type Object + */ + value: null, + + + /** + * @property submenuIndicator + * @description Object reference to the <em> element + * used to create the submenu indicator for the menu item. + * @default HTMLElement + * @type HTMLElement + */ + submenuIndicator: null, + + + /** + * @property browser + * @description String representing the browser. + * @type String + */ + browser: Module.prototype.browser, + + + /** + * @property id + * @description Id of the menu item's root <li> + * element. This property should be set via the constructor using the + * configuration object literal. If an id is not specified, then one will + * be created using the "generateId" method of the Dom utility. + * @default null + * @type String + */ + id: null, + + + + // Events + + + /** + * @event destroyEvent + * @description Fires when the menu item's <li> + * element is removed from its parent <ul> element. + * @type YAHOO.util.CustomEvent + */ + destroyEvent: null, + + + /** + * @event mouseOverEvent + * @description Fires when the mouse has entered the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseOverEvent: null, + + + /** + * @event mouseOutEvent + * @description Fires when the mouse has left the menu item. Passes back + * the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseOutEvent: null, + + + /** + * @event mouseDownEvent + * @description Fires when the user mouses down on the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseDownEvent: null, + + + /** + * @event mouseUpEvent + * @description Fires when the user releases a mouse button while the mouse + * is over the menu item. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseUpEvent: null, + + + /** + * @event clickEvent + * @description Fires when the user clicks the on the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + clickEvent: null, + + + /** + * @event keyPressEvent + * @description Fires when the user presses an alphanumeric key when the + * menu item has focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyPressEvent: null, + + + /** + * @event keyDownEvent + * @description Fires when the user presses a key when the menu item has + * focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyDownEvent: null, + + + /** + * @event keyUpEvent + * @description Fires when the user releases a key when the menu item has + * focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyUpEvent: null, + + + /** + * @event focusEvent + * @description Fires when the menu item receives focus. + * @type YAHOO.util.CustomEvent + */ + focusEvent: null, + + + /** + * @event blurEvent + * @description Fires when the menu item loses the input focus. + * @type YAHOO.util.CustomEvent + */ + blurEvent: null, + + + /** + * @method init + * @description The MenuItem class's initialization method. This method is + * automatically called by the constructor, and sets up all DOM references + * for pre-existing markup, and creates required markup if it is not + * already present. + * @param {String} p_oObject String specifying the text of the menu item. + * @param {HTMLLIElement} p_oObject Object specifying + * the <li> element of the menu item. + * @param {HTMLOptGroupElement} p_oObject Object + * specifying the <optgroup> element of the menu item. + * @param {HTMLOptionElement} p_oObject Object + * specifying the <option> element of the menu item. + * @param {Object} p_oConfig Optional. Object literal specifying the + * configuration for the menu item. See configuration class documentation + * for more details. + */ + init: function(p_oObject, p_oConfig) { + + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = Menu; + + } + + + // Create the config object + + this.cfg = new YAHOO.util.Config(this); + + this.initDefaultConfig(); + + var oConfig = this.cfg; + + + if(this._checkString(p_oObject)) { + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject); + + } + else if(this._checkDOMNode(p_oObject)) { + + switch(p_oObject.tagName.toUpperCase()) { + + case "OPTION": + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject.text); + + this.srcElement = p_oObject; + + break; + + case "OPTGROUP": + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject.label); + + this.srcElement = p_oObject; + + this._initSubTree(); + + break; + + case "LI": + + // Get the anchor node (if it exists) + + var oAnchor = this._getFirstElement(p_oObject, "A"), + sURL = "#", + sTarget, + sText; + + + // Capture the "text" and/or the "URL" + + if(oAnchor) { + + sURL = oAnchor.getAttribute("href"); + sTarget = oAnchor.getAttribute("target"); + + if(oAnchor.innerText) { + + sText = oAnchor.innerText; + + } + else { + + var oRange = oAnchor.ownerDocument.createRange(); + + oRange.selectNodeContents(oAnchor); + + sText = oRange.toString(); + + } + + } + else { + + var oText = p_oObject.firstChild; + + sText = oText.nodeValue; + + oAnchor = document.createElement("a"); + + oAnchor.setAttribute("href", sURL); + + p_oObject.replaceChild(oAnchor, oText); + + oAnchor.appendChild(oText); + + } + + + this.srcElement = p_oObject; + this.element = p_oObject; + this._oAnchor = oAnchor; + + + // Check if emphasis has been applied to the MenuItem + + var oEmphasisNode = this._getFirstElement(oAnchor), + bEmphasis = false, + bStrongEmphasis = false; + + if(oEmphasisNode) { + + // Set a reference to the text node + + this._oText = oEmphasisNode.firstChild; + + switch(oEmphasisNode.tagName.toUpperCase()) { + + case "EM": + + bEmphasis = true; + + break; + + case "STRONG": + + bStrongEmphasis = true; + + break; + + } + + } + else { + + // Set a reference to the text node + + this._oText = oAnchor.firstChild; + + } + + + /* + Set these properties silently to sync up the + configuration object without making changes to the + element's DOM + */ + + oConfig.setProperty("text", sText, true); + oConfig.setProperty("url", sURL, true); + oConfig.setProperty("target", sTarget, true); + oConfig.setProperty("emphasis", bEmphasis, true); + oConfig.setProperty( + "strongemphasis", + bStrongEmphasis, + true + ); + + this._initSubTree(); + + break; + + } + + } + + + if(this.element) { + + var sId = this.element.id; + + if(!sId) { + + sId = this.id || Dom.generateId(); + + this.element.id = sId; + + } + + this.id = sId; + + + Dom.addClass(this.element, this.CSS_CLASS_NAME); + + + // Create custom events + + var CustomEvent = YAHOO.util.CustomEvent; + + this.destroyEvent = new CustomEvent("destroyEvent", this); + this.mouseOverEvent = new CustomEvent("mouseOverEvent", this); + this.mouseOutEvent = new CustomEvent("mouseOutEvent", this); + this.mouseDownEvent = new CustomEvent("mouseDownEvent", this); + this.mouseUpEvent = new CustomEvent("mouseUpEvent", this); + this.clickEvent = new CustomEvent("clickEvent", this); + this.keyPressEvent = new CustomEvent("keyPressEvent", this); + this.keyDownEvent = new CustomEvent("keyDownEvent", this); + this.keyUpEvent = new CustomEvent("keyUpEvent", this); + this.focusEvent = new CustomEvent("focusEvent", this); + this.blurEvent = new CustomEvent("blurEvent", this); + + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig); + + } + + oConfig.fireQueue(); + + + + + } + + }, + + + + // Private methods + + + /** + * @method _getFirstElement + * @description Returns an HTML element's first HTML element node. + * @private + * @param {HTMLElement} p_oElement Object + * reference specifying the element to be evaluated. + * @param {String} p_sTagName Optional. String specifying the tagname of + * the element to be retrieved. + * @return {HTMLElement} + */ + _getFirstElement: function(p_oElement, p_sTagName) { + + var oFirstChild = p_oElement.firstChild, + oElement; + + if(oFirstChild) { + + if(oFirstChild.nodeType == 1) { + + oElement = oFirstChild; + + } + else { + + var oNextSibling = oFirstChild.nextSibling; + + if(oNextSibling && oNextSibling.nodeType == 1) { + + oElement = oNextSibling; + + } + + } + + } + + + if(p_sTagName) { + + return (oElement && oElement.tagName.toUpperCase() == p_sTagName) ? + oElement : false; + + } + + return oElement; + + }, + + + /** + * @method _checkString + * @description Determines if an object is a string. + * @private + * @param {Object} p_oObject Object to be evaluated. + * @return {Boolean} + */ + _checkString: function(p_oObject) { + + return (typeof p_oObject == "string"); + + }, + + + /** + * @method _checkDOMNode + * @description Determines if an object is an HTML element. + * @private + * @param {Object} p_oObject Object to be evaluated. + * @return {Boolean} + */ + _checkDOMNode: function(p_oObject) { + + return (p_oObject && p_oObject.tagName); + + }, + + + /** + * @method _createRootNodeStructure + * @description Creates the core DOM structure for the menu item. + * @private + */ + _createRootNodeStructure: function () { + + if(!m_oMenuItemElement) { + + m_oMenuItemElement = document.createElement("li"); + m_oMenuItemElement.innerHTML = "s"; + + } + + this.element = m_oMenuItemElement.cloneNode(true); + this._oAnchor = this.element.firstChild; + this._oText = this._oAnchor.firstChild; + + this.element.appendChild(this._oAnchor); + + }, + + + /** + * @method _initSubTree + * @description Iterates the source element's childNodes collection and uses + * the child nodes to instantiate other menus. + * @private + */ + _initSubTree: function() { + + var oSrcEl = this.srcElement, + oConfig = this.cfg; + + + if(oSrcEl.childNodes.length > 0) { + + if( + this.parent.lazyLoad && + this.parent.srcElement && + this.parent.srcElement.tagName.toUpperCase() == "SELECT" + ) { + + oConfig.setProperty( + "submenu", + { id: Dom.generateId(), itemdata: oSrcEl.childNodes } + ); + + } + else { + + var oNode = oSrcEl.firstChild, + aOptions = []; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "DIV": + + oConfig.setProperty("submenu", oNode); + + break; + + case "OPTION": + + aOptions[aOptions.length] = oNode; + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + + var nOptions = aOptions.length; + + if(nOptions > 0) { + + var oMenu = new this.SUBMENU_TYPE(Dom.generateId()); + + oConfig.setProperty("submenu", oMenu); + + for(var n=0; n 0) { + + oAnchor.setAttribute("target", sTarget); + + } + else { + + oAnchor.removeAttribute("target"); + + } + + }, + + + /** + * @method configEmphasis + * @description Event handler for when the "emphasis" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configEmphasis: function(p_sType, p_aArgs, p_oItem) { + + var bEmphasis = p_aArgs[0], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + oEM; + + + if(bEmphasis && oConfig.getProperty("strongemphasis")) { + + oConfig.setProperty("strongemphasis", false); + + } + + + if(oAnchor) { + + if(bEmphasis) { + + oEM = document.createElement("em"); + oEM.appendChild(oText); + + oAnchor.appendChild(oEM); + + } + else { + + oEM = this._getFirstElement(oAnchor, "EM"); + + if(oEM) { + + oAnchor.removeChild(oEM); + oAnchor.appendChild(oText); + + } + + } + + } + + }, + + + /** + * @method configStrongEmphasis + * @description Event handler for when the "strongemphasis" configuration + * property of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configStrongEmphasis: function(p_sType, p_aArgs, p_oItem) { + + var bStrongEmphasis = p_aArgs[0], + oAnchor = this._oAnchor, + oText = this._oText, + oConfig = this.cfg, + oStrong; + + if(bStrongEmphasis && oConfig.getProperty("emphasis")) { + + oConfig.setProperty("emphasis", false); + + } + + if(oAnchor) { + + if(bStrongEmphasis) { + + oStrong = document.createElement("strong"); + oStrong.appendChild(oText); + + oAnchor.appendChild(oStrong); + + } + else { + + oStrong = this._getFirstElement(oAnchor, "STRONG"); + + if(oStrong) { + + oAnchor.removeChild(oStrong); + oAnchor.appendChild(oText); + + } + + } + + } + + }, + + + /** + * @method configChecked + * @description Event handler for when the "checked" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configChecked: function(p_sType, p_aArgs, p_oItem) { + + var bChecked = p_aArgs[0], + oEl = this.element, + oConfig = this.cfg, + oEM; + + + if(bChecked) { + + if(!m_oCheckedIndicator) { + + m_oCheckedIndicator = document.createElement("em"); + m_oCheckedIndicator.innerHTML = this.CHECKED_TEXT; + m_oCheckedIndicator.className = "checkedindicator"; + + } + + oEM = m_oCheckedIndicator.cloneNode(true); + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.element) { + + oEl.insertBefore(oEM, oSubmenu.element); + + } + else { + + oEl.appendChild(oEM); + + } + + + Dom.addClass(oEl, "checked"); + + this._oCheckedIndicator = oEM; + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + else { + + oEM = this._oCheckedIndicator; + + Dom.removeClass(oEl, "checked"); + + if(oEM) { + + oEl.removeChild(oEM); + + } + + this._oCheckedIndicator = null; + + } + + }, + + + + /** + * @method configDisabled + * @description Event handler for when the "disabled" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configDisabled: function(p_sType, p_aArgs, p_oItem) { + + var bDisabled = p_aArgs[0], + oConfig = this.cfg, + oAnchor = this._oAnchor, + aNodes = [this.element, oAnchor], + oHelpText = this._oHelpTextEM, + oCheckedIndicator = this._oCheckedIndicator, + oSubmenuIndicator = this.submenuIndicator, + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oCheckedIndicator) { + + oCheckedIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_CHECKED_TEXT : + this.CHECKED_TEXT; + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(oSubmenuIndicator) { + + oSubmenuIndicator.firstChild.nodeValue = bDisabled ? + this.DISABLED_SUBMENU_INDICATOR_TEXT : + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(bDisabled) { + + if(oConfig.getProperty("selected")) { + + oConfig.setProperty("selected", false); + + } + + oAnchor.removeAttribute("href"); + + Dom.addClass(aNodes, "disabled"); + + } + else { + + oAnchor.setAttribute("href", oConfig.getProperty("url")); + + Dom.removeClass(aNodes, "disabled"); + + } + + }, + + + /** + * @method configSelected + * @description Event handler for when the "selected" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configSelected: function(p_sType, p_aArgs, p_oItem) { + + if(!this.cfg.getProperty("disabled")) { + + var bSelected = p_aArgs[0], + oHelpText = this._oHelpTextEM, + oSubmenuIndicator = this.submenuIndicator, + oCheckedIndicator = this._oCheckedIndicator, + aNodes = [this.element, this._oAnchor], + i = 1; + + + if(oHelpText) { + + i++; + aNodes[i] = oHelpText; + + } + + + if(oSubmenuIndicator) { + + i++; + aNodes[i] = oSubmenuIndicator; + + } + + + if(oCheckedIndicator) { + + i++; + aNodes[i] = oCheckedIndicator; + + } + + + if(bSelected) { + + Dom.addClass(aNodes, "selected"); + + } + else { + + Dom.removeClass(aNodes, "selected"); + + } + + } + + }, + + + /** + * @method configSubmenu + * @description Event handler for when the "submenu" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configSubmenu: function(p_sType, p_aArgs, p_oItem) { + + var oEl = this.element, + oSubmenu = p_aArgs[0], + oSubmenuIndicator = this.submenuIndicator, + oConfig = this.cfg, + aNodes = [this.element, this._oAnchor], + bLazyLoad = this.parent && this.parent.lazyLoad, + oMenu; + + + if(oSubmenu) { + + if(oSubmenu instanceof Menu) { + + oMenu = oSubmenu; + oMenu.parent = this; + oMenu.lazyLoad = bLazyLoad; + + } + else if( + typeof oSubmenu == "object" && + oSubmenu.id && + !oSubmenu.nodeType + ) { + + var sSubmenuId = oSubmenu.id, + oSubmenuConfig = oSubmenu; + + oSubmenuConfig.lazyload = bLazyLoad; + oSubmenuConfig.parent = this; + + oMenu = new this.SUBMENU_TYPE(sSubmenuId, oSubmenuConfig); + + + // Set the value of the property to the Menu instance + + this.cfg.setProperty("submenu", oMenu, true); + + } + else { + + oMenu = new this.SUBMENU_TYPE( + oSubmenu, + { lazyload: bLazyLoad, parent: this } + ); + + + // Set the value of the property to the Menu instance + + this.cfg.setProperty("submenu", oMenu, true); + + } + + + if(oMenu) { + + this._oSubmenu = oMenu; + + + if(!oSubmenuIndicator) { + + + if(!m_oSubmenuIndicator) { + + m_oSubmenuIndicator = document.createElement("em"); + m_oSubmenuIndicator.innerHTML = + this.COLLAPSED_SUBMENU_INDICATOR_TEXT; + m_oSubmenuIndicator.className = "submenuindicator"; + + } + + + oSubmenuIndicator = m_oSubmenuIndicator.cloneNode(true); + + + if(oMenu.element.parentNode == oEl) { + + if(this.browser == "opera") { + + oEl.appendChild(oSubmenuIndicator); + + oMenu.renderEvent.subscribe(function() { + + oSubmenuIndicator.parentNode.insertBefore( + oSubmenuIndicator, + oMenu.element + ); + + }); + + } + else { + + oEl.insertBefore(oSubmenuIndicator, oMenu.element); + + } + + } + else { + + oEl.appendChild(oSubmenuIndicator); + + } + + this.submenuIndicator = oSubmenuIndicator; + + } + + + Dom.addClass(aNodes, "hassubmenu"); + + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + + } + else { + + Dom.removeClass(aNodes, "hassubmenu"); + + if(oSubmenuIndicator) { + + oEl.removeChild(oSubmenuIndicator); + + } + + if(this._oSubmenu) { + + this._oSubmenu.destroy(); + + } + + } + + }, + + + /** + * @method configOnClick + * @description Event handler for when the "onclick" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configOnClick: function(p_sType, p_aArgs, p_oItem) { + + var oObject = p_aArgs[0]; + + /* + Remove any existing listeners if a "click" event handler has + already been specified. + */ + + if( + this._oOnclickAttributeValue && + (this._oOnclickAttributeValue != oObject) + ) { + + this.clickEvent.unsubscribe( + this._oOnclickAttributeValue.fn, + this._oOnclickAttributeValue.obj + ); + + this._oOnclickAttributeValue = null; + + } + + + if( + !this._oOnclickAttributeValue && + typeof oObject == "object" && + typeof oObject.fn == "function" + ) { + + this.clickEvent.subscribe( + oObject.fn, + (oObject.obj || this), + oObject.scope + ); + + this._oOnclickAttributeValue = oObject; + + } + + }, + + + /** + * @method configClassName + * @description Event handler for when the "classname" configuration + * property of a menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configClassName: function(p_sType, p_aArgs, p_oItem) { + + var sClassName = p_aArgs[0]; + + if(this._sClassName) { + + Dom.removeClass(this.element, this._sClassName); + + } + + Dom.addClass(this.element, sClassName); + this._sClassName = sClassName; + + }, + + + + // Public methods + + + /** + * @method initDefaultConfig + * @description Initializes an item's configurable properties. + */ + initDefaultConfig : function() { + + var oConfig = this.cfg, + CheckBoolean = oConfig.checkBoolean; + + + // Define the configuration attributes + + /** + * @config text + * @description String specifying the text label for the menu item. + * When building a menu from existing HTML the value of this property + * will be interpreted from the menu's markup. + * @default "" + * @type String + */ + oConfig.addProperty( + "text", + { + value: "", + handler: this.configText, + validator: this._checkString, + suppressEvent: true + } + ); + + + /** + * @config helptext + * @description String specifying additional instructional text to + * accompany the text for the nenu item. + * @default null + * @type String| + * HTMLElement + */ + oConfig.addProperty("helptext", { handler: this.configHelpText }); + + + /** + * @config url + * @description String specifying the URL for the menu item's anchor's + * "href" attribute. When building a menu from existing HTML the value + * of this property will be interpreted from the menu's markup. + * @default "#" + * @type String + */ + oConfig.addProperty( + "url", + { value: "#", handler: this.configURL, suppressEvent: true } + ); + + + /** + * @config target + * @description String specifying the value for the "target" attribute + * of the menu item's anchor element. Specifying a target will + * require the user to click directly on the menu item's anchor node in + * order to cause the browser to navigate to the specified URL. + * When building a menu from existing HTML the value of this property + * will be interpreted from the menu's markup. + * @default null + * @type String + */ + oConfig.addProperty( + "target", + { handler: this.configTarget, suppressEvent: true } + ); + + + /** + * @config emphasis + * @description Boolean indicating if the text of the menu item will be + * rendered with emphasis. When building a menu from existing HTML the + * value of this property will be interpreted from the menu's markup. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "emphasis", + { + value: false, + handler: this.configEmphasis, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config strongemphasis + * @description Boolean indicating if the text of the menu item will be + * rendered with strong emphasis. When building a menu from existing + * HTML the value of this property will be interpreted from the + * menu's markup. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "strongemphasis", + { + value: false, + handler: this.configStrongEmphasis, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config checked + * @description Boolean indicating if the menu item should be rendered + * with a checkmark. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "checked", + { + value: false, + handler: this.configChecked, + validator: this.cfg.checkBoolean, + suppressEvent: true, + supercedes:["disabled"] + } + ); + + + /** + * @config disabled + * @description Boolean indicating if the menu item should be disabled. + * (Disabled menu items are dimmed and will not respond to user input + * or fire events.) + * @default false + * @type Boolean + */ + oConfig.addProperty( + "disabled", + { + value: false, + handler: this.configDisabled, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config selected + * @description Boolean indicating if the menu item should + * be highlighted. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "selected", + { + value: false, + handler: this.configSelected, + validator: CheckBoolean, + suppressEvent: true + } + ); + + + /** + * @config submenu + * @description Object specifying the submenu to be appended to the + * menu item. The value can be one of the following:
    • Object + * specifying a Menu instance.
    • Object literal specifying the + * menu to be created. Format: { id: [menu id], itemdata: + * [array of values for + * items] }.
    • String specifying the id attribute + * of the <div> element of the menu.
    • + * Object specifying the <div> element of the + * menu.
    + * @default null + * @type Menu|String|Object| + * HTMLElement + */ + oConfig.addProperty("submenu", { handler: this.configSubmenu }); + + + /** + * @config onclick + * @description Object literal representing the code to be executed when + * the button is clicked. Format:
    {
    + * fn: Function, // The handler to call when + * the event fires.
    obj: Object, // An + * object to pass back to the handler.
    scope: + * Object // The object to use for the scope of the handler. + *
    }
    + * @type Object + * @default null + */ + oConfig.addProperty("onclick", { handler: this.configOnClick }); + + + /** + * @config classname + * @description CSS class to be applied to the menu item's root + * <li> element. The specified class(es) are + * appended in addition to the default class as specified by the menu + * item's CSS_CLASS_NAME constant. + * @default null + * @type String + */ + oConfig.addProperty( + "classname", + { + value: null, + handler: this.configClassName, + validator: this._checkString + } + ); + + }, + + + /** + * @method getNextEnabledSibling + * @description Finds the menu item's next enabled sibling. + * @return YAHOO.widget.MenuItem + */ + getNextEnabledSibling: function() { + + if(this.parent instanceof Menu) { + + var nGroupIndex = this.groupIndex; + + function getNextArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getNextArrayItem(p_aArray, (p_nStartIndex+1)); + + } + + + var aItemGroups = this.parent.getItemGroups(), + oNextItem; + + + if(this.index < (aItemGroups[nGroupIndex].length - 1)) { + + oNextItem = getNextArrayItem( + aItemGroups[nGroupIndex], + (this.index+1) + ); + + } + else { + + var nNextGroupIndex; + + if(nGroupIndex < (aItemGroups.length - 1)) { + + nNextGroupIndex = nGroupIndex + 1; + + } + else { + + nNextGroupIndex = 0; + + } + + var aNextGroup = getNextArrayItem(aItemGroups, nNextGroupIndex); + + // Retrieve the first menu item in the next group + + oNextItem = getNextArrayItem(aNextGroup, 0); + + } + + return ( + oNextItem.cfg.getProperty("disabled") || + oNextItem.element.style.display == "none" + ) ? + oNextItem.getNextEnabledSibling() : oNextItem; + + } + + }, + + + /** + * @method getPreviousEnabledSibling + * @description Finds the menu item's previous enabled sibling. + * @return {YAHOO.widget.MenuItem} + */ + getPreviousEnabledSibling: function() { + + if(this.parent instanceof Menu) { + + var nGroupIndex = this.groupIndex; + + function getPreviousArrayItem(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getPreviousArrayItem(p_aArray, (p_nStartIndex-1)); + + } + + function getFirstItemIndex(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] ? + p_nStartIndex : + getFirstItemIndex(p_aArray, (p_nStartIndex+1)); + + } + + var aItemGroups = this.parent.getItemGroups(), + oPreviousItem; + + if( + this.index > getFirstItemIndex(aItemGroups[nGroupIndex], 0) + ) { + + oPreviousItem = + getPreviousArrayItem( + aItemGroups[nGroupIndex], + (this.index-1) + ); + + } + else { + + var nPreviousGroupIndex; + + if(nGroupIndex > getFirstItemIndex(aItemGroups, 0)) { + + nPreviousGroupIndex = nGroupIndex - 1; + + } + else { + + nPreviousGroupIndex = aItemGroups.length - 1; + + } + + var aPreviousGroup = + getPreviousArrayItem(aItemGroups, nPreviousGroupIndex); + + oPreviousItem = + getPreviousArrayItem( + aPreviousGroup, + (aPreviousGroup.length - 1) + ); + + } + + return ( + oPreviousItem.cfg.getProperty("disabled") || + oPreviousItem.element.style.display == "none" + ) ? + oPreviousItem.getPreviousEnabledSibling() : oPreviousItem; + + } + + }, + + + /** + * @method focus + * @description Causes the menu item to receive the focus and fires the + * focus event. + */ + focus: function() { + + var oParent = this.parent, + oAnchor = this._oAnchor, + oActiveItem = oParent.activeItem; + + + function setFocus() { + + try { + + oAnchor.focus(); + + } + catch(e) { + + } + + } + + + if( + !this.cfg.getProperty("disabled") && + oParent && + oParent.cfg.getProperty("visible") && + this.element.style.display != "none" + ) { + + if(oActiveItem) { + + oActiveItem.blur(); + + } + + + /* + Setting focus via a timer fixes a race condition in Firefox, IE + and Opera where the browser viewport jumps as it trys to + position and focus the menu. + */ + + window.setTimeout(setFocus, 0); + + this.focusEvent.fire(); + + } + + }, + + + /** + * @method blur + * @description Causes the menu item to lose focus and fires the + * onblur event. + */ + blur: function() { + + var oParent = this.parent; + + if( + !this.cfg.getProperty("disabled") && + oParent && + Dom.getStyle(oParent.element, "visibility") == "visible" + ) { + + this._oAnchor.blur(); + + this.blurEvent.fire(); + + } + + }, + + + /** + * @method destroy + * @description Removes the menu item's <li> element + * from its parent <ul> element. + */ + destroy: function() { + + var oEl = this.element; + + if(oEl) { + + + // If the item has a submenu, destroy it first + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.destroy(); + + } + + + // Remove CustomEvent listeners + + this.mouseOverEvent.unsubscribeAll(); + this.mouseOutEvent.unsubscribeAll(); + this.mouseDownEvent.unsubscribeAll(); + this.mouseUpEvent.unsubscribeAll(); + this.clickEvent.unsubscribeAll(); + this.keyPressEvent.unsubscribeAll(); + this.keyDownEvent.unsubscribeAll(); + this.keyUpEvent.unsubscribeAll(); + this.focusEvent.unsubscribeAll(); + this.blurEvent.unsubscribeAll(); + this.cfg.configChangedEvent.unsubscribeAll(); + + + // Remove the element from the parent node + + var oParentNode = oEl.parentNode; + + if(oParentNode) { + + oParentNode.removeChild(oEl); + + this.destroyEvent.fire(); + + } + + this.destroyEvent.unsubscribeAll(); + + } + + }, + + + /** + * @method toString + * @description Returns a string representing the menu item. + * @return {String} + */ + toString: function() { + + return ("MenuItem: " + this.cfg.getProperty("text")); + + } + +}; + +})(); + + + +/** +* Creates a list of options or commands which are made visible in response to +* an HTML element's "contextmenu" event ("mousedown" for Opera). +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> element to be used as the data source for +* the context menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu. See configuration class documentation +* for more details. +* @class ContextMenu +* @constructor +* @extends YAHOO.widget.Menu +* @namespace YAHOO.widget +*/ +YAHOO.widget.ContextMenu = function(p_oElement, p_oConfig) { + + YAHOO.widget.ContextMenu.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + + +YAHOO.lang.extend(YAHOO.widget.ContextMenu, YAHOO.widget.Menu, { + + + +// Private properties + + +/** +* @property _oTrigger +* @description Object reference to the current value of the "trigger" +* configuration property. +* @default null +* @private +* @type String|HTMLElement|Array +*/ +_oTrigger: null, + + +/** +* @property _bCancelled +* @description Boolean indicating if the display of the context menu should +* be cancelled. +* @default false +* @private +* @type Boolean +*/ +_bCancelled: false, + + +// Public properties + + +/** +* @property contextEventTarget +* @description Object reference for the HTML element that was the target of the +* "contextmenu" DOM event ("mousedown" for Opera) that triggered the display of +* the context menu. +* @default null +* @type HTMLElement +*/ +contextEventTarget: null, + + + +// Events + + +/** +* @event triggerContextMenuEvent +* @description Custom Event wrapper for the "contextmenu" DOM event +* ("mousedown" for Opera) fired by the element(s) that trigger the display of +* the context menu. +*/ +triggerContextMenuEvent: null, + + + + + +/** +* @method init +* @description The ContextMenu class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for +* the context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> element to be used as the data source for +* the context menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu. See configuration class documentation +* for more details. +*/ +init: function(p_oElement, p_oConfig) { + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.ContextMenuItem; + + } + + + // Call the init of the superclass (YAHOO.widget.Menu) + + YAHOO.widget.ContextMenu.superclass.init.call(this, p_oElement); + + + this.beforeInitEvent.fire(YAHOO.widget.ContextMenu); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + + this.initEvent.fire(YAHOO.widget.ContextMenu); + +}, + + +/** +* @method initEvents +* @description Initializes the custom events for the context menu. +*/ +initEvents: function() { + + YAHOO.widget.ContextMenu.superclass.initEvents.call(this); + + // Create custom events + + this.triggerContextMenuEvent = + new YAHOO.util.CustomEvent("triggerContextMenuEvent", this); + +}, + + +/** +* @method cancel +* @description Cancels the display of the context menu. +*/ +cancel: function() { + + this._bCancelled = true; + +}, + + + +// Private methods + + +/** +* @method _removeEventHandlers +* @description Removes all of the DOM event handlers from the HTML element(s) +* whose "context menu" event ("click" for Opera) trigger the display of +* the context menu. +* @private +*/ +_removeEventHandlers: function() { + + var Event = YAHOO.util.Event, + oTrigger = this._oTrigger, + bOpera = (this.browser == "opera"); + + + // Remove the event handlers from the trigger(s) + + Event.removeListener( + oTrigger, + (bOpera ? "mousedown" : "contextmenu"), + this._onTriggerContextMenu + ); + + if(bOpera) { + + Event.removeListener(oTrigger, "click", this._onTriggerClick); + + } + +}, + + + +// Private event handlers + + +/** +* @method _onTriggerClick +* @description "click" event handler for the HTML element(s) identified as the +* "trigger" for the context menu. Used to cancel default behaviors in Opera. +* @private +* @param {Event} p_oEvent Object representing the DOM event object passed back +* by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that is handling the event. +*/ +_onTriggerClick: function(p_oEvent, p_oMenu) { + + if(p_oEvent.ctrlKey) { + + YAHOO.util.Event.stopEvent(p_oEvent); + + } + +}, + + +/** +* @method _onTriggerContextMenu +* @description "contextmenu" event handler ("mousedown" for Opera) for the HTML +* element(s) that trigger the display of the context menu. +* @private +* @param {Event} p_oEvent Object representing the DOM event object passed back +* by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that is handling the event. +*/ +_onTriggerContextMenu: function(p_oEvent, p_oMenu) { + + var Event = YAHOO.util.Event; + + if(p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) { + + return; + + } + + + /* + Prevent the browser's default context menu from appearing and + stop the propagation of the "contextmenu" event so that + other ContextMenu instances are not displayed. + */ + + Event.stopEvent(p_oEvent); + + + // Hide any other ContextMenu instances that might be visible + + YAHOO.widget.MenuManager.hideVisible(); + + + this.contextEventTarget = Event.getTarget(p_oEvent); + + this.triggerContextMenuEvent.fire(p_oEvent); + + + if(!this._bCancelled) { + + // Position and display the context menu + + this.cfg.setProperty("xy", Event.getXY(p_oEvent)); + + this.show(); + + } + + this._bCancelled = false; + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the context menu. +* @return {String} +*/ +toString: function() { + + return ("ContextMenu " + this.id); + +}, + + +/** +* @method initDefaultConfig +* @description Initializes the class's configurable properties which can be +* changed using the context menu's Config object ("cfg"). +*/ +initDefaultConfig: function() { + + YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this); + + /** + * @config trigger + * @description The HTML element(s) whose "contextmenu" event ("mousedown" + * for Opera) trigger the display of the context menu. Can be a string + * representing the id attribute of the HTML element, an object reference + * for the HTML element, or an array of strings or HTML element references. + * @default null + * @type String|HTMLElement|Array + */ + this.cfg.addProperty("trigger", { handler: this.configTrigger }); + +}, + + +/** +* @method destroy +* @description Removes the context menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove the DOM event handlers from the current trigger(s) + + this._removeEventHandlers(); + + + // Continue with the superclass implementation of this method + + YAHOO.widget.ContextMenu.superclass.destroy.call(this); + +}, + + + +// Public event handlers for configuration properties + + +/** +* @method configTrigger +* @description Event handler for when the value of the "trigger" configuration +* property changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that fired the event. +*/ +configTrigger: function(p_sType, p_aArgs, p_oMenu) { + + var Event = YAHOO.util.Event, + oTrigger = p_aArgs[0]; + + if(oTrigger) { + + /* + If there is a current "trigger" - remove the event handlers + from that element(s) before assigning new ones + */ + + if(this._oTrigger) { + + this._removeEventHandlers(); + + } + + this._oTrigger = oTrigger; + + + /* + Listen for the "mousedown" event in Opera b/c it does not + support the "contextmenu" event + */ + + var bOpera = (this.browser == "opera"); + + Event.addListener( + oTrigger, + (bOpera ? "mousedown" : "contextmenu"), + this._onTriggerContextMenu, + this, + true + ); + + + /* + Assign a "click" event handler to the trigger element(s) for + Opera to prevent default browser behaviors. + */ + + if(bOpera) { + + Event.addListener( + oTrigger, + "click", + this._onTriggerClick, + this, + true + ); + + } + + } + else { + + this._removeEventHandlers(); + + } + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a context menu. +* +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the context menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu item. See configuration class +* documentation for more details. +* @class ContextMenuItem +* @constructor +* @extends YAHOO.widget.MenuItem +*/ +YAHOO.widget.ContextMenuItem = function(p_oObject, p_oConfig) { + + YAHOO.widget.ContextMenuItem.superclass.constructor.call( + this, + p_oObject, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.ContextMenuItem, YAHOO.widget.MenuItem, { + + +/** +* @method init +* @description The ContextMenuItem class's initialization method. This method +* is automatically called by the constructor, and sets up all DOM references +* for pre-existing markup, and creates required markup if it is not +* already present. +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the context menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu item. See configuration class +* documentation for more details. +*/ +init: function(p_oObject, p_oConfig) { + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = YAHOO.widget.ContextMenu; + + } + + + /* + Call the init of the superclass (YAHOO.widget.MenuItem) + Note: We don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.ContextMenuItem.superclass.init.call(this, p_oObject); + + var oConfig = this.cfg; + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig, true); + + } + + oConfig.fireQueue(); + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the context menu item. +* @return {String} +*/ +toString: function() { + + return ("ContextMenuItem: " + this.cfg.getProperty("text")); + +} + +}); // END YAHOO.lang.extend + + + +/** +* Horizontal collection of items, each of which can contain a submenu. +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu bar. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar. See configuration class documentation for +* more details. +* @class Menubar +* @constructor +* @extends YAHOO.widget.Menu +* @namespace YAHOO.widget +*/ +YAHOO.widget.MenuBar = function(p_oElement, p_oConfig) { + + YAHOO.widget.MenuBar.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.MenuBar, YAHOO.widget.Menu, { + +/** +* @method init +* @description The MenuBar class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu bar. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar. See configuration class documentation for +* more details. +*/ +init: function(p_oElement, p_oConfig) { + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.MenuBarItem; + + } + + + // Call the init of the superclass (YAHOO.widget.Menu) + + YAHOO.widget.MenuBar.superclass.init.call(this, p_oElement); + + + this.beforeInitEvent.fire(YAHOO.widget.MenuBar); + + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + this.initEvent.fire(YAHOO.widget.MenuBar); + +}, + + + +// Constants + + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the menu +* bar's <div> element. +* @default "yuimenubar" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubar", + + + +// Protected event handlers + + +/** +* @method _onKeyDown +* @description "keydown" Custom Event handler for the menu bar. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar +* that fired the event. +*/ +_onKeyDown: function(p_sType, p_aArgs, p_oMenuBar) { + + var Event = YAHOO.util.Event, + oEvent = p_aArgs[0], + oItem = p_aArgs[1], + oSubmenu; + + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var oItemCfg = oItem.cfg; + + switch(oEvent.keyCode) { + + case 37: // Left arrow + case 39: // Right arrow + + if( + oItem == this.activeItem && + !oItemCfg.getProperty("selected") + ) { + + oItemCfg.setProperty("selected", true); + + } + else { + + var oNextItem = (oEvent.keyCode == 37) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + + if(this.cfg.getProperty("autosubmenudisplay")) { + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + oSubmenu.activeItem.blur(); + oSubmenu.activeItem = null; + + } + + } + + oNextItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + case 40: // Down arrow + + if(this.activeItem != oItem) { + + this.clearActiveItem(); + + oItemCfg.setProperty("selected", true); + oItem.focus(); + + } + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.setInitialSelection(); + oSubmenu.setInitialFocus(); + + } + else { + + oSubmenu.show(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + } + + } + + + if(oEvent.keyCode == 27 && this.activeItem) { // Esc key + + oSubmenu = this.activeItem.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + this.activeItem.focus(); + + } + else { + + this.activeItem.cfg.setProperty("selected", false); + this.activeItem.blur(); + + } + + Event.preventDefault(oEvent); + + } + +}, + + +/** +* @method _onClick +* @description "click" event handler for the menu bar. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar +* that fired the event. +*/ +_onClick: function(p_sType, p_aArgs, p_oMenuBar) { + + YAHOO.widget.MenuBar.superclass._onClick.call( + this, + p_sType, + p_aArgs, + p_oMenuBar + ); + + + var oItem = p_aArgs[1]; + + if(oItem && !oItem.cfg.getProperty("disabled")) { + + var Event = YAHOO.util.Event, + Dom = YAHOO.util.Dom, + + oEvent = p_aArgs[0], + oTarget = Event.getTarget(oEvent), + + oActiveItem = this.activeItem, + oConfig = this.cfg; + + + // Hide any other submenus that might be visible + + if(oActiveItem && oActiveItem != oItem) { + + this.clearActiveItem(); + + } + + + // Select and focus the current item + + oItem.cfg.setProperty("selected", true); + oItem.focus(); + + + // Show the submenu for the item + + var oSubmenu = oItem.cfg.getProperty("submenu"); + + + if(oSubmenu && oTarget != oItem.submenuIndicator) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + + } + else { + + oSubmenu.show(); + + } + + } + + } + +}, + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the menu bar. +* @return {String} +*/ +toString: function() { + + return ("MenuBar " + this.id); + +}, + + +/** +* @description Initializes the class's configurable properties which can be +* changed using the menu bar's Config object ("cfg"). +* @method initDefaultConfig +*/ +initDefaultConfig: function() { + + YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this); + + var oConfig = this.cfg; + + // Add configuration properties + + + /* + Set the default value for the "position" configuration property + to "static" by re-adding the property. + */ + + /** + * @config position + * @description String indicating how a menu bar should be positioned on the + * screen. Possible values are "static" and "dynamic." Static menu bars + * are visible by default and reside in the normal flow of the document + * (CSS position: static). Dynamic menu bars are hidden by default, reside + * out of the normal flow of the document (CSS position: absolute), and can + * overlay other elements on the screen. + * @default static + * @type String + */ + oConfig.addProperty( + "position", + { + value: "static", + handler: this.configPosition, + validator: this._checkPosition, + supercedes: ["visible"] + } + ); + + + /* + Set the default value for the "submenualignment" configuration property + to ["tl","bl"] by re-adding the property. + */ + + /** + * @config submenualignment + * @description Array defining how submenus should be aligned to their + * parent menu bar item. The format is: [itemCorner, submenuCorner]. + * @default ["tl","bl"] + * @type Array + */ + oConfig.addProperty("submenualignment", { value: ["tl","bl"] } ); + + + /* + Change the default value for the "autosubmenudisplay" configuration + property to "false" by re-adding the property. + */ + + /** + * @config autosubmenudisplay + * @description Boolean indicating if submenus are automatically made + * visible when the user mouses over the menu bar's items. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "autosubmenudisplay", + { value: false, validator: oConfig.checkBoolean } + ); + +} + +}); // END YAHOO.lang.extend + + + +/** +* Creates an item for a menu bar. +* +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the menu bar item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar item. See configuration class documentation +* for more details. +* @class MenuBarItem +* @constructor +* @extends YAHOO.widget.MenuItem +*/ +YAHOO.widget.MenuBarItem = function(p_oObject, p_oConfig) { + + YAHOO.widget.MenuBarItem.superclass.constructor.call( + this, + p_oObject, + p_oConfig + ); + +}; + +YAHOO.lang.extend(YAHOO.widget.MenuBarItem, YAHOO.widget.MenuItem, { + + +/** +* @method init +* @description The MenuBarItem class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the menu bar item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar item. See configuration class documentation +* for more details. +*/ +init: function(p_oObject, p_oConfig) { + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = YAHOO.widget.Menu; + + } + + + /* + Call the init of the superclass (YAHOO.widget.MenuItem) + Note: We don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.MenuBarItem.superclass.init.call(this, p_oObject); + + + var oConfig = this.cfg; + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig, true); + + } + + oConfig.fireQueue(); + +}, + + + +// Constants + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* <li> element of the menu bar item. +* @default "yuimenubaritem" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubaritem", + + + +// Public methods + + +/** +* @method toString +* @description Returns a string representing the menu bar item. +* @return {String} +*/ +toString: function() { + + return ("MenuBarItem: " + this.cfg.getProperty("text")); + +} + +}); // END YAHOO.lang.extend +YAHOO.register("menu", YAHOO.widget.Menu, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/reset-fonts-grids/README b/interface/ispconfig/interface/js/yui/reset-fonts-grids/README new file mode 100644 index 000000000..d0b211725 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/reset-fonts-grids/README @@ -0,0 +1,24 @@ +YUI Library - Reset+Fonts+Grids (RFG) - Release Notes + +*** NOTE *** + +This document is not updated with each release. Changes to +the reset-fonts-grids.css source are noted in the README +file for each component that comprises this aggregate: + +reset/README +fonts/README +grids/README + +************ + +Version 2.2.0 + + * No changes. + +Version 0.12.0 + + * Initial release. + + * This file is a convenience file containing an in-order + concatonation of Reset, Fonts, and Grids. \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/reset-fonts-grids/reset-fonts-grids.css b/interface/ispconfig/interface/js/yui/reset-fonts-grids/reset-fonts-grids.css new file mode 100644 index 000000000..43d99e754 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/reset-fonts-grids/reset-fonts-grids.css @@ -0,0 +1,9 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/*reset.css*/body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;} +/*fonts.css*/body{font:13px arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}pre, code {font:115% monospace;*font-size:100%;}body * {line-height:1.22em;} +/*grids.css*/body{text-align:center;}#ft{clear:both;}#doc,#doc2,#doc3,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.3em;min-width:750px;}#doc2{width:73.074em;*width:71.313em;min-width:950px;}#doc3{margin:auto 10px;width:auto;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.3207em;*width:12.0106em;}.yui-t1 #yui-main .yui-b{margin-left:13.3207em;*margin-left:13.0106em;}.yui-t2 .yui-b{float:left;width:13.8456em;*width:13.512em;}.yui-t2 #yui-main .yui-b{margin-left:14.8456em;*margin-left:14.512em;}.yui-t3 .yui-b{float:left;width:23.0759em;*width:22.52em;}.yui-t3 #yui-main .yui-b{margin-left:24.0759em;*margin-left:23.52em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.512em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.512em;}.yui-t5 .yui-b{float:right;width:18.4608em;*width:18.016em;}.yui-t5 #yui-main .yui-b{margin-right:19.4608em;*margin-right:19.016em;}.yui-t6 .yui-b{float:right;width:23.0759em;*width:22.52em;}.yui-t6 #yui-main .yui-b{margin-right:24.0759em;*margin-right:23.52em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-g .yui-u,.yui-g .yui-g,.yui-gc .yui-u,.yui-gc .yui-g .yui-u,.yui-ge .yui-u,.yui-gf .yui-u{float:right;display:inline;}.yui-g div.first,.yui-gc div.first,.yui-gc div.first div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g{width:49.1%;}.yui-g .yui-g .yui-u,.yui-gc .yui-g .yui-u{width:48.1%;}.yui-gb .yui-u,.yui-gc .yui-u,.yui-gd .yui-u{float:left;margin-left:2%;*margin-left:1.895%;width:32%;}.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge .yui-u{width:24%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-gf div.first{width:24%;}.yui-ge div.first{width:74.2%;}#bd:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#bd,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/reset/README b/interface/ispconfig/interface/js/yui/reset/README new file mode 100644 index 000000000..e25df6826 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/reset/README @@ -0,0 +1,25 @@ +YUI Library - Reset - Release Notes + +Version 2.2.0 + + * No changes. + +Version 0.12.1 - 0.12.2 + + * No changes. + +Version 0.12.0 + + * Added: h1,h2,h3,h4,h5,h6{font-weight:normal;} + + * Added: abbr,acronym {border:0;} + + * Added: textarea {padding:0;margin:0;} + +Version 0.11.0 + + * No changes. + +Version 0.10.0 + + * Initial release. \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/reset/reset-min.css b/interface/ispconfig/interface/js/yui/reset/reset-min.css new file mode 100644 index 000000000..5ca0723fc --- /dev/null +++ b/interface/ispconfig/interface/js/yui/reset/reset-min.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/reset/reset.css b/interface/ispconfig/interface/js/yui/reset/reset.css new file mode 100644 index 000000000..e5c5357da --- /dev/null +++ b/interface/ispconfig/interface/js/yui/reset/reset.css @@ -0,0 +1,15 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;} +table{border-collapse:collapse;border-spacing:0;} +fieldset,img{border:0;} +address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;} +ol,ul {list-style:none;} +caption,th {text-align:left;} +h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;} +q:before,q:after{content:'';} +abbr,acronym {border:0;} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/slider/README b/interface/ispconfig/interface/js/yui/slider/README new file mode 100644 index 000000000..e435635fa --- /dev/null +++ b/interface/ispconfig/interface/js/yui/slider/README @@ -0,0 +1,69 @@ +Slider - Release Notes + +2.2.0 + + * Added the missing "force" parameter to the signature for setRegionValue + + * deprecated the moveComplete flag + +0.12.2 + + * No change + +0.12.1 + + * Removed unneccessary getXY calls that were contribuing to slower performance + in FireFox when the slider was deeply nested in the DOM. + +0.12.0 + + * Added "slideStart", "slideEnd", and "change" custom events. The abstract + methods these will eventually replace still work. + + * The default animation duration is 0.2 seconds (reduced from 0.4 seconds), + and is configurable via the animationDuration property. + + * Keyboard navigation is now built in. The background needs a tabindex for + keyboard nav to work. Keyboard nav can be disabled by setting enableKeys + to false. The number of pixels the slider moves when the arrow keys + are pressed is controlled by keyIncrement, and defaults to 20. Note, + Safari support limited to background element types that support focus + in that browser. http://bugs.webkit.org/show_bug.cgi?id=7138 + + * Fixed broken doctype in examples/index.html + + * Catching an unhandled script exception in FF that could occur when + attempting to focus the slider background while a text field without + autocomplete="false" has focus + +0.11.3 + + * No change + +0.11.0 + + * When the thumb is clicked and dragged, the click position delta is properly + applied. + + * The slider background can be disabled by setting backgroundEnabled to false. + + * Added SliderThumb->clearTicks + + * Incorporated updated drag and drop performance improvements + +0.10.0 + + * Drag and drop's autoscroll feature is now turned off by default + in the slider. + + * The slider no longer sets its initial value upon initialization + + * RGB slider example fixed for IE7. + + * Updated to work with the onAvailable feature in Drag and Drop. + + * Updated the basic slider example page to make the control more + accessible to non-FF1.5 browsers. + + * Split the examples into separate pages + diff --git a/interface/ispconfig/interface/js/yui/slider/slider-debug.js b/interface/ispconfig/interface/js/yui/slider/slider-debug.js new file mode 100644 index 000000000..815d514dc --- /dev/null +++ b/interface/ispconfig/interface/js/yui/slider/slider-debug.js @@ -0,0 +1,1259 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** + * The Slider component is a UI control that enables the user to adjust + * values in a finite range along one or two axes. Typically, the Slider + * control is used in a web application as a rich, visual replacement + * for an input box that takes a number as input. The Slider control can + * also easily accommodate a second dimension, providing x,y output for + * a selection point chosen from a rectangular region. + * + * @module slider + * @title Slider Widget + * @namespace YAHOO.widget + * @requires yahoo,dom,dragdrop,event + * @optional animation + */ + +/** + * A DragDrop implementation that can be used as a background for a + * slider. It takes a reference to the thumb instance + * so it can delegate some of the events to it. The goal is to make the + * thumb jump to the location on the background when the background is + * clicked. + * + * @class Slider + * @extends YAHOO.util.DragDrop + * @uses YAHOO.util.EventProvider + * @constructor + * @param {String} id The id of the element linked to this instance + * @param {String} sGroup The group of related DragDrop items + * @param {SliderThumb} oThumb The thumb for this slider + * @param {String} sType The type of slider (horiz, vert, region) + */ +YAHOO.widget.Slider = function(sElementId, sGroup, oThumb, sType) { + if (sElementId) { + this.init(sElementId, sGroup, true); + this.initSlider(sType); + this.initThumb(oThumb); + } +}; + +/** + * Factory method for creating a horizontal slider + * @method YAHOO.widget.Slider.getHorizSlider + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a horizontal slider control + */ +YAHOO.widget.Slider.getHorizSlider = + function (sBGElId, sHandleElId, iLeft, iRight, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, + iLeft, iRight, 0, 0, iTickSize), "horiz"); +}; + +/** + * Factory method for creating a vertical slider + * @method YAHOO.widget.Slider.getVertSlider + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a vertical slider control + */ +YAHOO.widget.Slider.getVertSlider = + function (sBGElId, sHandleElId, iUp, iDown, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, 0, 0, + iUp, iDown, iTickSize), "vert"); +}; + +/** + * Factory method for creating a slider region like the one in the color + * picker example + * @method YAHOO.widget.Slider.getSliderRegion + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a slider region control + */ +YAHOO.widget.Slider.getSliderRegion = + function (sBGElId, sHandleElId, iLeft, iRight, iUp, iDown, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, iLeft, iRight, + iUp, iDown, iTickSize), "region"); +}; + +/** + * By default, animation is available if the animation library is detected. + * @property YAHOO.widget.Slider.ANIM_AVAIL + * @static + * @type boolean + */ +YAHOO.widget.Slider.ANIM_AVAIL = true; + +YAHOO.extend(YAHOO.widget.Slider, YAHOO.util.DragDrop, { + + /** + * Initializes the slider. Executed in the constructor + * @method initSlider + * @param {string} sType the type of slider (horiz, vert, region) + */ + initSlider: function(sType) { + + /** + * The type of the slider (horiz, vert, region) + * @property type + * @type string + */ + this.type = sType; + + //this.removeInvalidHandleType("A"); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + /** + * Event the fires when the value of the control changes. If + * the control is animated the event will fire every point + * along the way. + * @event change + * @param {int} newOffset|x the new offset for normal sliders, or the new + * x offset for region sliders + * @param {int} y the number of pixels the thumb has moved on the y axis + * (region sliders only) + */ + this.createEvent("change", this); + + /** + * Event that fires at the beginning of a slider thumb move. + * @event slideStart + */ + this.createEvent("slideStart", this); + + /** + * Event that fires at the end of a slider thumb move + * @event slideEnd + */ + this.createEvent("slideEnd", this); + + /** + * Overrides the isTarget property in YAHOO.util.DragDrop + * @property isTarget + * @private + */ + this.isTarget = false; + + /** + * Flag that determines if the thumb will animate when moved + * @property animate + * @type boolean + */ + this.animate = YAHOO.widget.Slider.ANIM_AVAIL; + + /** + * Set to false to disable a background click thumb move + * @property backgroundEnabled + * @type boolean + */ + this.backgroundEnabled = true; + + /** + * Adjustment factor for tick animation, the more ticks, the + * faster the animation (by default) + * @property tickPause + * @type int + */ + this.tickPause = 40; + + /** + * Enables the arrow, home and end keys, defaults to true. + * @property enableKeys + * @type boolean + */ + this.enableKeys = true; + + /** + * Specifies the number of pixels the arrow keys will move the slider. + * Default is 25. + * @property keyIncrement + * @type int + */ + this.keyIncrement = 20; + + /** + * moveComplete is set to true when the slider has moved to its final + * destination. For animated slider, this value can be checked in + * the onChange handler to make it possible to execute logic only + * when the move is complete rather than at all points along the way. + * Deprecated because this flag is only useful when the background is + * clicked and the slider is animated. If the user drags the thumb, + * the flag is updated when the drag is over ... the final onDrag event + * fires before the mouseup the ends the drag, so the implementer will + * never see it. + * + * @property moveComplete + * @type Boolean + * @deprecated use the slideEnd event instead + */ + this.moveComplete = true; + + /** + * If animation is configured, specifies the length of the animation + * in seconds. + * @property animationDuration + * @type int + * @default 0.2 + */ + this.animationDuration = 0.2; + }, + + /** + * Initializes the slider's thumb. Executed in the constructor. + * @method initThumb + * @param {YAHOO.widget.SliderThumb} t the slider thumb + */ + initThumb: function(t) { + + var self = this; + + /** + * A YAHOO.widget.SliderThumb instance that we will use to + * reposition the thumb when the background is clicked + * @property thumb + * @type YAHOO.widget.SliderThumb + */ + this.thumb = t; + t.cacheBetweenDrags = true; + + // add handler for the handle onchange event + t.onChange = function() { + self.handleThumbChange(); + }; + + if (t._isHoriz && t.xTicks && t.xTicks.length) { + this.tickPause = Math.round(360 / t.xTicks.length); + } else if (t.yTicks && t.yTicks.length) { + this.tickPause = Math.round(360 / t.yTicks.length); + } + + this.logger.log("tickPause: " + this.tickPause); + + // delegate thumb methods + t.onMouseDown = function () { return self.focus(); }; + t.onMouseUp = function() { self.thumbMouseUp(); }; + t.onDrag = function() { self.fireEvents(true); }; + t.onAvailable = function() { return self.setStartSliderState(); }; + + }, + + /** + * Executed when the slider element is available + * @method onAvailable + */ + onAvailable: function() { + var Event = YAHOO.util.Event; + Event.on(this.id, "keydown", this.handleKeyDown, this, true); + Event.on(this.id, "keypress", this.handleKeyPress, this, true); + }, + + /** + * Executed when a keypress event happens with the control focused. + * Prevents the default behavior for navigation keys. The actual + * logic for moving the slider thumb in response to a key event + * happens in handleKeyDown. + * @param {Event} e the keypress event + */ + handleKeyPress: function(e) { + if (this.enableKeys) { + var Event = YAHOO.util.Event; + var kc = Event.getCharCode(e); + switch (kc) { + case 0x25: // left + case 0x26: // up + case 0x27: // right + case 0x28: // down + case 0x24: // home + case 0x23: // end + Event.preventDefault(e); + break; + default: + } + } + }, + + /** + * Executed when a keydown event happens with the control focused. + * Updates the slider value and display when the keypress is an + * arrow key, home, or end as long as enableKeys is set to true. + * @param {Event} e the keydown event + */ + handleKeyDown: function(e) { + if (this.enableKeys) { + var Event = YAHOO.util.Event; + + var kc = Event.getCharCode(e), t=this.thumb; + var h=this.getXValue(),v=this.getYValue(); + + var horiz = false; + var changeValue = true; + switch (kc) { + + // left + case 0x25: h -= this.keyIncrement; break; + + // up + case 0x26: v -= this.keyIncrement; break; + + // right + case 0x27: h += this.keyIncrement; break; + + // down + case 0x28: v += this.keyIncrement; break; + + // home + case 0x24: h = t.leftConstraint; + v = t.topConstraint; + break; + + // end + case 0x23: h = t.rightConstraint; + v = t.bottomConstraint; + break; + + default: changeValue = false; + } + + if (changeValue) { + if (t._isRegion) { + this.setRegionValue(h, v, true); + } else { + var newVal = (t._isHoriz) ? h : v; + this.setValue(newVal, true); + } + Event.stopEvent(e); + } + + } + }, + + /** + * Initialization that sets up the value offsets once the elements are ready + * @method setStartSliderState + */ + setStartSliderState: function() { + + this.logger.log("Fixing state"); + + this.setThumbCenterPoint(); + + /** + * The basline position of the background element, used + * to determine if the background has moved since the last + * operation. + * @property baselinePos + * @type [int, int] + */ + this.baselinePos = YAHOO.util.Dom.getXY(this.getEl()); + + this.thumb.startOffset = this.thumb.getOffsetFromParent(this.baselinePos); + + if (this.thumb._isRegion) { + if (this.deferredSetRegionValue) { + this.setRegionValue.apply(this, this.deferredSetRegionValue, true); + this.deferredSetRegionValue = null; + } else { + this.setRegionValue(0, 0, true, true); + } + } else { + if (this.deferredSetValue) { + this.setValue.apply(this, this.deferredSetValue, true); + this.deferredSetValue = null; + } else { + this.setValue(0, true, true); + } + } + }, + + /** + * When the thumb is available, we cache the centerpoint of the element so + * we can position the element correctly when the background is clicked + * @method setThumbCenterPoint + */ + setThumbCenterPoint: function() { + + var el = this.thumb.getEl(); + + if (el) { + /** + * The center of the slider element is stored so we can + * place it in the correct position when the background is clicked. + * @property thumbCenterPoint + * @type {"x": int, "y": int} + */ + this.thumbCenterPoint = { + x: parseInt(el.offsetWidth/2, 10), + y: parseInt(el.offsetHeight/2, 10) + }; + } + + }, + + /** + * Locks the slider, overrides YAHOO.util.DragDrop + * @method lock + */ + lock: function() { + this.logger.log("locking"); + this.thumb.lock(); + this.locked = true; + }, + + /** + * Unlocks the slider, overrides YAHOO.util.DragDrop + * @method unlock + */ + unlock: function() { + this.logger.log("unlocking"); + this.thumb.unlock(); + this.locked = false; + }, + + /** + * Handles mouseup event on the slider background + * @method thumbMouseUp + * @private + */ + thumbMouseUp: function() { + this.logger.log("bg mouseup"); + if (!this.isLocked() && !this.moveComplete) { + this.endMove(); + } + + }, + + /** + * Returns a reference to this slider's thumb + * @method getThumb + * @return {SliderThumb} this slider's thumb + */ + getThumb: function() { + return this.thumb; + }, + + /** + * Try to focus the element when clicked so we can add + * accessibility features + * @method focus + * @private + */ + focus: function() { + this.logger.log("focus"); + + // Focus the background element if possible + var el = this.getEl(); + + if (el.focus) { + try { + el.focus(); + } catch(e) { + // Prevent permission denied unhandled exception in FF that can + // happen when setting focus while another element is handling + // the blur. @TODO this is still writing to the error log + // (unhandled error) in FF1.5 with strict error checking on. + } + } + + this.verifyOffset(); + + if (this.isLocked()) { + return false; + } else { + this.onSlideStart(); + return true; + } + }, + + /** + * Event that fires when the value of the slider has changed + * @method onChange + * @param {int} firstOffset the number of pixels the thumb has moved + * from its start position. Normal horizontal and vertical sliders will only + * have the firstOffset. Regions will have both, the first is the horizontal + * offset, the second the vertical. + * @param {int} secondOffset the y offset for region sliders + * @deprecated use instance.subscribe("change") instead + */ + onChange: function (firstOffset, secondOffset) { + /* override me */ + this.logger.log("onChange: " + firstOffset + ", " + secondOffset); + }, + + /** + * Event that fires when the at the beginning of the slider thumb move + * @method onSlideStart + * @deprecated use instance.subscribe("slideStart") instead + */ + onSlideStart: function () { + /* override me */ + this.logger.log("onSlideStart"); + }, + + /** + * Event that fires at the end of a slider thumb move + * @method onSliderEnd + * @deprecated use instance.subscribe("slideEnd") instead + */ + onSlideEnd: function () { + /* override me */ + this.logger.log("onSlideEnd"); + }, + + /** + * Returns the slider's thumb offset from the start position + * @method getValue + * @return {int} the current value + */ + getValue: function () { + return this.thumb.getValue(); + }, + + /** + * Returns the slider's thumb X offset from the start position + * @method getXValue + * @return {int} the current horizontal offset + */ + getXValue: function () { + return this.thumb.getXValue(); + }, + + /** + * Returns the slider's thumb Y offset from the start position + * @method getYValue + * @return {int} the current vertical offset + */ + getYValue: function () { + return this.thumb.getYValue(); + }, + + /** + * Internal handler for the slider thumb's onChange event + * @method handleThumbChange + * @private + */ + handleThumbChange: function () { + var t = this.thumb; + if (t._isRegion) { + t.onChange(t.getXValue(), t.getYValue()); + this.fireEvent("change", { x: t.getXValue(), y: t.getYValue() } ); + } else { + t.onChange(t.getValue()); + this.fireEvent("change", t.getValue()); + } + + }, + + /** + * Provides a way to set the value of the slider in code. + * @method setValue + * @param {int} newOffset the number of pixels the thumb should be + * positioned away from the initial start point + * @param {boolean} skipAnim set to true to disable the animation + * for this move action (but not others). + * @param {boolean} force ignore the locked setting and set value anyway + * @return {boolean} true if the move was performed, false if it failed + */ + setValue: function(newOffset, skipAnim, force) { + this.logger.log("setValue " + newOffset); + + if (!this.thumb.available) { + this.logger.log("defer setValue until after onAvailble"); + this.deferredSetValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + this.logger.log("Can't set the value, the control is locked"); + return false; + } + + if ( isNaN(newOffset) ) { + this.logger.log("setValue, Illegal argument: " + newOffset); + return false; + } + + var t = this.thumb; + var newX, newY; + this.verifyOffset(true); + if (t._isRegion) { + return false; + } else if (t._isHoriz) { + this.onSlideStart(); + // this.fireEvent("slideStart"); + newX = t.initPageX + newOffset + this.thumbCenterPoint.x; + this.moveThumb(newX, t.initPageY, skipAnim); + } else { + this.onSlideStart(); + // this.fireEvent("slideStart"); + newY = t.initPageY + newOffset + this.thumbCenterPoint.y; + this.moveThumb(t.initPageX, newY, skipAnim); + } + + return true; + }, + + /** + * Provides a way to set the value of the region slider in code. + * @method setRegionValue + * @param {int} newOffset the number of pixels the thumb should be + * positioned away from the initial start point (x axis for region) + * @param {int} newOffset2 the number of pixels the thumb should be + * positioned away from the initial start point (y axis for region) + * @param {boolean} skipAnim set to true to disable the animation + * for this move action (but not others). + * @param {boolean} force ignore the locked setting and set value anyway + * @return {boolean} true if the move was performed, false if it failed + */ + setRegionValue: function(newOffset, newOffset2, skipAnim, force) { + + if (!this.thumb.available) { + this.logger.log("defer setRegionValue until after onAvailble"); + this.deferredSetRegionValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + this.logger.log("Can't set the value, the control is locked"); + return false; + } + + if ( isNaN(newOffset) ) { + this.logger.log("setRegionValue, Illegal argument: " + newOffset); + return false; + } + + var t = this.thumb; + if (t._isRegion) { + this.onSlideStart(); + var newX = t.initPageX + newOffset + this.thumbCenterPoint.x; + var newY = t.initPageY + newOffset2 + this.thumbCenterPoint.y; + this.moveThumb(newX, newY, skipAnim); + return true; + } + + return false; + + }, + + /** + * Checks the background position element position. If it has moved from the + * baseline position, the constraints for the thumb are reset + * @param checkPos {boolean} check the position instead of using cached value + * @method verifyOffset + * @return {boolean} True if the offset is the same as the baseline. + */ + verifyOffset: function(checkPos) { + + var newPos = YAHOO.util.Dom.getXY(this.getEl()); + //var newPos = [this.initPageX, this.initPageY]; + + this.logger.log("newPos: " + newPos, "warn"); + + if (newPos[0] != this.baselinePos[0] || newPos[1] != this.baselinePos[1]) { + this.logger.log("background moved, resetting constraints"); + this.thumb.resetConstraints(); + this.baselinePos = newPos; + return false; + } + + return true; + }, + + /** + * Move the associated slider moved to a timeout to try to get around the + * mousedown stealing moz does when I move the slider element between the + * cursor and the background during the mouseup event + * @method moveThumb + * @param {int} x the X coordinate of the click + * @param {int} y the Y coordinate of the click + * @param {boolean} skipAnim don't animate if the move happend onDrag + * @private + */ + moveThumb: function(x, y, skipAnim) { + + // this.logger.log("move thumb", "warn"); + + var t = this.thumb; + var self = this; + + if (!t.available) { + this.logger.log("thumb is not available yet, aborting move"); + return; + } + + this.logger.log("move thumb, x: " + x + ", y: " + y); + + // this.verifyOffset(); + + t.setDelta(this.thumbCenterPoint.x, this.thumbCenterPoint.y); + + var _p = t.getTargetCoord(x, y); + var p = [_p.x, _p.y]; + + + this.fireEvent("slideStart"); + + if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && t._graduated && !skipAnim) { + this.logger.log("graduated"); + // this.thumb._animating = true; + this.lock(); + + // cache the current thumb pos + this.curCoord = YAHOO.util.Dom.getXY(this.thumb.getEl()); + + setTimeout( function() { self.moveOneTick(p); }, this.tickPause ); + + } else if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && !skipAnim) { + this.logger.log("animating to " + p); + + // this.thumb._animating = true; + this.lock(); + + var oAnim = new YAHOO.util.Motion( + t.id, { points: { to: p } }, + this.animationDuration, + YAHOO.util.Easing.easeOut ); + + oAnim.onComplete.subscribe( function() { self.endMove(); } ); + oAnim.animate(); + } else { + t.setDragElPos(x, y); + // this.fireEvents(); + this.endMove(); + } + }, + + /** + * Move the slider one tick mark towards its final coordinate. Used + * for the animation when tick marks are defined + * @method moveOneTick + * @param {int[]} the destination coordinate + * @private + */ + moveOneTick: function(finalCoord) { + + var t = this.thumb, tmp; + + + // redundant call to getXY since we set the position most of time prior + // to getting here. Moved to this.curCoord + //var curCoord = YAHOO.util.Dom.getXY(t.getEl()); + + // alignElWithMouse caches position in lastPageX, lastPageY .. doesn't work + //var curCoord = [this.lastPageX, this.lastPageY]; + + // var thresh = Math.min(t.tickSize + (Math.floor(t.tickSize/2)), 10); + // var thresh = 10; + // var thresh = t.tickSize + (Math.floor(t.tickSize/2)); + + var nextCoord = null; + + if (t._isRegion) { + nextCoord = this._getNextX(this.curCoord, finalCoord); + var tmpX = (nextCoord) ? nextCoord[0] : this.curCoord[0]; + nextCoord = this._getNextY([tmpX, this.curCoord[1]], finalCoord); + + } else if (t._isHoriz) { + nextCoord = this._getNextX(this.curCoord, finalCoord); + } else { + nextCoord = this._getNextY(this.curCoord, finalCoord); + } + + this.logger.log("moveOneTick: " + + " finalCoord: " + finalCoord + + " this.curCoord: " + this.curCoord + + " nextCoord: " + nextCoord); + + if (nextCoord) { + + // cache the position + this.curCoord = nextCoord; + + // move to the next coord + // YAHOO.util.Dom.setXY(t.getEl(), nextCoord); + + // var el = t.getEl(); + // YAHOO.util.Dom.setStyle(el, "left", (nextCoord[0] + this.thumb.deltaSetXY[0]) + "px"); + // YAHOO.util.Dom.setStyle(el, "top", (nextCoord[1] + this.thumb.deltaSetXY[1]) + "px"); + + this.thumb.alignElWithMouse(t.getEl(), nextCoord[0], nextCoord[1]); + + // check if we are in the final position, if not make a recursive call + if (!(nextCoord[0] == finalCoord[0] && nextCoord[1] == finalCoord[1])) { + var self = this; + setTimeout(function() { self.moveOneTick(finalCoord); }, + this.tickPause); + } else { + this.endMove(); + } + } else { + this.endMove(); + } + + //this.tickPause = Math.round(this.tickPause/2); + }, + + /** + * Returns the next X tick value based on the current coord and the target coord. + * @method _getNextX + * @private + */ + _getNextX: function(curCoord, finalCoord) { + this.logger.log("getNextX: " + curCoord + ", " + finalCoord); + var t = this.thumb; + var thresh; + var tmp = []; + var nextCoord = null; + if (curCoord[0] > finalCoord[0]) { + thresh = t.tickSize - this.thumbCenterPoint.x; + tmp = t.getTargetCoord( curCoord[0] - thresh, curCoord[1] ); + nextCoord = [tmp.x, tmp.y]; + } else if (curCoord[0] < finalCoord[0]) { + thresh = t.tickSize + this.thumbCenterPoint.x; + tmp = t.getTargetCoord( curCoord[0] + thresh, curCoord[1] ); + nextCoord = [tmp.x, tmp.y]; + } else { + // equal, do nothing + } + + return nextCoord; + }, + + /** + * Returns the next Y tick value based on the current coord and the target coord. + * @method _getNextY + * @private + */ + _getNextY: function(curCoord, finalCoord) { + var t = this.thumb; + var thresh; + var tmp = []; + var nextCoord = null; + + if (curCoord[1] > finalCoord[1]) { + thresh = t.tickSize - this.thumbCenterPoint.y; + tmp = t.getTargetCoord( curCoord[0], curCoord[1] - thresh ); + nextCoord = [tmp.x, tmp.y]; + } else if (curCoord[1] < finalCoord[1]) { + thresh = t.tickSize + this.thumbCenterPoint.y; + tmp = t.getTargetCoord( curCoord[0], curCoord[1] + thresh ); + nextCoord = [tmp.x, tmp.y]; + } else { + // equal, do nothing + } + + return nextCoord; + }, + + /** + * Resets the constraints before moving the thumb. + * @method b4MouseDown + * @private + */ + b4MouseDown: function(e) { + this.thumb.autoOffset(); + this.thumb.resetConstraints(); + }, + + + /** + * Handles the mousedown event for the slider background + * @method onMouseDown + * @private + */ + onMouseDown: function(e) { + // this.resetConstraints(true); + // this.thumb.resetConstraints(true); + + if (! this.isLocked() && this.backgroundEnabled) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + this.logger.log("bg mousedown: " + x + "," + y); + + this.focus(); + this.moveThumb(x, y); + } + + }, + + /** + * Handles the onDrag event for the slider background + * @method onDrag + * @private + */ + onDrag: function(e) { + if (! this.isLocked()) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + this.moveThumb(x, y, true); + } + }, + + /** + * Fired when the slider movement ends + * @method endMove + * @private + */ + endMove: function () { + // this._animating = false; + this.unlock(); + this.moveComplete = true; + this.fireEvents(); + }, + + /** + * Fires the change event if the value has been changed. Ignored if we are in + * the middle of an animation as the event will fire when the animation is + * complete + * @method fireEvents + * @param {boolean} thumbEvent set to true if this event is fired from an event + * that occurred on the thumb. If it is, the state of the + * thumb dd object should be correct. Otherwise, the event + * originated on the background, so the thumb state needs to + * be refreshed before proceeding. + * @private + */ + fireEvents: function (thumbEvent) { + + var t = this.thumb; + // this.logger.log("FireEvents: " + t._isRegion); + + if (!thumbEvent) { + t.cachePosition(); + } + + if (! this.isLocked()) { + if (t._isRegion) { + this.logger.log("region"); + var newX = t.getXValue(); + var newY = t.getYValue(); + + if (newX != this.previousX || newY != this.previousY) { + // this.logger.log("Firing onchange"); + this.onChange(newX, newY); + this.fireEvent("change", { x: newX, y: newY }); + } + + this.previousX = newX; + this.previousY = newY; + + } else { + var newVal = t.getValue(); + if (newVal != this.previousVal) { + this.logger.log("Firing onchange: " + newVal); + this.onChange( newVal ); + this.fireEvent("change", newVal); + } + this.previousVal = newVal; + } + + if (this.moveComplete) { + this.onSlideEnd(); + this.fireEvent("slideEnd"); + this.moveComplete = false; + } + + } + }, + + /** + * Slider toString + * @method toString + * @return {string} string representation of the instance + */ + toString: function () { + return ("Slider (" + this.type +") " + this.id); + } + +}); + +YAHOO.augment(YAHOO.widget.Slider, YAHOO.util.EventProvider); + +/** + * A drag and drop implementation to be used as the thumb of a slider. + * @class SliderThumb + * @extends YAHOO.util.DD + * @constructor + * @param {String} id the id of the slider html element + * @param {String} sGroup the group of related DragDrop items + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + */ +YAHOO.widget.SliderThumb = function(id, sGroup, iLeft, iRight, iUp, iDown, iTickSize) { + + if (id) { + //this.init(id, sGroup); + YAHOO.widget.SliderThumb.superclass.constructor.call(this, id, sGroup); + + /** + * The id of the thumbs parent HTML element (the slider background + * element). + * @property parentElId + * @type string + */ + this.parentElId = sGroup; + } + + + //this.removeInvalidHandleType("A"); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + /** + * Overrides the isTarget property in YAHOO.util.DragDrop + * @property isTarget + * @private + */ + this.isTarget = false; + + /** + * The tick size for this slider + * @property tickSize + * @type int + * @private + */ + this.tickSize = iTickSize; + + /** + * Informs the drag and drop util that the offsets should remain when + * resetting the constraints. This preserves the slider value when + * the constraints are reset + * @property maintainOffset + * @type boolean + * @private + */ + this.maintainOffset = true; + + this.initSlider(iLeft, iRight, iUp, iDown, iTickSize); + + /** + * Turns off the autoscroll feature in drag and drop + * @property scroll + * @private + */ + this.scroll = false; + +}; + +YAHOO.extend(YAHOO.widget.SliderThumb, YAHOO.util.DD, { + + /** + * The (X and Y) difference between the thumb location and its parent + * (the slider background) when the control is instantiated. + * @property startOffset + * @type [int, int] + */ + startOffset: null, + + /** + * Flag used to figure out if this is a horizontal or vertical slider + * @property _isHoriz + * @type boolean + * @private + */ + _isHoriz: false, + + /** + * Cache the last value so we can check for change + * @property _prevVal + * @type int + * @private + */ + _prevVal: 0, + + /** + * The slider is _graduated if there is a tick interval defined + * @property _graduated + * @type boolean + * @private + */ + _graduated: false, + + + /** + * Returns the difference between the location of the thumb and its parent. + * @method getOffsetFromParent + * @param {[int, int]} parentPos Optionally accepts the position of the parent + * @type [int, int] + */ + getOffsetFromParent0: function(parentPos) { + var myPos = YAHOO.util.Dom.getXY(this.getEl()); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + return [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + }, + + getOffsetFromParent: function(parentPos) { + + var el = this.getEl(); + + if (!this.deltaOffset) { + + var myPos = YAHOO.util.Dom.getXY(el); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + var newOffset = [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + + var l = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var t = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + var deltaX = l - newOffset[0]; + var deltaY = t - newOffset[1]; + + if (isNaN(deltaX) || isNaN(deltaY)) { + this.logger.log("element does not have a position style def yet"); + } else { + this.deltaOffset = [deltaX, deltaY]; + } + + } else { + var newLeft = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var newTop = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + newOffset = [newLeft + this.deltaOffset[0], newTop + this.deltaOffset[1]]; + } + + return newOffset; + + //return [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + }, + + /** + * Set up the slider, must be called in the constructor of all subclasses + * @method initSlider + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize the width of the tick interval. + */ + initSlider: function (iLeft, iRight, iUp, iDown, iTickSize) { + + + //document these. new for 0.12.1 + this.initLeft = iLeft; + this.initRight = iRight; + this.initUp = iUp; + this.initDown = iDown; + + this.setXConstraint(iLeft, iRight, iTickSize); + this.setYConstraint(iUp, iDown, iTickSize); + + if (iTickSize && iTickSize > 1) { + this._graduated = true; + } + + this._isHoriz = (iLeft || iRight); + this._isVert = (iUp || iDown); + this._isRegion = (this._isHoriz && this._isVert); + + }, + + /** + * Clear's the slider's ticks + * @method clearTicks + */ + clearTicks: function () { + YAHOO.widget.SliderThumb.superclass.clearTicks.call(this); + this.tickSize = 0; + this._graduated = false; + }, + + + /** + * Gets the current offset from the element's start position in + * pixels. + * @method getValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved from the start position. + */ + getValue: function () { + if (!this.available) { return 0; } + var val = (this._isHoriz) ? this.getXValue() : this.getYValue(); + //this.logger.log("getVal: " + val); + return val; + }, + + /** + * Gets the current X offset from the element's start position in + * pixels. + * @method getXValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved horizontally from the start position. + */ + getXValue: function () { + if (!this.available) { return 0; } + var newOffset = this.getOffsetFromParent(); + return (newOffset[0] - this.startOffset[0]); + }, + + /** + * Gets the current Y offset from the element's start position in + * pixels. + * @method getYValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved vertically from the start position. + */ + getYValue: function () { + if (!this.available) { return 0; } + var newOffset = this.getOffsetFromParent(); + return (newOffset[1] - this.startOffset[1]); + }, + + /** + * Thumb toString + * @method toString + * @return {string} string representation of the instance + */ + toString: function () { + return "SliderThumb " + this.id; + }, + + /** + * The onchange event for the handle/thumb is delegated to the YAHOO.widget.Slider + * instance it belongs to. + * @method onChange + * @private + */ + onChange: function (x, y) { + } + +}); + +if ("undefined" == typeof YAHOO.util.Anim) { + YAHOO.widget.Slider.ANIM_AVAIL = false; +} + +YAHOO.register("slider", YAHOO.widget.Slider, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/slider/slider-min.js b/interface/ispconfig/interface/js/yui/slider/slider-min.js new file mode 100644 index 000000000..84eeb0f28 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/slider/slider-min.js @@ -0,0 +1,36 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +YAHOO.widget.Slider=function(sElementId,sGroup,oThumb,sType){if(sElementId){this.init(sElementId,sGroup,true);this.initSlider(sType);this.initThumb(oThumb);}};YAHOO.widget.Slider.getHorizSlider=function(sBGElId,sHandleElId,iLeft,iRight,iTickSize){return new YAHOO.widget.Slider(sBGElId,sBGElId,new YAHOO.widget.SliderThumb(sHandleElId,sBGElId,iLeft,iRight,0,0,iTickSize),"horiz");};YAHOO.widget.Slider.getVertSlider=function(sBGElId,sHandleElId,iUp,iDown,iTickSize){return new YAHOO.widget.Slider(sBGElId,sBGElId,new YAHOO.widget.SliderThumb(sHandleElId,sBGElId,0,0,iUp,iDown,iTickSize),"vert");};YAHOO.widget.Slider.getSliderRegion=function(sBGElId,sHandleElId,iLeft,iRight,iUp,iDown,iTickSize){return new YAHOO.widget.Slider(sBGElId,sBGElId,new YAHOO.widget.SliderThumb(sHandleElId,sBGElId,iLeft,iRight,iUp,iDown,iTickSize),"region");};YAHOO.widget.Slider.ANIM_AVAIL=true;YAHOO.extend(YAHOO.widget.Slider,YAHOO.util.DragDrop,{initSlider:function(sType){this.type=sType;this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);this.isTarget=false;this.animate=YAHOO.widget.Slider.ANIM_AVAIL;this.backgroundEnabled=true;this.tickPause=40;this.enableKeys=true;this.keyIncrement=20;this.moveComplete=true;this.animationDuration=0.2;},initThumb:function(t){var self=this;this.thumb=t;t.cacheBetweenDrags=true;t.onChange=function(){self.handleThumbChange();};if(t._isHoriz&&t.xTicks&&t.xTicks.length){this.tickPause=Math.round(360/t.xTicks.length);}else if(t.yTicks&&t.yTicks.length){this.tickPause=Math.round(360/t.yTicks.length);} +t.onMouseDown=function(){return self.focus();};t.onMouseUp=function(){self.thumbMouseUp();};t.onDrag=function(){self.fireEvents(true);};t.onAvailable=function(){return self.setStartSliderState();};},onAvailable:function(){var Event=YAHOO.util.Event;Event.on(this.id,"keydown",this.handleKeyDown,this,true);Event.on(this.id,"keypress",this.handleKeyPress,this,true);},handleKeyPress:function(e){if(this.enableKeys){var Event=YAHOO.util.Event;var kc=Event.getCharCode(e);switch(kc){case 0x25:case 0x26:case 0x27:case 0x28:case 0x24:case 0x23:Event.preventDefault(e);break;default:}}},handleKeyDown:function(e){if(this.enableKeys){var Event=YAHOO.util.Event;var kc=Event.getCharCode(e),t=this.thumb;var h=this.getXValue(),v=this.getYValue();var horiz=false;var changeValue=true;switch(kc){case 0x25:h-=this.keyIncrement;break;case 0x26:v-=this.keyIncrement;break;case 0x27:h+=this.keyIncrement;break;case 0x28:v+=this.keyIncrement;break;case 0x24:h=t.leftConstraint;v=t.topConstraint;break;case 0x23:h=t.rightConstraint;v=t.bottomConstraint;break;default:changeValue=false;} +if(changeValue){if(t._isRegion){this.setRegionValue(h,v,true);}else{var newVal=(t._isHoriz)?h:v;this.setValue(newVal,true);} +Event.stopEvent(e);}}},setStartSliderState:function(){this.setThumbCenterPoint();this.baselinePos=YAHOO.util.Dom.getXY(this.getEl());this.thumb.startOffset=this.thumb.getOffsetFromParent(this.baselinePos);if(this.thumb._isRegion){if(this.deferredSetRegionValue){this.setRegionValue.apply(this,this.deferredSetRegionValue,true);this.deferredSetRegionValue=null;}else{this.setRegionValue(0,0,true,true);}}else{if(this.deferredSetValue){this.setValue.apply(this,this.deferredSetValue,true);this.deferredSetValue=null;}else{this.setValue(0,true,true);}}},setThumbCenterPoint:function(){var el=this.thumb.getEl();if(el){this.thumbCenterPoint={x:parseInt(el.offsetWidth/2,10),y:parseInt(el.offsetHeight/2,10)};}},lock:function(){this.thumb.lock();this.locked=true;},unlock:function(){this.thumb.unlock();this.locked=false;},thumbMouseUp:function(){if(!this.isLocked()&&!this.moveComplete){this.endMove();}},getThumb:function(){return this.thumb;},focus:function(){var el=this.getEl();if(el.focus){try{el.focus();}catch(e){}} +this.verifyOffset();if(this.isLocked()){return false;}else{this.onSlideStart();return true;}},onChange:function(firstOffset,secondOffset){},onSlideStart:function(){},onSlideEnd:function(){},getValue:function(){return this.thumb.getValue();},getXValue:function(){return this.thumb.getXValue();},getYValue:function(){return this.thumb.getYValue();},handleThumbChange:function(){var t=this.thumb;if(t._isRegion){t.onChange(t.getXValue(),t.getYValue());this.fireEvent("change",{x:t.getXValue(),y:t.getYValue()});}else{t.onChange(t.getValue());this.fireEvent("change",t.getValue());}},setValue:function(newOffset,skipAnim,force){if(!this.thumb.available){this.deferredSetValue=arguments;return false;} +if(this.isLocked()&&!force){return false;} +if(isNaN(newOffset)){return false;} +var t=this.thumb;var newX,newY;this.verifyOffset(true);if(t._isRegion){return false;}else if(t._isHoriz){this.onSlideStart();newX=t.initPageX+newOffset+this.thumbCenterPoint.x;this.moveThumb(newX,t.initPageY,skipAnim);}else{this.onSlideStart();newY=t.initPageY+newOffset+this.thumbCenterPoint.y;this.moveThumb(t.initPageX,newY,skipAnim);} +return true;},setRegionValue:function(newOffset,newOffset2,skipAnim,force){if(!this.thumb.available){this.deferredSetRegionValue=arguments;return false;} +if(this.isLocked()&&!force){return false;} +if(isNaN(newOffset)){return false;} +var t=this.thumb;if(t._isRegion){this.onSlideStart();var newX=t.initPageX+newOffset+this.thumbCenterPoint.x;var newY=t.initPageY+newOffset2+this.thumbCenterPoint.y;this.moveThumb(newX,newY,skipAnim);return true;} +return false;},verifyOffset:function(checkPos){var newPos=YAHOO.util.Dom.getXY(this.getEl());if(newPos[0]!=this.baselinePos[0]||newPos[1]!=this.baselinePos[1]){this.thumb.resetConstraints();this.baselinePos=newPos;return false;} +return true;},moveThumb:function(x,y,skipAnim){var t=this.thumb;var self=this;if(!t.available){return;} +t.setDelta(this.thumbCenterPoint.x,this.thumbCenterPoint.y);var _p=t.getTargetCoord(x,y);var p=[_p.x,_p.y];this.fireEvent("slideStart");if(this.animate&&YAHOO.widget.Slider.ANIM_AVAIL&&t._graduated&&!skipAnim){this.lock();this.curCoord=YAHOO.util.Dom.getXY(this.thumb.getEl());setTimeout(function(){self.moveOneTick(p);},this.tickPause);}else if(this.animate&&YAHOO.widget.Slider.ANIM_AVAIL&&!skipAnim){this.lock();var oAnim=new YAHOO.util.Motion(t.id,{points:{to:p}},this.animationDuration,YAHOO.util.Easing.easeOut);oAnim.onComplete.subscribe(function(){self.endMove();});oAnim.animate();}else{t.setDragElPos(x,y);this.endMove();}},moveOneTick:function(finalCoord){var t=this.thumb,tmp;var nextCoord=null;if(t._isRegion){nextCoord=this._getNextX(this.curCoord,finalCoord);var tmpX=(nextCoord)?nextCoord[0]:this.curCoord[0];nextCoord=this._getNextY([tmpX,this.curCoord[1]],finalCoord);}else if(t._isHoriz){nextCoord=this._getNextX(this.curCoord,finalCoord);}else{nextCoord=this._getNextY(this.curCoord,finalCoord);} +if(nextCoord){this.curCoord=nextCoord;this.thumb.alignElWithMouse(t.getEl(),nextCoord[0],nextCoord[1]);if(!(nextCoord[0]==finalCoord[0]&&nextCoord[1]==finalCoord[1])){var self=this;setTimeout(function(){self.moveOneTick(finalCoord);},this.tickPause);}else{this.endMove();}}else{this.endMove();}},_getNextX:function(curCoord,finalCoord){var t=this.thumb;var thresh;var tmp=[];var nextCoord=null;if(curCoord[0]>finalCoord[0]){thresh=t.tickSize-this.thumbCenterPoint.x;tmp=t.getTargetCoord(curCoord[0]-thresh,curCoord[1]);nextCoord=[tmp.x,tmp.y];}else if(curCoord[0]finalCoord[1]){thresh=t.tickSize-this.thumbCenterPoint.y;tmp=t.getTargetCoord(curCoord[0],curCoord[1]-thresh);nextCoord=[tmp.x,tmp.y];}else if(curCoord[1]1){this._graduated=true;} +this._isHoriz=(iLeft||iRight);this._isVert=(iUp||iDown);this._isRegion=(this._isHoriz&&this._isVert);},clearTicks:function(){YAHOO.widget.SliderThumb.superclass.clearTicks.call(this);this.tickSize=0;this._graduated=false;},getValue:function(){if(!this.available){return 0;} +var val=(this._isHoriz)?this.getXValue():this.getYValue();return val;},getXValue:function(){if(!this.available){return 0;} +var newOffset=this.getOffsetFromParent();return(newOffset[0]-this.startOffset[0]);},getYValue:function(){if(!this.available){return 0;} +var newOffset=this.getOffsetFromParent();return(newOffset[1]-this.startOffset[1]);},toString:function(){return"SliderThumb "+this.id;},onChange:function(x,y){}});if("undefined"==typeof YAHOO.util.Anim){YAHOO.widget.Slider.ANIM_AVAIL=false;} +YAHOO.register("slider",YAHOO.widget.Slider,{version:"2.2.0",build:"127"}); \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/slider/slider.js b/interface/ispconfig/interface/js/yui/slider/slider.js new file mode 100644 index 000000000..9497d2c00 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/slider/slider.js @@ -0,0 +1,1222 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** + * The Slider component is a UI control that enables the user to adjust + * values in a finite range along one or two axes. Typically, the Slider + * control is used in a web application as a rich, visual replacement + * for an input box that takes a number as input. The Slider control can + * also easily accommodate a second dimension, providing x,y output for + * a selection point chosen from a rectangular region. + * + * @module slider + * @title Slider Widget + * @namespace YAHOO.widget + * @requires yahoo,dom,dragdrop,event + * @optional animation + */ + +/** + * A DragDrop implementation that can be used as a background for a + * slider. It takes a reference to the thumb instance + * so it can delegate some of the events to it. The goal is to make the + * thumb jump to the location on the background when the background is + * clicked. + * + * @class Slider + * @extends YAHOO.util.DragDrop + * @uses YAHOO.util.EventProvider + * @constructor + * @param {String} id The id of the element linked to this instance + * @param {String} sGroup The group of related DragDrop items + * @param {SliderThumb} oThumb The thumb for this slider + * @param {String} sType The type of slider (horiz, vert, region) + */ +YAHOO.widget.Slider = function(sElementId, sGroup, oThumb, sType) { + if (sElementId) { + this.init(sElementId, sGroup, true); + this.initSlider(sType); + this.initThumb(oThumb); + } +}; + +/** + * Factory method for creating a horizontal slider + * @method YAHOO.widget.Slider.getHorizSlider + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a horizontal slider control + */ +YAHOO.widget.Slider.getHorizSlider = + function (sBGElId, sHandleElId, iLeft, iRight, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, + iLeft, iRight, 0, 0, iTickSize), "horiz"); +}; + +/** + * Factory method for creating a vertical slider + * @method YAHOO.widget.Slider.getVertSlider + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a vertical slider control + */ +YAHOO.widget.Slider.getVertSlider = + function (sBGElId, sHandleElId, iUp, iDown, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, 0, 0, + iUp, iDown, iTickSize), "vert"); +}; + +/** + * Factory method for creating a slider region like the one in the color + * picker example + * @method YAHOO.widget.Slider.getSliderRegion + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a slider region control + */ +YAHOO.widget.Slider.getSliderRegion = + function (sBGElId, sHandleElId, iLeft, iRight, iUp, iDown, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, iLeft, iRight, + iUp, iDown, iTickSize), "region"); +}; + +/** + * By default, animation is available if the animation library is detected. + * @property YAHOO.widget.Slider.ANIM_AVAIL + * @static + * @type boolean + */ +YAHOO.widget.Slider.ANIM_AVAIL = true; + +YAHOO.extend(YAHOO.widget.Slider, YAHOO.util.DragDrop, { + + /** + * Initializes the slider. Executed in the constructor + * @method initSlider + * @param {string} sType the type of slider (horiz, vert, region) + */ + initSlider: function(sType) { + + /** + * The type of the slider (horiz, vert, region) + * @property type + * @type string + */ + this.type = sType; + + //this.removeInvalidHandleType("A"); + + + /** + * Event the fires when the value of the control changes. If + * the control is animated the event will fire every point + * along the way. + * @event change + * @param {int} newOffset|x the new offset for normal sliders, or the new + * x offset for region sliders + * @param {int} y the number of pixels the thumb has moved on the y axis + * (region sliders only) + */ + this.createEvent("change", this); + + /** + * Event that fires at the beginning of a slider thumb move. + * @event slideStart + */ + this.createEvent("slideStart", this); + + /** + * Event that fires at the end of a slider thumb move + * @event slideEnd + */ + this.createEvent("slideEnd", this); + + /** + * Overrides the isTarget property in YAHOO.util.DragDrop + * @property isTarget + * @private + */ + this.isTarget = false; + + /** + * Flag that determines if the thumb will animate when moved + * @property animate + * @type boolean + */ + this.animate = YAHOO.widget.Slider.ANIM_AVAIL; + + /** + * Set to false to disable a background click thumb move + * @property backgroundEnabled + * @type boolean + */ + this.backgroundEnabled = true; + + /** + * Adjustment factor for tick animation, the more ticks, the + * faster the animation (by default) + * @property tickPause + * @type int + */ + this.tickPause = 40; + + /** + * Enables the arrow, home and end keys, defaults to true. + * @property enableKeys + * @type boolean + */ + this.enableKeys = true; + + /** + * Specifies the number of pixels the arrow keys will move the slider. + * Default is 25. + * @property keyIncrement + * @type int + */ + this.keyIncrement = 20; + + /** + * moveComplete is set to true when the slider has moved to its final + * destination. For animated slider, this value can be checked in + * the onChange handler to make it possible to execute logic only + * when the move is complete rather than at all points along the way. + * Deprecated because this flag is only useful when the background is + * clicked and the slider is animated. If the user drags the thumb, + * the flag is updated when the drag is over ... the final onDrag event + * fires before the mouseup the ends the drag, so the implementer will + * never see it. + * + * @property moveComplete + * @type Boolean + * @deprecated use the slideEnd event instead + */ + this.moveComplete = true; + + /** + * If animation is configured, specifies the length of the animation + * in seconds. + * @property animationDuration + * @type int + * @default 0.2 + */ + this.animationDuration = 0.2; + }, + + /** + * Initializes the slider's thumb. Executed in the constructor. + * @method initThumb + * @param {YAHOO.widget.SliderThumb} t the slider thumb + */ + initThumb: function(t) { + + var self = this; + + /** + * A YAHOO.widget.SliderThumb instance that we will use to + * reposition the thumb when the background is clicked + * @property thumb + * @type YAHOO.widget.SliderThumb + */ + this.thumb = t; + t.cacheBetweenDrags = true; + + // add handler for the handle onchange event + t.onChange = function() { + self.handleThumbChange(); + }; + + if (t._isHoriz && t.xTicks && t.xTicks.length) { + this.tickPause = Math.round(360 / t.xTicks.length); + } else if (t.yTicks && t.yTicks.length) { + this.tickPause = Math.round(360 / t.yTicks.length); + } + + + // delegate thumb methods + t.onMouseDown = function () { return self.focus(); }; + t.onMouseUp = function() { self.thumbMouseUp(); }; + t.onDrag = function() { self.fireEvents(true); }; + t.onAvailable = function() { return self.setStartSliderState(); }; + + }, + + /** + * Executed when the slider element is available + * @method onAvailable + */ + onAvailable: function() { + var Event = YAHOO.util.Event; + Event.on(this.id, "keydown", this.handleKeyDown, this, true); + Event.on(this.id, "keypress", this.handleKeyPress, this, true); + }, + + /** + * Executed when a keypress event happens with the control focused. + * Prevents the default behavior for navigation keys. The actual + * logic for moving the slider thumb in response to a key event + * happens in handleKeyDown. + * @param {Event} e the keypress event + */ + handleKeyPress: function(e) { + if (this.enableKeys) { + var Event = YAHOO.util.Event; + var kc = Event.getCharCode(e); + switch (kc) { + case 0x25: // left + case 0x26: // up + case 0x27: // right + case 0x28: // down + case 0x24: // home + case 0x23: // end + Event.preventDefault(e); + break; + default: + } + } + }, + + /** + * Executed when a keydown event happens with the control focused. + * Updates the slider value and display when the keypress is an + * arrow key, home, or end as long as enableKeys is set to true. + * @param {Event} e the keydown event + */ + handleKeyDown: function(e) { + if (this.enableKeys) { + var Event = YAHOO.util.Event; + + var kc = Event.getCharCode(e), t=this.thumb; + var h=this.getXValue(),v=this.getYValue(); + + var horiz = false; + var changeValue = true; + switch (kc) { + + // left + case 0x25: h -= this.keyIncrement; break; + + // up + case 0x26: v -= this.keyIncrement; break; + + // right + case 0x27: h += this.keyIncrement; break; + + // down + case 0x28: v += this.keyIncrement; break; + + // home + case 0x24: h = t.leftConstraint; + v = t.topConstraint; + break; + + // end + case 0x23: h = t.rightConstraint; + v = t.bottomConstraint; + break; + + default: changeValue = false; + } + + if (changeValue) { + if (t._isRegion) { + this.setRegionValue(h, v, true); + } else { + var newVal = (t._isHoriz) ? h : v; + this.setValue(newVal, true); + } + Event.stopEvent(e); + } + + } + }, + + /** + * Initialization that sets up the value offsets once the elements are ready + * @method setStartSliderState + */ + setStartSliderState: function() { + + + this.setThumbCenterPoint(); + + /** + * The basline position of the background element, used + * to determine if the background has moved since the last + * operation. + * @property baselinePos + * @type [int, int] + */ + this.baselinePos = YAHOO.util.Dom.getXY(this.getEl()); + + this.thumb.startOffset = this.thumb.getOffsetFromParent(this.baselinePos); + + if (this.thumb._isRegion) { + if (this.deferredSetRegionValue) { + this.setRegionValue.apply(this, this.deferredSetRegionValue, true); + this.deferredSetRegionValue = null; + } else { + this.setRegionValue(0, 0, true, true); + } + } else { + if (this.deferredSetValue) { + this.setValue.apply(this, this.deferredSetValue, true); + this.deferredSetValue = null; + } else { + this.setValue(0, true, true); + } + } + }, + + /** + * When the thumb is available, we cache the centerpoint of the element so + * we can position the element correctly when the background is clicked + * @method setThumbCenterPoint + */ + setThumbCenterPoint: function() { + + var el = this.thumb.getEl(); + + if (el) { + /** + * The center of the slider element is stored so we can + * place it in the correct position when the background is clicked. + * @property thumbCenterPoint + * @type {"x": int, "y": int} + */ + this.thumbCenterPoint = { + x: parseInt(el.offsetWidth/2, 10), + y: parseInt(el.offsetHeight/2, 10) + }; + } + + }, + + /** + * Locks the slider, overrides YAHOO.util.DragDrop + * @method lock + */ + lock: function() { + this.thumb.lock(); + this.locked = true; + }, + + /** + * Unlocks the slider, overrides YAHOO.util.DragDrop + * @method unlock + */ + unlock: function() { + this.thumb.unlock(); + this.locked = false; + }, + + /** + * Handles mouseup event on the slider background + * @method thumbMouseUp + * @private + */ + thumbMouseUp: function() { + if (!this.isLocked() && !this.moveComplete) { + this.endMove(); + } + + }, + + /** + * Returns a reference to this slider's thumb + * @method getThumb + * @return {SliderThumb} this slider's thumb + */ + getThumb: function() { + return this.thumb; + }, + + /** + * Try to focus the element when clicked so we can add + * accessibility features + * @method focus + * @private + */ + focus: function() { + + // Focus the background element if possible + var el = this.getEl(); + + if (el.focus) { + try { + el.focus(); + } catch(e) { + // Prevent permission denied unhandled exception in FF that can + // happen when setting focus while another element is handling + // the blur. @TODO this is still writing to the error log + // (unhandled error) in FF1.5 with strict error checking on. + } + } + + this.verifyOffset(); + + if (this.isLocked()) { + return false; + } else { + this.onSlideStart(); + return true; + } + }, + + /** + * Event that fires when the value of the slider has changed + * @method onChange + * @param {int} firstOffset the number of pixels the thumb has moved + * from its start position. Normal horizontal and vertical sliders will only + * have the firstOffset. Regions will have both, the first is the horizontal + * offset, the second the vertical. + * @param {int} secondOffset the y offset for region sliders + * @deprecated use instance.subscribe("change") instead + */ + onChange: function (firstOffset, secondOffset) { + /* override me */ + }, + + /** + * Event that fires when the at the beginning of the slider thumb move + * @method onSlideStart + * @deprecated use instance.subscribe("slideStart") instead + */ + onSlideStart: function () { + /* override me */ + }, + + /** + * Event that fires at the end of a slider thumb move + * @method onSliderEnd + * @deprecated use instance.subscribe("slideEnd") instead + */ + onSlideEnd: function () { + /* override me */ + }, + + /** + * Returns the slider's thumb offset from the start position + * @method getValue + * @return {int} the current value + */ + getValue: function () { + return this.thumb.getValue(); + }, + + /** + * Returns the slider's thumb X offset from the start position + * @method getXValue + * @return {int} the current horizontal offset + */ + getXValue: function () { + return this.thumb.getXValue(); + }, + + /** + * Returns the slider's thumb Y offset from the start position + * @method getYValue + * @return {int} the current vertical offset + */ + getYValue: function () { + return this.thumb.getYValue(); + }, + + /** + * Internal handler for the slider thumb's onChange event + * @method handleThumbChange + * @private + */ + handleThumbChange: function () { + var t = this.thumb; + if (t._isRegion) { + t.onChange(t.getXValue(), t.getYValue()); + this.fireEvent("change", { x: t.getXValue(), y: t.getYValue() } ); + } else { + t.onChange(t.getValue()); + this.fireEvent("change", t.getValue()); + } + + }, + + /** + * Provides a way to set the value of the slider in code. + * @method setValue + * @param {int} newOffset the number of pixels the thumb should be + * positioned away from the initial start point + * @param {boolean} skipAnim set to true to disable the animation + * for this move action (but not others). + * @param {boolean} force ignore the locked setting and set value anyway + * @return {boolean} true if the move was performed, false if it failed + */ + setValue: function(newOffset, skipAnim, force) { + + if (!this.thumb.available) { + this.deferredSetValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + return false; + } + + if ( isNaN(newOffset) ) { + return false; + } + + var t = this.thumb; + var newX, newY; + this.verifyOffset(true); + if (t._isRegion) { + return false; + } else if (t._isHoriz) { + this.onSlideStart(); + // this.fireEvent("slideStart"); + newX = t.initPageX + newOffset + this.thumbCenterPoint.x; + this.moveThumb(newX, t.initPageY, skipAnim); + } else { + this.onSlideStart(); + // this.fireEvent("slideStart"); + newY = t.initPageY + newOffset + this.thumbCenterPoint.y; + this.moveThumb(t.initPageX, newY, skipAnim); + } + + return true; + }, + + /** + * Provides a way to set the value of the region slider in code. + * @method setRegionValue + * @param {int} newOffset the number of pixels the thumb should be + * positioned away from the initial start point (x axis for region) + * @param {int} newOffset2 the number of pixels the thumb should be + * positioned away from the initial start point (y axis for region) + * @param {boolean} skipAnim set to true to disable the animation + * for this move action (but not others). + * @param {boolean} force ignore the locked setting and set value anyway + * @return {boolean} true if the move was performed, false if it failed + */ + setRegionValue: function(newOffset, newOffset2, skipAnim, force) { + + if (!this.thumb.available) { + this.deferredSetRegionValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + return false; + } + + if ( isNaN(newOffset) ) { + return false; + } + + var t = this.thumb; + if (t._isRegion) { + this.onSlideStart(); + var newX = t.initPageX + newOffset + this.thumbCenterPoint.x; + var newY = t.initPageY + newOffset2 + this.thumbCenterPoint.y; + this.moveThumb(newX, newY, skipAnim); + return true; + } + + return false; + + }, + + /** + * Checks the background position element position. If it has moved from the + * baseline position, the constraints for the thumb are reset + * @param checkPos {boolean} check the position instead of using cached value + * @method verifyOffset + * @return {boolean} True if the offset is the same as the baseline. + */ + verifyOffset: function(checkPos) { + + var newPos = YAHOO.util.Dom.getXY(this.getEl()); + //var newPos = [this.initPageX, this.initPageY]; + + + if (newPos[0] != this.baselinePos[0] || newPos[1] != this.baselinePos[1]) { + this.thumb.resetConstraints(); + this.baselinePos = newPos; + return false; + } + + return true; + }, + + /** + * Move the associated slider moved to a timeout to try to get around the + * mousedown stealing moz does when I move the slider element between the + * cursor and the background during the mouseup event + * @method moveThumb + * @param {int} x the X coordinate of the click + * @param {int} y the Y coordinate of the click + * @param {boolean} skipAnim don't animate if the move happend onDrag + * @private + */ + moveThumb: function(x, y, skipAnim) { + + + var t = this.thumb; + var self = this; + + if (!t.available) { + return; + } + + + // this.verifyOffset(); + + t.setDelta(this.thumbCenterPoint.x, this.thumbCenterPoint.y); + + var _p = t.getTargetCoord(x, y); + var p = [_p.x, _p.y]; + + + this.fireEvent("slideStart"); + + if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && t._graduated && !skipAnim) { + // this.thumb._animating = true; + this.lock(); + + // cache the current thumb pos + this.curCoord = YAHOO.util.Dom.getXY(this.thumb.getEl()); + + setTimeout( function() { self.moveOneTick(p); }, this.tickPause ); + + } else if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && !skipAnim) { + + // this.thumb._animating = true; + this.lock(); + + var oAnim = new YAHOO.util.Motion( + t.id, { points: { to: p } }, + this.animationDuration, + YAHOO.util.Easing.easeOut ); + + oAnim.onComplete.subscribe( function() { self.endMove(); } ); + oAnim.animate(); + } else { + t.setDragElPos(x, y); + // this.fireEvents(); + this.endMove(); + } + }, + + /** + * Move the slider one tick mark towards its final coordinate. Used + * for the animation when tick marks are defined + * @method moveOneTick + * @param {int[]} the destination coordinate + * @private + */ + moveOneTick: function(finalCoord) { + + var t = this.thumb, tmp; + + + // redundant call to getXY since we set the position most of time prior + // to getting here. Moved to this.curCoord + //var curCoord = YAHOO.util.Dom.getXY(t.getEl()); + + // alignElWithMouse caches position in lastPageX, lastPageY .. doesn't work + //var curCoord = [this.lastPageX, this.lastPageY]; + + // var thresh = Math.min(t.tickSize + (Math.floor(t.tickSize/2)), 10); + // var thresh = 10; + // var thresh = t.tickSize + (Math.floor(t.tickSize/2)); + + var nextCoord = null; + + if (t._isRegion) { + nextCoord = this._getNextX(this.curCoord, finalCoord); + var tmpX = (nextCoord) ? nextCoord[0] : this.curCoord[0]; + nextCoord = this._getNextY([tmpX, this.curCoord[1]], finalCoord); + + } else if (t._isHoriz) { + nextCoord = this._getNextX(this.curCoord, finalCoord); + } else { + nextCoord = this._getNextY(this.curCoord, finalCoord); + } + + + if (nextCoord) { + + // cache the position + this.curCoord = nextCoord; + + // move to the next coord + // YAHOO.util.Dom.setXY(t.getEl(), nextCoord); + + // var el = t.getEl(); + // YAHOO.util.Dom.setStyle(el, "left", (nextCoord[0] + this.thumb.deltaSetXY[0]) + "px"); + // YAHOO.util.Dom.setStyle(el, "top", (nextCoord[1] + this.thumb.deltaSetXY[1]) + "px"); + + this.thumb.alignElWithMouse(t.getEl(), nextCoord[0], nextCoord[1]); + + // check if we are in the final position, if not make a recursive call + if (!(nextCoord[0] == finalCoord[0] && nextCoord[1] == finalCoord[1])) { + var self = this; + setTimeout(function() { self.moveOneTick(finalCoord); }, + this.tickPause); + } else { + this.endMove(); + } + } else { + this.endMove(); + } + + //this.tickPause = Math.round(this.tickPause/2); + }, + + /** + * Returns the next X tick value based on the current coord and the target coord. + * @method _getNextX + * @private + */ + _getNextX: function(curCoord, finalCoord) { + var t = this.thumb; + var thresh; + var tmp = []; + var nextCoord = null; + if (curCoord[0] > finalCoord[0]) { + thresh = t.tickSize - this.thumbCenterPoint.x; + tmp = t.getTargetCoord( curCoord[0] - thresh, curCoord[1] ); + nextCoord = [tmp.x, tmp.y]; + } else if (curCoord[0] < finalCoord[0]) { + thresh = t.tickSize + this.thumbCenterPoint.x; + tmp = t.getTargetCoord( curCoord[0] + thresh, curCoord[1] ); + nextCoord = [tmp.x, tmp.y]; + } else { + // equal, do nothing + } + + return nextCoord; + }, + + /** + * Returns the next Y tick value based on the current coord and the target coord. + * @method _getNextY + * @private + */ + _getNextY: function(curCoord, finalCoord) { + var t = this.thumb; + var thresh; + var tmp = []; + var nextCoord = null; + + if (curCoord[1] > finalCoord[1]) { + thresh = t.tickSize - this.thumbCenterPoint.y; + tmp = t.getTargetCoord( curCoord[0], curCoord[1] - thresh ); + nextCoord = [tmp.x, tmp.y]; + } else if (curCoord[1] < finalCoord[1]) { + thresh = t.tickSize + this.thumbCenterPoint.y; + tmp = t.getTargetCoord( curCoord[0], curCoord[1] + thresh ); + nextCoord = [tmp.x, tmp.y]; + } else { + // equal, do nothing + } + + return nextCoord; + }, + + /** + * Resets the constraints before moving the thumb. + * @method b4MouseDown + * @private + */ + b4MouseDown: function(e) { + this.thumb.autoOffset(); + this.thumb.resetConstraints(); + }, + + + /** + * Handles the mousedown event for the slider background + * @method onMouseDown + * @private + */ + onMouseDown: function(e) { + // this.resetConstraints(true); + // this.thumb.resetConstraints(true); + + if (! this.isLocked() && this.backgroundEnabled) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + + this.focus(); + this.moveThumb(x, y); + } + + }, + + /** + * Handles the onDrag event for the slider background + * @method onDrag + * @private + */ + onDrag: function(e) { + if (! this.isLocked()) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + this.moveThumb(x, y, true); + } + }, + + /** + * Fired when the slider movement ends + * @method endMove + * @private + */ + endMove: function () { + // this._animating = false; + this.unlock(); + this.moveComplete = true; + this.fireEvents(); + }, + + /** + * Fires the change event if the value has been changed. Ignored if we are in + * the middle of an animation as the event will fire when the animation is + * complete + * @method fireEvents + * @param {boolean} thumbEvent set to true if this event is fired from an event + * that occurred on the thumb. If it is, the state of the + * thumb dd object should be correct. Otherwise, the event + * originated on the background, so the thumb state needs to + * be refreshed before proceeding. + * @private + */ + fireEvents: function (thumbEvent) { + + var t = this.thumb; + + if (!thumbEvent) { + t.cachePosition(); + } + + if (! this.isLocked()) { + if (t._isRegion) { + var newX = t.getXValue(); + var newY = t.getYValue(); + + if (newX != this.previousX || newY != this.previousY) { + this.onChange(newX, newY); + this.fireEvent("change", { x: newX, y: newY }); + } + + this.previousX = newX; + this.previousY = newY; + + } else { + var newVal = t.getValue(); + if (newVal != this.previousVal) { + this.onChange( newVal ); + this.fireEvent("change", newVal); + } + this.previousVal = newVal; + } + + if (this.moveComplete) { + this.onSlideEnd(); + this.fireEvent("slideEnd"); + this.moveComplete = false; + } + + } + }, + + /** + * Slider toString + * @method toString + * @return {string} string representation of the instance + */ + toString: function () { + return ("Slider (" + this.type +") " + this.id); + } + +}); + +YAHOO.augment(YAHOO.widget.Slider, YAHOO.util.EventProvider); + +/** + * A drag and drop implementation to be used as the thumb of a slider. + * @class SliderThumb + * @extends YAHOO.util.DD + * @constructor + * @param {String} id the id of the slider html element + * @param {String} sGroup the group of related DragDrop items + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + */ +YAHOO.widget.SliderThumb = function(id, sGroup, iLeft, iRight, iUp, iDown, iTickSize) { + + if (id) { + //this.init(id, sGroup); + YAHOO.widget.SliderThumb.superclass.constructor.call(this, id, sGroup); + + /** + * The id of the thumbs parent HTML element (the slider background + * element). + * @property parentElId + * @type string + */ + this.parentElId = sGroup; + } + + + //this.removeInvalidHandleType("A"); + + + /** + * Overrides the isTarget property in YAHOO.util.DragDrop + * @property isTarget + * @private + */ + this.isTarget = false; + + /** + * The tick size for this slider + * @property tickSize + * @type int + * @private + */ + this.tickSize = iTickSize; + + /** + * Informs the drag and drop util that the offsets should remain when + * resetting the constraints. This preserves the slider value when + * the constraints are reset + * @property maintainOffset + * @type boolean + * @private + */ + this.maintainOffset = true; + + this.initSlider(iLeft, iRight, iUp, iDown, iTickSize); + + /** + * Turns off the autoscroll feature in drag and drop + * @property scroll + * @private + */ + this.scroll = false; + +}; + +YAHOO.extend(YAHOO.widget.SliderThumb, YAHOO.util.DD, { + + /** + * The (X and Y) difference between the thumb location and its parent + * (the slider background) when the control is instantiated. + * @property startOffset + * @type [int, int] + */ + startOffset: null, + + /** + * Flag used to figure out if this is a horizontal or vertical slider + * @property _isHoriz + * @type boolean + * @private + */ + _isHoriz: false, + + /** + * Cache the last value so we can check for change + * @property _prevVal + * @type int + * @private + */ + _prevVal: 0, + + /** + * The slider is _graduated if there is a tick interval defined + * @property _graduated + * @type boolean + * @private + */ + _graduated: false, + + + /** + * Returns the difference between the location of the thumb and its parent. + * @method getOffsetFromParent + * @param {[int, int]} parentPos Optionally accepts the position of the parent + * @type [int, int] + */ + getOffsetFromParent0: function(parentPos) { + var myPos = YAHOO.util.Dom.getXY(this.getEl()); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + return [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + }, + + getOffsetFromParent: function(parentPos) { + + var el = this.getEl(); + + if (!this.deltaOffset) { + + var myPos = YAHOO.util.Dom.getXY(el); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + var newOffset = [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + + var l = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var t = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + var deltaX = l - newOffset[0]; + var deltaY = t - newOffset[1]; + + if (isNaN(deltaX) || isNaN(deltaY)) { + } else { + this.deltaOffset = [deltaX, deltaY]; + } + + } else { + var newLeft = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var newTop = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + newOffset = [newLeft + this.deltaOffset[0], newTop + this.deltaOffset[1]]; + } + + return newOffset; + + //return [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + }, + + /** + * Set up the slider, must be called in the constructor of all subclasses + * @method initSlider + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize the width of the tick interval. + */ + initSlider: function (iLeft, iRight, iUp, iDown, iTickSize) { + + + //document these. new for 0.12.1 + this.initLeft = iLeft; + this.initRight = iRight; + this.initUp = iUp; + this.initDown = iDown; + + this.setXConstraint(iLeft, iRight, iTickSize); + this.setYConstraint(iUp, iDown, iTickSize); + + if (iTickSize && iTickSize > 1) { + this._graduated = true; + } + + this._isHoriz = (iLeft || iRight); + this._isVert = (iUp || iDown); + this._isRegion = (this._isHoriz && this._isVert); + + }, + + /** + * Clear's the slider's ticks + * @method clearTicks + */ + clearTicks: function () { + YAHOO.widget.SliderThumb.superclass.clearTicks.call(this); + this.tickSize = 0; + this._graduated = false; + }, + + + /** + * Gets the current offset from the element's start position in + * pixels. + * @method getValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved from the start position. + */ + getValue: function () { + if (!this.available) { return 0; } + var val = (this._isHoriz) ? this.getXValue() : this.getYValue(); + return val; + }, + + /** + * Gets the current X offset from the element's start position in + * pixels. + * @method getXValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved horizontally from the start position. + */ + getXValue: function () { + if (!this.available) { return 0; } + var newOffset = this.getOffsetFromParent(); + return (newOffset[0] - this.startOffset[0]); + }, + + /** + * Gets the current Y offset from the element's start position in + * pixels. + * @method getYValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved vertically from the start position. + */ + getYValue: function () { + if (!this.available) { return 0; } + var newOffset = this.getOffsetFromParent(); + return (newOffset[1] - this.startOffset[1]); + }, + + /** + * Thumb toString + * @method toString + * @return {string} string representation of the instance + */ + toString: function () { + return "SliderThumb " + this.id; + }, + + /** + * The onchange event for the handle/thumb is delegated to the YAHOO.widget.Slider + * instance it belongs to. + * @method onChange + * @private + */ + onChange: function (x, y) { + } + +}); + +if ("undefined" == typeof YAHOO.util.Anim) { + YAHOO.widget.Slider.ANIM_AVAIL = false; +} + +YAHOO.register("slider", YAHOO.widget.Slider, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/tabview/README b/interface/ispconfig/interface/js/yui/tabview/README new file mode 100644 index 000000000..0c598a55d --- /dev/null +++ b/interface/ispconfig/interface/js/yui/tabview/README @@ -0,0 +1,21 @@ +*** version 2.2.0 ** + +* Element broken out into seperate pkg + NOTE: new dependency required - element-beta.js + +*** version 0.12.2 *** + +* var Tab is now private +* fixed Element.configureAttribute + +*** version 0.12.1 *** + +* tabs.css renamed to tabview.css +* calls to "set" now queued so they can be made before "contentReady" + + +*** version 0.12.0 *** + +* TabView widget introduced + +* Note: border_tabs.css included as basic skin to enable "tabs" look diff --git a/interface/ispconfig/interface/js/yui/tabview/assets/border_tabs.css b/interface/ispconfig/interface/js/yui/tabview/assets/border_tabs.css new file mode 100644 index 000000000..57395f62c --- /dev/null +++ b/interface/ispconfig/interface/js/yui/tabview/assets/border_tabs.css @@ -0,0 +1,54 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +.yui-navset .yui-nav li a, .yui-navset .yui-content { + border:1px solid #000; /* label and content borders */ +} + +.yui-navset .yui-nav .selected a, .yui-navset .yui-nav a:hover, .yui-navset .yui-content { + background-color:#f6f7ee; /* active tab, tab hover, and content bgcolor */ +} + +.yui-navset .yui-nav li em { padding:.5em; } /* tab padding */ + +/* defaults to orientation "top" */ +.yui-navset .yui-nav .selected a { + border-bottom-width:0; /* no bottom border for active tab */ + padding-bottom:1px; /* to match height of other tabs */ +} + +.yui-navset .yui-content { + margin-top:-1px; /* for active tab overlap */ +} + +/* overrides for other orientations */ + +.yui-navset-bottom .yui-nav .selected a { + border-width:0 1px 1px; /* no top border for active tab */ + padding:1px 0 0; /* to match height of other tabs */ +} + +.yui-navset-bottom .yui-content { + margin:0 0 -1px; /* for active tab overlap */ +} + +.yui-navset-left .yui-nav li.selected a { + border-width:1px 0 1px 1px; /* no right border for active tab */ + padding:0 1px 0 0; /* to match width of other tabs */ +} + +.yui-navset-left .yui-content { + margin:0 0 0 -1px; /* for active tab overlap */ +} + +.yui-navset-right .yui-nav li.selected a { + border-width:1px 1px 1px 0; /* no left border for active tab */ + padding:0 0 0 1px; /* to match width of other tabs */ +} + +.yui-navset-right .yui-content { + margin:0 -1px 0 0; /* for active tab overlap */ +} \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/tabview/assets/tabview.css b/interface/ispconfig/interface/js/yui/tabview/assets/tabview.css new file mode 100644 index 000000000..2d6b788f5 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/tabview/assets/tabview.css @@ -0,0 +1,75 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* default space between tabs */ +.yui-navset .yui-nav li { + margin-right:0.5em; /* horizontal tabs */ +} +.yui-navset-left .yui-nav li, .yui-navset-right .yui-nav li { + margin:0 0 0.5em; /* vertical tabs */ +} + +/* default width for side tabs */ +.yui-navset-left .yui-nav, .yui-navset-right .yui-nav { width:6em; } +.yui-navset-left { padding-left:6em; } /* map to nav width */ +.yui-navset-right { padding-right:6em; } /* ditto */ + +/* core */ + +.yui-nav, .yui-nav li { + margin:0; + padding:0; + list-style:none; +} +.yui-navset li em { font-style:normal; } + +.yui-navset { + position:relative; /* contain absolute positioned tabs (left/right) */ + zoom:1; +} + +.yui-navset .yui-content { zoom:1; } + +.yui-navset .yui-nav li { + display:inline-block; + display:-moz-inline-stack; + *display:inline; /* IE */ + vertical-align:bottom; /* safari: for overlap */ + cursor:pointer; /* gecko: due to -moz-inline-stack on anchor */ + zoom:1; /* IE: kill space between horizontal tabs */ +} + +.yui-navset-left .yui-nav li, .yui-navset-right .yui-nav li { + display:block; +} + +.yui-navset .yui-nav a { + outline:0; /* gecko: keep from shifting */ +} + +.yui-navset .yui-nav a { position:relative; } /* IE: to allow overlap */ + +.yui-navset .yui-nav li a { + display:block; + display:inline-block; + vertical-align:bottom; /* safari: for overlap */ + zoom:1; +} + +.yui-navset-left .yui-nav li a, .yui-navset-right .yui-nav li a { + display:block; +} + +.yui-navset-bottom .yui-nav li a { + vertical-align:text-top; /* for inline overlap (reverse for Op border bug) */ +} + +.yui-navset .yui-nav li a em { display:block; } + +/* position left and right oriented tabs */ +.yui-navset-left .yui-nav, .yui-navset-right .yui-nav { position:absolute; z-index:1; } +.yui-navset-left .yui-nav { left:0; } +.yui-navset-right .yui-nav { right:0; } diff --git a/interface/ispconfig/interface/js/yui/tabview/tabview-debug.js b/interface/ispconfig/interface/js/yui/tabview/tabview-debug.js new file mode 100644 index 000000000..f84511aa2 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/tabview/tabview-debug.js @@ -0,0 +1,1025 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +(function() { + + /** + * The tabview module provides a widget for managing content bound to tabs. + * @module tabview + * @requires yahoo, dom, event, element + * + */ + /** + * A widget to control tabbed views. + * @namespace YAHOO.widget + * @class TabView + * @extends YAHOO.util.Element + * @constructor + * @param {HTMLElement | String | Object} el(optional) The html + * element that represents the TabView, or the attribute object to use. + * An element will be created if none provided. + * @param {Object} attr (optional) A key map of the tabView's + * initial attributes. Ignored if first arg is attributes object. + */ + YAHOO.widget.TabView = function(el, attr) { + attr = attr || {}; + if (arguments.length == 1 && !YAHOO.lang.isString(el) && !el.nodeName) { + attr = el; // treat first arg as attr object + el = attr.element || null; + } + + if (!el && !attr.element) { // create if we dont have one + el = _createTabViewElement.call(this, attr); + } + YAHOO.widget.TabView.superclass.constructor.call(this, el, attr); + }; + + YAHOO.extend(YAHOO.widget.TabView, YAHOO.util.Element); + + var proto = YAHOO.widget.TabView.prototype; + var Dom = YAHOO.util.Dom; + var Event = YAHOO.util.Event; + var Tab = YAHOO.widget.Tab; + + + /** + * The className to add when building from scratch. + * @property CLASSNAME + * @default "navset" + */ + proto.CLASSNAME = 'yui-navset'; + + /** + * The className of the HTMLElement containing the TabView's tab elements + * to look for when building from existing markup, or to add when building + * from scratch. + * All childNodes of the tab container are treated as Tabs when building + * from existing markup. + * @property TAB_PARENT_CLASSNAME + * @default "nav" + */ + proto.TAB_PARENT_CLASSNAME = 'yui-nav'; + + /** + * The className of the HTMLElement containing the TabView's label elements + * to look for when building from existing markup, or to add when building + * from scratch. + * All childNodes of the content container are treated as content elements when + * building from existing markup. + * @property CONTENT_PARENT_CLASSNAME + * @default "nav-content" + */ + proto.CONTENT_PARENT_CLASSNAME = 'yui-content'; + + proto._tabParent = null; + proto._contentParent = null; + + /** + * Adds a Tab to the TabView instance. + * If no index is specified, the tab is added to the end of the tab list. + * @method addTab + * @param {YAHOO.widget.Tab} tab A Tab instance to add. + * @param {Integer} index The position to add the tab. + * @return void + */ + proto.addTab = function(tab, index) { + var tabs = this.get('tabs'); + if (!tabs) { // not ready yet + this._queue[this._queue.length] = ['addTab', arguments]; + return false; + } + + index = (index === undefined) ? tabs.length : index; + + var before = this.getTab(index); + + var self = this; + var el = this.get('element'); + var tabParent = this._tabParent; + var contentParent = this._contentParent; + + var tabElement = tab.get('element'); + var contentEl = tab.get('contentEl'); + + if ( before ) { + tabParent.insertBefore(tabElement, before.get('element')); + } else { + tabParent.appendChild(tabElement); + } + + if ( contentEl && !Dom.isAncestor(contentParent, contentEl) ) { + contentParent.appendChild(contentEl); + } + + if ( !tab.get('active') ) { + tab.set('contentVisible', false, true); /* hide if not active */ + } else { + this.set('activeTab', tab, true); + + } + + var activate = function(e) { + YAHOO.util.Event.preventDefault(e); + self.set('activeTab', this); + }; + + tab.addListener( tab.get('activationEvent'), activate); + + tab.addListener('activationEventChange', function(e) { + if (e.prevValue != e.newValue) { + tab.removeListener(e.prevValue, activate); + tab.addListener(e.newValue, activate); + } + }); + + tabs.splice(index, 0, tab); + }; + + /** + * Routes childNode events. + * @method DOMEventHandler + * @param {event} e The Dom event that is being handled. + * @return void + */ + proto.DOMEventHandler = function(e) { + var el = this.get('element'); + var target = YAHOO.util.Event.getTarget(e); + var tabParent = this._tabParent; + + if (Dom.isAncestor(tabParent, target) ) { + var tabEl; + var tab = null; + var contentEl; + var tabs = this.get('tabs'); + + for (var i = 0, len = tabs.length; i < len; i++) { + tabEl = tabs[i].get('element'); + contentEl = tabs[i].get('contentEl'); + + if ( target == tabEl || Dom.isAncestor(tabEl, target) ) { + tab = tabs[i]; + break; // note break + } + } + + if (tab) { + tab.fireEvent(e.type, e); + } + } + }; + + /** + * Returns the Tab instance at the specified index. + * @method getTab + * @param {Integer} index The position of the Tab. + * @return YAHOO.widget.Tab + */ + proto.getTab = function(index) { + return this.get('tabs')[index]; + }; + + /** + * Returns the index of given tab. + * @method getTabIndex + * @param {YAHOO.widget.Tab} tab The tab whose index will be returned. + * @return int + */ + proto.getTabIndex = function(tab) { + var index = null; + var tabs = this.get('tabs'); + for (var i = 0, len = tabs.length; i < len; ++i) { + if (tab == tabs[i]) { + index = i; + break; + } + } + + return index; + }; + + /** + * Removes the specified Tab from the TabView. + * @method removeTab + * @param {YAHOO.widget.Tab} item The Tab instance to be removed. + * @return void + */ + proto.removeTab = function(tab) { + var tabCount = this.get('tabs').length; + + var index = this.getTabIndex(tab); + var nextIndex = index + 1; + if ( tab == this.get('activeTab') ) { // select next tab + if (tabCount > 1) { + if (index + 1 == tabCount) { + this.set('activeIndex', index - 1); + } else { + this.set('activeIndex', index + 1); + } + } + } + + this._tabParent.removeChild( tab.get('element') ); + this._contentParent.removeChild( tab.get('contentEl') ); + this._configs.tabs.value.splice(index, 1); + + }; + + /** + * Provides a readable name for the TabView instance. + * @method toString + * @return String + */ + proto.toString = function() { + var name = this.get('id') || this.get('tagName'); + return "TabView " + name; + }; + + /** + * The transiton to use when switching between tabs. + * @method contentTransition + */ + proto.contentTransition = function(newTab, oldTab) { + newTab.set('contentVisible', true); + oldTab.set('contentVisible', false); + }; + + /** + * setAttributeConfigs TabView specific properties. + * @method initAttributes + * @param {Object} attr Hash of initial attributes + */ + proto.initAttributes = function(attr) { + YAHOO.widget.TabView.superclass.initAttributes.call(this, attr); + + if (!attr.orientation) { + attr.orientation = 'top'; + } + + var el = this.get('element'); + + /** + * The Tabs belonging to the TabView instance. + * @config tabs + * @type Array + */ + this.setAttributeConfig('tabs', { + value: [], + readOnly: true + }); + + /** + * The container of the tabView's label elements. + * @property _tabParent + * @private + * @type HTMLElement + */ + this._tabParent = + this.getElementsByClassName(this.TAB_PARENT_CLASSNAME, + 'ul' )[0] || _createTabParent.call(this); + + /** + * The container of the tabView's content elements. + * @property _contentParent + * @type HTMLElement + * @private + */ + this._contentParent = + this.getElementsByClassName(this.CONTENT_PARENT_CLASSNAME, + 'div')[0] || _createContentParent.call(this); + + /** + * How the Tabs should be oriented relative to the TabView. + * @config orientation + * @type String + * @default "top" + */ + this.setAttributeConfig('orientation', { + value: attr.orientation, + method: function(value) { + var current = this.get('orientation'); + this.addClass('yui-navset-' + value); + + if (current != value) { + this.removeClass('yui-navset-' + current); + } + + switch(value) { + case 'bottom': + this.appendChild(this._tabParent); + break; + } + } + }); + + /** + * The index of the tab currently active. + * @config activeIndex + * @type Int + */ + this.setAttributeConfig('activeIndex', { + value: attr.activeIndex, + method: function(value) { + this.set('activeTab', this.getTab(value)); + }, + validator: function(value) { + return !this.getTab(value).get('disabled'); // cannot activate if disabled + } + }); + + /** + * The tab currently active. + * @config activeTab + * @type YAHOO.widget.Tab + */ + this.setAttributeConfig('activeTab', { + value: attr.activeTab, + method: function(tab) { + var activeTab = this.get('activeTab'); + + if (tab) { + tab.set('active', true); + this._configs['activeIndex'].value = this.getTabIndex(tab); // keep in sync + } + + if (activeTab && activeTab != tab) { + activeTab.set('active', false); + } + + if (activeTab && tab != activeTab) { // no transition if only 1 + this.contentTransition(tab, activeTab); + } else if (tab) { + tab.set('contentVisible', true); + } + }, + validator: function(value) { + return !value.get('disabled'); // cannot activate if disabled + } + }); + + if ( this._tabParent ) { + _initTabs.call(this); + } + + for (var type in this.DOM_EVENTS) { + if ( YAHOO.lang.hasOwnProperty(this.DOM_EVENTS, type) ) { + this.addListener.call(this, type, this.DOMEventHandler); + } + } + }; + + /** + * Creates Tab instances from a collection of HTMLElements. + * @method createTabs + * @private + * @param {Array|HTMLCollection} elements The elements to use for Tabs. + * @return void + */ + var _initTabs = function() { + var tab, + attr, + contentEl; + + var el = this.get('element'); + var tabs = _getChildNodes(this._tabParent); + var contentElements = _getChildNodes(this._contentParent); + + for (var i = 0, len = tabs.length; i < len; ++i) { + attr = {}; + + if (contentElements[i]) { + attr.contentEl = contentElements[i]; + } + + tab = new YAHOO.widget.Tab(tabs[i], attr); + this.addTab(tab); + + if (tab.hasClass(tab.ACTIVE_CLASSNAME) ) { + this._configs.activeTab.value = tab; // dont invoke method + } + } + }; + + var _createTabViewElement = function(attr) { + var el = document.createElement('div'); + + if ( this.CLASSNAME ) { + el.className = this.CLASSNAME; + } + + return el; + }; + + var _createTabParent = function(attr) { + var el = document.createElement('ul'); + + if ( this.TAB_PARENT_CLASSNAME ) { + el.className = this.TAB_PARENT_CLASSNAME; + } + + this.get('element').appendChild(el); + + return el; + }; + + var _createContentParent = function(attr) { + var el = document.createElement('div'); + + if ( this.CONTENT_PARENT_CLASSNAME ) { + el.className = this.CONTENT_PARENT_CLASSNAME; + } + + this.get('element').appendChild(el); + + return el; + }; + + var _getChildNodes = function(el) { + var nodes = []; + var childNodes = el.childNodes; + + for (var i = 0, len = childNodes.length; i < len; ++i) { + if (childNodes[i].nodeType == 1) { + nodes[nodes.length] = childNodes[i]; + } + } + + return nodes; + }; + +/** + * Fires before the activeTab is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeActiveTabChange
    + * <YAHOO.widget.Tab> + * prevValue the currently active tab
    + * <YAHOO.widget.Tab> + * newValue the tab to be made active

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeActiveTabChange', handler);

    + * @event beforeActiveTabChange + */ + +/** + * Fires after the activeTab is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type activeTabChange
    + * <YAHOO.widget.Tab> + * prevValue the formerly active tab
    + * <YAHOO.widget.Tab> + * newValue the new active tab

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('activeTabChange', handler);

    + * @event activeTabChange + */ + +/** + * Fires before the orientation is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeOrientationChange
    + * <String> + * prevValue the current orientation
    + * <String> + * newValue the new orientation to be applied

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeOrientationChange', handler);

    + * @event beforeOrientationChange + */ + +/** + * Fires after the orientation is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type orientationChange
    + * <String> + * prevValue the former orientation
    + * <String> + * newValue the new orientation

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('orientationChange', handler);

    + * @event orientationChange + */ +})(); + +(function() { + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * A representation of a Tab's label and content. + * @namespace YAHOO.widget + * @class Tab + * @extends YAHOO.util.Element + * @constructor + * @param element {HTMLElement | String} (optional) The html element that + * represents the TabView. An element will be created if none provided. + * @param {Object} properties A key map of initial properties + */ + var Tab = function(el, attr) { + attr = attr || {}; + if (arguments.length == 1 && !YAHOO.lang.isString(el) && !el.nodeName) { + attr = el; + el = attr.element; + } + + if (!el && !attr.element) { + el = _createTabElement.call(this, attr); + } + + this.loadHandler = { + success: function(o) { + this.set('content', o.responseText); + }, + failure: function(o) { + YAHOO.log('loading failed: ' + o.statusText, + 'error', 'Tab'); + } + }; + + Tab.superclass.constructor.call(this, el, attr); + + this.DOM_EVENTS = {}; // delegating to tabView + }; + + YAHOO.extend(Tab, YAHOO.util.Element); + var proto = Tab.prototype; + + /** + * The default tag name for a Tab's inner element. + * @property LABEL_INNER_TAGNAME + * @type String + * @default "em" + */ + proto.LABEL_TAGNAME = 'em'; + + /** + * The class name applied to active tabs. + * @property ACTIVE_CLASSNAME + * @type String + * @default "on" + */ + proto.ACTIVE_CLASSNAME = 'selected'; + + /** + * The class name applied to disabled tabs. + * @property DISABLED_CLASSNAME + * @type String + * @default "disabled" + */ + proto.DISABLED_CLASSNAME = 'disabled'; + + /** + * The class name applied to dynamic tabs while loading. + * @property LOADING_CLASSNAME + * @type String + * @default "disabled" + */ + proto.LOADING_CLASSNAME = 'loading'; + + /** + * Provides a reference to the connection request object when data is + * loaded dynamically. + * @property dataConnection + * @type Object + */ + proto.dataConnection = null; + + /** + * Object containing success and failure callbacks for loading data. + * @property loadHandler + * @type object + */ + proto.loadHandler = null; + + /** + * Provides a readable name for the tab. + * @method toString + * @return String + */ + proto.toString = function() { + var el = this.get('element'); + var id = el.id || el.tagName; + return "Tab " + id; + }; + + /** + * setAttributeConfigs TabView specific properties. + * @method initAttributes + * @param {Object} attr Hash of initial attributes + */ + proto.initAttributes = function(attr) { + attr = attr || {}; + Tab.superclass.initAttributes.call(this, attr); + + var el = this.get('element'); + + /** + * The event that triggers the tab's activation. + * @config activationEvent + * @type String + */ + this.setAttributeConfig('activationEvent', { + value: attr.activationEvent || 'click' + }); + + /** + * The element that contains the tab's label. + * @config labelEl + * @type HTMLElement + */ + this.setAttributeConfig('labelEl', { + value: attr.labelEl || _getlabelEl.call(this), + method: function(value) { + var current = this.get('labelEl'); + + if (current) { + if (current == value) { + return false; // already set + } + + this.replaceChild(value, current); + } else if (el.firstChild) { // ensure label is firstChild by default + this.insertBefore(value, el.firstChild); + } else { + this.appendChild(value); + } + } + }); + + /** + * The tab's label text (or innerHTML). + * @config label + * @type String + */ + this.setAttributeConfig('label', { + value: attr.label || _getLabel.call(this), + method: function(value) { + var labelEl = this.get('labelEl'); + if (!labelEl) { // create if needed + this.set('labelEl', _createlabelEl.call(this)); + } + + _setLabel.call(this, value); + } + }); + + /** + * The HTMLElement that contains the tab's content. + * @config contentEl + * @type HTMLElement + */ + this.setAttributeConfig('contentEl', { + value: attr.contentEl || document.createElement('div'), + method: function(value) { + var current = this.get('contentEl'); + + if (current) { + if (current == value) { + return false; // already set + } + this.replaceChild(value, current); + } + } + }); + + /** + * The tab's content. + * @config content + * @type String + */ + this.setAttributeConfig('content', { + value: attr.content, + method: function(value) { + this.get('contentEl').innerHTML = value; + } + }); + + var _dataLoaded = false; + + /** + * The tab's data source, used for loading content dynamically. + * @config dataSrc + * @type String + */ + this.setAttributeConfig('dataSrc', { + value: attr.dataSrc + }); + + /** + * Whether or not content should be reloaded for every view. + * @config cacheData + * @type Boolean + * @default false + */ + this.setAttributeConfig('cacheData', { + value: attr.cacheData || false, + validator: YAHOO.lang.isBoolean + }); + + /** + * The method to use for the data request. + * @config loadMethod + * @type String + * @default "GET" + */ + this.setAttributeConfig('loadMethod', { + value: attr.loadMethod || 'GET', + validator: YAHOO.lang.isString + }); + + /** + * Whether or not any data has been loaded from the server. + * @config dataLoaded + * @type Boolean + */ + this.setAttributeConfig('dataLoaded', { + value: false, + validator: YAHOO.lang.isBoolean, + writeOnce: true + }); + + /** + * Number if milliseconds before aborting and calling failure handler. + * @config dataTimeout + * @type Number + * @default null + */ + this.setAttributeConfig('dataTimeout', { + value: attr.dataTimeout || null, + validator: YAHOO.lang.isNumber + }); + + /** + * Whether or not the tab is currently active. + * If a dataSrc is set for the tab, the content will be loaded from + * the given source. + * @config active + * @type Boolean + */ + this.setAttributeConfig('active', { + value: attr.active || this.hasClass(this.ACTIVE_CLASSNAME), + method: function(value) { + if (value === true) { + this.addClass(this.ACTIVE_CLASSNAME); + this.set('title', 'active'); + } else { + this.removeClass(this.ACTIVE_CLASSNAME); + this.set('title', ''); + } + }, + validator: function(value) { + return YAHOO.lang.isBoolean(value) && !this.get('disabled') ; + } + }); + + /** + * Whether or not the tab is disabled. + * @config disabled + * @type Boolean + */ + this.setAttributeConfig('disabled', { + value: attr.disabled || this.hasClass(this.DISABLED_CLASSNAME), + method: function(value) { + if (value === true) { + Dom.addClass(this.get('element'), this.DISABLED_CLASSNAME); + } else { + Dom.removeClass(this.get('element'), this.DISABLED_CLASSNAME); + } + }, + validator: YAHOO.lang.isBoolean + }); + + /** + * The href of the tab's anchor element. + * @config href + * @type String + * @default '#' + */ + this.setAttributeConfig('href', { + value: attr.href || '#', + method: function(value) { + this.getElementsByTagName('a')[0].href = value; + }, + validator: YAHOO.lang.isString + }); + + /** + * The Whether or not the tab's content is visible. + * @config contentVisible + * @type Boolean + * @default false + */ + this.setAttributeConfig('contentVisible', { + value: attr.contentVisible, + method: function(value) { + if (value) { + this.get('contentEl').style.display = 'block'; + + if ( this.get('dataSrc') ) { + // load dynamic content unless already loaded and caching + if ( !this.get('dataLoaded') || !this.get('cacheData') ) { + _dataConnect.call(this); + } + } + } else { + this.get('contentEl').style.display = 'none'; + } + }, + validator: YAHOO.lang.isBoolean + }); + }; + + var _createTabElement = function(attr) { + var el = document.createElement('li'); + var a = document.createElement('a'); + + a.href = attr.href || '#'; + + el.appendChild(a); + + var label = attr.label || null; + var labelEl = attr.labelEl || null; + + if (labelEl) { // user supplied labelEl + if (!label) { // user supplied label + label = _getLabel.call(this, labelEl); + } + } else { + labelEl = _createlabelEl.call(this); + } + + a.appendChild(labelEl); + + return el; + }; + + var _getlabelEl = function() { + return this.getElementsByTagName(this.LABEL_TAGNAME)[0]; + }; + + var _createlabelEl = function() { + var el = document.createElement(this.LABEL_TAGNAME); + return el; + }; + + var _setLabel = function(label) { + var el = this.get('labelEl'); + el.innerHTML = label; + }; + + var _getLabel = function() { + var label, + el = this.get('labelEl'); + + if (!el) { + return undefined; + } + + return el.innerHTML; + }; + + var _dataConnect = function() { + if (!YAHOO.util.Connect) { + YAHOO.log('YAHOO.util.Connect dependency not met', + 'error', 'Tab'); + return false; + } + + Dom.addClass(this.get('contentEl').parentNode, this.LOADING_CLASSNAME); + + this.dataConnection = YAHOO.util.Connect.asyncRequest( + this.get('loadMethod'), + this.get('dataSrc'), + { + success: function(o) { + this.loadHandler.success.call(this, o); + this.set('dataLoaded', true); + this.dataConnection = null; + Dom.removeClass(this.get('contentEl').parentNode, + this.LOADING_CLASSNAME); + }, + failure: function(o) { + this.loadHandler.failure.call(this, o); + this.dataConnection = null; + Dom.removeClass(this.get('contentEl').parentNode, + this.LOADING_CLASSNAME); + }, + scope: this, + timeout: this.get('dataTimeout') + } + ); + }; + + YAHOO.widget.Tab = Tab; + + /** + * Fires before the active state is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeActiveChange
    + * <Boolean> + * prevValue the current value
    + * <Boolean> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeActiveChange', handler);

    + * @event beforeActiveChange + */ + + /** + * Fires after the active state is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type activeChange
    + * <Boolean> + * prevValue the previous value
    + * <Boolean> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('activeChange', handler);

    + * @event activeChange + */ + + /** + * Fires before the tab label is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeLabelChange
    + * <String> + * prevValue the current value
    + * <String> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeLabelChange', handler);

    + * @event beforeLabelChange + */ + + /** + * Fires after the tab label is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type labelChange
    + * <String> + * prevValue the previous value
    + * <String> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('labelChange', handler);

    + * @event labelChange + */ + + /** + * Fires before the tab content is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeContentChange
    + * <String> + * prevValue the current value
    + * <String> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeContentChange', handler);

    + * @event beforeContentChange + */ + + /** + * Fires after the tab content is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type contentChange
    + * <String> + * prevValue the previous value
    + * <Boolean> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('contentChange', handler);

    + * @event contentChange + */ +})(); + +YAHOO.register("tabview", YAHOO.widget.TabView, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/tabview/tabview-min.js b/interface/ispconfig/interface/js/yui/tabview/tabview-min.js new file mode 100644 index 000000000..0985d81f8 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/tabview/tabview-min.js @@ -0,0 +1,35 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +(function(){YAHOO.widget.TabView=function(el,attr){attr=attr||{};if(arguments.length==1&&!YAHOO.lang.isString(el)&&!el.nodeName){attr=el;el=attr.element||null;} +if(!el&&!attr.element){el=_createTabViewElement.call(this,attr);} +YAHOO.widget.TabView.superclass.constructor.call(this,el,attr);};YAHOO.extend(YAHOO.widget.TabView,YAHOO.util.Element);var proto=YAHOO.widget.TabView.prototype;var Dom=YAHOO.util.Dom;var Event=YAHOO.util.Event;var Tab=YAHOO.widget.Tab;proto.CLASSNAME='yui-navset';proto.TAB_PARENT_CLASSNAME='yui-nav';proto.CONTENT_PARENT_CLASSNAME='yui-content';proto._tabParent=null;proto._contentParent=null;proto.addTab=function(tab,index){var tabs=this.get('tabs');if(!tabs){this._queue[this._queue.length]=['addTab',arguments];return false;} +index=(index===undefined)?tabs.length:index;var before=this.getTab(index);var self=this;var el=this.get('element');var tabParent=this._tabParent;var contentParent=this._contentParent;var tabElement=tab.get('element');var contentEl=tab.get('contentEl');if(before){tabParent.insertBefore(tabElement,before.get('element'));}else{tabParent.appendChild(tabElement);} +if(contentEl&&!Dom.isAncestor(contentParent,contentEl)){contentParent.appendChild(contentEl);} +if(!tab.get('active')){tab.set('contentVisible',false,true);}else{this.set('activeTab',tab,true);} +var activate=function(e){YAHOO.util.Event.preventDefault(e);self.set('activeTab',this);};tab.addListener(tab.get('activationEvent'),activate);tab.addListener('activationEventChange',function(e){if(e.prevValue!=e.newValue){tab.removeListener(e.prevValue,activate);tab.addListener(e.newValue,activate);}});tabs.splice(index,0,tab);};proto.DOMEventHandler=function(e){var el=this.get('element');var target=YAHOO.util.Event.getTarget(e);var tabParent=this._tabParent;if(Dom.isAncestor(tabParent,target)){var tabEl;var tab=null;var contentEl;var tabs=this.get('tabs');for(var i=0,len=tabs.length;i1){if(index+1==tabCount){this.set('activeIndex',index-1);}else{this.set('activeIndex',index+1);}}} +this._tabParent.removeChild(tab.get('element'));this._contentParent.removeChild(tab.get('contentEl'));this._configs.tabs.value.splice(index,1);};proto.toString=function(){var name=this.get('id')||this.get('tagName');return"TabView "+name;};proto.contentTransition=function(newTab,oldTab){newTab.set('contentVisible',true);oldTab.set('contentVisible',false);};proto.initAttributes=function(attr){YAHOO.widget.TabView.superclass.initAttributes.call(this,attr);if(!attr.orientation){attr.orientation='top';} +var el=this.get('element');this.setAttributeConfig('tabs',{value:[],readOnly:true});this._tabParent=this.getElementsByClassName(this.TAB_PARENT_CLASSNAME,'ul')[0]||_createTabParent.call(this);this._contentParent=this.getElementsByClassName(this.CONTENT_PARENT_CLASSNAME,'div')[0]||_createContentParent.call(this);this.setAttributeConfig('orientation',{value:attr.orientation,method:function(value){var current=this.get('orientation');this.addClass('yui-navset-'+value);if(current!=value){this.removeClass('yui-navset-'+current);} +switch(value){case'bottom':this.appendChild(this._tabParent);break;}}});this.setAttributeConfig('activeIndex',{value:attr.activeIndex,method:function(value){this.set('activeTab',this.getTab(value));},validator:function(value){return!this.getTab(value).get('disabled');}});this.setAttributeConfig('activeTab',{value:attr.activeTab,method:function(tab){var activeTab=this.get('activeTab');if(tab){tab.set('active',true);this._configs['activeIndex'].value=this.getTabIndex(tab);} +if(activeTab&&activeTab!=tab){activeTab.set('active',false);} +if(activeTab&&tab!=activeTab){this.contentTransition(tab,activeTab);}else if(tab){tab.set('contentVisible',true);}},validator:function(value){return!value.get('disabled');}});if(this._tabParent){_initTabs.call(this);} +for(var type in this.DOM_EVENTS){if(YAHOO.lang.hasOwnProperty(this.DOM_EVENTS,type)){this.addListener.call(this,type,this.DOMEventHandler);}}};var _initTabs=function(){var tab,attr,contentEl;var el=this.get('element');var tabs=_getChildNodes(this._tabParent);var contentElements=_getChildNodes(this._contentParent);for(var i=0,len=tabs.length;i 1) { + if (index + 1 == tabCount) { + this.set('activeIndex', index - 1); + } else { + this.set('activeIndex', index + 1); + } + } + } + + this._tabParent.removeChild( tab.get('element') ); + this._contentParent.removeChild( tab.get('contentEl') ); + this._configs.tabs.value.splice(index, 1); + + }; + + /** + * Provides a readable name for the TabView instance. + * @method toString + * @return String + */ + proto.toString = function() { + var name = this.get('id') || this.get('tagName'); + return "TabView " + name; + }; + + /** + * The transiton to use when switching between tabs. + * @method contentTransition + */ + proto.contentTransition = function(newTab, oldTab) { + newTab.set('contentVisible', true); + oldTab.set('contentVisible', false); + }; + + /** + * setAttributeConfigs TabView specific properties. + * @method initAttributes + * @param {Object} attr Hash of initial attributes + */ + proto.initAttributes = function(attr) { + YAHOO.widget.TabView.superclass.initAttributes.call(this, attr); + + if (!attr.orientation) { + attr.orientation = 'top'; + } + + var el = this.get('element'); + + /** + * The Tabs belonging to the TabView instance. + * @config tabs + * @type Array + */ + this.setAttributeConfig('tabs', { + value: [], + readOnly: true + }); + + /** + * The container of the tabView's label elements. + * @property _tabParent + * @private + * @type HTMLElement + */ + this._tabParent = + this.getElementsByClassName(this.TAB_PARENT_CLASSNAME, + 'ul' )[0] || _createTabParent.call(this); + + /** + * The container of the tabView's content elements. + * @property _contentParent + * @type HTMLElement + * @private + */ + this._contentParent = + this.getElementsByClassName(this.CONTENT_PARENT_CLASSNAME, + 'div')[0] || _createContentParent.call(this); + + /** + * How the Tabs should be oriented relative to the TabView. + * @config orientation + * @type String + * @default "top" + */ + this.setAttributeConfig('orientation', { + value: attr.orientation, + method: function(value) { + var current = this.get('orientation'); + this.addClass('yui-navset-' + value); + + if (current != value) { + this.removeClass('yui-navset-' + current); + } + + switch(value) { + case 'bottom': + this.appendChild(this._tabParent); + break; + } + } + }); + + /** + * The index of the tab currently active. + * @config activeIndex + * @type Int + */ + this.setAttributeConfig('activeIndex', { + value: attr.activeIndex, + method: function(value) { + this.set('activeTab', this.getTab(value)); + }, + validator: function(value) { + return !this.getTab(value).get('disabled'); // cannot activate if disabled + } + }); + + /** + * The tab currently active. + * @config activeTab + * @type YAHOO.widget.Tab + */ + this.setAttributeConfig('activeTab', { + value: attr.activeTab, + method: function(tab) { + var activeTab = this.get('activeTab'); + + if (tab) { + tab.set('active', true); + this._configs['activeIndex'].value = this.getTabIndex(tab); // keep in sync + } + + if (activeTab && activeTab != tab) { + activeTab.set('active', false); + } + + if (activeTab && tab != activeTab) { // no transition if only 1 + this.contentTransition(tab, activeTab); + } else if (tab) { + tab.set('contentVisible', true); + } + }, + validator: function(value) { + return !value.get('disabled'); // cannot activate if disabled + } + }); + + if ( this._tabParent ) { + _initTabs.call(this); + } + + for (var type in this.DOM_EVENTS) { + if ( YAHOO.lang.hasOwnProperty(this.DOM_EVENTS, type) ) { + this.addListener.call(this, type, this.DOMEventHandler); + } + } + }; + + /** + * Creates Tab instances from a collection of HTMLElements. + * @method createTabs + * @private + * @param {Array|HTMLCollection} elements The elements to use for Tabs. + * @return void + */ + var _initTabs = function() { + var tab, + attr, + contentEl; + + var el = this.get('element'); + var tabs = _getChildNodes(this._tabParent); + var contentElements = _getChildNodes(this._contentParent); + + for (var i = 0, len = tabs.length; i < len; ++i) { + attr = {}; + + if (contentElements[i]) { + attr.contentEl = contentElements[i]; + } + + tab = new YAHOO.widget.Tab(tabs[i], attr); + this.addTab(tab); + + if (tab.hasClass(tab.ACTIVE_CLASSNAME) ) { + this._configs.activeTab.value = tab; // dont invoke method + } + } + }; + + var _createTabViewElement = function(attr) { + var el = document.createElement('div'); + + if ( this.CLASSNAME ) { + el.className = this.CLASSNAME; + } + + return el; + }; + + var _createTabParent = function(attr) { + var el = document.createElement('ul'); + + if ( this.TAB_PARENT_CLASSNAME ) { + el.className = this.TAB_PARENT_CLASSNAME; + } + + this.get('element').appendChild(el); + + return el; + }; + + var _createContentParent = function(attr) { + var el = document.createElement('div'); + + if ( this.CONTENT_PARENT_CLASSNAME ) { + el.className = this.CONTENT_PARENT_CLASSNAME; + } + + this.get('element').appendChild(el); + + return el; + }; + + var _getChildNodes = function(el) { + var nodes = []; + var childNodes = el.childNodes; + + for (var i = 0, len = childNodes.length; i < len; ++i) { + if (childNodes[i].nodeType == 1) { + nodes[nodes.length] = childNodes[i]; + } + } + + return nodes; + }; + +/** + * Fires before the activeTab is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeActiveTabChange
    + * <YAHOO.widget.Tab> + * prevValue the currently active tab
    + * <YAHOO.widget.Tab> + * newValue the tab to be made active

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeActiveTabChange', handler);

    + * @event beforeActiveTabChange + */ + +/** + * Fires after the activeTab is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type activeTabChange
    + * <YAHOO.widget.Tab> + * prevValue the formerly active tab
    + * <YAHOO.widget.Tab> + * newValue the new active tab

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('activeTabChange', handler);

    + * @event activeTabChange + */ + +/** + * Fires before the orientation is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeOrientationChange
    + * <String> + * prevValue the current orientation
    + * <String> + * newValue the new orientation to be applied

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeOrientationChange', handler);

    + * @event beforeOrientationChange + */ + +/** + * Fires after the orientation is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type orientationChange
    + * <String> + * prevValue the former orientation
    + * <String> + * newValue the new orientation

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('orientationChange', handler);

    + * @event orientationChange + */ +})(); + +(function() { + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event; + + /** + * A representation of a Tab's label and content. + * @namespace YAHOO.widget + * @class Tab + * @extends YAHOO.util.Element + * @constructor + * @param element {HTMLElement | String} (optional) The html element that + * represents the TabView. An element will be created if none provided. + * @param {Object} properties A key map of initial properties + */ + var Tab = function(el, attr) { + attr = attr || {}; + if (arguments.length == 1 && !YAHOO.lang.isString(el) && !el.nodeName) { + attr = el; + el = attr.element; + } + + if (!el && !attr.element) { + el = _createTabElement.call(this, attr); + } + + this.loadHandler = { + success: function(o) { + this.set('content', o.responseText); + }, + failure: function(o) { + } + }; + + Tab.superclass.constructor.call(this, el, attr); + + this.DOM_EVENTS = {}; // delegating to tabView + }; + + YAHOO.extend(Tab, YAHOO.util.Element); + var proto = Tab.prototype; + + /** + * The default tag name for a Tab's inner element. + * @property LABEL_INNER_TAGNAME + * @type String + * @default "em" + */ + proto.LABEL_TAGNAME = 'em'; + + /** + * The class name applied to active tabs. + * @property ACTIVE_CLASSNAME + * @type String + * @default "on" + */ + proto.ACTIVE_CLASSNAME = 'selected'; + + /** + * The class name applied to disabled tabs. + * @property DISABLED_CLASSNAME + * @type String + * @default "disabled" + */ + proto.DISABLED_CLASSNAME = 'disabled'; + + /** + * The class name applied to dynamic tabs while loading. + * @property LOADING_CLASSNAME + * @type String + * @default "disabled" + */ + proto.LOADING_CLASSNAME = 'loading'; + + /** + * Provides a reference to the connection request object when data is + * loaded dynamically. + * @property dataConnection + * @type Object + */ + proto.dataConnection = null; + + /** + * Object containing success and failure callbacks for loading data. + * @property loadHandler + * @type object + */ + proto.loadHandler = null; + + /** + * Provides a readable name for the tab. + * @method toString + * @return String + */ + proto.toString = function() { + var el = this.get('element'); + var id = el.id || el.tagName; + return "Tab " + id; + }; + + /** + * setAttributeConfigs TabView specific properties. + * @method initAttributes + * @param {Object} attr Hash of initial attributes + */ + proto.initAttributes = function(attr) { + attr = attr || {}; + Tab.superclass.initAttributes.call(this, attr); + + var el = this.get('element'); + + /** + * The event that triggers the tab's activation. + * @config activationEvent + * @type String + */ + this.setAttributeConfig('activationEvent', { + value: attr.activationEvent || 'click' + }); + + /** + * The element that contains the tab's label. + * @config labelEl + * @type HTMLElement + */ + this.setAttributeConfig('labelEl', { + value: attr.labelEl || _getlabelEl.call(this), + method: function(value) { + var current = this.get('labelEl'); + + if (current) { + if (current == value) { + return false; // already set + } + + this.replaceChild(value, current); + } else if (el.firstChild) { // ensure label is firstChild by default + this.insertBefore(value, el.firstChild); + } else { + this.appendChild(value); + } + } + }); + + /** + * The tab's label text (or innerHTML). + * @config label + * @type String + */ + this.setAttributeConfig('label', { + value: attr.label || _getLabel.call(this), + method: function(value) { + var labelEl = this.get('labelEl'); + if (!labelEl) { // create if needed + this.set('labelEl', _createlabelEl.call(this)); + } + + _setLabel.call(this, value); + } + }); + + /** + * The HTMLElement that contains the tab's content. + * @config contentEl + * @type HTMLElement + */ + this.setAttributeConfig('contentEl', { + value: attr.contentEl || document.createElement('div'), + method: function(value) { + var current = this.get('contentEl'); + + if (current) { + if (current == value) { + return false; // already set + } + this.replaceChild(value, current); + } + } + }); + + /** + * The tab's content. + * @config content + * @type String + */ + this.setAttributeConfig('content', { + value: attr.content, + method: function(value) { + this.get('contentEl').innerHTML = value; + } + }); + + var _dataLoaded = false; + + /** + * The tab's data source, used for loading content dynamically. + * @config dataSrc + * @type String + */ + this.setAttributeConfig('dataSrc', { + value: attr.dataSrc + }); + + /** + * Whether or not content should be reloaded for every view. + * @config cacheData + * @type Boolean + * @default false + */ + this.setAttributeConfig('cacheData', { + value: attr.cacheData || false, + validator: YAHOO.lang.isBoolean + }); + + /** + * The method to use for the data request. + * @config loadMethod + * @type String + * @default "GET" + */ + this.setAttributeConfig('loadMethod', { + value: attr.loadMethod || 'GET', + validator: YAHOO.lang.isString + }); + + /** + * Whether or not any data has been loaded from the server. + * @config dataLoaded + * @type Boolean + */ + this.setAttributeConfig('dataLoaded', { + value: false, + validator: YAHOO.lang.isBoolean, + writeOnce: true + }); + + /** + * Number if milliseconds before aborting and calling failure handler. + * @config dataTimeout + * @type Number + * @default null + */ + this.setAttributeConfig('dataTimeout', { + value: attr.dataTimeout || null, + validator: YAHOO.lang.isNumber + }); + + /** + * Whether or not the tab is currently active. + * If a dataSrc is set for the tab, the content will be loaded from + * the given source. + * @config active + * @type Boolean + */ + this.setAttributeConfig('active', { + value: attr.active || this.hasClass(this.ACTIVE_CLASSNAME), + method: function(value) { + if (value === true) { + this.addClass(this.ACTIVE_CLASSNAME); + this.set('title', 'active'); + } else { + this.removeClass(this.ACTIVE_CLASSNAME); + this.set('title', ''); + } + }, + validator: function(value) { + return YAHOO.lang.isBoolean(value) && !this.get('disabled') ; + } + }); + + /** + * Whether or not the tab is disabled. + * @config disabled + * @type Boolean + */ + this.setAttributeConfig('disabled', { + value: attr.disabled || this.hasClass(this.DISABLED_CLASSNAME), + method: function(value) { + if (value === true) { + Dom.addClass(this.get('element'), this.DISABLED_CLASSNAME); + } else { + Dom.removeClass(this.get('element'), this.DISABLED_CLASSNAME); + } + }, + validator: YAHOO.lang.isBoolean + }); + + /** + * The href of the tab's anchor element. + * @config href + * @type String + * @default '#' + */ + this.setAttributeConfig('href', { + value: attr.href || '#', + method: function(value) { + this.getElementsByTagName('a')[0].href = value; + }, + validator: YAHOO.lang.isString + }); + + /** + * The Whether or not the tab's content is visible. + * @config contentVisible + * @type Boolean + * @default false + */ + this.setAttributeConfig('contentVisible', { + value: attr.contentVisible, + method: function(value) { + if (value) { + this.get('contentEl').style.display = 'block'; + + if ( this.get('dataSrc') ) { + // load dynamic content unless already loaded and caching + if ( !this.get('dataLoaded') || !this.get('cacheData') ) { + _dataConnect.call(this); + } + } + } else { + this.get('contentEl').style.display = 'none'; + } + }, + validator: YAHOO.lang.isBoolean + }); + }; + + var _createTabElement = function(attr) { + var el = document.createElement('li'); + var a = document.createElement('a'); + + a.href = attr.href || '#'; + + el.appendChild(a); + + var label = attr.label || null; + var labelEl = attr.labelEl || null; + + if (labelEl) { // user supplied labelEl + if (!label) { // user supplied label + label = _getLabel.call(this, labelEl); + } + } else { + labelEl = _createlabelEl.call(this); + } + + a.appendChild(labelEl); + + return el; + }; + + var _getlabelEl = function() { + return this.getElementsByTagName(this.LABEL_TAGNAME)[0]; + }; + + var _createlabelEl = function() { + var el = document.createElement(this.LABEL_TAGNAME); + return el; + }; + + var _setLabel = function(label) { + var el = this.get('labelEl'); + el.innerHTML = label; + }; + + var _getLabel = function() { + var label, + el = this.get('labelEl'); + + if (!el) { + return undefined; + } + + return el.innerHTML; + }; + + var _dataConnect = function() { + if (!YAHOO.util.Connect) { + return false; + } + + Dom.addClass(this.get('contentEl').parentNode, this.LOADING_CLASSNAME); + + this.dataConnection = YAHOO.util.Connect.asyncRequest( + this.get('loadMethod'), + this.get('dataSrc'), + { + success: function(o) { + this.loadHandler.success.call(this, o); + this.set('dataLoaded', true); + this.dataConnection = null; + Dom.removeClass(this.get('contentEl').parentNode, + this.LOADING_CLASSNAME); + }, + failure: function(o) { + this.loadHandler.failure.call(this, o); + this.dataConnection = null; + Dom.removeClass(this.get('contentEl').parentNode, + this.LOADING_CLASSNAME); + }, + scope: this, + timeout: this.get('dataTimeout') + } + ); + }; + + YAHOO.widget.Tab = Tab; + + /** + * Fires before the active state is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeActiveChange
    + * <Boolean> + * prevValue the current value
    + * <Boolean> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeActiveChange', handler);

    + * @event beforeActiveChange + */ + + /** + * Fires after the active state is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type activeChange
    + * <Boolean> + * prevValue the previous value
    + * <Boolean> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('activeChange', handler);

    + * @event activeChange + */ + + /** + * Fires before the tab label is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeLabelChange
    + * <String> + * prevValue the current value
    + * <String> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeLabelChange', handler);

    + * @event beforeLabelChange + */ + + /** + * Fires after the tab label is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type labelChange
    + * <String> + * prevValue the previous value
    + * <String> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('labelChange', handler);

    + * @event labelChange + */ + + /** + * Fires before the tab content is changed. + *

    See: Element.addListener

    + *

    If handler returns false, the change will be cancelled, and the value will not + * be set.

    + *

    Event fields:
    + * <String> type beforeContentChange
    + * <String> + * prevValue the current value
    + * <String> + * newValue the new value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('beforeContentChange', handler);

    + * @event beforeContentChange + */ + + /** + * Fires after the tab content is changed. + *

    See: Element.addListener

    + *

    Event fields:
    + * <String> type contentChange
    + * <String> + * prevValue the previous value
    + * <Boolean> + * newValue the updated value

    + *

    Usage:
    + * var handler = function(e) {var previous = e.prevValue};
    + * myTabs.addListener('contentChange', handler);

    + * @event contentChange + */ +})(); + +YAHOO.register("tabview", YAHOO.widget.TabView, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/treeview/README b/interface/ispconfig/interface/js/yui/treeview/README new file mode 100644 index 000000000..6b24d39ee --- /dev/null +++ b/interface/ispconfig/interface/js/yui/treeview/README @@ -0,0 +1,147 @@ +TreeView - Release Notes + +2.2.0 + + * Node::insertAfter properly nulls the nextSibling attribute when the + inserted before the firstChild. + + * MenuNodes inserted at the root level will no longer lose the menu behavior. + + * TextNode::setUpLabel sets the data.label property as well as the label property. + + * TaskNode example: made the logger optional, and moved the creation of the logger + instance to the proper location. + + * TaskNodes added to a node that is in a fully selected state will update the + parent to a partially selected state. + + * TaskNode example fixed to propagate the labelClick event + + +0.12.2 + + * removeChildren will now work properly on the root node. + +0.12.1 + + * Added custom events for expandComplete and collapseComplete. These events are + needed in situations where the implementer needs to resize or reposition + something based on the new offset. + + * Added a "nowrap" property to Node, and set the default to false. Specifies + whether or not the content area of the node should be allowed to wrap + naturally. + + * Added additional HTML elements to preserve the tree presentation when constrained + by a parent element. + +0.12.0 + + * TreeView now augments EventProvider, and has custom events for expand, + collapse, animStart, animComplete, and labelClick. Existing implementations + using abstract methods for these events (if they exist) will still work. + New events can be plugged into the tree by the Node implementation. For + example, TaskNode adds a checkClick event. EventProvider makes it safe + to do this because implementing code can call subscribe() prior to the + event creation. + + * YAHOO.util.Event is now a requirement for the widget + + * TreeView::removeChildren no longer expands and collapses the node. + + * Documented the moveComplete property + + * createElement("DIV") changed to createElement("div") + +0.11.4 + + * Fixed a javascript error on the HTML node example page. + +0.11.3 + + * popNode now clears the tree, previousSibling, nextSibling, and parent + properties of the node that is being removed from the tree. + + * Fixed the paths to the images in the tree.css file that is included in + build/assets. + +0.11.0 + + * Added TreeView -> popNode, which differs from removeNode in that the + node's children are preserved so the entire branch can be re-inserted + into another part of the tree, or another tree. + + * Added TreeView -> getNodesByProperty, which differs from + getNodeByProperty by returning an array of all nodes that have the + specified property rather than just the first one. + + * Added Node -> insertBefore, insertAfter, and appendTo. These method + can be used to reorganize the tree. + + * removeChildren properly resets the node icon when executed against a + collpased node. + + * Moved depth assignment from the constructor to appendChild so that the + value is set properly if the node is moved within the tree. + + * Fixed broken loop in removeChildren. + + * RootNode -> loadComplete calls tree.draw for hot-wiring the dynamic load + feature for the top level nodes. + + * The treeview constructor will accept an element instead of an id. + +0.10.0 + + * If the child collection changes prior to a refresh(), the icon is now + changed appropriately. + + * Added TreeView removeChildren(node). This will recursively purge the node's + children, and reset its dynamic load state. + + * previousSibling and nextSibling are now adjusted correctly when a + node is deleted. + + * expand()/collapse() now will not expand/collapse the node if false is + returned from the onExpand/onCollapse event handlers. + + * The onExpand and onCollapse events now fire before the node is expanded + or collapsed so that the implementer can modify the node's child collection + prior to display. + + * The childrenRendered property previous was used to indicate both that + a dynamically loaded node has received its data, and also to indicate + that the children html has been created. This has been split into + two properties. dynamicLoadComplete and childrenRendered. + + * Implemented the renderHidden flag. If set to true, the html for the entire + tree will be created when tree.draw() is called, not just the html for the + visible nodes. + + * Added an onLabelClick listener to TextNode + + * TreeView.removeNode no longer automatically refreshes the tree. It has an + optional parameter to perform the refresh. + + * removeNode can now be executed on nodes that have not been rendered. + + * You can now delete top-level nodes. + + * Added onCheckClick listener to the TaskNode example + + * Added Node.iconMode, which is a property that configures the way + dynamically loaded nodes are displayed when they are expanded and contain + no children. + + * TreeView/Node.setDynamicLoad now accepts an optional second parameter to + set the iconMode property. + + * Fixed an issue in the TaskNode.js example that prevented setting the checked + state of a node through the constructor. + + * Fixed an issue in HTMLNode that caused rendering issues when hasIcon was + set to true. + + * Added TreeView.removeNode + + * Added Node.refresh diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/lm.gif b/interface/ispconfig/interface/js/yui/treeview/assets/lm.gif new file mode 100644 index 0000000000000000000000000000000000000000..e7d0a3ce92eb825a95ca188133567cd4f8f31499 GIT binary patch literal 94 zcmZ?wbhEHb6krfzn8?8J|NsAnh6V;OL-8jIs|W)#gAS0(0Fq~5(x216Qtb79sX3ZA us+DiZoVZmeFVu3oV#=XiRnDKMs-2p#PO1G%cj6U(9b}?;FOZ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/ln.gif b/interface/ispconfig/interface/js/yui/treeview/assets/ln.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7b3e55cd044af047e571b8e46d99dd4b801ee60 GIT binary patch literal 142 zcmZ?wbhEHb6krfz*v!Dt(9rPz|9=MJ08pjkPZmZ727U&`e=?ytsfj5H?w)Q6!MTY= zCBcbhsYME5Ky0LEz@P&%5oCu0i}Z(+o~!p-ygs}8e}YEQf$*yI>683lZcElVAIHLA F4FFl;B{Tp4 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/loading.gif b/interface/ispconfig/interface/js/yui/treeview/assets/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396 GIT binary patch literal 2673 zcmchY_gj;P7RTSb83YJ1>=8y5ONL=ZcEgk+C?FydumNNz8c=c6`n&|fmMu_HHG%^w zNLVjHyfy)hAgHK_Kxkz+0Ktm5M|X*?y?g!o_3yv`{_^F^wY9YuFJ3GxEUd1s-nnz<)vH(c?%i8n zUVirM+2rIT007UQKY#e};oRKZty{MqJa}MhYina;bNBAu-+udTYHDhBcJ|n@WA*j* z-+lL;iHS*OX6D|#dm|zu!o$ON?b=mbT)bh!26uP&kdP1u2Zx!N8486$B9X?&$DclZ zdgI28>FMdk#l`#g@Bj4EPc=0)2M!!4EG!%z9?s6rzI5r**|TSdhK8)HtXf)HHgDc+ zZEek9Fk)k4xm@nHZQC3j9o^jACMG6~jg9m3^EYnX2*Yq^XJ>6~?X_#y4jnqQbLUQp zM6z$+zMp^o*}}p?p-?n8H=jOzx~Zv&N~Km+RkgLX9X@>c=FOXxm6dsUd1NvZ zX=yul?BMZua=F~p)O7py?EwJ+w{PD*dGh2hzx?v((WCP6au$mb!vmnqSpF6-9Ona(JQT#e>!KODwxYzG5#S|?M#v6eD#mgO^`=~9EL;yL&>*dd5*+XG=_`^3=CG25PbLa+LJ%N(PW_s z=_-TaM{SB!w(n7k+dMDN2G6VPqUA$u7F4m@ABAZ1D`*UMfe}E6csJU}J1Trmp#~7hZ5QSGpNvd1Uz$!Rf3q28pgSj9o zx?zwoWa8GYK@TOz^)mp#V2_VR5WfJ0W9BSSbn+cKb z7B9l9)K#s!?PSt;g%c8u;y7rd?hkP%>vq5BY=N>c=98V=+T&RSPgSu|E(FAK>B?vNN1 zPszwcbxJ?Oh|1pGd!9?gxzSWOR8o=x5!rGh+6r3hBL-14aTaAQxvJ|Y-S_m4niV2S zK@?}-9Dkhg<+w{Ny!vjyp-QmjyGmIW1DFB{k>P2=8cm~9M^_P#8?JFDumGEPaqJvf zZ{f;B#CG;H7q8a_hQ$pR6%%6So8vKM+W+cNPE_TI46^dn9q@qBr@1bUgxcPGB*b-i z3Hx_0(Esy5KKx^Y0yfgB6~}t>@!ctk>J|!vgVRhE2CPQ;AOKY2y%5nM@YF^ZMS~q}%L-n>Lpor#4w48UHYViOt={{43LMRvkIp+rkbs*s; z14}4q0y6`s8DL?uo-~*R@5tnFsC1DR#BGxT8fA20u_o?`0iDNI6lf;^$@AkR1dPTz z>XF1ZAqNjU95c@Vn59Wo;Z6b(YG+L$xy3(?j2I*vQ>PmzMEdh`yw3=)E}JYMDG|*x mDkGVJ;D)fXhxDI?kcM(ish)oPv+$)O9m7&lFF%`-bKA@>z>*#XDKFr20=RDO%adz+epk!mc6H literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/lph.gif b/interface/ispconfig/interface/js/yui/treeview/assets/lph.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3478d8e37dadeba8c9d68c84ad29c3b2843a69b GIT binary patch literal 111 zcmZ?wbhEHb6krfzSj586(9qzWyyp6yrwj}X|Ns97k`SQylZBCifrUW_#09BkU^emC zb!Xj!lRuUA>b}?;FOZcNk%w1VGsZy1Cav&|Ns90004l1fdBvhA^8LW00093EC2ui01yBm0{{a5 zoR6s{>%SVDN!WWM*c`~(aUUXt+jx}0x_U$Nl_tuVt|Eu@i(%By01AUc;I0@!{*Fpg zbHaSSq>t#++QcfgNN&+P1PjGRs)M{VC)E{p+ns{PY55GCCfKT zdutnudlj5Dyj9$F{FNNGJl0(HoBNy=EnH1}ZJdp~t=!H0?Hmr>3p`F;E`5$S&AzVp z{?`tlZe5Rkubt1m@7)jnPh3E9yb6{Yh|XXugzgy9Q&`KPym)~q60+C`qA!W^6**q? znDL-Sb09BaG+A=fNOdVgwOqB*UQB#5_0{Be(_c=2I|cS6C^G26p9zIVB-#+^L!%p& zPJB7bX-BCasfHZNl%!RZTUBOd+0|uOm|tamHq3)NWI} zN%=0-tJUw*u~7w2HCz?()w_VfD(3pwYh$yM(N< zs&K4`v9z;VwY#}pyCWrW*|_c0@z(R$uJ^F-()E4(hW?AL_0z|Vpf`iy5Q;dvYwa^J{*Cj$a(RI*^pgD(@tTsX5~&4)K5=A5{*V$X{pgJ%4> zk!VMwABPGRiIn70lTA@ZRhg3IQW>=eEafa17mSEp06Pc% BB!B<_ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/tn.gif b/interface/ispconfig/interface/js/yui/treeview/assets/tn.gif new file mode 100644 index 0000000000000000000000000000000000000000..4a280397de0ae7564f625d9356204a1cb6a1f399 GIT binary patch literal 504 zcmVi2fsz(rj1Z(I%uk_Z1$dUHLJCFC+@t*{rh7DQ$tg6bPOd)Ib9R>WJIOY zC1?7iG(~*cW?M%k^nH`*-V=i`xtK z>l-Y#TUe}i?3nDfEc#3uZ90uwt$NLx?Ya%yEz9_=8%|Cu4t!3WF5E0v&bw~>jvTK% z&s^_(54|tlPyNqYKx_lG736l%TS9Q=7LIEO5uQVI6V+8@m(N{9de0Z-ZN%5n-ba2T z{gniGQeaAgD-E_p_)=j^h7xB!tcjDOO^Q1$_QV)c-%pP@K@JsJlw?wqOHnpe`IKc; zms4R@m3ft>&a5}LdNsJN672wB*X9FPF}IdUNW|t3S66 u{d%%SVDDcF0XR#Je|A>GGlz1le|i8=~as(Px~3Y#jsDi#ZROFE0Y zt6NK!%i1gaYZh!fj9iR%44mw|tk!J&OdZWO&0MX0?UpUQ4c-m+jU8@2E_d#|PTsDb zepk*OpEvJbzjqJ+%A4QU&sRWV1CsGaU6>nC( zTlseN`xS6l!D9)RHGCFv+PjSNHs1TVZ{)v|16Lk=xp3ygn-h0l>^L-J(UM71HfVqJ9X~WyIc2u{X2H>*|v-0Hm(~vZ{@z319vVQI`QMwlUHAU dy?OTM+oN}%ZaqA9@!H9AH}4%ic+3R=06S)30ObGx literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/tph.gif b/interface/ispconfig/interface/js/yui/treeview/assets/tph.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4d7d991e44f0ebbe5f05ec261eb831d96332a4e GIT binary patch literal 568 zcmV-80>}MFNk%w1VGsZy1EK@~*WBexW2^uG0Dypi|Ns900000000000A^8LW000C4 zEC2ui01yBm0{{d6NV?pvH@CVug*84wib4m7AKKl%9&5pQE9md6;~nrKG2-t)^qB zU9PdTVX}#@thKPWwqLl8yS}}^zh=j1$!g1N&2GDcSq!^Z7?+4Av#^Y-0ZW&C?{%!M{?3ielPvS1UOS*O@cQK=0vztVNZrX9j4qE zv|`bVM^CC8$};Ikrz4@36gjo!C6iB?!qh60D^0I9!QvFFlPpiOKG6bID|D$_qHK-E zMLJh0+_z2ZX2rXeZ&$xx0f!YlmT+0aXA!4Wyq0m>yO8rbmOGhlWxJ9i_tpHDb70Sd zK^GQ%m~>*(i%~aL{W!Dh&96Jh{yaN$?a{YO=RUnVb??=`Tf-hMn>cObwvppjuA4b; z=f0r>moB`x_2bu*XJ5X(dH3hvqlce9zB=~v+R<}Y@0~q(_u}D`mv273{q^_T=YMZI G0RTJi9wSr$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/tree.css b/interface/ispconfig/interface/js/yui/treeview/assets/tree.css new file mode 100644 index 000000000..afd444d78 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/treeview/assets/tree.css @@ -0,0 +1,102 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/* first or middle sibling, no children */ +.ygtvtn { + width:16px; height:22px; + background: url(tn.gif) 0 0 no-repeat; +} + +/* first or middle sibling, collapsable */ +.ygtvtm { + width:16px; height:22px; + cursor:pointer ; + background: url(tm.gif) 0 0 no-repeat; +} + +/* first or middle sibling, collapsable, hover */ +.ygtvtmh { + width:16px; height:22px; + cursor:pointer ; + background: url(tmh.gif) 0 0 no-repeat; +} + +/* first or middle sibling, expandable */ +.ygtvtp { + width:16px; height:22px; + cursor:pointer ; + background: url(tp.gif) 0 0 no-repeat; +} + +/* first or middle sibling, expandable, hover */ +.ygtvtph { + width:16px; height:22px; + cursor:pointer ; + background: url(tph.gif) 0 0 no-repeat; +} + +/* last sibling, no children */ +.ygtvln { + width:16px; height:22px; + background: url(ln.gif) 0 0 no-repeat; +} + +/* Last sibling, collapsable */ +.ygtvlm { + width:16px; height:22px; + cursor:pointer ; + background: url(lm.gif) 0 0 no-repeat; +} + +/* Last sibling, collapsable, hover */ +.ygtvlmh { + width:16px; height:22px; + cursor:pointer ; + background: url(lmh.gif) 0 0 no-repeat; +} + +/* Last sibling, expandable */ +.ygtvlp { + width:16px; height:22px; + cursor:pointer ; + background: url(lp.gif) 0 0 no-repeat; +} + +/* Last sibling, expandable, hover */ +.ygtvlph { + width:16px; height:22px; cursor:pointer ; + background: url(lph.gif) 0 0 no-repeat; +} + +/* Loading icon */ +.ygtvloading { + width:16px; height:22px; + background: url(loading.gif) 0 0 no-repeat; +} + +/* the style for the empty cells that are used for rendering the depth + * of the node */ +.ygtvdepthcell { + width:16px; height:22px; + background: url(vline.gif) 0 0 no-repeat; +} + +.ygtvblankdepthcell { width:16px; height:22px; } + +/* the style of the div around each node */ +.ygtvitem { } + +/* the style of the div around each node's collection of children */ +.ygtvchildren { } +* html .ygtvchildren { height:2%; } + +/* the style of the text label in ygTextNode */ +.ygtvlabel, .ygtvlabel:link, .ygtvlabel:visited, .ygtvlabel:hover { + margin-left:2px; + text-decoration: none; +} + +.ygtvspacer { height: 10px; width: 10px; margin: 2px; } diff --git a/interface/ispconfig/interface/js/yui/treeview/assets/vline.gif b/interface/ispconfig/interface/js/yui/treeview/assets/vline.gif new file mode 100644 index 0000000000000000000000000000000000000000..1fb0de8bb2911a51ff29f91fe7d231c0a5529091 GIT binary patch literal 503 zcmV^fYPpKps`<(p>p2TrD|$=1D3^=ctGbK# zdo|2eJQh57td{J!4A)HgY!_`h&36sRSk21q>J1AnD^5#pYmSSqyUot4?)whhE*wu> zZ+wqDubj`k@7xdCKWPD}4YXDeTS9H_4t8_+4PrQn<0zK1cn)Jajn3;DdZfn@UPyT# z`Hi%95?@MvB>}GV*OK5%fiV%zG+6Ut&WJlF_N@5xV$h63Hx}&(@~B9qB$GNd$rNQ& zl~Y+hby*eWRhe07ZnfDJ=U1I$d6xBg7HC?bYl*fs`W7kFxJ&6aor@Q%U8#Gi_O+Uq z>tC&b!4CFXm~3LRi_tb#`$+IcfwtO2i=-iumcis&gwQteGNf$RAoON>7%V9T{{hW3I06UMq^ke`4 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/js/yui/treeview/treeview-debug.js b/interface/ispconfig/interface/js/yui/treeview/treeview-debug.js new file mode 100644 index 000000000..1259a971d --- /dev/null +++ b/interface/ispconfig/interface/js/yui/treeview/treeview-debug.js @@ -0,0 +1,2287 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** + * The treeview widget is a generic tree building tool. + * @module treeview + * @title TreeView Widget + * @requires yahoo, event + * @optional animation + * @namespace YAHOO.widget + */ + +/** + * Contains the tree view state data and the root node. + * + * @class TreeView + * @uses YAHOO.util.EventProvider + * @constructor + * @param {string|HTMLElement} id The id of the element, or the element + * itself that the tree will be inserted into. + */ +YAHOO.widget.TreeView = function(id) { + if (id) { this.init(id); } +}; + +YAHOO.widget.TreeView.prototype = { + + /** + * The id of tree container element + * @property id + * @type String + */ + id: null, + + /** + * The host element for this tree + * @property _el + * @private + */ + _el: null, + + /** + * Flat collection of all nodes in this tree. This is a sparse + * array, so the length property can't be relied upon for a + * node count for the tree. + * @property _nodes + * @type Node[] + * @private + */ + _nodes: null, + + /** + * We lock the tree control while waiting for the dynamic loader to return + * @property locked + * @type boolean + */ + locked: false, + + /** + * The animation to use for expanding children, if any + * @property _expandAnim + * @type string + * @private + */ + _expandAnim: null, + + /** + * The animation to use for collapsing children, if any + * @property _collapseAnim + * @type string + * @private + */ + _collapseAnim: null, + + /** + * The current number of animations that are executing + * @property _animCount + * @type int + * @private + */ + _animCount: 0, + + /** + * The maximum number of animations to run at one time. + * @property maxAnim + * @type int + */ + maxAnim: 2, + + /** + * Sets up the animation for expanding children + * @method setExpandAnim + * @param {string} type the type of animation (acceptable values defined + * in YAHOO.widget.TVAnim) + */ + setExpandAnim: function(type) { + if (YAHOO.widget.TVAnim.isValid(type)) { + this._expandAnim = type; + } + }, + + /** + * Sets up the animation for collapsing children + * @method setCollapseAnim + * @param {string} the type of animation (acceptable values defined in + * YAHOO.widget.TVAnim) + */ + setCollapseAnim: function(type) { + if (YAHOO.widget.TVAnim.isValid(type)) { + this._collapseAnim = type; + } + }, + + /** + * Perform the expand animation if configured, or just show the + * element if not configured or too many animations are in progress + * @method animateExpand + * @param el {HTMLElement} the element to animate + * @param node {YAHOO.util.Node} the node that was expanded + * @return {boolean} true if animation could be invoked, false otherwise + */ + animateExpand: function(el, node) { + this.logger.log("animating expand"); + + if (this._expandAnim && this._animCount < this.maxAnim) { + // this.locked = true; + var tree = this; + var a = YAHOO.widget.TVAnim.getAnim(this._expandAnim, el, + function() { tree.expandComplete(node); }); + if (a) { + ++this._animCount; + this.fireEvent("animStart", { + "node": node, + "type": "expand" + }); + a.animate(); + } + + return true; + } + + return false; + }, + + /** + * Perform the collapse animation if configured, or just show the + * element if not configured or too many animations are in progress + * @method animateCollapse + * @param el {HTMLElement} the element to animate + * @param node {YAHOO.util.Node} the node that was expanded + * @return {boolean} true if animation could be invoked, false otherwise + */ + animateCollapse: function(el, node) { + this.logger.log("animating collapse"); + + if (this._collapseAnim && this._animCount < this.maxAnim) { + // this.locked = true; + var tree = this; + var a = YAHOO.widget.TVAnim.getAnim(this._collapseAnim, el, + function() { tree.collapseComplete(node); }); + if (a) { + ++this._animCount; + this.fireEvent("animStart", { + "node": node, + "type": "collapse" + }); + a.animate(); + } + + return true; + } + + return false; + }, + + /** + * Function executed when the expand animation completes + * @method expandComplete + */ + expandComplete: function(node) { + this.logger.log("expand complete: " + this.id); + --this._animCount; + this.fireEvent("animComplete", { + "node": node, + "type": "expand" + }); + // this.locked = false; + }, + + /** + * Function executed when the collapse animation completes + * @method collapseComplete + */ + collapseComplete: function(node) { + this.logger.log("collapse complete: " + this.id); + --this._animCount; + this.fireEvent("animComplete", { + "node": node, + "type": "collapse" + }); + // this.locked = false; + }, + + /** + * Initializes the tree + * @method init + * @parm {string|HTMLElement} id the id of the element that will hold the tree + * @private + */ + init: function(id) { + + this.id = id; + + if ("string" !== typeof id) { + this._el = id; + this.id = this.generateId(id); + } + + /** + * When animation is enabled, this event fires when the animation + * starts + * @event animStart + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + * @parm {String} type the type of animation ("expand" or "collapse") + */ + this.createEvent("animStart", this); + + /** + * When animation is enabled, this event fires when the animation + * completes + * @event animComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + * @parm {String} type the type of animation ("expand" or "collapse") + */ + this.createEvent("animComplete", this); + + /** + * Fires when a node is going to be collapsed. Return false to stop + * the collapse. + * @event collapse + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is collapsing + */ + this.createEvent("collapse", this); + + /** + * Fires after a node is successfully collapsed. This event will not fire + * if the "collapse" event was cancelled. + * @event collapseComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was collapsed + */ + this.createEvent("collapseComplete", this); + + /** + * Fires when a node is going to be expanded. Return false to stop + * the collapse. + * @event expand + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding + */ + this.createEvent("expand", this); + + /** + * Fires after a node is successfully expanded. This event will not fire + * if the "expand" event was cancelled. + * @event expandComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was expanded + */ + this.createEvent("expandComplete", this); + + this._nodes = []; + + // store a global reference + YAHOO.widget.TreeView.trees[this.id] = this; + + // Set up the root node + this.root = new YAHOO.widget.RootNode(this); + + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + this.logger.log("tree init: " + this.id); + + //YAHOO.util.Event.onContentReady(this.id, this.handleAvailable, this, true); + YAHOO.util.Event.on(this.id, "click", this.handleClick, this, true); + }, + + + //handleAvailable: function() { + //var Event = YAHOO.util.Event; + //Event.on(this.id, + //}, + + /** + * Renders the tree boilerplate and visible nodes + * @method draw + */ + draw: function() { + var html = this.root.getHtml(); + this.getEl().innerHTML = html; + this.firstDraw = false; + }, + + /** + * Returns the tree's host element + * @method getEl + * @return {HTMLElement} the host element + */ + getEl: function() { + if (! this._el) { + this._el = document.getElementById(this.id); + } + return this._el; + }, + + /** + * Nodes register themselves with the tree instance when they are created. + * @method regNode + * @param node {Node} the node to register + * @private + */ + regNode: function(node) { + this._nodes[node.index] = node; + }, + + /** + * Returns the root node of this tree + * @method getRoot + * @return {Node} the root node + */ + getRoot: function() { + return this.root; + }, + + /** + * Configures this tree to dynamically load all child data + * @method setDynamicLoad + * @param {function} fnDataLoader the function that will be called to get the data + * @param iconMode {int} configures the icon that is displayed when a dynamic + * load node is expanded the first time without children. By default, the + * "collapse" icon will be used. If set to 1, the leaf node icon will be + * displayed. + */ + setDynamicLoad: function(fnDataLoader, iconMode) { + this.root.setDynamicLoad(fnDataLoader, iconMode); + }, + + /** + * Expands all child nodes. Note: this conflicts with the "multiExpand" + * node property. If expand all is called in a tree with nodes that + * do not allow multiple siblings to be displayed, only the last sibling + * will be expanded. + * @method expandAll + */ + expandAll: function() { + if (!this.locked) { + this.root.expandAll(); + } + }, + + /** + * Collapses all expanded child nodes in the entire tree. + * @method collapseAll + */ + collapseAll: function() { + if (!this.locked) { + this.root.collapseAll(); + } + }, + + /** + * Returns a node in the tree that has the specified index (this index + * is created internally, so this function probably will only be used + * in html generated for a given node.) + * @method getNodeByIndex + * @param {int} nodeIndex the index of the node wanted + * @return {Node} the node with index=nodeIndex, null if no match + */ + getNodeByIndex: function(nodeIndex) { + var n = this._nodes[nodeIndex]; + return (n) ? n : null; + }, + + /** + * Returns a node that has a matching property and value in the data + * object that was passed into its constructor. + * @method getNodeByProperty + * @param {object} property the property to search (usually a string) + * @param {object} value the value we want to find (usuall an int or string) + * @return {Node} the matching node, null if no match + */ + getNodeByProperty: function(property, value) { + for (var i in this._nodes) { + var n = this._nodes[i]; + if (n.data && value == n.data[property]) { + return n; + } + } + + return null; + }, + + /** + * Returns a collection of nodes that have a matching property + * and value in the data object that was passed into its constructor. + * @method getNodesByProperty + * @param {object} property the property to search (usually a string) + * @param {object} value the value we want to find (usuall an int or string) + * @return {Array} the matching collection of nodes, null if no match + */ + getNodesByProperty: function(property, value) { + var values = []; + for (var i in this._nodes) { + var n = this._nodes[i]; + if (n.data && value == n.data[property]) { + values.push(n); + } + } + + return (values.length) ? values : null; + }, + + /** + * Removes the node and its children, and optionally refreshes the + * branch of the tree that was affected. + * @method removeNode + * @param {Node} The node to remove + * @param {boolean} autoRefresh automatically refreshes branch if true + * @return {boolean} False is there was a problem, true otherwise. + */ + removeNode: function(node, autoRefresh) { + + // Don't delete the root node + if (node.isRoot()) { + return false; + } + + // Get the branch that we may need to refresh + var p = node.parent; + if (p.parent) { + p = p.parent; + } + + // Delete the node and its children + this._deleteNode(node); + + // Refresh the parent of the parent + if (autoRefresh && p && p.childrenRendered) { + p.refresh(); + } + + return true; + }, + + /** + * Deletes this nodes child collection, recursively. Also collapses + * the node, and resets the dynamic load flag. The primary use for + * this method is to purge a node and allow it to fetch its data + * dynamically again. + * @method removeChildren + * @param {Node} node the node to purge + */ + removeChildren: function(node) { + this.logger.log("Removing children for " + node); + while (node.children.length) { + this._deleteNode(node.children[0]); + } + + node.childrenRendered = false; + node.dynamicLoadComplete = false; + if (node.expanded) { + node.collapse(); + } else { + node.updateIcon(); + } + }, + + /** + * Deletes the node and recurses children + * @method _deleteNode + * @private + */ + _deleteNode: function(node) { + // Remove all the child nodes first + this.removeChildren(node); + + // Remove the node from the tree + this.popNode(node); + }, + + /** + * Removes the node from the tree, preserving the child collection + * to make it possible to insert the branch into another part of the + * tree, or another tree. + * @method popNode + * @param {Node} the node to remove + */ + popNode: function(node) { + var p = node.parent; + + // Update the parent's collection of children + var a = []; + + for (var i=0, len=p.children.length;i '; + } + + var f = document.createElement("div"); + var s = f.style; + s.position = "absolute"; + s.top = "-1000px"; + s.left = "-1000px"; + f.innerHTML = sb.join(""); + + document.body.appendChild(f); + + YAHOO.widget.TreeView.removeHandler(window, + "load", YAHOO.widget.TreeView.preload); + +}; + +YAHOO.widget.TreeView.addHandler(window, + "load", YAHOO.widget.TreeView.preload); + +/** + * The base class for all tree nodes. The node's presentation and behavior in + * response to mouse events is handled in Node subclasses. + * @namespace YAHOO.widget + * @class Node + * @uses YAHOO.util.EventProvider + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + * @constructor + */ +YAHOO.widget.Node = function(oData, oParent, expanded) { + if (oData) { this.init(oData, oParent, expanded); } +}; + +YAHOO.widget.Node.prototype = { + + /** + * The index for this instance obtained from global counter in YAHOO.widget.TreeView. + * @property index + * @type int + */ + index: 0, + + /** + * This node's child node collection. + * @property children + * @type Node[] + */ + children: null, + + /** + * Tree instance this node is part of + * @property tree + * @type TreeView + */ + tree: null, + + /** + * The data linked to this node. This can be any object or primitive + * value, and the data can be used in getNodeHtml(). + * @property data + * @type object + */ + data: null, + + /** + * Parent node + * @property parent + * @type Node + */ + parent: null, + + /** + * The depth of this node. We start at -1 for the root node. + * @property depth + * @type int + */ + depth: -1, + + /** + * The href for the node's label. If one is not specified, the href will + * be set so that it toggles the node. + * @property href + * @type string + */ + href: null, + + /** + * The label href target, defaults to current window + * @property target + * @type string + */ + target: "_self", + + /** + * The node's expanded/collapsed state + * @property expanded + * @type boolean + */ + expanded: false, + + /** + * Can multiple children be expanded at once? + * @property multiExpand + * @type boolean + */ + multiExpand: true, + + /** + * Should we render children for a collapsed node? It is possible that the + * implementer will want to render the hidden data... @todo verify that we + * need this, and implement it if we do. + * @property renderHidden + * @type boolean + */ + renderHidden: false, + + /** + * This flag is set to true when the html is generated for this node's + * children, and set to false when new children are added. + * @property childrenRendered + * @type boolean + */ + childrenRendered: false, + + /** + * Dynamically loaded nodes only fetch the data the first time they are + * expanded. This flag is set to true once the data has been fetched. + * @property dynamicLoadComplete + * @type boolean + */ + dynamicLoadComplete: false, + + /** + * This node's previous sibling + * @property previousSibling + * @type Node + */ + previousSibling: null, + + /** + * This node's next sibling + * @property nextSibling + * @type Node + */ + nextSibling: null, + + /** + * We can set the node up to call an external method to get the child + * data dynamically. + * @property _dynLoad + * @type boolean + * @private + */ + _dynLoad: false, + + /** + * Function to execute when we need to get this node's child data. + * @property dataLoader + * @type function + */ + dataLoader: null, + + /** + * This is true for dynamically loading nodes while waiting for the + * callback to return. + * @property isLoading + * @type boolean + */ + isLoading: false, + + /** + * The toggle/branch icon will not show if this is set to false. This + * could be useful if the implementer wants to have the child contain + * extra info about the parent, rather than an actual node. + * @property hasIcon + * @type boolean + */ + hasIcon: true, + + /** + * Used to configure what happens when a dynamic load node is expanded + * and we discover that it does not have children. By default, it is + * treated as if it still could have children (plus/minus icon). Set + * iconMode to have it display like a leaf node instead. + * @property iconMode + * @type int + */ + iconMode: 0, + + /** + * Specifies whether or not the content area of the node should be allowed + * to wrap. + * @property nowrap + * @type boolean + * @default true + */ + nowrap: false, + + /** + * The node type + * @property _type + * @private + */ + _type: "Node", + + /* + spacerPath: "http://us.i1.yimg.com/us.yimg.com/i/space.gif", + expandedText: "Expanded", + collapsedText: "Collapsed", + loadingText: "Loading", + */ + + /** + * Initializes this node, gets some of the properties from the parent + * @method init + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ + init: function(oData, oParent, expanded) { + + this.data = oData; + this.children = []; + this.index = YAHOO.widget.TreeView.nodeCount; + ++YAHOO.widget.TreeView.nodeCount; + this.expanded = expanded; + this.logger = new YAHOO.widget.LogWriter(this.toString()); + + /** + * The parentChange event is fired when a parent element is applied + * to the node. This is useful if you need to apply tree-level + * properties to a tree that need to happen if a node is moved from + * one tree to another. + * + * @event parentChange + * @type CustomEvent + */ + this.createEvent("parentChange", this); + + // oParent should never be null except when we create the root node. + if (oParent) { + oParent.appendChild(this); + } + }, + + /** + * Certain properties for the node cannot be set until the parent + * is known. This is called after the node is inserted into a tree. + * the parent is also applied to this node's children in order to + * make it possible to move a branch from one tree to another. + * @method applyParent + * @param {Node} parentNode this node's parent node + * @return {boolean} true if the application was successful + */ + applyParent: function(parentNode) { + if (!parentNode) { + return false; + } + + this.tree = parentNode.tree; + this.parent = parentNode; + this.depth = parentNode.depth + 1; + + if (!this.href) { + this.href = "javascript:" + this.getToggleLink(); + } + + // @todo why was this put here. This causes new nodes added at the + // root level to lose the menu behavior. + // if (! this.multiExpand) { + // this.multiExpand = parentNode.multiExpand; + // } + + this.tree.regNode(this); + parentNode.childrenRendered = false; + + // cascade update existing children + for (var i=0, len=this.children.length;i 0 || + (checkForLazyLoad && this.isDynamic() && !this.dynamicLoadComplete) ); + }, + + /** + * Expands if node is collapsed, collapses otherwise. + * @method toggle + */ + toggle: function() { + if (!this.tree.locked && ( this.hasChildren(true) || this.isDynamic()) ) { + if (this.expanded) { this.collapse(); } else { this.expand(); } + } + }, + + /** + * Returns the markup for this node and its children. + * @method getHtml + * @return {string} the markup for this node and its expanded children. + */ + getHtml: function() { + + this.childrenRendered = false; + + var sb = []; + sb[sb.length] = '
    '; + sb[sb.length] = this.getNodeHtml(); + sb[sb.length] = this.getChildrenHtml(); + sb[sb.length] = '
    '; + return sb.join(""); + }, + + /** + * Called when first rendering the tree. We always build the div that will + * contain this nodes children, but we don't render the children themselves + * unless this node is expanded. + * @method getChildrenHtml + * @return {string} the children container div html and any expanded children + * @private + */ + getChildrenHtml: function() { + + var sb = []; + sb[sb.length] = '
    = this.depth || depth < 0) { + this.logger.log("illegal getAncestor depth: " + depth); + return null; + } + + var p = this.parent; + + while (p.depth > depth) { + p = p.parent; + } + + return p; + }, + + /** + * Returns the css class for the spacer at the specified depth for + * this node. If this node's ancestor at the specified depth + * has a next sibling the presentation is different than if it + * does not have a next sibling + * @method getDepthStyle + * @param {int} depth the depth of the ancestor. + * @return {string} the css class for the spacer + */ + getDepthStyle: function(depth) { + return (this.getAncestor(depth).nextSibling) ? + "ygtvdepthcell" : "ygtvblankdepthcell"; + }, + + /** + * Get the markup for the node. This is designed to be overrided so that we can + * support different types of nodes. + * @method getNodeHtml + * @return {string} The HTML that will render this node. + */ + getNodeHtml: function() { + this.logger.log("Generating html"); + return ""; + }, + + /** + * Regenerates the html for this node and its children. To be used when the + * node is expanded and new children have been added. + * @method refresh + */ + refresh: function() { + // this.loadComplete(); + this.getChildrenEl().innerHTML = this.completeRender(); + + if (this.hasIcon) { + var el = this.getToggleEl(); + if (el) { + el.className = this.getStyle(); + } + } + }, + + /** + * Node toString + * @method toString + * @return {string} string representation of the node + */ + toString: function() { + return "Node (" + this.index + ")"; + } + +}; + +YAHOO.augment(YAHOO.widget.Node, YAHOO.util.EventProvider); + +/** + * The default node presentation. The first parameter should be + * either a string that will be used as the node's label, or an object + * that has a string propery called label. By default, the clicking the + * label will toggle the expanded/collapsed state of the node. By + * changing the href property of the instance, this behavior can be + * changed so that the label will go to the specified href. + * @namespace YAHOO.widget + * @class TextNode + * @extends YAHOO.widget.Node + * @constructor + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {YAHOO.widget.Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ +YAHOO.widget.TextNode = function(oData, oParent, expanded) { + + if (oData) { + this.init(oData, oParent, expanded); + this.setUpLabel(oData); + } + + this.logger = new YAHOO.widget.LogWriter(this.toString()); +}; + +YAHOO.extend(YAHOO.widget.TextNode, YAHOO.widget.Node, { + + /** + * The CSS class for the label href. Defaults to ygtvlabel, but can be + * overridden to provide a custom presentation for a specific node. + * @property labelStyle + * @type string + */ + labelStyle: "ygtvlabel", + + /** + * The derived element id of the label for this node + * @property labelElId + * @type string + */ + labelElId: null, + + /** + * The text for the label. It is assumed that the oData parameter will + * either be a string that will be used as the label, or an object that + * has a property called "label" that we will use. + * @property label + * @type string + */ + label: null, + + textNodeParentChange: function() { + + /** + * Custom event that is fired when the text node label is clicked. The + * custom event is defined on the tree instance, so there is a single + * event that handles all nodes in the tree. The node clicked is + * provided as an argument + * + * @event labelClick + * @for YAHOO.widget.TreeView + * @param {YAHOO.widget.Node} node the node clicked + */ + if (this.tree && !this.tree.hasEvent("labelClick")) { + this.tree.createEvent("labelClick", this.tree); + } + + }, + + /** + * Sets up the node label + * @method setUpLabel + * @param oData string containing the label, or an object with a label property + */ + setUpLabel: function(oData) { + + // set up the custom event on the tree + this.textNodeParentChange(); + this.subscribe("parentChange", this.textNodeParentChange); + + if (typeof oData == "string") { + oData = { label: oData }; + } + this.label = oData.label; + this.data.label = oData.label; + + // update the link + if (oData.href) { + this.href = oData.href; + } + + // set the target + if (oData.target) { + this.target = oData.target; + } + + if (oData.style) { + this.labelStyle = oData.style; + } + + this.labelElId = "ygtvlabelel" + this.index; + }, + + /** + * Returns the label element + * @for YAHOO.widget.TextNode + * @method getLabelEl + * @return {object} the element + */ + getLabelEl: function() { + return document.getElementById(this.labelElId); + }, + + // overrides YAHOO.widget.Node + getNodeHtml: function() { + this.logger.log("Generating html"); + var sb = []; + + sb[sb.length] = ''; + sb[sb.length] = ''; + + for (var i=0;i '; + //sb[sb.length] = ''; + sb[sb.length] = ''; + } + + var getNode = 'YAHOO.widget.TreeView.getNode(\'' + + this.tree.id + '\',' + this.index + ')'; + + sb[sb.length] = ''; + + sb[sb.length] = '
    '; + + /* + sb[sb.length] = ' '; + sb[sb.length] = '
    '; + } + + if (this.hasIcon) { + sb[sb.length] = ' ';} +var f=document.createElement("div");var s=f.style;s.position="absolute";s.top="-1000px";s.left="-1000px";f.innerHTML=sb.join("");document.body.appendChild(f);YAHOO.widget.TreeView.removeHandler(window,"load",YAHOO.widget.TreeView.preload);};YAHOO.widget.TreeView.addHandler(window,"load",YAHOO.widget.TreeView.preload);YAHOO.widget.Node=function(oData,oParent,expanded){if(oData){this.init(oData,oParent,expanded);}};YAHOO.widget.Node.prototype={index:0,children:null,tree:null,data:null,parent:null,depth:-1,href:null,target:"_self",expanded:false,multiExpand:true,renderHidden:false,childrenRendered:false,dynamicLoadComplete:false,previousSibling:null,nextSibling:null,_dynLoad:false,dataLoader:null,isLoading:false,hasIcon:true,iconMode:0,nowrap:false,_type:"Node",init:function(oData,oParent,expanded){this.data=oData;this.children=[];this.index=YAHOO.widget.TreeView.nodeCount;++YAHOO.widget.TreeView.nodeCount;this.expanded=expanded;this.createEvent("parentChange",this);if(oParent){oParent.appendChild(this);}},applyParent:function(parentNode){if(!parentNode){return false;} +this.tree=parentNode.tree;this.parent=parentNode;this.depth=parentNode.depth+1;if(!this.href){this.href="javascript:"+this.getToggleLink();} +this.tree.regNode(this);parentNode.childrenRendered=false;for(var i=0,len=this.children.length;i0||(checkForLazyLoad&&this.isDynamic()&&!this.dynamicLoadComplete));},toggle:function(){if(!this.tree.locked&&(this.hasChildren(true)||this.isDynamic())){if(this.expanded){this.collapse();}else{this.expand();}}},getHtml:function(){this.childrenRendered=false;var sb=[];sb[sb.length]='
    ';sb[sb.length]=this.getNodeHtml();sb[sb.length]=this.getChildrenHtml();sb[sb.length]='
    ';return sb.join("");},getChildrenHtml:function(){var sb=[];sb[sb.length]='
    =this.depth||depth<0){return null;} +var p=this.parent;while(p.depth>depth){p=p.parent;} +return p;},getDepthStyle:function(depth){return(this.getAncestor(depth).nextSibling)?"ygtvdepthcell":"ygtvblankdepthcell";},getNodeHtml:function(){return"";},refresh:function(){this.getChildrenEl().innerHTML=this.completeRender();if(this.hasIcon){var el=this.getToggleEl();if(el){el.className=this.getStyle();}}},toString:function(){return"Node ("+this.index+")";}};YAHOO.augment(YAHOO.widget.Node,YAHOO.util.EventProvider);YAHOO.widget.TextNode=function(oData,oParent,expanded){if(oData){this.init(oData,oParent,expanded);this.setUpLabel(oData);}};YAHOO.extend(YAHOO.widget.TextNode,YAHOO.widget.Node,{labelStyle:"ygtvlabel",labelElId:null,label:null,textNodeParentChange:function(){if(this.tree&&!this.tree.hasEvent("labelClick")){this.tree.createEvent("labelClick",this.tree);}},setUpLabel:function(oData){this.textNodeParentChange();this.subscribe("parentChange",this.textNodeParentChange);if(typeof oData=="string"){oData={label:oData};} +this.label=oData.label;this.data.label=oData.label;if(oData.href){this.href=oData.href;} +if(oData.target){this.target=oData.target;} +if(oData.style){this.labelStyle=oData.style;} +this.labelElId="ygtvlabelel"+this.index;},getLabelEl:function(){return document.getElementById(this.labelElId);},getNodeHtml:function(){var sb=[];sb[sb.length]='
    ';sb[sb.length]='';for(var i=0;i
    ';} +var getNode='YAHOO.widget.TreeView.getNode(\''+ +this.tree.id+'\','+this.index+')';sb[sb.length]='';sb[sb.length]='
    ';sb[sb.length]='
    ';sb[sb.length]='';sb[sb.length]='
    ';sb[sb.length]='';sb[sb.length]='
    ';sb[sb.length]='
    ';return sb.join("");},onLabelClick:function(me){return me.tree.fireEvent("labelClick",me);},toString:function(){return"TextNode ("+this.index+") "+this.label;}});YAHOO.widget.RootNode=function(oTree){this.init(null,null,true);this.tree=oTree;};YAHOO.extend(YAHOO.widget.RootNode,YAHOO.widget.Node,{getNodeHtml:function(){return"";},toString:function(){return"RootNode";},loadComplete:function(){this.tree.draw();},collapse:function(){},expand:function(){}});YAHOO.widget.HTMLNode=function(oData,oParent,expanded,hasIcon){if(oData){this.init(oData,oParent,expanded);this.initContent(oData,hasIcon);}};YAHOO.extend(YAHOO.widget.HTMLNode,YAHOO.widget.Node,{contentStyle:"ygtvhtml",contentElId:null,content:null,initContent:function(oData,hasIcon){if(typeof oData=="string"){oData={html:oData};} +this.html=oData.html;this.contentElId="ygtvcontentel"+this.index;this.hasIcon=hasIcon;},getContentEl:function(){return document.getElementById(this.contentElId);},getNodeHtml:function(){var sb=[];sb[sb.length]='';sb[sb.length]='';for(var i=0;i
    ';} +if(this.hasIcon){sb[sb.length]='';sb[sb.length]='
    ';sb[sb.length]='
    ';return sb.join("");},toString:function(){return"HTMLNode ("+this.index+")";}});YAHOO.widget.MenuNode=function(oData,oParent,expanded){if(oData){this.init(oData,oParent,expanded);this.setUpLabel(oData);} +this.multiExpand=false;};YAHOO.extend(YAHOO.widget.MenuNode,YAHOO.widget.TextNode,{toString:function(){return"MenuNode ("+this.index+") "+this.label;}});YAHOO.widget.TVAnim=function(){return{FADE_IN:"TVFadeIn",FADE_OUT:"TVFadeOut",getAnim:function(type,el,callback){if(YAHOO.widget[type]){return new YAHOO.widget[type](el,callback);}else{return null;}},isValid:function(type){return(YAHOO.widget[type]);}};}();YAHOO.widget.TVFadeIn=function(el,callback){this.el=el;this.callback=callback;};YAHOO.widget.TVFadeIn.prototype={animate:function(){var tvanim=this;var s=this.el.style;s.opacity=0.1;s.filter="alpha(opacity=10)";s.display="";var dur=0.4;var a=new YAHOO.util.Anim(this.el,{opacity:{from:0.1,to:1,unit:""}},dur);a.onComplete.subscribe(function(){tvanim.onComplete();});a.animate();},onComplete:function(){this.callback();},toString:function(){return"TVFadeIn";}};YAHOO.widget.TVFadeOut=function(el,callback){this.el=el;this.callback=callback;};YAHOO.widget.TVFadeOut.prototype={animate:function(){var tvanim=this;var dur=0.4;var a=new YAHOO.util.Anim(this.el,{opacity:{from:1,to:0.1,unit:""}},dur);a.onComplete.subscribe(function(){tvanim.onComplete();});a.animate();},onComplete:function(){var s=this.el.style;s.display="none";s.filter="alpha(opacity=100)";this.callback();},toString:function(){return"TVFadeOut";}};YAHOO.register("treeview",YAHOO.widget.TreeView,{version:"2.2.0",build:"127"}); \ No newline at end of file diff --git a/interface/ispconfig/interface/js/yui/treeview/treeview.js b/interface/ispconfig/interface/js/yui/treeview/treeview.js new file mode 100644 index 000000000..2551856e9 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/treeview/treeview.js @@ -0,0 +1,2248 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ +/** + * The treeview widget is a generic tree building tool. + * @module treeview + * @title TreeView Widget + * @requires yahoo, event + * @optional animation + * @namespace YAHOO.widget + */ + +/** + * Contains the tree view state data and the root node. + * + * @class TreeView + * @uses YAHOO.util.EventProvider + * @constructor + * @param {string|HTMLElement} id The id of the element, or the element + * itself that the tree will be inserted into. + */ +YAHOO.widget.TreeView = function(id) { + if (id) { this.init(id); } +}; + +YAHOO.widget.TreeView.prototype = { + + /** + * The id of tree container element + * @property id + * @type String + */ + id: null, + + /** + * The host element for this tree + * @property _el + * @private + */ + _el: null, + + /** + * Flat collection of all nodes in this tree. This is a sparse + * array, so the length property can't be relied upon for a + * node count for the tree. + * @property _nodes + * @type Node[] + * @private + */ + _nodes: null, + + /** + * We lock the tree control while waiting for the dynamic loader to return + * @property locked + * @type boolean + */ + locked: false, + + /** + * The animation to use for expanding children, if any + * @property _expandAnim + * @type string + * @private + */ + _expandAnim: null, + + /** + * The animation to use for collapsing children, if any + * @property _collapseAnim + * @type string + * @private + */ + _collapseAnim: null, + + /** + * The current number of animations that are executing + * @property _animCount + * @type int + * @private + */ + _animCount: 0, + + /** + * The maximum number of animations to run at one time. + * @property maxAnim + * @type int + */ + maxAnim: 2, + + /** + * Sets up the animation for expanding children + * @method setExpandAnim + * @param {string} type the type of animation (acceptable values defined + * in YAHOO.widget.TVAnim) + */ + setExpandAnim: function(type) { + if (YAHOO.widget.TVAnim.isValid(type)) { + this._expandAnim = type; + } + }, + + /** + * Sets up the animation for collapsing children + * @method setCollapseAnim + * @param {string} the type of animation (acceptable values defined in + * YAHOO.widget.TVAnim) + */ + setCollapseAnim: function(type) { + if (YAHOO.widget.TVAnim.isValid(type)) { + this._collapseAnim = type; + } + }, + + /** + * Perform the expand animation if configured, or just show the + * element if not configured or too many animations are in progress + * @method animateExpand + * @param el {HTMLElement} the element to animate + * @param node {YAHOO.util.Node} the node that was expanded + * @return {boolean} true if animation could be invoked, false otherwise + */ + animateExpand: function(el, node) { + + if (this._expandAnim && this._animCount < this.maxAnim) { + // this.locked = true; + var tree = this; + var a = YAHOO.widget.TVAnim.getAnim(this._expandAnim, el, + function() { tree.expandComplete(node); }); + if (a) { + ++this._animCount; + this.fireEvent("animStart", { + "node": node, + "type": "expand" + }); + a.animate(); + } + + return true; + } + + return false; + }, + + /** + * Perform the collapse animation if configured, or just show the + * element if not configured or too many animations are in progress + * @method animateCollapse + * @param el {HTMLElement} the element to animate + * @param node {YAHOO.util.Node} the node that was expanded + * @return {boolean} true if animation could be invoked, false otherwise + */ + animateCollapse: function(el, node) { + + if (this._collapseAnim && this._animCount < this.maxAnim) { + // this.locked = true; + var tree = this; + var a = YAHOO.widget.TVAnim.getAnim(this._collapseAnim, el, + function() { tree.collapseComplete(node); }); + if (a) { + ++this._animCount; + this.fireEvent("animStart", { + "node": node, + "type": "collapse" + }); + a.animate(); + } + + return true; + } + + return false; + }, + + /** + * Function executed when the expand animation completes + * @method expandComplete + */ + expandComplete: function(node) { + --this._animCount; + this.fireEvent("animComplete", { + "node": node, + "type": "expand" + }); + // this.locked = false; + }, + + /** + * Function executed when the collapse animation completes + * @method collapseComplete + */ + collapseComplete: function(node) { + --this._animCount; + this.fireEvent("animComplete", { + "node": node, + "type": "collapse" + }); + // this.locked = false; + }, + + /** + * Initializes the tree + * @method init + * @parm {string|HTMLElement} id the id of the element that will hold the tree + * @private + */ + init: function(id) { + + this.id = id; + + if ("string" !== typeof id) { + this._el = id; + this.id = this.generateId(id); + } + + /** + * When animation is enabled, this event fires when the animation + * starts + * @event animStart + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + * @parm {String} type the type of animation ("expand" or "collapse") + */ + this.createEvent("animStart", this); + + /** + * When animation is enabled, this event fires when the animation + * completes + * @event animComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + * @parm {String} type the type of animation ("expand" or "collapse") + */ + this.createEvent("animComplete", this); + + /** + * Fires when a node is going to be collapsed. Return false to stop + * the collapse. + * @event collapse + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is collapsing + */ + this.createEvent("collapse", this); + + /** + * Fires after a node is successfully collapsed. This event will not fire + * if the "collapse" event was cancelled. + * @event collapseComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was collapsed + */ + this.createEvent("collapseComplete", this); + + /** + * Fires when a node is going to be expanded. Return false to stop + * the collapse. + * @event expand + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding + */ + this.createEvent("expand", this); + + /** + * Fires after a node is successfully expanded. This event will not fire + * if the "expand" event was cancelled. + * @event expandComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that was expanded + */ + this.createEvent("expandComplete", this); + + this._nodes = []; + + // store a global reference + YAHOO.widget.TreeView.trees[this.id] = this; + + // Set up the root node + this.root = new YAHOO.widget.RootNode(this); + + + + //YAHOO.util.Event.onContentReady(this.id, this.handleAvailable, this, true); + YAHOO.util.Event.on(this.id, "click", this.handleClick, this, true); + }, + + + //handleAvailable: function() { + //var Event = YAHOO.util.Event; + //Event.on(this.id, + //}, + + /** + * Renders the tree boilerplate and visible nodes + * @method draw + */ + draw: function() { + var html = this.root.getHtml(); + this.getEl().innerHTML = html; + this.firstDraw = false; + }, + + /** + * Returns the tree's host element + * @method getEl + * @return {HTMLElement} the host element + */ + getEl: function() { + if (! this._el) { + this._el = document.getElementById(this.id); + } + return this._el; + }, + + /** + * Nodes register themselves with the tree instance when they are created. + * @method regNode + * @param node {Node} the node to register + * @private + */ + regNode: function(node) { + this._nodes[node.index] = node; + }, + + /** + * Returns the root node of this tree + * @method getRoot + * @return {Node} the root node + */ + getRoot: function() { + return this.root; + }, + + /** + * Configures this tree to dynamically load all child data + * @method setDynamicLoad + * @param {function} fnDataLoader the function that will be called to get the data + * @param iconMode {int} configures the icon that is displayed when a dynamic + * load node is expanded the first time without children. By default, the + * "collapse" icon will be used. If set to 1, the leaf node icon will be + * displayed. + */ + setDynamicLoad: function(fnDataLoader, iconMode) { + this.root.setDynamicLoad(fnDataLoader, iconMode); + }, + + /** + * Expands all child nodes. Note: this conflicts with the "multiExpand" + * node property. If expand all is called in a tree with nodes that + * do not allow multiple siblings to be displayed, only the last sibling + * will be expanded. + * @method expandAll + */ + expandAll: function() { + if (!this.locked) { + this.root.expandAll(); + } + }, + + /** + * Collapses all expanded child nodes in the entire tree. + * @method collapseAll + */ + collapseAll: function() { + if (!this.locked) { + this.root.collapseAll(); + } + }, + + /** + * Returns a node in the tree that has the specified index (this index + * is created internally, so this function probably will only be used + * in html generated for a given node.) + * @method getNodeByIndex + * @param {int} nodeIndex the index of the node wanted + * @return {Node} the node with index=nodeIndex, null if no match + */ + getNodeByIndex: function(nodeIndex) { + var n = this._nodes[nodeIndex]; + return (n) ? n : null; + }, + + /** + * Returns a node that has a matching property and value in the data + * object that was passed into its constructor. + * @method getNodeByProperty + * @param {object} property the property to search (usually a string) + * @param {object} value the value we want to find (usuall an int or string) + * @return {Node} the matching node, null if no match + */ + getNodeByProperty: function(property, value) { + for (var i in this._nodes) { + var n = this._nodes[i]; + if (n.data && value == n.data[property]) { + return n; + } + } + + return null; + }, + + /** + * Returns a collection of nodes that have a matching property + * and value in the data object that was passed into its constructor. + * @method getNodesByProperty + * @param {object} property the property to search (usually a string) + * @param {object} value the value we want to find (usuall an int or string) + * @return {Array} the matching collection of nodes, null if no match + */ + getNodesByProperty: function(property, value) { + var values = []; + for (var i in this._nodes) { + var n = this._nodes[i]; + if (n.data && value == n.data[property]) { + values.push(n); + } + } + + return (values.length) ? values : null; + }, + + /** + * Removes the node and its children, and optionally refreshes the + * branch of the tree that was affected. + * @method removeNode + * @param {Node} The node to remove + * @param {boolean} autoRefresh automatically refreshes branch if true + * @return {boolean} False is there was a problem, true otherwise. + */ + removeNode: function(node, autoRefresh) { + + // Don't delete the root node + if (node.isRoot()) { + return false; + } + + // Get the branch that we may need to refresh + var p = node.parent; + if (p.parent) { + p = p.parent; + } + + // Delete the node and its children + this._deleteNode(node); + + // Refresh the parent of the parent + if (autoRefresh && p && p.childrenRendered) { + p.refresh(); + } + + return true; + }, + + /** + * Deletes this nodes child collection, recursively. Also collapses + * the node, and resets the dynamic load flag. The primary use for + * this method is to purge a node and allow it to fetch its data + * dynamically again. + * @method removeChildren + * @param {Node} node the node to purge + */ + removeChildren: function(node) { + while (node.children.length) { + this._deleteNode(node.children[0]); + } + + node.childrenRendered = false; + node.dynamicLoadComplete = false; + if (node.expanded) { + node.collapse(); + } else { + node.updateIcon(); + } + }, + + /** + * Deletes the node and recurses children + * @method _deleteNode + * @private + */ + _deleteNode: function(node) { + // Remove all the child nodes first + this.removeChildren(node); + + // Remove the node from the tree + this.popNode(node); + }, + + /** + * Removes the node from the tree, preserving the child collection + * to make it possible to insert the branch into another part of the + * tree, or another tree. + * @method popNode + * @param {Node} the node to remove + */ + popNode: function(node) { + var p = node.parent; + + // Update the parent's collection of children + var a = []; + + for (var i=0, len=p.children.length;i '; + } + + var f = document.createElement("div"); + var s = f.style; + s.position = "absolute"; + s.top = "-1000px"; + s.left = "-1000px"; + f.innerHTML = sb.join(""); + + document.body.appendChild(f); + + YAHOO.widget.TreeView.removeHandler(window, + "load", YAHOO.widget.TreeView.preload); + +}; + +YAHOO.widget.TreeView.addHandler(window, + "load", YAHOO.widget.TreeView.preload); + +/** + * The base class for all tree nodes. The node's presentation and behavior in + * response to mouse events is handled in Node subclasses. + * @namespace YAHOO.widget + * @class Node + * @uses YAHOO.util.EventProvider + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + * @constructor + */ +YAHOO.widget.Node = function(oData, oParent, expanded) { + if (oData) { this.init(oData, oParent, expanded); } +}; + +YAHOO.widget.Node.prototype = { + + /** + * The index for this instance obtained from global counter in YAHOO.widget.TreeView. + * @property index + * @type int + */ + index: 0, + + /** + * This node's child node collection. + * @property children + * @type Node[] + */ + children: null, + + /** + * Tree instance this node is part of + * @property tree + * @type TreeView + */ + tree: null, + + /** + * The data linked to this node. This can be any object or primitive + * value, and the data can be used in getNodeHtml(). + * @property data + * @type object + */ + data: null, + + /** + * Parent node + * @property parent + * @type Node + */ + parent: null, + + /** + * The depth of this node. We start at -1 for the root node. + * @property depth + * @type int + */ + depth: -1, + + /** + * The href for the node's label. If one is not specified, the href will + * be set so that it toggles the node. + * @property href + * @type string + */ + href: null, + + /** + * The label href target, defaults to current window + * @property target + * @type string + */ + target: "_self", + + /** + * The node's expanded/collapsed state + * @property expanded + * @type boolean + */ + expanded: false, + + /** + * Can multiple children be expanded at once? + * @property multiExpand + * @type boolean + */ + multiExpand: true, + + /** + * Should we render children for a collapsed node? It is possible that the + * implementer will want to render the hidden data... @todo verify that we + * need this, and implement it if we do. + * @property renderHidden + * @type boolean + */ + renderHidden: false, + + /** + * This flag is set to true when the html is generated for this node's + * children, and set to false when new children are added. + * @property childrenRendered + * @type boolean + */ + childrenRendered: false, + + /** + * Dynamically loaded nodes only fetch the data the first time they are + * expanded. This flag is set to true once the data has been fetched. + * @property dynamicLoadComplete + * @type boolean + */ + dynamicLoadComplete: false, + + /** + * This node's previous sibling + * @property previousSibling + * @type Node + */ + previousSibling: null, + + /** + * This node's next sibling + * @property nextSibling + * @type Node + */ + nextSibling: null, + + /** + * We can set the node up to call an external method to get the child + * data dynamically. + * @property _dynLoad + * @type boolean + * @private + */ + _dynLoad: false, + + /** + * Function to execute when we need to get this node's child data. + * @property dataLoader + * @type function + */ + dataLoader: null, + + /** + * This is true for dynamically loading nodes while waiting for the + * callback to return. + * @property isLoading + * @type boolean + */ + isLoading: false, + + /** + * The toggle/branch icon will not show if this is set to false. This + * could be useful if the implementer wants to have the child contain + * extra info about the parent, rather than an actual node. + * @property hasIcon + * @type boolean + */ + hasIcon: true, + + /** + * Used to configure what happens when a dynamic load node is expanded + * and we discover that it does not have children. By default, it is + * treated as if it still could have children (plus/minus icon). Set + * iconMode to have it display like a leaf node instead. + * @property iconMode + * @type int + */ + iconMode: 0, + + /** + * Specifies whether or not the content area of the node should be allowed + * to wrap. + * @property nowrap + * @type boolean + * @default true + */ + nowrap: false, + + /** + * The node type + * @property _type + * @private + */ + _type: "Node", + + /* + spacerPath: "http://us.i1.yimg.com/us.yimg.com/i/space.gif", + expandedText: "Expanded", + collapsedText: "Collapsed", + loadingText: "Loading", + */ + + /** + * Initializes this node, gets some of the properties from the parent + * @method init + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ + init: function(oData, oParent, expanded) { + + this.data = oData; + this.children = []; + this.index = YAHOO.widget.TreeView.nodeCount; + ++YAHOO.widget.TreeView.nodeCount; + this.expanded = expanded; + + /** + * The parentChange event is fired when a parent element is applied + * to the node. This is useful if you need to apply tree-level + * properties to a tree that need to happen if a node is moved from + * one tree to another. + * + * @event parentChange + * @type CustomEvent + */ + this.createEvent("parentChange", this); + + // oParent should never be null except when we create the root node. + if (oParent) { + oParent.appendChild(this); + } + }, + + /** + * Certain properties for the node cannot be set until the parent + * is known. This is called after the node is inserted into a tree. + * the parent is also applied to this node's children in order to + * make it possible to move a branch from one tree to another. + * @method applyParent + * @param {Node} parentNode this node's parent node + * @return {boolean} true if the application was successful + */ + applyParent: function(parentNode) { + if (!parentNode) { + return false; + } + + this.tree = parentNode.tree; + this.parent = parentNode; + this.depth = parentNode.depth + 1; + + if (!this.href) { + this.href = "javascript:" + this.getToggleLink(); + } + + // @todo why was this put here. This causes new nodes added at the + // root level to lose the menu behavior. + // if (! this.multiExpand) { + // this.multiExpand = parentNode.multiExpand; + // } + + this.tree.regNode(this); + parentNode.childrenRendered = false; + + // cascade update existing children + for (var i=0, len=this.children.length;i 0 || + (checkForLazyLoad && this.isDynamic() && !this.dynamicLoadComplete) ); + }, + + /** + * Expands if node is collapsed, collapses otherwise. + * @method toggle + */ + toggle: function() { + if (!this.tree.locked && ( this.hasChildren(true) || this.isDynamic()) ) { + if (this.expanded) { this.collapse(); } else { this.expand(); } + } + }, + + /** + * Returns the markup for this node and its children. + * @method getHtml + * @return {string} the markup for this node and its expanded children. + */ + getHtml: function() { + + this.childrenRendered = false; + + var sb = []; + sb[sb.length] = '
    '; + sb[sb.length] = this.getNodeHtml(); + sb[sb.length] = this.getChildrenHtml(); + sb[sb.length] = '
    '; + return sb.join(""); + }, + + /** + * Called when first rendering the tree. We always build the div that will + * contain this nodes children, but we don't render the children themselves + * unless this node is expanded. + * @method getChildrenHtml + * @return {string} the children container div html and any expanded children + * @private + */ + getChildrenHtml: function() { + + var sb = []; + sb[sb.length] = '
    = this.depth || depth < 0) { + return null; + } + + var p = this.parent; + + while (p.depth > depth) { + p = p.parent; + } + + return p; + }, + + /** + * Returns the css class for the spacer at the specified depth for + * this node. If this node's ancestor at the specified depth + * has a next sibling the presentation is different than if it + * does not have a next sibling + * @method getDepthStyle + * @param {int} depth the depth of the ancestor. + * @return {string} the css class for the spacer + */ + getDepthStyle: function(depth) { + return (this.getAncestor(depth).nextSibling) ? + "ygtvdepthcell" : "ygtvblankdepthcell"; + }, + + /** + * Get the markup for the node. This is designed to be overrided so that we can + * support different types of nodes. + * @method getNodeHtml + * @return {string} The HTML that will render this node. + */ + getNodeHtml: function() { + return ""; + }, + + /** + * Regenerates the html for this node and its children. To be used when the + * node is expanded and new children have been added. + * @method refresh + */ + refresh: function() { + // this.loadComplete(); + this.getChildrenEl().innerHTML = this.completeRender(); + + if (this.hasIcon) { + var el = this.getToggleEl(); + if (el) { + el.className = this.getStyle(); + } + } + }, + + /** + * Node toString + * @method toString + * @return {string} string representation of the node + */ + toString: function() { + return "Node (" + this.index + ")"; + } + +}; + +YAHOO.augment(YAHOO.widget.Node, YAHOO.util.EventProvider); + +/** + * The default node presentation. The first parameter should be + * either a string that will be used as the node's label, or an object + * that has a string propery called label. By default, the clicking the + * label will toggle the expanded/collapsed state of the node. By + * changing the href property of the instance, this behavior can be + * changed so that the label will go to the specified href. + * @namespace YAHOO.widget + * @class TextNode + * @extends YAHOO.widget.Node + * @constructor + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {YAHOO.widget.Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ +YAHOO.widget.TextNode = function(oData, oParent, expanded) { + + if (oData) { + this.init(oData, oParent, expanded); + this.setUpLabel(oData); + } + +}; + +YAHOO.extend(YAHOO.widget.TextNode, YAHOO.widget.Node, { + + /** + * The CSS class for the label href. Defaults to ygtvlabel, but can be + * overridden to provide a custom presentation for a specific node. + * @property labelStyle + * @type string + */ + labelStyle: "ygtvlabel", + + /** + * The derived element id of the label for this node + * @property labelElId + * @type string + */ + labelElId: null, + + /** + * The text for the label. It is assumed that the oData parameter will + * either be a string that will be used as the label, or an object that + * has a property called "label" that we will use. + * @property label + * @type string + */ + label: null, + + textNodeParentChange: function() { + + /** + * Custom event that is fired when the text node label is clicked. The + * custom event is defined on the tree instance, so there is a single + * event that handles all nodes in the tree. The node clicked is + * provided as an argument + * + * @event labelClick + * @for YAHOO.widget.TreeView + * @param {YAHOO.widget.Node} node the node clicked + */ + if (this.tree && !this.tree.hasEvent("labelClick")) { + this.tree.createEvent("labelClick", this.tree); + } + + }, + + /** + * Sets up the node label + * @method setUpLabel + * @param oData string containing the label, or an object with a label property + */ + setUpLabel: function(oData) { + + // set up the custom event on the tree + this.textNodeParentChange(); + this.subscribe("parentChange", this.textNodeParentChange); + + if (typeof oData == "string") { + oData = { label: oData }; + } + this.label = oData.label; + this.data.label = oData.label; + + // update the link + if (oData.href) { + this.href = oData.href; + } + + // set the target + if (oData.target) { + this.target = oData.target; + } + + if (oData.style) { + this.labelStyle = oData.style; + } + + this.labelElId = "ygtvlabelel" + this.index; + }, + + /** + * Returns the label element + * @for YAHOO.widget.TextNode + * @method getLabelEl + * @return {object} the element + */ + getLabelEl: function() { + return document.getElementById(this.labelElId); + }, + + // overrides YAHOO.widget.Node + getNodeHtml: function() { + var sb = []; + + sb[sb.length] = ''; + sb[sb.length] = ''; + + for (var i=0;i '; + //sb[sb.length] = ''; + sb[sb.length] = ''; + } + + var getNode = 'YAHOO.widget.TreeView.getNode(\'' + + this.tree.id + '\',' + this.index + ')'; + + sb[sb.length] = ''; + + sb[sb.length] = '
    '; + + /* + sb[sb.length] = ' '; + sb[sb.length] = '
    '; + } + + if (this.hasIcon) { + sb[sb.length] = '-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=='boolean';},isFunction:function(obj){return typeof obj=='function';},isNull:function(obj){return obj===null;},isNumber:function(obj){return typeof obj=='number'&&isFinite(obj);},isObject:function(obj){return typeof obj=='object'||YAHOO.lang.isFunction(obj);},isString:function(obj){return typeof obj=='string';},isUndefined:function(obj){return typeof obj=='undefined';},hasOwnProperty:function(obj,prop){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(prop);} +return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]!==obj[prop];},extend:function(subc,superc,overrides){var F=function(){};F.prototype=superc.prototype;subc.prototype=new F();subc.prototype.constructor=subc;subc.superclass=superc.prototype;if(superc.prototype.constructor==Object.prototype.constructor){superc.prototype.constructor=superc;} +if(overrides){for(var i in overrides){subc.prototype[i]=overrides[i];}}},augment:function(r,s){var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i-1),isSafari=(ua.indexOf('safari')>-1),isGecko=(!isOpera&&!isSafari&&ua.indexOf('gecko')>-1),isIE=(!isOpera&&ua.indexOf('msie')>-1);var patterns={HYPHEN:/(-[a-z])/i};var toCamel=function(property){if(!patterns.HYPHEN.test(property)){return property;} +if(propertyCache[property]){return propertyCache[property];} +while(patterns.HYPHEN.exec(property)){property=property.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());} +propertyCache[property]=property;return property;};if(document.defaultView&&document.defaultView.getComputedStyle){getStyle=function(el,property){var value=null;var computed=document.defaultView.getComputedStyle(el,'');if(computed){value=computed[toCamel(property)];} +return el.style[property]||value;};}else if(document.documentElement.currentStyle&&isIE){getStyle=function(el,property){switch(toCamel(property)){case'opacity':var val=100;try{val=el.filters['DXImageTransform.Microsoft.Alpha'].opacity;}catch(e){try{val=el.filters('alpha').opacity;}catch(e){}} +return val/100;break;default:var value=el.currentStyle?el.currentStyle[property]:null;return(el.style[property]||value);}};}else{getStyle=function(el,property){return el.style[property];};} +if(isIE){setStyle=function(el,property,val){switch(property){case'opacity':if(typeof el.style.filter=='string'){el.style.filter='alpha(opacity='+val*100+')';if(!el.currentStyle||!el.currentStyle.hasLayout){el.style.zoom=1;}} +break;default:el.style[property]=val;}};}else{setStyle=function(el,property,val){el.style[property]=val;};} +YAHOO.util.Dom={get:function(el){if(!el){return null;} +if(typeof el!='string'&&!(el instanceof Array)){return el;} +if(typeof el=='string'){return document.getElementById(el);} +else{var collection=[];for(var i=0,len=el.length;i=this.left&®ion.right<=this.right&®ion.top>=this.top&®ion.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(region){var t=Math.max(this.top,region.top);var r=Math.min(this.right,region.right);var b=Math.min(this.bottom,region.bottom);var l=Math.max(this.left,region.left);if(b>=t&&r>=l){return new YAHOO.util.Region(t,r,b,l);}else{return null;}};YAHOO.util.Region.prototype.union=function(region){var t=Math.min(this.top,region.top);var r=Math.max(this.right,region.right);var b=Math.max(this.bottom,region.bottom);var l=Math.min(this.left,region.left);return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+"}");};YAHOO.util.Region.getRegion=function(el){var p=YAHOO.util.Dom.getXY(el);var t=p[1];var r=p[0]+el.offsetWidth;var b=p[1]+el.offsetHeight;var l=p[0];return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Point=function(x,y){if(x instanceof Array){y=x[1];x=x[0];} +this.x=this.right=this.left=this[0]=x;this.y=this.top=this.bottom=this[1]=y;};YAHOO.util.Point.prototype=new YAHOO.util.Region();YAHOO.register("dom",YAHOO.util.Dom,{version:"2.2.0",build:"127"}); +if(!YAHOO.util.Event){YAHOO.util.Event=function(){var loadComplete=false;var listeners=[];var unloadListeners=[];var legacyEvents=[];var legacyHandlers=[];var retryCount=0;var onAvailStack=[];var legacyMap=[];var counter=0;var lastError=null;return{POLL_RETRYS:200,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,OBJ:3,ADJ_SCOPE:4,isSafari:(/KHTML/gi).test(navigator.userAgent),webkit:function(){var v=navigator.userAgent.match(/AppleWebKit\/([^ ]*)/);if(v&&v[1]){return v[1];} +return null;}(),isIE:(!this.webkit&&!navigator.userAgent.match(/opera/gi)&&navigator.userAgent.match(/msie/gi)),_interval:null,startInterval:function(){if(!this._interval){var self=this;var callback=function(){self._tryPreloadAttach();};this._interval=setInterval(callback,this.POLL_INTERVAL);}},onAvailable:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:false});retryCount=this.POLL_RETRYS;this.startInterval();},onContentReady:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:true});retryCount=this.POLL_RETRYS;this.startInterval();},addListener:function(el,sType,fn,obj,override){if(!fn||!fn.call){return false;} +if(this._isValidCollection(el)){var ok=true;for(var i=0,len=el.length;i=0){cacheItem=listeners[index];} +if(!el||!cacheItem){return false;} +if(this.useLegacyEvent(el,sType)){var legacyIndex=this.getLegacyIndex(el,sType);var llist=legacyHandlers[legacyIndex];if(llist){for(i=0,len=llist.length;i0);} +var notAvail=[];for(var i=0,len=onAvailStack.length;i0){for(var i=0,len=searchList.length;i0){j=listeners.length;while(j){index=j-1;l=listeners[index];if(l){EU.removeListener(l[EU.EL],l[EU.TYPE],l[EU.FN],index);} +j=j-1;} +l=null;EU.clearCache();} +for(i=0,len=legacyEvents.length;i0){param=args[0];} +ret=s.fn.call(scope,param,s.obj);}else{ret=s.fn.call(scope,this.type,args,s.obj);} +if(false===ret){if(!this.silent){} +return false;}}} +return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i=200&&httpStatus<300){responseObject=this.createResponseObject(o,callback.argument);if(callback.success){if(!callback.scope){callback.success(responseObject);} +else{callback.success.apply(callback.scope,[responseObject]);}}} +else{switch(httpStatus){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:responseObject=this.createExceptionObject(o.tId,callback.argument,(isAbort?isAbort:false));if(callback.failure){if(!callback.scope){callback.failure(responseObject);} +else{callback.failure.apply(callback.scope,[responseObject]);}} +break;default:responseObject=this.createResponseObject(o,callback.argument);if(callback.failure){if(!callback.scope){callback.failure(responseObject);} +else{callback.failure.apply(callback.scope,[responseObject]);}}}} +this.releaseObject(o);responseObject=null;},createResponseObject:function(o,callbackArg) +{var obj={};var headerObj={};try +{var headerStr=o.conn.getAllResponseHeaders();var header=headerStr.split('\n');for(var i=0;i');if(typeof secureUri=='boolean'){io.src='javascript:false';} +else if(typeof secureURI=='string'){io.src=secureUri;}} +else{var io=document.createElement('iframe');io.id=frameId;io.name=frameId;} +io.style.position='absolute';io.style.top='-1000px';io.style.left='-1000px';document.body.appendChild(io);},appendPostData:function(postData) +{var formElements=[];var postMessage=postData.split('&');for(var i=0;i0){for(var i=0;i0)?val:0;} +YAHOO.util.Dom.setStyle(this.getEl(),attr,val+unit);},getAttribute:function(attr){var el=this.getEl();var val=YAHOO.util.Dom.getStyle(el,attr);if(val!=='auto'&&!this.patterns.offsetUnit.test(val)){return parseFloat(val);} +var a=this.patterns.offsetAttribute.exec(attr)||[];var pos=!!(a[3]);var box=!!(a[2]);if(box||(YAHOO.util.Dom.getStyle(el,'position')=='absolute'&&pos)){val=el['offset'+a[0].charAt(0).toUpperCase()+a[0].substr(1)];}else{val=0;} +return val;},getDefaultUnit:function(attr){if(this.patterns.defaultUnit.test(attr)){return'px';} +return'';},setRuntimeAttribute:function(attr){var start;var end;var attributes=this.attributes;this.runtimeAttributes[attr]={};var isset=function(prop){return(typeof prop!=='undefined');};if(!isset(attributes[attr]['to'])&&!isset(attributes[attr]['by'])){return false;} +start=(isset(attributes[attr]['from']))?attributes[attr]['from']:this.getAttribute(attr);if(isset(attributes[attr]['to'])){end=attributes[attr]['to'];}else if(isset(attributes[attr]['by'])){if(start.constructor==Array){end=[];for(var i=0,len=start.length;i0&&isFinite(tweak)){if(tween.currentFrame+tweak>=frames){tweak=frames-(frame+1);} +tween.currentFrame+=tweak;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(points,t){var n=points.length;var tmp=[];for(var i=0;i0&&!(control[0]instanceof Array)){control=[control];}else{var tmp=[];for(i=0,len=control.length;i0){this.runtimeAttributes[attr]=this.runtimeAttributes[attr].concat(control);} +this.runtimeAttributes[attr][this.runtimeAttributes[attr].length]=end;} +else{superclass.setRuntimeAttribute.call(this,attr);}};var translateValues=function(val,start){var pageXY=Y.Dom.getXY(this.getEl());val=[val[0]-pageXY[0]+start[0],val[1]-pageXY[1]+start[1]];return val;};var isset=function(prop){return(typeof prop!=='undefined');};})();(function(){YAHOO.util.Scroll=function(el,attributes,duration,method){if(el){YAHOO.util.Scroll.superclass.constructor.call(this,el,attributes,duration,method);}};YAHOO.extend(YAHOO.util.Scroll,YAHOO.util.ColorAnim);var Y=YAHOO.util;var superclass=Y.Scroll.superclass;var proto=Y.Scroll.prototype;proto.toString=function(){var el=this.getEl();var id=el.id||el.tagName;return("Scroll "+id);};proto.doMethod=function(attr,start,end){var val=null;if(attr=='scroll'){val=[this.method(this.currentFrame,start[0],end[0]-start[0],this.totalFrames),this.method(this.currentFrame,start[1],end[1]-start[1],this.totalFrames)];}else{val=superclass.doMethod.call(this,attr,start,end);} +return val;};proto.getAttribute=function(attr){var val=null;var el=this.getEl();if(attr=='scroll'){val=[el.scrollLeft,el.scrollTop];}else{val=superclass.getAttribute.call(this,attr);} +return val;};proto.setAttribute=function(attr,val,unit){var el=this.getEl();if(attr=='scroll'){el.scrollLeft=val[0];el.scrollTop=val[1];}else{superclass.setAttribute.call(this,attr,val,unit);}};})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.2.0",build:"127"}); +if(!YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr=function(){var Event=YAHOO.util.Event;return{ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initalized:false,locked:false,init:function(){this.initialized=true;},POINT:0,INTERSECT:1,STRICT_INTERSECT:2,mode:0,_execOnAll:function(sMethod,args){for(var i in this.ids){for(var j in this.ids[i]){var oDD=this.ids[i][j];if(!this.isTypeOfDD(oDD)){continue;} +oDD[sMethod].apply(oDD,args);}}},_onLoad:function(){this.init();Event.on(document,"mouseup",this.handleMouseUp,this,true);Event.on(document,"mousemove",this.handleMouseMove,this,true);Event.on(window,"unload",this._onUnload,this,true);Event.on(window,"resize",this._onResize,this,true);},_onResize:function(e){this._execOnAll("resetConstraints",[]);},lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isLocked:function(){return this.locked;},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:1000,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(oDD,sGroup){if(!this.initialized){this.init();} +if(!this.ids[sGroup]){this.ids[sGroup]={};} +this.ids[sGroup][oDD.id]=oDD;},removeDDFromGroup:function(oDD,sGroup){if(!this.ids[sGroup]){this.ids[sGroup]={};} +var obj=this.ids[sGroup];if(obj&&obj[oDD.id]){delete obj[oDD.id];}},_remove:function(oDD){for(var g in oDD.groups){if(g&&this.ids[g][oDD.id]){delete this.ids[g][oDD.id];}} +delete this.handleIds[oDD.id];},regHandle:function(sDDId,sHandleId){if(!this.handleIds[sDDId]){this.handleIds[sDDId]={};} +this.handleIds[sDDId][sHandleId]=sHandleId;},isDragDrop:function(id){return(this.getDDById(id))?true:false;},getRelated:function(p_oDD,bTargetsOnly){var oDDs=[];for(var i in p_oDD.groups){for(j in this.ids[i]){var dd=this.ids[i][j];if(!this.isTypeOfDD(dd)){continue;} +if(!bTargetsOnly||dd.isTarget){oDDs[oDDs.length]=dd;}}} +return oDDs;},isLegalTarget:function(oDD,oTargetDD){var targets=this.getRelated(oDD,true);for(var i=0,len=targets.length;ithis.clickPixelThresh||diffY>this.clickPixelThresh){this.startDrag(this.startX,this.startY);}} +if(this.dragThreshMet){this.dragCurrent.b4Drag(e);this.dragCurrent.onDrag(e);this.fireEvents(e,false);} +this.stopEvent(e);return true;},fireEvents:function(e,isDrop){var dc=this.dragCurrent;if(!dc||dc.isLocked()){return;} +var x=YAHOO.util.Event.getPageX(e);var y=YAHOO.util.Event.getPageY(e);var pt=new YAHOO.util.Point(x,y);var oldOvers=[];var outEvts=[];var overEvts=[];var dropEvts=[];var enterEvts=[];for(var i in this.dragOvers){var ddo=this.dragOvers[i];if(!this.isTypeOfDD(ddo)){continue;} +if(!this.isOverTarget(pt,ddo,this.mode)){outEvts.push(ddo);} +oldOvers[i]=true;delete this.dragOvers[i];} +for(var sGroup in dc.groups){if("string"!=typeof sGroup){continue;} +for(i in this.ids[sGroup]){var oDD=this.ids[sGroup][i];if(!this.isTypeOfDD(oDD)){continue;} +if(oDD.isTarget&&!oDD.isLocked()&&oDD!=dc){if(this.isOverTarget(pt,oDD,this.mode)){if(isDrop){dropEvts.push(oDD);}else{if(!oldOvers[oDD.id]){enterEvts.push(oDD);}else{overEvts.push(oDD);} +this.dragOvers[oDD.id]=oDD;}}}}} +if(this.mode){if(outEvts.length){dc.b4DragOut(e,outEvts);dc.onDragOut(e,outEvts);} +if(enterEvts.length){dc.onDragEnter(e,enterEvts);} +if(overEvts.length){dc.b4DragOver(e,overEvts);dc.onDragOver(e,overEvts);} +if(dropEvts.length){dc.b4DragDrop(e,dropEvts);dc.onDragDrop(e,dropEvts);}}else{var len=0;for(i=0,len=outEvts.length;i2000){}else{setTimeout(DDM._addListeners,10);if(document&&document.body){DDM._timeoutCount+=1;}}}},handleWasClicked:function(node,id){if(this.isHandle(id,node.id)){return true;}else{var p=node.parentNode;while(p){if(this.isHandle(id,p.id)){return true;}else{p=p.parentNode;}}} +return false;}};}();YAHOO.util.DDM=YAHOO.util.DragDropMgr;YAHOO.util.DDM._addListeners();} +(function(){var Event=YAHOO.util.Event;var Dom=YAHOO.util.Dom;YAHOO.util.DragDrop=function(id,sGroup,config){if(id){this.init(id,sGroup,config);}};YAHOO.util.DragDrop.prototype={id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isTarget:true,padding:null,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,b4StartDrag:function(x,y){},startDrag:function(x,y){},b4Drag:function(e){},onDrag:function(e){},onDragEnter:function(e,id){},b4DragOver:function(e){},onDragOver:function(e,id){},b4DragOut:function(e){},onDragOut:function(e,id){},b4DragDrop:function(e){},onDragDrop:function(e,id){},onInvalidDrop:function(e){},b4EndDrag:function(e){},endDrag:function(e){},b4MouseDown:function(e){},onMouseDown:function(e){},onMouseUp:function(e){},onAvailable:function(){},getEl:function(){if(!this._domRef){this._domRef=Dom.get(this.id);} +return this._domRef;},getDragEl:function(){return Dom.get(this.dragElId);},init:function(id,sGroup,config){this.initTarget(id,sGroup,config);Event.on(this.id,"mousedown",this.handleMouseDown,this,true);},initTarget:function(id,sGroup,config){this.config=config||{};this.DDM=YAHOO.util.DDM;this.groups={};if(typeof id!=="string"){id=Dom.generateId(id);} +this.id=id;this.addToGroup((sGroup)?sGroup:"default");this.handleElId=id;Event.onAvailable(id,this.handleOnAvailable,this,true);this.setDragElId(id);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();},applyConfig:function(){this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false);},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable();},setPadding:function(iTop,iRight,iBot,iLeft){if(!iRight&&0!==iRight){this.padding=[iTop,iTop,iTop,iTop];}else if(!iBot&&0!==iBot){this.padding=[iTop,iRight,iTop,iRight];}else{this.padding=[iTop,iRight,iBot,iLeft];}},setInitPosition:function(diffX,diffY){var el=this.getEl();if(!this.DDM.verifyEl(el)){return;} +var dx=diffX||0;var dy=diffY||0;var p=Dom.getXY(el);this.initPageX=p[0]-dx;this.initPageY=p[1]-dy;this.lastPageX=p[0];this.lastPageY=p[1];this.setStartPosition(p);},setStartPosition:function(pos){var p=pos||Dom.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=p[0];this.startPageY=p[1];},addToGroup:function(sGroup){this.groups[sGroup]=true;this.DDM.regDragDrop(this,sGroup);},removeFromGroup:function(sGroup){if(this.groups[sGroup]){delete this.groups[sGroup];} +this.DDM.removeDDFromGroup(this,sGroup);},setDragElId:function(id){this.dragElId=id;},setHandleElId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +this.handleElId=id;this.DDM.regHandle(this.id,id);},setOuterHandleElId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +Event.on(id,"mousedown",this.handleMouseDown,this,true);this.setHandleElId(id);this.hasOuterHandles=true;},unreg:function(){Event.removeListener(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this);},isLocked:function(){return(this.DDM.isLocked()||this.locked);},handleMouseDown:function(e,oDD){var button=e.which||e.button;if(this.primaryButtonOnly&&button>1){return;} +if(this.isLocked()){return;} +this.b4MouseDown(e);this.onMouseDown(e);this.DDM.refreshCache(this.groups);var pt=new YAHOO.util.Point(Event.getPageX(e),Event.getPageY(e));if(!this.hasOuterHandles&&!this.DDM.isOverTarget(pt,this)){}else{if(this.clickValidator(e)){this.setStartPosition();this.DDM.handleMouseDown(e,this);this.DDM.stopEvent(e);}else{}}},clickValidator:function(e){var target=Event.getTarget(e);return(this.isValidHandleChild(target)&&(this.id==this.handleElId||this.DDM.handleWasClicked(target,this.id)));},addInvalidHandleType:function(tagName){var type=tagName.toUpperCase();this.invalidHandleTypes[type]=type;},addInvalidHandleId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +this.invalidHandleIds[id]=id;},addInvalidHandleClass:function(cssClass){this.invalidHandleClasses.push(cssClass);},removeInvalidHandleType:function(tagName){var type=tagName.toUpperCase();delete this.invalidHandleTypes[type];},removeInvalidHandleId:function(id){if(typeof id!=="string"){id=Dom.generateId(id);} +delete this.invalidHandleIds[id];},removeInvalidHandleClass:function(cssClass){for(var i=0,len=this.invalidHandleClasses.length;i=this.minX;i=i-iTickSize){if(!tickMap[i]){this.xTicks[this.xTicks.length]=i;tickMap[i]=true;}} +for(i=this.initPageX;i<=this.maxX;i=i+iTickSize){if(!tickMap[i]){this.xTicks[this.xTicks.length]=i;tickMap[i]=true;}} +this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(iStartY,iTickSize){this.yTicks=[];this.yTickSize=iTickSize;var tickMap={};for(var i=this.initPageY;i>=this.minY;i=i-iTickSize){if(!tickMap[i]){this.yTicks[this.yTicks.length]=i;tickMap[i]=true;}} +for(i=this.initPageY;i<=this.maxY;i=i+iTickSize){if(!tickMap[i]){this.yTicks[this.yTicks.length]=i;tickMap[i]=true;}} +this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(iLeft,iRight,iTickSize){this.leftConstraint=parseInt(iLeft,10);this.rightConstraint=parseInt(iRight,10);this.minX=this.initPageX-this.leftConstraint;this.maxX=this.initPageX+this.rightConstraint;if(iTickSize){this.setXTicks(this.initPageX,iTickSize);} +this.constrainX=true;},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks();},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0;},setYConstraint:function(iUp,iDown,iTickSize){this.topConstraint=parseInt(iUp,10);this.bottomConstraint=parseInt(iDown,10);this.minY=this.initPageY-this.topConstraint;this.maxY=this.initPageY+this.bottomConstraint;if(iTickSize){this.setYTicks(this.initPageY,iTickSize);} +this.constrainY=true;},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var dx=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var dy=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(dx,dy);}else{this.setInitPosition();} +if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize);} +if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize);}},getTick:function(val,tickArray){if(!tickArray){return val;}else if(tickArray[0]>=val){return tickArray[0];}else{for(var i=0,len=tickArray.length;i=val){var diff1=val-tickArray[i];var diff2=tickArray[next]-val;return(diff2>diff1)?tickArray[i]:tickArray[next];}} +return tickArray[tickArray.length-1];}},toString:function(){return("DragDrop "+this.id);}};})();YAHOO.util.DD=function(id,sGroup,config){if(id){this.init(id,sGroup,config);}};YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop,{scroll:true,autoOffset:function(iPageX,iPageY){var x=iPageX-this.startPageX;var y=iPageY-this.startPageY;this.setDelta(x,y);},setDelta:function(iDeltaX,iDeltaY){this.deltaX=iDeltaX;this.deltaY=iDeltaY;},setDragElPos:function(iPageX,iPageY){var el=this.getDragEl();this.alignElWithMouse(el,iPageX,iPageY);},alignElWithMouse:function(el,iPageX,iPageY){var oCoord=this.getTargetCoord(iPageX,iPageY);if(!this.deltaSetXY){var aCoord=[oCoord.x,oCoord.y];YAHOO.util.Dom.setXY(el,aCoord);var newLeft=parseInt(YAHOO.util.Dom.getStyle(el,"left"),10);var newTop=parseInt(YAHOO.util.Dom.getStyle(el,"top"),10);this.deltaSetXY=[newLeft-oCoord.x,newTop-oCoord.y];}else{YAHOO.util.Dom.setStyle(el,"left",(oCoord.x+this.deltaSetXY[0])+"px");YAHOO.util.Dom.setStyle(el,"top",(oCoord.y+this.deltaSetXY[1])+"px");} +this.cachePosition(oCoord.x,oCoord.y);this.autoScroll(oCoord.x,oCoord.y,el.offsetHeight,el.offsetWidth);},cachePosition:function(iPageX,iPageY){if(iPageX){this.lastPageX=iPageX;this.lastPageY=iPageY;}else{var aCoord=YAHOO.util.Dom.getXY(this.getEl());this.lastPageX=aCoord[0];this.lastPageY=aCoord[1];}},autoScroll:function(x,y,h,w){if(this.scroll){var clientH=this.DDM.getClientHeight();var clientW=this.DDM.getClientWidth();var st=this.DDM.getScrollTop();var sl=this.DDM.getScrollLeft();var bot=h+y;var right=w+x;var toBot=(clientH+st-y-this.deltaY);var toRight=(clientW+sl-x-this.deltaX);var thresh=40;var scrAmt=(document.all)?80:30;if(bot>clientH&&toBot0&&y-stclientW&&toRight0&&x-slthis.maxX){x=this.maxX;}} +if(this.constrainY){if(ythis.maxY){y=this.maxY;}} +x=this.getTick(x,this.xTicks);y=this.getTick(y,this.yTicks);return{x:x,y:y};},applyConfig:function(){YAHOO.util.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false);},b4MouseDown:function(e){this.setStartPosition();this.autoOffset(YAHOO.util.Event.getPageX(e),YAHOO.util.Event.getPageY(e));},b4Drag:function(e){this.setDragElPos(YAHOO.util.Event.getPageX(e),YAHOO.util.Event.getPageY(e));},toString:function(){return("DD "+this.id);}});YAHOO.util.DDProxy=function(id,sGroup,config){if(id){this.init(id,sGroup,config);this.initFrame();}};YAHOO.util.DDProxy.dragElId="ygddfdiv";YAHOO.extend(YAHOO.util.DDProxy,YAHOO.util.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var self=this;var body=document.body;if(!body||!body.firstChild){setTimeout(function(){self.createFrame();},50);return;} +var div=this.getDragEl();if(!div){div=document.createElement("div");div.id=this.dragElId;var s=div.style;s.position="absolute";s.visibility="hidden";s.cursor="move";s.border="2px solid #aaa";s.zIndex=999;body.insertBefore(div,body.firstChild);}},initFrame:function(){this.createFrame();},applyConfig:function(){YAHOO.util.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||YAHOO.util.DDProxy.dragElId);},showFrame:function(iPageX,iPageY){var el=this.getEl();var dragEl=this.getDragEl();var s=dragEl.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(s.width,10)/2),Math.round(parseInt(s.height,10)/2));} +this.setDragElPos(iPageX,iPageY);YAHOO.util.Dom.setStyle(dragEl,"visibility","visible");},_resizeProxy:function(){if(this.resizeFrame){var DOM=YAHOO.util.Dom;var el=this.getEl();var dragEl=this.getDragEl();var bt=parseInt(DOM.getStyle(dragEl,"borderTopWidth"),10);var br=parseInt(DOM.getStyle(dragEl,"borderRightWidth"),10);var bb=parseInt(DOM.getStyle(dragEl,"borderBottomWidth"),10);var bl=parseInt(DOM.getStyle(dragEl,"borderLeftWidth"),10);if(isNaN(bt)){bt=0;} +if(isNaN(br)){br=0;} +if(isNaN(bb)){bb=0;} +if(isNaN(bl)){bl=0;} +var newWidth=Math.max(0,el.offsetWidth-br-bl);var newHeight=Math.max(0,el.offsetHeight-bt-bb);DOM.setStyle(dragEl,"width",newWidth+"px");DOM.setStyle(dragEl,"height",newHeight+"px");}},b4MouseDown:function(e){this.setStartPosition();var x=YAHOO.util.Event.getPageX(e);var y=YAHOO.util.Event.getPageY(e);this.autoOffset(x,y);this.setDragElPos(x,y);},b4StartDrag:function(x,y){this.showFrame(x,y);},b4EndDrag:function(e){YAHOO.util.Dom.setStyle(this.getDragEl(),"visibility","hidden");},endDrag:function(e){var DOM=YAHOO.util.Dom;var lel=this.getEl();var del=this.getDragEl();DOM.setStyle(del,"visibility","");DOM.setStyle(lel,"visibility","hidden");YAHOO.util.DDM.moveToEl(lel,del);DOM.setStyle(del,"visibility","hidden");DOM.setStyle(lel,"visibility","");},toString:function(){return("DDProxy "+this.id);}});YAHOO.util.DDTarget=function(id,sGroup,config){if(id){this.initTarget(id,sGroup,config);}};YAHOO.extend(YAHOO.util.DDTarget,YAHOO.util.DragDrop,{toString:function(){return("DDTarget "+this.id);}});YAHOO.register("dragdrop",YAHOO.util.DragDropMgr,{version:"2.2.0",build:"127"}); +YAHOO.util.Attribute=function(hash,owner){if(owner){this.owner=owner;this.configure(hash,true);}};YAHOO.util.Attribute.prototype={name:undefined,value:null,owner:null,readOnly:false,writeOnce:false,_initialConfig:null,_written:false,method:null,validator:null,getValue:function(){return this.value;},setValue:function(value,silent){var beforeRetVal;var owner=this.owner;var name=this.name;var event={type:name,prevValue:this.getValue(),newValue:value};if(this.readOnly||(this.writeOnce&&this._written)){return false;} +if(this.validator&&!this.validator.call(owner,value)){return false;} +if(!silent){beforeRetVal=owner.fireBeforeChangeEvent(event);if(beforeRetVal===false){return false;}} +if(this.method){this.method.call(owner,value);} +this.value=value;this._written=true;event.type=name;if(!silent){this.owner.fireChangeEvent(event);} +return true;},configure:function(map,init){map=map||{};this._written=false;this._initialConfig=this._initialConfig||{};for(var key in map){if(key&&YAHOO.lang.hasOwnProperty(map,key)){this[key]=map[key];if(init){this._initialConfig[key]=map[key];}}}},resetValue:function(){return this.setValue(this._initialConfig.value);},resetConfig:function(){this.configure(this._initialConfig);},refresh:function(silent){this.setValue(this.value,silent);}};(function(){var Lang=YAHOO.util.Lang;YAHOO.util.AttributeProvider=function(){};YAHOO.util.AttributeProvider.prototype={_configs:null,get:function(key){var configs=this._configs||{};var config=configs[key];if(!config){return undefined;} +return config.value;},set:function(key,value,silent){var configs=this._configs||{};var config=configs[key];if(!config){return false;} +return config.setValue(value,silent);},getAttributeKeys:function(){var configs=this._configs;var keys=[];var config;for(var key in configs){config=configs[key];if(Lang.hasOwnProperty(configs,key)&&!Lang.isUndefined(config)){keys[keys.length]=key;}} +return keys;},setAttributes:function(map,silent){for(var key in map){if(Lang.hasOwnProperty(map,key)){this.set(key,map[key],silent);}}},resetValue:function(key,silent){var configs=this._configs||{};if(configs[key]){this.set(key,configs[key]._initialConfig.value,silent);return true;} +return false;},refresh:function(key,silent){var configs=this._configs;key=((Lang.isString(key))?[key]:key)||this.getAttributeKeys();for(var i=0,len=key.length;i-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=='boolean';},isFunction:function(obj){return typeof obj=='function';},isNull:function(obj){return obj===null;},isNumber:function(obj){return typeof obj=='number'&&isFinite(obj);},isObject:function(obj){return typeof obj=='object'||YAHOO.lang.isFunction(obj);},isString:function(obj){return typeof obj=='string';},isUndefined:function(obj){return typeof obj=='undefined';},hasOwnProperty:function(obj,prop){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(prop);} +return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]!==obj[prop];},extend:function(subc,superc,overrides){var F=function(){};F.prototype=superc.prototype;subc.prototype=new F();subc.prototype.constructor=subc;subc.superclass=superc.prototype;if(superc.prototype.constructor==Object.prototype.constructor){superc.prototype.constructor=superc;} +if(overrides){for(var i in overrides){subc.prototype[i]=overrides[i];}}},augment:function(r,s){var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i-1),isSafari=(ua.indexOf('safari')>-1),isGecko=(!isOpera&&!isSafari&&ua.indexOf('gecko')>-1),isIE=(!isOpera&&ua.indexOf('msie')>-1);var patterns={HYPHEN:/(-[a-z])/i};var toCamel=function(property){if(!patterns.HYPHEN.test(property)){return property;} +if(propertyCache[property]){return propertyCache[property];} +while(patterns.HYPHEN.exec(property)){property=property.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());} +propertyCache[property]=property;return property;};if(document.defaultView&&document.defaultView.getComputedStyle){getStyle=function(el,property){var value=null;var computed=document.defaultView.getComputedStyle(el,'');if(computed){value=computed[toCamel(property)];} +return el.style[property]||value;};}else if(document.documentElement.currentStyle&&isIE){getStyle=function(el,property){switch(toCamel(property)){case'opacity':var val=100;try{val=el.filters['DXImageTransform.Microsoft.Alpha'].opacity;}catch(e){try{val=el.filters('alpha').opacity;}catch(e){}} +return val/100;break;default:var value=el.currentStyle?el.currentStyle[property]:null;return(el.style[property]||value);}};}else{getStyle=function(el,property){return el.style[property];};} +if(isIE){setStyle=function(el,property,val){switch(property){case'opacity':if(typeof el.style.filter=='string'){el.style.filter='alpha(opacity='+val*100+')';if(!el.currentStyle||!el.currentStyle.hasLayout){el.style.zoom=1;}} +break;default:el.style[property]=val;}};}else{setStyle=function(el,property,val){el.style[property]=val;};} +YAHOO.util.Dom={get:function(el){if(!el){return null;} +if(typeof el!='string'&&!(el instanceof Array)){return el;} +if(typeof el=='string'){return document.getElementById(el);} +else{var collection=[];for(var i=0,len=el.length;i=this.left&®ion.right<=this.right&®ion.top>=this.top&®ion.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(region){var t=Math.max(this.top,region.top);var r=Math.min(this.right,region.right);var b=Math.min(this.bottom,region.bottom);var l=Math.max(this.left,region.left);if(b>=t&&r>=l){return new YAHOO.util.Region(t,r,b,l);}else{return null;}};YAHOO.util.Region.prototype.union=function(region){var t=Math.min(this.top,region.top);var r=Math.max(this.right,region.right);var b=Math.max(this.bottom,region.bottom);var l=Math.min(this.left,region.left);return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+"}");};YAHOO.util.Region.getRegion=function(el){var p=YAHOO.util.Dom.getXY(el);var t=p[1];var r=p[0]+el.offsetWidth;var b=p[1]+el.offsetHeight;var l=p[0];return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Point=function(x,y){if(x instanceof Array){y=x[1];x=x[0];} +this.x=this.right=this.left=this[0]=x;this.y=this.top=this.bottom=this[1]=y;};YAHOO.util.Point.prototype=new YAHOO.util.Region();YAHOO.register("dom",YAHOO.util.Dom,{version:"2.2.0",build:"127"}); +if(!YAHOO.util.Event){YAHOO.util.Event=function(){var loadComplete=false;var listeners=[];var unloadListeners=[];var legacyEvents=[];var legacyHandlers=[];var retryCount=0;var onAvailStack=[];var legacyMap=[];var counter=0;var lastError=null;return{POLL_RETRYS:200,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,OBJ:3,ADJ_SCOPE:4,isSafari:(/KHTML/gi).test(navigator.userAgent),webkit:function(){var v=navigator.userAgent.match(/AppleWebKit\/([^ ]*)/);if(v&&v[1]){return v[1];} +return null;}(),isIE:(!this.webkit&&!navigator.userAgent.match(/opera/gi)&&navigator.userAgent.match(/msie/gi)),_interval:null,startInterval:function(){if(!this._interval){var self=this;var callback=function(){self._tryPreloadAttach();};this._interval=setInterval(callback,this.POLL_INTERVAL);}},onAvailable:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:false});retryCount=this.POLL_RETRYS;this.startInterval();},onContentReady:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:true});retryCount=this.POLL_RETRYS;this.startInterval();},addListener:function(el,sType,fn,obj,override){if(!fn||!fn.call){return false;} +if(this._isValidCollection(el)){var ok=true;for(var i=0,len=el.length;i=0){cacheItem=listeners[index];} +if(!el||!cacheItem){return false;} +if(this.useLegacyEvent(el,sType)){var legacyIndex=this.getLegacyIndex(el,sType);var llist=legacyHandlers[legacyIndex];if(llist){for(i=0,len=llist.length;i0);} +var notAvail=[];for(var i=0,len=onAvailStack.length;i0){for(var i=0,len=searchList.length;i0){j=listeners.length;while(j){index=j-1;l=listeners[index];if(l){EU.removeListener(l[EU.EL],l[EU.TYPE],l[EU.FN],index);} +j=j-1;} +l=null;EU.clearCache();} +for(i=0,len=legacyEvents.length;i0){param=args[0];} +ret=s.fn.call(scope,param,s.obj);}else{ret=s.fn.call(scope,this.type,args,s.obj);} +if(false===ret){if(!this.silent){} +return false;}}} +return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i + * YAHOO.env.getVersion for the description of the version data structure. + * @property listener + * @static + */ +if (typeof YAHOO == "undefined") { + /** + * The YAHOO global namespace object. If YAHOO is already defined, the + * existing YAHOO object will not be overwritten so that defined + * namespaces are preserved. + * @class YAHOO + * @static + */ + var YAHOO = {}; +} + +/** + * Returns the namespace specified and creates it if it doesn't exist + *
    + * YAHOO.namespace("property.package");
    + * YAHOO.namespace("YAHOO.property.package");
    + * 
    + * Either of the above would create YAHOO.property, then + * YAHOO.property.package + * + * Be careful when naming packages. Reserved words may work in some browsers + * and not others. For instance, the following will fail in Safari: + *
    + * YAHOO.namespace("really.long.nested.namespace");
    + * 
    + * This fails because "long" is a future reserved word in ECMAScript + * + * @method namespace + * @static + * @param {String*} arguments 1-n namespaces to create + * @return {Object} A reference to the last namespace object created + */ +YAHOO.namespace = function() { + var a=arguments, o=null, i, j, d; + for (i=0; i + *
    name:
    The name of the module
    + *
    version:
    The version in use
    + *
    build:
    The build number in use
    + *
    versions:
    All versions that were registered
    + *
    builds:
    All builds that were registered.
    + *
    mainClass:
    An object that was was stamped with the + * current version and build. If + * mainClass.VERSION != version or mainClass.BUILD != build, + * multiple versions of pieces of the library have been + * loaded, potentially causing issues.
    + * + * + * @method getVersion + * @static + * @param {String} name the name of the module (event, slider, etc) + * @return {Object} The version info + */ + getVersion: function(name) { + return YAHOO.env.modules[name] || null; + } +}; + +/** + * Provides the language utilites and extensions used by the library + * @class YAHOO.lang + */ +YAHOO.lang = { + /** + * Determines whether or not the provided object is an array + * @method isArray + * @param {any} obj The object being testing + * @return Boolean + */ + isArray: function(obj) { // frames lose type, so test constructor string + if (obj.constructor && obj.constructor.toString().indexOf('Array') > -1) { + return true; + } else { + return YAHOO.lang.isObject(obj) && obj.constructor == Array; + } + }, + + /** + * Determines whether or not the provided object is a boolean + * @method isBoolean + * @param {any} obj The object being testing + * @return Boolean + */ + isBoolean: function(obj) { + return typeof obj == 'boolean'; + }, + + /** + * Determines whether or not the provided object is a function + * @method isFunction + * @param {any} obj The object being testing + * @return Boolean + */ + isFunction: function(obj) { + return typeof obj == 'function'; + }, + + /** + * Determines whether or not the provided object is null + * @method isNull + * @param {any} obj The object being testing + * @return Boolean + */ + isNull: function(obj) { + return obj === null; + }, + + /** + * Determines whether or not the provided object is a legal number + * @method isNumber + * @param {any} obj The object being testing + * @return Boolean + */ + isNumber: function(obj) { + return typeof obj == 'number' && isFinite(obj); + }, + + /** + * Determines whether or not the provided object is of type object + * or function + * @method isObject + * @param {any} obj The object being testing + * @return Boolean + */ + isObject: function(obj) { + return typeof obj == 'object' || YAHOO.lang.isFunction(obj); + }, + + /** + * Determines whether or not the provided object is a string + * @method isString + * @param {any} obj The object being testing + * @return Boolean + */ + isString: function(obj) { + return typeof obj == 'string'; + }, + + /** + * Determines whether or not the provided object is undefined + * @method isUndefined + * @param {any} obj The object being testing + * @return Boolean + */ + isUndefined: function(obj) { + return typeof obj == 'undefined'; + }, + + /** + * Determines whether or not the property was added + * to the object instance. Returns false if the property is not present + * in the object, or was inherited from the prototype. + * This abstraction is provided to enable hasOwnProperty for Safari 1.3.x. + * There is a discrepancy between YAHOO.lang.hasOwnProperty and + * Object.prototype.hasOwnProperty when the property is a primitive added to + * both the instance AND prototype with the same value: + *
    +     * var A = function() {};
    +     * A.prototype.foo = 'foo';
    +     * var a = new A();
    +     * a.foo = 'foo';
    +     * alert(a.hasOwnProperty('foo')); // true
    +     * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
    +     * 
    + * @method hasOwnProperty + * @param {any} obj The object being testing + * @return Boolean + */ + hasOwnProperty: function(obj, prop) { + if (Object.prototype.hasOwnProperty) { + return obj.hasOwnProperty(prop); + } + + return !YAHOO.lang.isUndefined(obj[prop]) && + obj.constructor.prototype[prop] !== obj[prop]; + }, + + /** + * Utility to set up the prototype, constructor and superclass properties to + * support an inheritance strategy that can chain constructors and methods. + * + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ + extend: function(subc, superc, overrides) { + var F = function() {}; + F.prototype=superc.prototype; + subc.prototype=new F(); + subc.prototype.constructor=subc; + subc.superclass=superc.prototype; + if (superc.prototype.constructor == Object.prototype.constructor) { + superc.prototype.constructor=superc; + } + + if (overrides) { + for (var i in overrides) { + subc.prototype[i]=overrides[i]; + } + } + }, + + /** + * Applies all prototype properties in the supplier to the receiver if the + * receiver does not have these properties yet. Optionally, one or more + * methods/properties can be specified (as additional parameters). This + * option will overwrite the property if receiver has it already. + * + * @method augment + * @static + * @param {Function} r the object to receive the augmentation + * @param {Function} s the object that supplies the properties to augment + * @param {String*} arguments zero or more properties methods to augment the + * receiver with. If none specified, everything + * in the supplier will be used unless it would + * overwrite an existing property in the receiver + */ + augment: function(r, s) { + var rp=r.prototype, sp=s.prototype, a=arguments, i, p; + if (a[2]) { + for (i=2; iYAHOO.lang + * @class YAHOO.util.Lang + */ +YAHOO.util.Lang = YAHOO.lang; + +/** + * An alias for YAHOO.lang.augment + * @for YAHOO + * @method augment + * @static + * @param {Function} r the object to receive the augmentation + * @param {Function} s the object that supplies the properties to augment + * @param {String*} arguments zero or more properties methods to augment the + * receiver with. If none specified, everything + * in the supplier will be used unless it would + * overwrite an existing property in the receiver + */ +YAHOO.augment = YAHOO.lang.augment; + +/** + * An alias for YAHOO.lang.extend + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ +YAHOO.extend = YAHOO.lang.extend; + +YAHOO.register("yahoo", YAHOO, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/js/yui/yahoo/yahoo-min.js b/interface/ispconfig/interface/js/yui/yahoo/yahoo-min.js new file mode 100644 index 000000000..0747668a4 --- /dev/null +++ b/interface/ispconfig/interface/js/yui/yahoo/yahoo-min.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.2.0 +*/ + +if(typeof YAHOO=="undefined"){var YAHOO={};} +YAHOO.namespace=function(){var a=arguments,o=null,i,j,d;for(i=0;i-1){return true;}else{return YAHOO.lang.isObject(obj)&&obj.constructor==Array;}},isBoolean:function(obj){return typeof obj=='boolean';},isFunction:function(obj){return typeof obj=='function';},isNull:function(obj){return obj===null;},isNumber:function(obj){return typeof obj=='number'&&isFinite(obj);},isObject:function(obj){return typeof obj=='object'||YAHOO.lang.isFunction(obj);},isString:function(obj){return typeof obj=='string';},isUndefined:function(obj){return typeof obj=='undefined';},hasOwnProperty:function(obj,prop){if(Object.prototype.hasOwnProperty){return obj.hasOwnProperty(prop);} +return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]!==obj[prop];},extend:function(subc,superc,overrides){var F=function(){};F.prototype=superc.prototype;subc.prototype=new F();subc.prototype.constructor=subc;subc.superclass=superc.prototype;if(superc.prototype.constructor==Object.prototype.constructor){superc.prototype.constructor=superc;} +if(overrides){for(var i in overrides){subc.prototype[i]=overrides[i];}}},augment:function(r,s){var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i + * YAHOO.env.getVersion for the description of the version data structure. + * @property listener + * @static + */ +if (typeof YAHOO == "undefined") { + /** + * The YAHOO global namespace object. If YAHOO is already defined, the + * existing YAHOO object will not be overwritten so that defined + * namespaces are preserved. + * @class YAHOO + * @static + */ + var YAHOO = {}; +} + +/** + * Returns the namespace specified and creates it if it doesn't exist + *
    + * YAHOO.namespace("property.package");
    + * YAHOO.namespace("YAHOO.property.package");
    + * 
    + * Either of the above would create YAHOO.property, then + * YAHOO.property.package + * + * Be careful when naming packages. Reserved words may work in some browsers + * and not others. For instance, the following will fail in Safari: + *
    + * YAHOO.namespace("really.long.nested.namespace");
    + * 
    + * This fails because "long" is a future reserved word in ECMAScript + * + * @method namespace + * @static + * @param {String*} arguments 1-n namespaces to create + * @return {Object} A reference to the last namespace object created + */ +YAHOO.namespace = function() { + var a=arguments, o=null, i, j, d; + for (i=0; i + *
    name:
    The name of the module
    + *
    version:
    The version in use
    + *
    build:
    The build number in use
    + *
    versions:
    All versions that were registered
    + *
    builds:
    All builds that were registered.
    + *
    mainClass:
    An object that was was stamped with the + * current version and build. If + * mainClass.VERSION != version or mainClass.BUILD != build, + * multiple versions of pieces of the library have been + * loaded, potentially causing issues.
    + * + * + * @method getVersion + * @static + * @param {String} name the name of the module (event, slider, etc) + * @return {Object} The version info + */ + getVersion: function(name) { + return YAHOO.env.modules[name] || null; + } +}; + +/** + * Provides the language utilites and extensions used by the library + * @class YAHOO.lang + */ +YAHOO.lang = { + /** + * Determines whether or not the provided object is an array + * @method isArray + * @param {any} obj The object being testing + * @return Boolean + */ + isArray: function(obj) { // frames lose type, so test constructor string + if (obj.constructor && obj.constructor.toString().indexOf('Array') > -1) { + return true; + } else { + return YAHOO.lang.isObject(obj) && obj.constructor == Array; + } + }, + + /** + * Determines whether or not the provided object is a boolean + * @method isBoolean + * @param {any} obj The object being testing + * @return Boolean + */ + isBoolean: function(obj) { + return typeof obj == 'boolean'; + }, + + /** + * Determines whether or not the provided object is a function + * @method isFunction + * @param {any} obj The object being testing + * @return Boolean + */ + isFunction: function(obj) { + return typeof obj == 'function'; + }, + + /** + * Determines whether or not the provided object is null + * @method isNull + * @param {any} obj The object being testing + * @return Boolean + */ + isNull: function(obj) { + return obj === null; + }, + + /** + * Determines whether or not the provided object is a legal number + * @method isNumber + * @param {any} obj The object being testing + * @return Boolean + */ + isNumber: function(obj) { + return typeof obj == 'number' && isFinite(obj); + }, + + /** + * Determines whether or not the provided object is of type object + * or function + * @method isObject + * @param {any} obj The object being testing + * @return Boolean + */ + isObject: function(obj) { + return typeof obj == 'object' || YAHOO.lang.isFunction(obj); + }, + + /** + * Determines whether or not the provided object is a string + * @method isString + * @param {any} obj The object being testing + * @return Boolean + */ + isString: function(obj) { + return typeof obj == 'string'; + }, + + /** + * Determines whether or not the provided object is undefined + * @method isUndefined + * @param {any} obj The object being testing + * @return Boolean + */ + isUndefined: function(obj) { + return typeof obj == 'undefined'; + }, + + /** + * Determines whether or not the property was added + * to the object instance. Returns false if the property is not present + * in the object, or was inherited from the prototype. + * This abstraction is provided to enable hasOwnProperty for Safari 1.3.x. + * There is a discrepancy between YAHOO.lang.hasOwnProperty and + * Object.prototype.hasOwnProperty when the property is a primitive added to + * both the instance AND prototype with the same value: + *
    +     * var A = function() {};
    +     * A.prototype.foo = 'foo';
    +     * var a = new A();
    +     * a.foo = 'foo';
    +     * alert(a.hasOwnProperty('foo')); // true
    +     * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
    +     * 
    + * @method hasOwnProperty + * @param {any} obj The object being testing + * @return Boolean + */ + hasOwnProperty: function(obj, prop) { + if (Object.prototype.hasOwnProperty) { + return obj.hasOwnProperty(prop); + } + + return !YAHOO.lang.isUndefined(obj[prop]) && + obj.constructor.prototype[prop] !== obj[prop]; + }, + + /** + * Utility to set up the prototype, constructor and superclass properties to + * support an inheritance strategy that can chain constructors and methods. + * + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ + extend: function(subc, superc, overrides) { + var F = function() {}; + F.prototype=superc.prototype; + subc.prototype=new F(); + subc.prototype.constructor=subc; + subc.superclass=superc.prototype; + if (superc.prototype.constructor == Object.prototype.constructor) { + superc.prototype.constructor=superc; + } + + if (overrides) { + for (var i in overrides) { + subc.prototype[i]=overrides[i]; + } + } + }, + + /** + * Applies all prototype properties in the supplier to the receiver if the + * receiver does not have these properties yet. Optionally, one or more + * methods/properties can be specified (as additional parameters). This + * option will overwrite the property if receiver has it already. + * + * @method augment + * @static + * @param {Function} r the object to receive the augmentation + * @param {Function} s the object that supplies the properties to augment + * @param {String*} arguments zero or more properties methods to augment the + * receiver with. If none specified, everything + * in the supplier will be used unless it would + * overwrite an existing property in the receiver + */ + augment: function(r, s) { + var rp=r.prototype, sp=s.prototype, a=arguments, i, p; + if (a[2]) { + for (i=2; iYAHOO.lang + * @class YAHOO.util.Lang + */ +YAHOO.util.Lang = YAHOO.lang; + +/** + * An alias for YAHOO.lang.augment + * @for YAHOO + * @method augment + * @static + * @param {Function} r the object to receive the augmentation + * @param {Function} s the object that supplies the properties to augment + * @param {String*} arguments zero or more properties methods to augment the + * receiver with. If none specified, everything + * in the supplier will be used unless it would + * overwrite an existing property in the receiver + */ +YAHOO.augment = YAHOO.lang.augment; + +/** + * An alias for YAHOO.lang.extend + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ +YAHOO.extend = YAHOO.lang.extend; + +YAHOO.register("yahoo", YAHOO, {version: "2.2.0", build: "127"}); diff --git a/interface/ispconfig/interface/keepalive.php b/interface/ispconfig/interface/keepalive.php new file mode 100644 index 000000000..6ba2b8f59 --- /dev/null +++ b/interface/ispconfig/interface/keepalive.php @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/login/index.php b/interface/ispconfig/interface/login/index.php new file mode 100644 index 000000000..a1e2befa4 --- /dev/null +++ b/interface/ispconfig/interface/login/index.php @@ -0,0 +1,203 @@ +uses('tpl'); + $app->tpl->newTemplate('form.tpl.htm'); + + $error = ''; + + $app->load_language_file('web/login/lib/lang/'.$conf["language"].'.lng'); + + + //* Login Form was send + if(count($_POST) > 0) { + + //** Check variables + if(!preg_match("/^[\w\.\-\_]{1,64}$/", $_POST['username'])) $error = $app->lng('user_regex_error'); + if(!preg_match("/^.{1,64}$/i", $_POST['passwort'])) $error = $app->lng('pw_error_length'); + + //** iporting variables + $ip = $app->db->quote(ip2long($_SERVER['REMOTE_ADDR'])); + $username = $app->db->quote($_POST['username']); + $passwort = $app->db->quote($_POST['passwort']); + $loginAs = false; + $time = time(); + + if($username != '' && $passwort != '' && $error == '') { + /* + * Check, if there is a "login as" instead of a "normal" login + */ + if (isset($_SESSION['s']['user']) && $_SESSION['s']['user']['active'] == 1){ + /* + * only the admin can "login as" so if the user is NOT a admin, we + * open the startpage (after killing the old session), so the user + * is logout and has to start again! + */ + if ($_SESSION['s']['user']['typ'] != 'admin') { + /* + * The actual user is NOT a admin, but maybe the admin + * has logged in as "normal" user bevore... + */ + if (isset($_SESSION['s_old'])&& ($_SESSION['s_old']['user']['typ'] == 'admin')){ + /* The "old" user is admin, so everything is ok */ + } + else { + die("You don't have the right to 'login as'!"); + } + } + $loginAs = true; + } + else { + /* normal login */ + $loginAs = false; + } + + //* Check if there are already wrong logins + $sql = "SELECT * FROM `attempts_login` WHERE `ip`= '{$ip}' AND `login_time` > (NOW() - INTERVAL 1 MINUTE) LIMIT 1"; + $alreadyfailed = $app->db->queryOneRecord($sql); + //* login to much wrong + if($alreadyfailed['times'] > 5) { + $error = $app->lng('error_user_too_many_logins'); + } else { + if ($loginAs){ + $sql = "SELECT * FROM sys_user WHERE USERNAME = '$username' and PASSWORT = '". $passwort. "'"; + $user = $app->db->queryOneRecord($sql); + } else { + $sql = "SELECT * FROM sys_user WHERE USERNAME = '$username'"; + $user = $app->db->queryOneRecord($sql); + if($user && $user['active'] == 1) { + $saved_password = stripslashes($user['passwort']); + if(substr($saved_password,0,3) == '$1$') { + //* The password is crypt-md5 encrypted + $salt = '$1$'.substr($saved_password,3,8).'$'; + if(crypt($passwort,$salt) != $saved_password) { + $user = false; + } + } else { + //* The password is md5 encrypted + if(md5($passwort) != $saved_password) { + $user = false; + } + } + } else { + $user = false; + } + } + + if($user) { + if($user['active'] == 1) { + // User login right, so attempts can be deleted + $sql = "DELETE FROM `attempts_login` WHERE `ip`='{$ip}'"; + $app->db->query($sql); + $user = $app->db->toLower($user); + if ($loginAs) $oldSession = $_SESSION['s']; + $_SESSION = array(); + if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! + $_SESSION['s']['user'] = $user; + $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; + $_SESSION['s']['language'] = $user['language']; + $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; + + if(is_file($_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { + include_once($_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); + $_SESSION['s']['module'] = $module; + } + + $app->plugin->raiseEvent('login',$this); + + echo 'HEADER_REDIRECT:'.$_SESSION['s']['module']['startpage']; + + exit; + } else { + $error = $app->lng('error_user_blocked'); + } + } else { + if(!$alreadyfailed['times'] ) + { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES ('{$ip}', 1, NOW())"; + $app->db->query($sql); + } elseif($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `login_time` >= '{$time}' LIMIT 1"; + $app->db->query($sql); + } + //* Incorrect login - Username and password incorrect + $error = $app->lng('error_user_password_incorrect'); + if($app->db->errorMessage != '') $error .= '
    '.$app->db->errorMessage != ''; + } + } + } else { + //* Username or password empty + if($error == '') $error = $app->lng('error_user_password_empty'); + } + } + if($error != ''){ + $error = '

    Error

    '.$error.'
    '; + } + + + + $app->tpl->setVar('error', $error); + $app->tpl->setVar('username_txt', $app->lng('username_txt')); + $app->tpl->setVar('password_txt', $app->lng('password_txt')); + $app->tpl->setVar('login_button_txt', $app->lng('login_button_txt')); + $app->tpl->setInclude('content_tpl','login/templates/index.htm'); + $app->tpl_defaults(); + + $this->status = 'OK'; + + return $app->tpl->grab(); + + } // << end function + +} // << end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/login/lib/lang/bg.lng b/interface/ispconfig/interface/login/lib/lang/bg.lng new file mode 100644 index 000000000..9a9103417 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/bg.lng @@ -0,0 +1,17 @@ + 64 characters.'; +$wb['error_user_password_empty'] = 'Username or Password empty.'; +$wb['error_user_password_incorrect'] = 'Username or Password wrong.'; +$wb['error_user_blocked'] = 'User is blocked.'; +$wb['error_user_too_many_logins'] = 'To many wrong logins, Please retry it after 15 minutes'; +$wb['username_txt'] = 'Username'; +$wb['password_txt'] = 'Password'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/br.lng b/interface/ispconfig/interface/login/lib/lang/br.lng new file mode 100644 index 000000000..4f2d676d6 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/br.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/de.lng b/interface/ispconfig/interface/login/lib/lang/de.lng new file mode 100644 index 000000000..855798aa6 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/de.lng @@ -0,0 +1,17 @@ + 64 Zeichen.'; +$wb['error_user_password_empty'] = 'Bwnutzername oder Passwort leer.'; +$wb['error_user_password_incorrect'] = 'Benutzername oder Passwort falsch.'; +$wb['error_user_blocked'] = 'Benutzer ist gesperrt.'; +$wb['error_user_too_many_logins'] = 'Zu viele falsche Logins. Bitte nach 15 Minuten nochmal probieren.'; +$wb['username_txt'] = 'Benutzername'; +$wb['password_txt'] = 'Passwort'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/en.lng b/interface/ispconfig/interface/login/lib/lang/en.lng new file mode 100644 index 000000000..fc488cd56 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/en.lng @@ -0,0 +1,22 @@ + 64 characters.'; + +$wb['username_txt'] = "Username"; +$wb['password_txt'] = "Password"; +$wb['login_button_txt'] = "Login"; + +?> diff --git a/interface/ispconfig/interface/login/lib/lang/es.lng b/interface/ispconfig/interface/login/lib/lang/es.lng new file mode 100644 index 000000000..9db2714ea --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/es.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/fi.lng b/interface/ispconfig/interface/login/lib/lang/fi.lng new file mode 100644 index 000000000..7385385af --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/fi.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/fr.lng b/interface/ispconfig/interface/login/lib/lang/fr.lng new file mode 100644 index 000000000..115a33a20 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/fr.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/hu.lng b/interface/ispconfig/interface/login/lib/lang/hu.lng new file mode 100644 index 000000000..109276262 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/hu.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/it.lng b/interface/ispconfig/interface/login/lib/lang/it.lng new file mode 100644 index 000000000..23940d3f2 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/it.lng @@ -0,0 +1,17 @@ + 64 characters.'; +$wb['error_user_password_empty'] = 'Username or Password empty.'; +$wb['error_user_password_incorrect'] = 'Username or Password wrong.'; +$wb['error_user_blocked'] = 'User is blocked.'; +$wb['error_user_too_many_logins'] = 'To many wrong logins, Please retry it after 15 minutes'; +$wb['username_txt'] = 'Username'; +$wb['password_txt'] = 'Password'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/ja.lng b/interface/ispconfig/interface/login/lib/lang/ja.lng new file mode 100644 index 000000000..7cfb1d8bb --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/ja.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/nl.lng b/interface/ispconfig/interface/login/lib/lang/nl.lng new file mode 100644 index 000000000..46e1175c8 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/nl.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/lang/pl.lng b/interface/ispconfig/interface/login/lib/lang/pl.lng new file mode 100644 index 000000000..52f31b61b --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/pl.lng @@ -0,0 +1,17 @@ + 64 znaki.'; +$wb['error_user_password_empty'] = 'Username or Password empty.'; +$wb['error_user_password_incorrect'] = 'Username or Password wrong.'; +$wb['error_user_blocked'] = 'User is blocked.'; +$wb['error_user_too_many_logins'] = 'To many wrong logins, Please retry it after 15 minutes'; +$wb['username_txt'] = 'Username'; +$wb['password_txt'] = 'Password'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/pt.lng b/interface/ispconfig/interface/login/lib/lang/pt.lng new file mode 100644 index 000000000..48e217f59 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/pt.lng @@ -0,0 +1,18 @@ + + diff --git a/interface/ispconfig/interface/login/lib/lang/ro.lng b/interface/ispconfig/interface/login/lib/lang/ro.lng new file mode 100644 index 000000000..bcd64f446 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/ro.lng @@ -0,0 +1,17 @@ + 64 caractere.'; +$wb['error_user_password_empty'] = 'Username or Password empty.'; +$wb['error_user_password_incorrect'] = 'Username or Password wrong.'; +$wb['error_user_blocked'] = 'User is blocked.'; +$wb['error_user_too_many_logins'] = 'To many wrong logins, Please retry it after 15 minutes'; +$wb['username_txt'] = 'Username'; +$wb['password_txt'] = 'Password'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/ru.lng b/interface/ispconfig/interface/login/lib/lang/ru.lng new file mode 100644 index 000000000..200d43d97 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/ru.lng @@ -0,0 +1,18 @@ + + diff --git a/interface/ispconfig/interface/login/lib/lang/se.lng b/interface/ispconfig/interface/login/lib/lang/se.lng new file mode 100644 index 000000000..24fbbe1e0 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/se.lng @@ -0,0 +1,17 @@ + 64 characters.'; +$wb['error_user_password_empty'] = 'Username or Password empty.'; +$wb['error_user_password_incorrect'] = 'Username or Password wrong.'; +$wb['error_user_blocked'] = 'User is blocked.'; +$wb['error_user_too_many_logins'] = 'To many wrong logins, Please retry it after 15 minutes'; +$wb['username_txt'] = 'Username'; +$wb['password_txt'] = 'Password'; +$wb['login_button_txt'] = 'Login'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/sk.lng b/interface/ispconfig/interface/login/lib/lang/sk.lng new file mode 100644 index 000000000..ff376aef1 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/sk.lng @@ -0,0 +1,17 @@ + 64 znakov.'; +$wb['username_txt'] = 'Užívate?ské meno'; +$wb['password_txt'] = 'Heslo'; +$wb['login_button_txt'] = 'Prihlásenie'; +?> diff --git a/interface/ispconfig/interface/login/lib/lang/tr.lng b/interface/ispconfig/interface/login/lib/lang/tr.lng new file mode 100644 index 000000000..73d464b8a --- /dev/null +++ b/interface/ispconfig/interface/login/lib/lang/tr.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/login/lib/module.conf.php b/interface/ispconfig/interface/login/lib/module.conf.php new file mode 100644 index 000000000..b199ad575 --- /dev/null +++ b/interface/ispconfig/interface/login/lib/module.conf.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/login/logout.php b/interface/ispconfig/interface/login/logout.php new file mode 100644 index 000000000..bb3ba95eb --- /dev/null +++ b/interface/ispconfig/interface/login/logout.php @@ -0,0 +1,80 @@ +


    + Do you want to re-login as admin or log out?
    +
    + + +
    + + +
    + + +
    + '; + exit; +} + +$app->plugin->raiseEvent('logout',true); + +$_SESSION["s"]["user"] = null; +$_SESSION["s"]["module"] = null; +$_SESSION['s_old'] = null; + +//header("Location: ../index.php?phpsessid=".$_SESSION["s"]["id"]); + +if($_SESSION["s"]["site"]["logout"] != '') { + echo('URL_REDIRECT:'.$_SESSION["s"]["site"]["logout"]); +} else { + if($conf["interface_logout_url"] != '') { + echo('URL_REDIRECT:'.$conf["interface_logout_url"]); + } else { + echo('URL_REDIRECT:index.php'); + } +} +exit; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/login/password_reset.php b/interface/ispconfig/interface/login/password_reset.php new file mode 100644 index 000000000..ebe8154e4 --- /dev/null +++ b/interface/ispconfig/interface/login/password_reset.php @@ -0,0 +1,92 @@ +uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/password_reset.htm'); + +$app->tpl_defaults(); + +include(ISPC_ROOT_PATH.'/web/login/lib/lang/'.$_SESSION['s']['language'].'.lng'); +$app->tpl->setVar($wb); + +if(isset($_POST['username']) && $_POST['username'] != '' && $_POST['email'] != '' && $_POST['username'] != 'admin') { + + if(!preg_match("/^[\w\.\-\_]{1,64}$/", $_POST['username'])) die($app->lng('user_regex_error')); + if(!preg_match("/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,10}$/i", $_POST['email'])) die($app->lng('email_error')); + + $username = $app->db->quote($_POST['username']); + $email = $app->db->quote($_POST['email']); + + $client = $app->db->queryOneRecord("SELECT * FROM client WHERE username = '$username' AND email = '$email'"); + + if($client['client_id'] > 0) { + $new_password = md5 (uniqid (rand())); + $salt="$1$"; + $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + for ($n=0;$n<8;$n++) { + //$salt.=chr(mt_rand(64,126)); + $salt.=$base64_alphabet[mt_rand(0,63)]; + } + $salt.="$"; + $new_password_encrypted = crypt($new_password,$salt); + $new_password_encrypted = $app->db->quote($new_password_encrypted); + + $username = $app->db->quote($client['username']); + $app->db->query("UPDATE sys_user SET passwort = '$new_password_encrypted' WHERE username = '$username'"); + $app->db->query("UPDATE client SET ´password´ = '$new_password_encrypted' WHERE username = '$username'"); + $app->tpl->setVar("message",$wb['pw_reset']); + + mail($client['email'],$wb['pw_reset_mail_title'],$wb['pw_reset_mail_msg'].$new_password); + + $app->plugin->raiseEvent('password_reset',true); + + } else { + $app->tpl->setVar("message",$wb['pw_error']); + } + +} else { + $app->tpl->setVar("message",$wb['pw_error_noinput']); +} + + + +$app->tpl_defaults(); +$app->tpl->pparse(); + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/login/templates/index.htm b/interface/ispconfig/interface/login/templates/index.htm new file mode 100644 index 000000000..cd12199a5 --- /dev/null +++ b/interface/ispconfig/interface/login/templates/index.htm @@ -0,0 +1,33 @@ +

    Login

    +

    + + diff --git a/interface/ispconfig/interface/login/templates/password_reset.htm b/interface/ispconfig/interface/login/templates/password_reset.htm new file mode 100644 index 000000000..f3f99d225 --- /dev/null +++ b/interface/ispconfig/interface/login/templates/password_reset.htm @@ -0,0 +1,33 @@ +

    Password Reset

    +

    + +
    + + +

    +
    + +

    ERROR

    +
    + +
    +
    Password reset +
    + + +
    +
    + + +
    +
    + + + + +
    + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/form/mail_alias.tform.php b/interface/ispconfig/interface/mail/form/mail_alias.tform.php new file mode 100644 index 000000000..b74e36a12 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_alias.tform.php @@ -0,0 +1,114 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['alias'] = array ( + 'title' => "Email Alias", + 'width' => 100, + 'template' => "templates/mail_alias_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'email_error_isemail'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'destination' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT email FROM mail_user WHERE {AUTHSQL} ORDER BY email', + 'keyfield' => 'email', + 'valuefield' => 'email' + ), + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'destination_error_isemail'), + ), + 'value' => '' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('alias' => 'Alias','forward'=>'Forward') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_aliasdomain.tform.php b/interface/ispconfig/interface/mail/form/mail_aliasdomain.tform.php new file mode 100644 index 000000000..cc60cec1f --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_aliasdomain.tform.php @@ -0,0 +1,113 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['alias'] = array ( + 'title' => "Domain Alias", + 'width' => 100, + 'template' => "templates/mail_aliasdomain_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'source_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^\@[\w\.\-]{2,64}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'source_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'destination' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('alias' => 'Alias','forward'=>'Forward') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_blacklist.tform.php b/interface/ispconfig/interface/mail/form/mail_blacklist.tform.php new file mode 100644 index 000000000..83fc255d4 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_blacklist.tform.php @@ -0,0 +1,110 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['blacklist'] = array ( + 'title' => "Blacklist", + 'width' => 100, + 'template' => "templates/mail_blacklist_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'REJECT', + 'value' => 'REJECT', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('recipient' => 'Recipient', 'sender' => 'Sender', 'client' => 'Client') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_content_filter.tform.php b/interface/ispconfig/interface/mail/form/mail_content_filter.tform.php new file mode 100644 index 000000000..d07cb561d --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_content_filter.tform.php @@ -0,0 +1,116 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['filter'] = array ( + 'title' => "Filter", + 'width' => 100, + 'template' => "templates/mail_content_filter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('header' => 'Header Filter','body' => 'Body Filter','mime_header' => 'MIME-Header Filter','nested_header' => 'Nested-Header Filter') + ), + 'pattern' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'pattern_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'action' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('DISCARD' => 'DISCARD','DUNNO'=>'DUNNO','FILTER'=>'FILTER','HOLD'=>'HOLD','IGNORE'=>'IGNORE','PREPEND'=>'PREPEND','REDIRECT'=>'REDIRECT','REPLACE'=>'REPLACE','REJECT'=>'REJECT','WARN'=>'WARN') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_domain.tform.php b/interface/ispconfig/interface/mail/form/mail_domain.tform.php new file mode 100644 index 000000000..35f3218d6 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_domain.tform.php @@ -0,0 +1,101 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['domain'] = array ( + 'title' => "Domain", + 'width' => 100, + 'template' => "templates/mail_domain_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_domain_catchall.tform.php b/interface/ispconfig/interface/mail/form/mail_domain_catchall.tform.php new file mode 100644 index 000000000..a5982507d --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_domain_catchall.tform.php @@ -0,0 +1,119 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['catchall'] = array ( + 'title' => "Email Catchall", + 'width' => 100, + 'template' => "templates/mail_domain_catchall_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^\@[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'destination' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT email FROM mail_user WHERE {AUTHSQL} ORDER BY email', + 'keyfield' => 'email', + 'valuefield' => 'email' + ), + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'destination_error_isemail'), + ), + 'value' => '' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('alias' => 'Alias','forward'=>'Forward','catchall'=>'Catchall') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_forward.tform.php b/interface/ispconfig/interface/mail/form/mail_forward.tform.php new file mode 100644 index 000000000..ef348f977 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_forward.tform.php @@ -0,0 +1,108 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['forward'] = array ( + 'title' => "Email Forward", + 'width' => 100, + 'template' => "templates/mail_forward_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'email_error_isemail'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'destination' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('forward'=>'Forward','alias' => 'Alias') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_get.tform.php b/interface/ispconfig/interface/mail/form/mail_get.tform.php new file mode 100644 index 000000000..41bc01473 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_get.tform.php @@ -0,0 +1,148 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['mailget'] = array ( + 'title' => "Get Email", + 'width' => 100, + 'template' => "templates/mail_get_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('pop3' => 'POP3','imap'=>'IMAP','pop3ssl' => 'POP3SSL','imapssl'=>'IMAPSSL') + ), + 'source_server' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_server_error_isempty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,64}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'source_server_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source_username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_username_error_isempty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_password_error_isempty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source_delete' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + 'destination' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT email FROM mail_user WHERE {AUTHSQL} ORDER BY email', + 'keyfield' => 'email', + 'valuefield' => 'email' + ), + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'destination_error_isemail'), + ), + 'value' => '' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_relay_recipient.tform.php b/interface/ispconfig/interface/mail/form/mail_relay_recipient.tform.php new file mode 100644 index 000000000..b89a7997f --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_relay_recipient.tform.php @@ -0,0 +1,104 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['relay_recipient'] = array ( + 'title' => "Relay recipient", + 'width' => 100, + 'template' => "templates/mail_relay_recipient_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'OK', + 'value' => 'OK', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_spamfilter.tform.php b/interface/ispconfig/interface/mail/form/mail_spamfilter.tform.php new file mode 100644 index 000000000..e85f7ffdc --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_spamfilter.tform.php @@ -0,0 +1,146 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['spamfilter'] = array ( + 'title' => "Spamfilter", + 'width' => 100, + 'template' => "templates/mail_spamfilter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'email_error_notempty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'email_error_unique'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'spam_rewrite_score_int' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '5.00', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'spam_redirect_score_int' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '7.00', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'spam_delete_score_int' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '15.00', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'spam_rewrite_subject' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '***SPAM***', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'spam_redirect_maildir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT mailbox_id,email FROM mail_box WHERE {AUTHSQL} ORDER BY email', + 'keyfield'=> 'mailbox_id', + 'valuefield'=> 'email' + ), + 'default' => '', + 'value' => '' + ), + 'spam_redirect_maildir_purge' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '7', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_transport.tform.php b/interface/ispconfig/interface/mail/form/mail_transport.tform.php new file mode 100644 index 000000000..f277f9270 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_transport.tform.php @@ -0,0 +1,111 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['transport'] = array ( + 'title' => "Email transport", + 'width' => 100, + 'template' => "templates/mail_transport_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'transport' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'sort_order' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => 5, + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10) + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_user.tform.php b/interface/ispconfig/interface/mail/form/mail_user.tform.php new file mode 100644 index 000000000..570ccb4ea --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_user.tform.php @@ -0,0 +1,280 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['mailuser'] = array ( + 'title' => "Mailbox", + 'width' => 100, + 'template' => "templates/mail_user_mailbox_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'email_error_isemail'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'email_error_unique'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'ENCRYPT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'quota_error_isint'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^([0-9]*)$/', + 'errmsg'=> 'quota_error_value'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'maildir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'homedir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'uid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'gid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'postfix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(1 => 'y',0 => 'n') + ), + /* + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(1 => 'y',0 => 'n') + ), + */ + 'disableimap' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + 'disablepop3' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['autoresponder'] = array ( + 'title' => "Autoresponder", + 'width' => 100, + 'template' => "templates/mail_user_autoresponder_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'autoresponder_text' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '15' + ), + 'autoresponder' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + 'autoresponder_start_date' => array ( + 'datatype' => 'DATETIME', + 'formtype' => 'DATETIME', + 'validators'=> array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_autoresponder', + 'function' => 'start_date', + 'errmsg'=> 'autoresponder_start_date_isfuture'), + ), + ), + 'autoresponder_end_date' => array ( + 'datatype' => 'DATETIME', + 'formtype' => 'DATETIME', + 'validators'=> array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_autoresponder', + 'function' => 'end_date', + 'errmsg'=> 'autoresponder_end_date_isgreater'), + ), + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['filter_records'] = array ( + 'title' => "Mail Filter", + 'width' => 100, + 'template' => "templates/mail_user_mailfilter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'move_junk' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ), + 'plugins' => array ( + 'filter_records' => array ( + 'class' => 'plugin_listview', + 'options' => array( + 'listdef' => 'list/mail_user_filter.list.php', + 'sqlextwhere' => "mailuser_id = ".@intval(@$_REQUEST['id']), + 'sql_order_by' => "ORDER BY rulename" + ) + ) + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin' || 'user') { + +$form["tabs"]['mailfilter'] = array ( + 'title' => "Custom Rules", + 'width' => 100, + 'template' => "templates/mail_user_custom_rules_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'custom_mailfilter' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '15' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} + + +?> diff --git a/interface/ispconfig/interface/mail/form/mail_user.tform.php.orig b/interface/ispconfig/interface/mail/form/mail_user.tform.php.orig new file mode 100644 index 000000000..5214b6209 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_user.tform.php.orig @@ -0,0 +1,280 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['mailuser'] = array ( + 'title' => "Mailbox", + 'width' => 100, + 'template' => "templates/mail_user_mailbox_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'errmsg'=> 'email_error_isemail'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'email_error_unique'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'CRYPT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'quota_error_isint'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^([0-9]*)$/', + 'errmsg'=> 'quota_error_value'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'maildir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'homedir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'uid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'gid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'postfix' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(1 => 'y',0 => 'n') + ), + /* + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(1 => 'y',0 => 'n') + ), + */ + 'disableimap' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + 'disablepop3' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['autoresponder'] = array ( + 'title' => "Autoresponder", + 'width' => 100, + 'template' => "templates/mail_user_autoresponder_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'autoresponder_text' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '15' + ), + 'autoresponder' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y',0 => 'n') + ), + 'autoresponder_start_date' => array ( + 'datatype' => 'DATETIME', + 'formtype' => 'DATETIME', + 'validators'=> array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_autoresponder', + 'function' => 'start_date', + 'errmsg'=> 'autoresponder_start_date_isfuture'), + ), + ), + 'autoresponder_end_date' => array ( + 'datatype' => 'DATETIME', + 'formtype' => 'DATETIME', + 'validators'=> array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_autoresponder', + 'function' => 'end_date', + 'errmsg'=> 'autoresponder_end_date_isgreater'), + ), + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['filter_records'] = array ( + 'title' => "Mail Filter", + 'width' => 100, + 'template' => "templates/mail_user_mailfilter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'move_junk' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ), + 'plugins' => array ( + 'filter_records' => array ( + 'class' => 'plugin_listview', + 'options' => array( + 'listdef' => 'list/mail_user_filter.list.php', + 'sqlextwhere' => "mailuser_id = ".@intval(@$_REQUEST['id']), + 'sql_order_by' => "ORDER BY rulename" + ) + ) + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + +$form["tabs"]['mailfilter'] = array ( + 'title' => "Custom Rules", + 'width' => 100, + 'template' => "templates/mail_user_custom_rules_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'custom_mailfilter' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '15' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php b/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php new file mode 100644 index 000000000..cafab8ad6 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php @@ -0,0 +1,135 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = 'r'; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['filter'] = array ( + 'title' => "Filter", + 'width' => 100, + 'template' => "templates/mail_user_filter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'mailuser_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["mailuser_id"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'rulename' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'rulename_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('Subject' => 'Subject','From'=>'From','To'=>'To') + ), + 'op' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('contains'=>'Contains','is' => 'Is','begins'=>'Begins with','ends'=>'Ends with') + ), + 'searchterm' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'searchterm_is_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'action' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('move' => 'Move to','delete'=>'Delete') + ), + 'target' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9\.\-\_\ ]{0,100}$/', + 'errmsg'=> 'target_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> diff --git a/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php.orig b/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php.orig new file mode 100644 index 000000000..565d5c497 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_user_filter.tform.php.orig @@ -0,0 +1,135 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = 'r'; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['filter'] = array ( + 'title' => "Filter", + 'width' => 100, + 'template' => "templates/mail_user_filter_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'mailuser_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @intval($_REQUEST["mailuser_id"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'rulename' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'rulename_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('Subject' => 'Subject','From'=>'From','To'=>'To') + ), + 'op' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('contains'=>'Contains','is' => 'Is','begins'=>'Begins with','ends'=>'Ends with') + ), + 'searchterm' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'searchterm_is_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'action' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('move' => 'Move to','delete'=>'Delete') + ), + 'target' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9\.\-\_\ ]{0,100}$/', + 'errmsg'=> 'target_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> diff --git a/interface/ispconfig/interface/mail/form/mail_whitelist.tform.php b/interface/ispconfig/interface/mail/form/mail_whitelist.tform.php new file mode 100644 index 000000000..bf52f561a --- /dev/null +++ b/interface/ispconfig/interface/mail/form/mail_whitelist.tform.php @@ -0,0 +1,110 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['whitelist'] = array ( + 'title' => "Witelist", + 'width' => 100, + 'template' => "templates/mail_whitelist_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'source' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'source_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'OK', + 'value' => 'OK', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('recipient' => 'Recipient', 'sender' => 'Sender', 'client' => 'Client') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/spamfilter_blacklist.tform.php b/interface/ispconfig/interface/mail/form/spamfilter_blacklist.tform.php new file mode 100644 index 000000000..098c0dadc --- /dev/null +++ b/interface/ispconfig/interface/mail/form/spamfilter_blacklist.tform.php @@ -0,0 +1,119 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['blacklist'] = array ( + 'title' => "Blacklist", + 'width' => 100, + 'template' => "templates/spamfilter_blacklist_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'wb' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'B', + 'value' => array('W' => 'blacklist', 'B' => 'Blacklist') + ), + 'rid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,email FROM spamfilter_users WHERE {AUTHSQL} ORDER BY email', + 'keyfield'=> 'id', + 'valuefield'=> 'email' + ), + 'value' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'email_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'priority' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => 5, + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10) + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/spamfilter_config.tform.php b/interface/ispconfig/interface/mail/form/spamfilter_config.tform.php new file mode 100644 index 000000000..c04b50e77 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/spamfilter_config.tform.php @@ -0,0 +1,275 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['server'] = array ( + 'title' => "Server", + 'width' => 100, + 'template' => "templates/spamfilter_config_server_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'ip_address' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.105', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'ip_address_error_empty'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'netmask' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '255.255.255.0', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'netmask_error_empty'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'gateway' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.1', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'gateway_error_empty'), + ), + 'value' => '', + 'width' => '15', + 'maxlength' => '255' + ), + 'hostname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'server1.domain.tld', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'hostname_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'nameservers' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '192.168.0.1,192.168.0.2', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'nameservers_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['mail'] = array ( + 'title' => "Mail", + 'width' => 100, + 'template' => "templates/spamfilter_config_mail_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'module' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('postfix_mysql' => 'postfix_mysql') + ), + 'maildir_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/home/vmail/[domain]/[localpart]/', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'maildir_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'homedir_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/home/vmail/', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'homedir_path_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'mailuser_uid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '5000', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_uid_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_gid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '5000', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_gid_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'vmail', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_name_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'mailuser_group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'vmail', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'mailuser_group_error_empty'), + ), + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'relayhost' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'relayhost_user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'relayhost_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'mailbox_size_limit' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '15' + ), + 'message_size_limit' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '15' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['getmail'] = array ( + 'title' => "Getmail", + 'width' => 100, + 'template' => "templates/spamfilter_config_getmail_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'getmail_config_dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'getmail_config_dir_error_empty'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/spamfilter_policy.tform.php b/interface/ispconfig/interface/mail/form/spamfilter_policy.tform.php new file mode 100644 index 000000000..bf6588c52 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/spamfilter_policy.tform.php @@ -0,0 +1,382 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = 'r'; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['policy'] = array ( + 'title' => "Policy", + 'width' => 100, + 'template' => "templates/spamfilter_policy_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'policy_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'policyname_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'virus_lover' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'spam_lover' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'banned_files_lover' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'bad_header_lover' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'bypass_virus_checks' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'bypass_banned_checks' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'bypass_header_checks' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +$form["tabs"]['quarantine'] = array ( + 'title' => "Quarantine", + 'width' => 100, + 'template' => "templates/spamfilter_quarantine_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'virus_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'spam_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'banned_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'bad_header_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'clean_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'other_quarantine_to' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['taglevel'] = array ( + 'title' => "Tag-Level", + 'width' => 100, + 'template' => "templates/spamfilter_taglevel_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'spam_tag_level' => array ( + 'datatype' => 'DOUBLE', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'spam_tag2_level' => array ( + 'datatype' => 'DOUBLE', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'spam_kill_level' => array ( + 'datatype' => 'DOUBLE', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'spam_dsn_cutoff_level' => array ( + 'datatype' => 'DOUBLE', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'spam_quarantine_cutoff_level' => array ( + 'datatype' => 'DOUBLE', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'spam_modifies_subj' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'spam_subject_tag' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'spam_subject_tag2' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +$form["tabs"]['other'] = array ( + 'title' => "Other", + 'width' => 100, + 'template' => "templates/spamfilter_other_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'addr_extension_virus' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'addr_extension_spam' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'addr_extension_banned' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'addr_extension_bad_header' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'warnvirusrecip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'warnbannedrecip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'warnbadhrecip' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'N', + 'value' => array('N' => 'No','Y' => 'Yes') + ), + 'newvirus_admin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'virus_admin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'banned_admin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'bad_header_admin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'spam_admin' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + + 'message_size_limit' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '255' + ), + 'banned_rulenames' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + + ################################## + # ENDE Datatable fields + ################################## + ) +); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/spamfilter_users.tform.php b/interface/ispconfig/interface/mail/form/spamfilter_users.tform.php new file mode 100644 index 000000000..75cc35dc9 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/spamfilter_users.tform.php @@ -0,0 +1,125 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['users'] = array ( + 'title' => "Users", + 'width' => 100, + 'template' => "templates/spamfilter_users_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'priority' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => 5, + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10) + ), + 'policy_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,policy_name FROM spamfilter_policy WHERE {AUTHSQL} ORDER BY policy_name', + 'keyfield'=> 'id', + 'valuefield'=> 'policy_name' + ), + 'value' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'email_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'fullname' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'fullname_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'local' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'Y', + 'value' => array('Y' => 'Yes','N' => 'No') + ), + + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/form/spamfilter_whitelist.tform.php b/interface/ispconfig/interface/mail/form/spamfilter_whitelist.tform.php new file mode 100644 index 000000000..f3b541408 --- /dev/null +++ b/interface/ispconfig/interface/mail/form/spamfilter_whitelist.tform.php @@ -0,0 +1,119 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['whitelist'] = array ( + 'title' => "Whitelist", + 'width' => 100, + 'template' => "templates/spamfilter_whitelist_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'wb' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'W', + 'value' => array('W' => 'Whitelist', 'B' => 'Blacklist') + ), + 'rid' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,email FROM spamfilter_users WHERE {AUTHSQL} ORDER BY email', + 'keyfield'=> 'id', + 'valuefield'=> 'email' + ), + 'value' => '' + ), + 'email' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'email_error_notempty'), + ), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'priority' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => 5, + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10) + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/admin.conf.php b/interface/ispconfig/interface/mail/lib/admin.conf.php new file mode 100644 index 000000000..a45d44034 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/admin.conf.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/bg.lng b/interface/ispconfig/interface/mail/lib/lang/bg.lng new file mode 100644 index 000000000..e3a31e332 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias.lng new file mode 100644 index 000000000..44b6fed86 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias_list.lng new file mode 100644 index 000000000..0a44ea4f7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist.lng new file mode 100644 index 000000000..5b2815c0d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist_list.lng new file mode 100644 index 000000000..a72052f08 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter.lng new file mode 100644 index 000000000..9d5e5f9ba --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter_list.lng new file mode 100644 index 000000000..8c1e5e2e7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain.lng new file mode 100644 index 000000000..6120e82b7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall.lng new file mode 100644 index 000000000..382e97f0e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall_list.lng new file mode 100644 index 000000000..7d076dd4c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_list.lng new file mode 100644 index 000000000..d84478131 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward.lng new file mode 100644 index 000000000..7d237e14f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward_list.lng new file mode 100644 index 000000000..f4529440c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_get.lng new file mode 100644 index 000000000..5e42823b6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_get_list.lng new file mode 100644 index 000000000..4baf67e02 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter.lng new file mode 100644 index 000000000..e0a2a2f9a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter_list.lng new file mode 100644 index 000000000..728f3d365 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport.lng new file mode 100644 index 000000000..a4d7bbc44 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport_list.lng new file mode 100644 index 000000000..a96c081e6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user.lng new file mode 100644 index 000000000..374503643 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user.lng @@ -0,0 +1,41 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter.lng new file mode 100644 index 000000000..e633c1bd1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter_list.lng new file mode 100644 index 000000000..2754259f4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_list.lng new file mode 100644 index 000000000..6063cef12 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_stats_list.lng new file mode 100644 index 000000000..edde65bd7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist.lng new file mode 100644 index 000000000..92c365ba2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist_list.lng new file mode 100644 index 000000000..eaa7eb3fc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist.lng new file mode 100644 index 000000000..5a85949ab --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..1b17e6442 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config.lng new file mode 100644 index 000000000..2843133ca --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config_list.lng new file mode 100644 index 000000000..70e49e22b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy.lng new file mode 100644 index 000000000..e876330a6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy_list.lng new file mode 100644 index 000000000..04491ae4c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users.lng new file mode 100644 index 000000000..a93d94dba --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users_list.lng new file mode 100644 index 000000000..ed3d7a399 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist.lng new file mode 100644 index 000000000..5a85949ab --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..d209d17a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/bg_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br.lng b/interface/ispconfig/interface/mail/lib/lang/br.lng new file mode 100644 index 000000000..5e325a567 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_alias.lng new file mode 100644 index 000000000..b3b08e349 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_alias_list.lng new file mode 100644 index 000000000..c503b0bcc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain.lng new file mode 100644 index 000000000..7d8602823 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain_list.lng new file mode 100644 index 000000000..beb2c8205 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist.lng new file mode 100644 index 000000000..6d2cdb2a2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist_list.lng new file mode 100644 index 000000000..9395a2ccb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter.lng new file mode 100644 index 000000000..d5cda471f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter_list.lng new file mode 100644 index 000000000..c3a616ef3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain.lng new file mode 100644 index 000000000..a1cab1cfa --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall.lng new file mode 100644 index 000000000..1b794de61 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall_list.lng new file mode 100644 index 000000000..c4d548173 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_list.lng new file mode 100644 index 000000000..2afb7db7f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_forward.lng new file mode 100644 index 000000000..1dab622dd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_forward_list.lng new file mode 100644 index 000000000..f9f7ce406 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_get.lng new file mode 100644 index 000000000..bd3a3c221 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_get_list.lng new file mode 100644 index 000000000..9eaf45b73 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient.lng new file mode 100644 index 000000000..cdbf7ca73 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient_list.lng new file mode 100644 index 000000000..e6d898c97 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter.lng new file mode 100644 index 000000000..7f8a33642 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter_list.lng new file mode 100644 index 000000000..9b549a939 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_transport.lng new file mode 100644 index 000000000..51df05db4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_transport_list.lng new file mode 100644 index 000000000..4c6728056 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_user.lng new file mode 100644 index 000000000..46449972f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Início:'; +$wb['autoresponder_start_date_isfuture'] = 'A data de ínicio não pode estar no passado.'; +$wb['autoresponder_end_date_txt'] = 'Termino:'; +$wb['autoresponder_end_date_isgreater'] = 'A data de início deve ser menor que a data de termino.'; +$wb['move_junk_txt'] = 'Mover Spam para o diretório JUNK'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter.lng new file mode 100644 index 000000000..a9c054b37 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter_list.lng new file mode 100644 index 000000000..847d72c3a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_list.lng new file mode 100644 index 000000000..d399f482d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_stats_list.lng new file mode 100644 index 000000000..0457c2da5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist.lng new file mode 100644 index 000000000..15db38f28 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist_list.lng new file mode 100644 index 000000000..bd84205e4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist.lng new file mode 100644 index 000000000..c282beab9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..81906532a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config.lng new file mode 100644 index 000000000..30d01386c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config_list.lng new file mode 100644 index 000000000..345903fe5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy.lng new file mode 100644 index 000000000..24eb2ed0a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy_list.lng new file mode 100644 index 000000000..7247b2a17 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users.lng new file mode 100644 index 000000000..451500940 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users_list.lng new file mode 100644 index 000000000..1fe408eb4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist.lng new file mode 100644 index 000000000..951c3f468 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..4420bca63 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/br_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de.lng b/interface/ispconfig/interface/mail/lib/lang/de.lng new file mode 100644 index 000000000..e4a2347c7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_alias.lng new file mode 100644 index 000000000..f9112df59 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_alias_list.lng new file mode 100644 index 000000000..f24906024 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain.lng new file mode 100644 index 000000000..4ea7715fd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain_list.lng new file mode 100644 index 000000000..1c486c92d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist.lng new file mode 100644 index 000000000..75b20e201 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist_list.lng new file mode 100644 index 000000000..276d3a62d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter.lng new file mode 100644 index 000000000..9ea542249 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter_list.lng new file mode 100644 index 000000000..126f23ce4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain.lng new file mode 100644 index 000000000..e1cf325dc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall.lng new file mode 100644 index 000000000..d67fa10d9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall_list.lng new file mode 100644 index 000000000..2c5763f05 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_list.lng new file mode 100644 index 000000000..0449bc9a9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_forward.lng new file mode 100644 index 000000000..7fcf306c1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_forward_list.lng new file mode 100644 index 000000000..2eee574b0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_get.lng new file mode 100644 index 000000000..eb4a3b0c1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_get_list.lng new file mode 100644 index 000000000..3f7cf2486 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient.lng new file mode 100644 index 000000000..535ceb33c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient_list.lng new file mode 100644 index 000000000..fc5d6f47c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter.lng new file mode 100644 index 000000000..d411cb14c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter_list.lng new file mode 100644 index 000000000..f0acef3c2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_transport.lng new file mode 100644 index 000000000..16d1e6405 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_transport_list.lng new file mode 100644 index 000000000..3efda20ee --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_user.lng new file mode 100644 index 000000000..6312cd8b2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Startet am'; +$wb['autoresponder_start_date_isfuture'] = 'Startdatum kann nicht in der Vergangenheit liegen.'; +$wb['autoresponder_end_date_txt'] = 'Endet am'; +$wb['autoresponder_end_date_isgreater'] = 'Enddatum muss angegeben werden und muss später als das Startdatum sein.'; +$wb['move_junk_txt'] = 'Spam Emails in den Junk Ordner verschieben'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter.lng new file mode 100644 index 000000000..cc6d3d180 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter_list.lng new file mode 100644 index 000000000..3d9fd82db --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_list.lng new file mode 100644 index 000000000..f2e3d7a11 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_stats_list.lng new file mode 100644 index 000000000..88ad07a60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist.lng new file mode 100644 index 000000000..528c7cfce --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist_list.lng new file mode 100644 index 000000000..cb7f293b3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist.lng new file mode 100644 index 000000000..f2bc79a6b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..ca726a90d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config.lng new file mode 100644 index 000000000..f82f27f5c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config_list.lng new file mode 100644 index 000000000..db92a4bd0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy.lng new file mode 100644 index 000000000..ff2426f70 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy_list.lng new file mode 100644 index 000000000..8f77a6475 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users.lng new file mode 100644 index 000000000..fcb58114f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users_list.lng new file mode 100644 index 000000000..b85e23de3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist.lng new file mode 100644 index 000000000..1f47c716d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..ea53892ff --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/de_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/en.lng b/interface/ispconfig/interface/mail/lib/lang/en.lng new file mode 100644 index 000000000..0570dfa40 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en.lng @@ -0,0 +1,51 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_alias.lng new file mode 100644 index 000000000..d7c5e7a07 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_alias.lng @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_alias_list.lng new file mode 100644 index 000000000..10d5a6c7e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_alias_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain.lng new file mode 100644 index 000000000..241eb64ce --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain_list.lng new file mode 100644 index 000000000..8ebfa7dec --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_aliasdomain_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist.lng new file mode 100644 index 000000000..440784775 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist_list.lng new file mode 100644 index 000000000..9eb28ce3b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter.lng new file mode 100644 index 000000000..c72c78bd2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter_list.lng new file mode 100644 index 000000000..58de44a51 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain.lng new file mode 100644 index 000000000..ad9310069 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain.lng @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall.lng new file mode 100644 index 000000000..211ea3d3a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall_list.lng new file mode 100644 index 000000000..589423b9a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_list.lng new file mode 100644 index 000000000..787216c3c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_domain_list.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_forward.lng new file mode 100644 index 000000000..dee627153 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_forward.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_forward_list.lng new file mode 100644 index 000000000..f850512f1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_forward_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_get.lng new file mode 100644 index 000000000..e2180e5eb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_get.lng @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_get_list.lng new file mode 100644 index 000000000..f8b307d3c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_get_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient.lng new file mode 100644 index 000000000..fdec9ab0a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient_list.lng new file mode 100644 index 000000000..44cd894ac --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter.lng new file mode 100644 index 000000000..72c126cd9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter.lng @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter_list.lng new file mode 100644 index 000000000..22316fa12 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_transport.lng new file mode 100644 index 000000000..152c2eba4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_transport.lng @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_transport_list.lng new file mode 100644 index 000000000..febadb874 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_transport_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_user.lng new file mode 100644 index 000000000..c393e0ce7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_user.lng @@ -0,0 +1,40 @@ + 1'; +$wb["move_junk_txt"] = 'Move Spam Emails to Junk directory'; +$wb["name_txt"] = 'Realname'; +$wb["name_optional_txt"] = '(Optional)'; +$wb['autoresponder_active'] = 'Enable the autoresponder'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter.lng new file mode 100644 index 000000000..3245a095d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter_list.lng new file mode 100644 index 000000000..97cc11a61 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_list.lng new file mode 100644 index 000000000..70497def6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_list.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_stats_list.lng new file mode 100644 index 000000000..a2947f740 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist.lng new file mode 100644 index 000000000..6c6bed933 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist_list.lng new file mode 100644 index 000000000..22aedf23d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist.lng new file mode 100644 index 000000000..6478b1f2f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..ca387fba3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config.lng new file mode 100644 index 000000000..28c6b3407 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config.lng @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config_list.lng new file mode 100644 index 000000000..710e22b00 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy.lng new file mode 100644 index 000000000..2e0f05d6c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy_list.lng new file mode 100644 index 000000000..1e87733a0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users.lng new file mode 100644 index 000000000..78b346c3e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users_list.lng new file mode 100644 index 000000000..75fc98e76 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist.lng new file mode 100644 index 000000000..6478b1f2f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..72495f5e0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/en_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/es.lng b/interface/ispconfig/interface/mail/lib/lang/es.lng new file mode 100644 index 000000000..fb3317046 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_alias.lng new file mode 100644 index 000000000..c23956890 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_alias_list.lng new file mode 100644 index 000000000..2f5df201f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist.lng new file mode 100644 index 000000000..8efc603be --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist_list.lng new file mode 100644 index 000000000..a7394e2f8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter.lng new file mode 100644 index 000000000..ec1ca9621 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter_list.lng new file mode 100644 index 000000000..d70bf425f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain.lng new file mode 100644 index 000000000..1bf9bc3f6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall.lng new file mode 100644 index 000000000..f29db0533 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall_list.lng new file mode 100644 index 000000000..c70887eb1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_list.lng new file mode 100644 index 000000000..c647e23af --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_forward.lng new file mode 100644 index 000000000..771ef2877 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_forward_list.lng new file mode 100644 index 000000000..2c5d9af25 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_get.lng new file mode 100644 index 000000000..c0c57ce99 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_get_list.lng new file mode 100644 index 000000000..3c133e723 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter.lng new file mode 100644 index 000000000..e4e615c94 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter_list.lng new file mode 100644 index 000000000..f2e2cb1b8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_transport.lng new file mode 100644 index 000000000..87904c398 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_transport_list.lng new file mode 100644 index 000000000..b23483f6c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_user.lng new file mode 100644 index 000000000..172b2bfcb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter.lng new file mode 100644 index 000000000..743e53fde --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter_list.lng new file mode 100644 index 000000000..31e0e9855 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_list.lng new file mode 100644 index 000000000..163033d24 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_stats_list.lng new file mode 100644 index 000000000..9837a3ff8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist.lng new file mode 100644 index 000000000..1d681a72e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist_list.lng new file mode 100644 index 000000000..233a25cbe --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist.lng new file mode 100644 index 000000000..a411046a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..628510699 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config.lng new file mode 100644 index 000000000..f2ba6932d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config_list.lng new file mode 100644 index 000000000..a46257a3c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy.lng new file mode 100644 index 000000000..2932f5607 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy_list.lng new file mode 100644 index 000000000..ce196bb0c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users.lng new file mode 100644 index 000000000..361c2fe1c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users_list.lng new file mode 100644 index 000000000..60d8388a8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist.lng new file mode 100644 index 000000000..a411046a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..e1c7f66b1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/es_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi.lng b/interface/ispconfig/interface/mail/lib/lang/fi.lng new file mode 100644 index 000000000..840936608 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias.lng new file mode 100644 index 000000000..135c179c2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias_list.lng new file mode 100644 index 000000000..37dad6eaa --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist.lng new file mode 100644 index 000000000..66cb93004 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist_list.lng new file mode 100644 index 000000000..2d792ffc6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter.lng new file mode 100644 index 000000000..9cac6d38f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter_list.lng new file mode 100644 index 000000000..ccd1b895e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain.lng new file mode 100644 index 000000000..fc92040a1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall.lng new file mode 100644 index 000000000..802f83d81 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall_list.lng new file mode 100644 index 000000000..73f8c7598 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_list.lng new file mode 100644 index 000000000..e8c4d2862 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward.lng new file mode 100644 index 000000000..2368ddeb7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward_list.lng new file mode 100644 index 000000000..15aab44bf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_get.lng new file mode 100644 index 000000000..5db3b0cd9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_get_list.lng new file mode 100644 index 000000000..be7a29f7c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter.lng new file mode 100644 index 000000000..a833ecacf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter_list.lng new file mode 100644 index 000000000..41f6e3b0d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport.lng new file mode 100644 index 000000000..4b4ad896a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport_list.lng new file mode 100644 index 000000000..e91c76e29 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user.lng new file mode 100644 index 000000000..71e74404a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user.lng @@ -0,0 +1,39 @@ + 1 tai 0 rajoittamattomalle.'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter.lng new file mode 100644 index 000000000..a9f7a2b8f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter_list.lng new file mode 100644 index 000000000..ed6639a5e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_list.lng new file mode 100644 index 000000000..f37a7b808 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_stats_list.lng new file mode 100644 index 000000000..5f5b0391f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist.lng new file mode 100644 index 000000000..abd8e85f2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist_list.lng new file mode 100644 index 000000000..d6b134948 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist.lng new file mode 100644 index 000000000..287d968cf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..d448876ef --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config.lng new file mode 100644 index 000000000..7447b48c7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config_list.lng new file mode 100644 index 000000000..aee0c8173 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy.lng new file mode 100644 index 000000000..8f61ba411 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy_list.lng new file mode 100644 index 000000000..3074d45ff --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users.lng new file mode 100644 index 000000000..d960f5c82 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users_list.lng new file mode 100644 index 000000000..385d617a7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist.lng new file mode 100644 index 000000000..9dee91858 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..a3f00fc84 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fi_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr.lng b/interface/ispconfig/interface/mail/lib/lang/fr.lng new file mode 100644 index 000000000..be44ddafd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias.lng new file mode 100644 index 000000000..8c4921b3d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias_list.lng new file mode 100644 index 000000000..ae4947afe --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist.lng new file mode 100644 index 000000000..ca715af0b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist_list.lng new file mode 100644 index 000000000..18ae28f51 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter.lng new file mode 100644 index 000000000..5aa0caac0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter_list.lng new file mode 100644 index 000000000..bee77a2cb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain.lng new file mode 100644 index 000000000..da7e9839b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall.lng new file mode 100644 index 000000000..49c9fab11 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall_list.lng new file mode 100644 index 000000000..44542bf40 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_list.lng new file mode 100644 index 000000000..0d89f254b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward.lng new file mode 100644 index 000000000..dc04099fb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward_list.lng new file mode 100644 index 000000000..d8d5db2d9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_get.lng new file mode 100644 index 000000000..9aeb86389 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_get_list.lng new file mode 100644 index 000000000..86fb4d171 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter.lng new file mode 100644 index 000000000..f93f485c5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter_list.lng new file mode 100644 index 000000000..1a7c0fb42 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport.lng new file mode 100644 index 000000000..7fcdca0c5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport_list.lng new file mode 100644 index 000000000..4430c77d8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user.lng new file mode 100644 index 000000000..c7a818bb4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user.lng @@ -0,0 +1,41 @@ + 1'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter.lng new file mode 100644 index 000000000..aaa31129a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter_list.lng new file mode 100644 index 000000000..96bde24ea --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_list.lng new file mode 100644 index 000000000..3e037c040 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_stats_list.lng new file mode 100644 index 000000000..341dfdd7e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist.lng new file mode 100644 index 000000000..2d80229bc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist_list.lng new file mode 100644 index 000000000..1537a96f8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist.lng new file mode 100644 index 000000000..530a59e54 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..e13895c9a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config.lng new file mode 100644 index 000000000..2843133ca --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config_list.lng new file mode 100644 index 000000000..d59ed84c2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy.lng new file mode 100644 index 000000000..d40fd4a0c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy_list.lng new file mode 100644 index 000000000..81e5ebfde --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users.lng new file mode 100644 index 000000000..e88d33e39 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users_list.lng new file mode 100644 index 000000000..55448926a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist.lng new file mode 100644 index 000000000..dc51f7b5e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..d209d17a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/fr_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu.lng b/interface/ispconfig/interface/mail/lib/lang/hu.lng new file mode 100644 index 000000000..c799c3502 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias.lng new file mode 100644 index 000000000..f6fb82760 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias_list.lng new file mode 100644 index 000000000..a349fba2b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist.lng new file mode 100644 index 000000000..1d2f0e014 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist_list.lng new file mode 100644 index 000000000..0552cdae7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter.lng new file mode 100644 index 000000000..687443d24 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter_list.lng new file mode 100644 index 000000000..557c9baed --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain.lng new file mode 100644 index 000000000..abaf7595b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall.lng new file mode 100644 index 000000000..e064f3056 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall_list.lng new file mode 100644 index 000000000..effd97914 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_list.lng new file mode 100644 index 000000000..aa90c422c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward.lng new file mode 100644 index 000000000..ec3e281a8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward_list.lng new file mode 100644 index 000000000..d9f917709 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_get.lng new file mode 100644 index 000000000..d3e066175 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_get_list.lng new file mode 100644 index 000000000..bb18a849c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter.lng new file mode 100644 index 000000000..1aeef9c88 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter_list.lng new file mode 100644 index 000000000..aa5879e32 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport.lng new file mode 100644 index 000000000..d5089f3c1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport_list.lng new file mode 100644 index 000000000..c2e7bf2a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user.lng new file mode 100644 index 000000000..3aaeca146 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter.lng new file mode 100644 index 000000000..e51ddd0cf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter_list.lng new file mode 100644 index 000000000..1adaa5ecd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_list.lng new file mode 100644 index 000000000..71d8e6beb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_stats_list.lng new file mode 100644 index 000000000..88b4b81bf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist.lng new file mode 100644 index 000000000..71c3cf39b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist_list.lng new file mode 100644 index 000000000..b5bc46825 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist.lng new file mode 100644 index 000000000..077a7bc23 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..c526bbb10 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config.lng new file mode 100644 index 000000000..c137e9a68 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config_list.lng new file mode 100644 index 000000000..59d0449d8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy.lng new file mode 100644 index 000000000..06cbda576 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy_list.lng new file mode 100644 index 000000000..a592422d5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users.lng new file mode 100644 index 000000000..4fd29bbd5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users_list.lng new file mode 100644 index 000000000..796a5f959 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist.lng new file mode 100644 index 000000000..077a7bc23 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..9a1a63587 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/hu_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it.lng b/interface/ispconfig/interface/mail/lib/lang/it.lng new file mode 100644 index 000000000..e3a31e332 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_alias.lng new file mode 100644 index 000000000..44b6fed86 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_alias_list.lng new file mode 100644 index 000000000..0a44ea4f7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist.lng new file mode 100644 index 000000000..5b2815c0d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist_list.lng new file mode 100644 index 000000000..a72052f08 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter.lng new file mode 100644 index 000000000..9d5e5f9ba --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter_list.lng new file mode 100644 index 000000000..8c1e5e2e7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain.lng new file mode 100644 index 000000000..6120e82b7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall.lng new file mode 100644 index 000000000..382e97f0e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall_list.lng new file mode 100644 index 000000000..7d076dd4c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_list.lng new file mode 100644 index 000000000..d84478131 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_forward.lng new file mode 100644 index 000000000..7d237e14f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_forward_list.lng new file mode 100644 index 000000000..f4529440c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_get.lng new file mode 100644 index 000000000..5e42823b6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_get_list.lng new file mode 100644 index 000000000..4baf67e02 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter.lng new file mode 100644 index 000000000..e0a2a2f9a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter_list.lng new file mode 100644 index 000000000..728f3d365 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_transport.lng new file mode 100644 index 000000000..a4d7bbc44 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_transport_list.lng new file mode 100644 index 000000000..a96c081e6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_user.lng new file mode 100644 index 000000000..374503643 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_user.lng @@ -0,0 +1,41 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter.lng new file mode 100644 index 000000000..e633c1bd1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter_list.lng new file mode 100644 index 000000000..2754259f4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_list.lng new file mode 100644 index 000000000..6063cef12 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_stats_list.lng new file mode 100644 index 000000000..edde65bd7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist.lng new file mode 100644 index 000000000..92c365ba2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist_list.lng new file mode 100644 index 000000000..eaa7eb3fc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist.lng new file mode 100644 index 000000000..5a85949ab --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..1b17e6442 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config.lng new file mode 100644 index 000000000..2843133ca --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config_list.lng new file mode 100644 index 000000000..70e49e22b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy.lng new file mode 100644 index 000000000..e876330a6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy_list.lng new file mode 100644 index 000000000..04491ae4c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users.lng new file mode 100644 index 000000000..a93d94dba --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users_list.lng new file mode 100644 index 000000000..ed3d7a399 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist.lng new file mode 100644 index 000000000..5a85949ab --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..d209d17a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/it_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja.lng b/interface/ispconfig/interface/mail/lib/lang/ja.lng new file mode 100644 index 000000000..91dcde5ca --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias.lng new file mode 100644 index 000000000..032fb286f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias_list.lng new file mode 100644 index 000000000..d7782802c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist.lng new file mode 100644 index 000000000..9007f6bb0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist_list.lng new file mode 100644 index 000000000..35bea5fc6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter.lng new file mode 100644 index 000000000..ba657bbae --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter_list.lng new file mode 100644 index 000000000..58470067c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain.lng new file mode 100644 index 000000000..37867b047 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall.lng new file mode 100644 index 000000000..9c29cfbb9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall_list.lng new file mode 100644 index 000000000..e459645b2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_list.lng new file mode 100644 index 000000000..89eaf06f3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward.lng new file mode 100644 index 000000000..e52a15d86 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward_list.lng new file mode 100644 index 000000000..bf0deec14 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_get.lng new file mode 100644 index 000000000..a4dd18c4c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_get_list.lng new file mode 100644 index 000000000..1bf625eef --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter.lng new file mode 100644 index 000000000..77ef6dd16 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter_list.lng new file mode 100644 index 000000000..bcc2a12c8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport.lng new file mode 100644 index 000000000..b922a0e02 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport_list.lng new file mode 100644 index 000000000..77684972d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user.lng new file mode 100644 index 000000000..35eecb9a0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user.lng @@ -0,0 +1,39 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter.lng new file mode 100644 index 000000000..94d29d413 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter_list.lng new file mode 100644 index 000000000..847a415cc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_list.lng new file mode 100644 index 000000000..6063cef12 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_stats_list.lng new file mode 100644 index 000000000..ee0b9b9af --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist.lng new file mode 100644 index 000000000..74d51da92 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist_list.lng new file mode 100644 index 000000000..3f9d10414 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist.lng new file mode 100644 index 000000000..3e85ceeb4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..2e3cc45f9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config.lng new file mode 100644 index 000000000..30211081b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config_list.lng new file mode 100644 index 000000000..49e2dbe37 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy.lng new file mode 100644 index 000000000..89d377a38 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy_list.lng new file mode 100644 index 000000000..b2656b78e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users.lng new file mode 100644 index 000000000..815e723c2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users_list.lng new file mode 100644 index 000000000..00459dc54 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist.lng new file mode 100644 index 000000000..3e85ceeb4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..36009973d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ja_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl.lng b/interface/ispconfig/interface/mail/lib/lang/nl.lng new file mode 100644 index 000000000..b903ae51c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias.lng new file mode 100644 index 000000000..5ee32421d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias_list.lng new file mode 100644 index 000000000..28fe08fb0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain.lng new file mode 100644 index 000000000..c6d8352dc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain_list.lng new file mode 100644 index 000000000..860e583ae --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist.lng new file mode 100644 index 000000000..f3dd2f487 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist_list.lng new file mode 100644 index 000000000..a44f067d0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter.lng new file mode 100644 index 000000000..97f102ad7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter_list.lng new file mode 100644 index 000000000..bb92651dc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain.lng new file mode 100644 index 000000000..5fbdeac27 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall.lng new file mode 100644 index 000000000..d68f7d821 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall_list.lng new file mode 100644 index 000000000..379f879aa --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_list.lng new file mode 100644 index 000000000..0218e9c59 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward.lng new file mode 100644 index 000000000..180a13846 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward_list.lng new file mode 100644 index 000000000..88cf50b91 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_get.lng new file mode 100644 index 000000000..f5097afad --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_get_list.lng new file mode 100644 index 000000000..e680ab12c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient.lng new file mode 100644 index 000000000..68e0739e5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient_list.lng new file mode 100644 index 000000000..57e832354 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter.lng new file mode 100644 index 000000000..707c6f7d3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter_list.lng new file mode 100644 index 000000000..556cb5da2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport.lng new file mode 100644 index 000000000..447fde847 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport_list.lng new file mode 100644 index 000000000..99f3d4175 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user.lng new file mode 100644 index 000000000..85a08bb62 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user.lng @@ -0,0 +1,39 @@ +1)'; +$wb['autoresponder_start_date_txt'] = 'Begin'; +$wb['autoresponder_start_date_isfuture'] = 'Begin-datum kan niet in het verleden liggen.'; +$wb['autoresponder_end_date_txt'] = 'Einde'; +$wb['autoresponder_end_date_isgreater'] = 'Eind-datum mag niet eerder zijn dan de begin-datum.'; +$wb['move_junk_txt'] = 'Verplaats SPAM naar map Ongewenste e-mail'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter.lng new file mode 100644 index 000000000..1a89f9009 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter_list.lng new file mode 100644 index 000000000..fc0af5b2f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_list.lng new file mode 100644 index 000000000..efd76bf79 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_stats_list.lng new file mode 100644 index 000000000..7d9406b49 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist.lng new file mode 100644 index 000000000..8bdc7a744 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist_list.lng new file mode 100644 index 000000000..e9ed520fb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist.lng new file mode 100644 index 000000000..7c3d30c94 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..adf40b954 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config.lng new file mode 100644 index 000000000..7e487c94b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config_list.lng new file mode 100644 index 000000000..cbae14cde --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy.lng new file mode 100644 index 000000000..d2ea79df2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy_list.lng new file mode 100644 index 000000000..139e395f8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users.lng new file mode 100644 index 000000000..acf65d6ab --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users_list.lng new file mode 100644 index 000000000..51f63097e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist.lng new file mode 100644 index 000000000..7c3d30c94 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..aa4fe00b3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/nl_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl.lng b/interface/ispconfig/interface/mail/lib/lang/pl.lng new file mode 100644 index 000000000..2e9f8d975 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias.lng new file mode 100644 index 000000000..8556be818 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias_list.lng new file mode 100644 index 000000000..b6ce95d0c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist.lng new file mode 100644 index 000000000..528f2f741 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist_list.lng new file mode 100644 index 000000000..ebef66657 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter.lng new file mode 100644 index 000000000..54efa4fed --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter_list.lng new file mode 100644 index 000000000..6b0dd9bb8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain.lng new file mode 100644 index 000000000..6f9c68cdc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall.lng new file mode 100644 index 000000000..c77cc73ba --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall_list.lng new file mode 100644 index 000000000..1f0aad197 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_list.lng new file mode 100644 index 000000000..ec51e2cdb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward.lng new file mode 100644 index 000000000..4e100d615 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward_list.lng new file mode 100644 index 000000000..1044bd512 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_get.lng new file mode 100644 index 000000000..66fe5a1f8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_get_list.lng new file mode 100644 index 000000000..cd473d9de --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter.lng new file mode 100644 index 000000000..3879f2424 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter_list.lng new file mode 100644 index 000000000..d6097bb33 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport.lng new file mode 100644 index 000000000..035a5b049 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport_list.lng new file mode 100644 index 000000000..fa5c58431 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user.lng new file mode 100644 index 000000000..12f4f7ec6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter.lng new file mode 100644 index 000000000..129fdae9d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter_list.lng new file mode 100644 index 000000000..cea7c44db --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_list.lng new file mode 100644 index 000000000..287f520f6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_stats_list.lng new file mode 100644 index 000000000..b9780687d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist.lng new file mode 100644 index 000000000..203c5bae7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist_list.lng new file mode 100644 index 000000000..10e6dfcf0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist.lng new file mode 100644 index 000000000..6da8ddc9d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..c237a7a77 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config.lng new file mode 100644 index 000000000..c750d9593 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config_list.lng new file mode 100644 index 000000000..45b3f315c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy.lng new file mode 100644 index 000000000..0e4df55a3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy_list.lng new file mode 100644 index 000000000..43d9d414d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users.lng new file mode 100644 index 000000000..573f9bec0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users_list.lng new file mode 100644 index 000000000..dde2a62c6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist.lng new file mode 100644 index 000000000..be836015d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..6517cf41a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pl_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt.lng b/interface/ispconfig/interface/mail/lib/lang/pt.lng new file mode 100644 index 000000000..2c051ce57 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt.lng @@ -0,0 +1,48 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias.lng new file mode 100644 index 000000000..abb37dc55 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias_list.lng new file mode 100644 index 000000000..7c5c9e3fc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_alias_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain.lng new file mode 100644 index 000000000..f98f59e76 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain_list.lng new file mode 100644 index 000000000..518720679 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_aliasdomain_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist.lng new file mode 100644 index 000000000..5a2da4f48 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist_list.lng new file mode 100644 index 000000000..efb50b1d9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_blacklist_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter.lng new file mode 100644 index 000000000..39c0a618d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter_list.lng new file mode 100644 index 000000000..e81fded7b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_content_filter_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain.lng new file mode 100644 index 000000000..ec01a7eb7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall.lng new file mode 100644 index 000000000..3a18b2f55 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall_list.lng new file mode 100644 index 000000000..f23bc6781 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_catchall_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_list.lng new file mode 100644 index 000000000..6a493a187 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_domain_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward.lng new file mode 100644 index 000000000..9acc18a91 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward_list.lng new file mode 100644 index 000000000..db6622f6b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_forward_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_get.lng new file mode 100644 index 000000000..0d86fe648 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_get.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_get_list.lng new file mode 100644 index 000000000..3ec9b263c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_get_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient.lng new file mode 100644 index 000000000..fe741e271 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient_list.lng new file mode 100644 index 000000000..4e2ca4c93 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_relay_recipient_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter.lng new file mode 100644 index 000000000..580c204b5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter.lng @@ -0,0 +1,18 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter_list.lng new file mode 100644 index 000000000..03ef40df8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_spamfilter_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport.lng new file mode 100644 index 000000000..c749a8157 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport_list.lng new file mode 100644 index 000000000..43136582a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_transport_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user.lng new file mode 100644 index 000000000..939dade35 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user.lng @@ -0,0 +1,40 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Início:'; +$wb['autoresponder_start_date_isfuture'] = 'A data de ínicio não pode estar no passado.'; +$wb['autoresponder_end_date_txt'] = 'Termino:'; +$wb['autoresponder_end_date_isgreater'] = 'A data de início deve ser menor que a data de termino.'; +$wb['move_junk_txt'] = 'Mover Spam para a pasta JUNK'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter.lng new file mode 100644 index 000000000..7554389ff --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter_list.lng new file mode 100644 index 000000000..f0075f92b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_filter_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_list.lng new file mode 100644 index 000000000..615004561 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_stats_list.lng new file mode 100644 index 000000000..bb8a6a4cd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_user_stats_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist.lng new file mode 100644 index 000000000..6853a4b83 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist_list.lng new file mode 100644 index 000000000..1ec69a34b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_mail_whitelist_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist.lng new file mode 100644 index 000000000..16b8bc632 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..b93d91b8d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_blacklist_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config.lng new file mode 100644 index 000000000..5d2d639a1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config.lng @@ -0,0 +1,21 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config_list.lng new file mode 100644 index 000000000..9857bc759 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_config_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy.lng new file mode 100644 index 000000000..18df72b1f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy.lng @@ -0,0 +1,39 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy_list.lng new file mode 100644 index 000000000..7675b1de2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_policy_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users.lng new file mode 100644 index 000000000..aa8eea9d1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users_list.lng new file mode 100644 index 000000000..b2398ddcf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_users_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist.lng new file mode 100644 index 000000000..092bf347a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..b5b68ba1e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/pt_spamfilter_whitelist_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro.lng b/interface/ispconfig/interface/mail/lib/lang/ro.lng new file mode 100644 index 000000000..f9ad4e65c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias.lng new file mode 100644 index 000000000..dbc2f7abf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias_list.lng new file mode 100644 index 000000000..e9f37c807 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain.lng new file mode 100644 index 000000000..241eb64ce --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain_list.lng new file mode 100644 index 000000000..8ebfa7dec --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_aliasdomain_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist.lng new file mode 100644 index 000000000..a0feb7826 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist_list.lng new file mode 100644 index 000000000..b0342fcf1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter.lng new file mode 100644 index 000000000..d6f2d8cd1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter_list.lng new file mode 100644 index 000000000..8cd0f8377 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain.lng new file mode 100644 index 000000000..ce579c204 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall.lng new file mode 100644 index 000000000..9b7134d84 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall_list.lng new file mode 100644 index 000000000..362af948a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_list.lng new file mode 100644 index 000000000..600eefc7c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward.lng new file mode 100644 index 000000000..f75e39630 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward_list.lng new file mode 100644 index 000000000..620cb0de8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_get.lng new file mode 100644 index 000000000..7a8ea8ec8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_get_list.lng new file mode 100644 index 000000000..dcfa65c0f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient.lng new file mode 100644 index 000000000..fdec9ab0a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient_list.lng new file mode 100644 index 000000000..44cd894ac --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter.lng new file mode 100644 index 000000000..ce7b3a98c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter_list.lng new file mode 100644 index 000000000..f39841361 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport.lng new file mode 100644 index 000000000..6693e9fa8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport_list.lng new file mode 100644 index 000000000..5775d2717 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user.lng new file mode 100644 index 000000000..19928116f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter.lng new file mode 100644 index 000000000..5442a3da0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter_list.lng new file mode 100644 index 000000000..d0df16766 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_list.lng new file mode 100644 index 000000000..6d45a926b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_stats_list.lng new file mode 100644 index 000000000..525483d85 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist.lng new file mode 100644 index 000000000..7a3f9f515 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist_list.lng new file mode 100644 index 000000000..e2ab48b66 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist.lng new file mode 100644 index 000000000..f24efb551 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..de9cbc975 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config.lng new file mode 100644 index 000000000..1ed8aac8c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config_list.lng new file mode 100644 index 000000000..059001111 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy.lng new file mode 100644 index 000000000..3645b3e1d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy_list.lng new file mode 100644 index 000000000..d72f80207 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users.lng new file mode 100644 index 000000000..d07cd4987 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users_list.lng new file mode 100644 index 000000000..fb352a16b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist.lng new file mode 100644 index 000000000..f24efb551 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..adb312d41 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ro_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru.lng b/interface/ispconfig/interface/mail/lib/lang/ru.lng new file mode 100644 index 000000000..eaeaf4d24 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru.lng @@ -0,0 +1,48 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias.lng new file mode 100644 index 000000000..31408f90a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias_list.lng new file mode 100644 index 000000000..079c7697a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_alias_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain.lng new file mode 100644 index 000000000..10f6db67c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain_list.lng new file mode 100644 index 000000000..cfc133851 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_aliasdomain_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist.lng new file mode 100644 index 000000000..e0136d21d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist_list.lng new file mode 100644 index 000000000..239741682 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_blacklist_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter.lng new file mode 100644 index 000000000..74514c3e4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter_list.lng new file mode 100644 index 000000000..f3925847a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_content_filter_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain.lng new file mode 100644 index 000000000..1ce7bcff7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain.lng @@ -0,0 +1,14 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall.lng new file mode 100644 index 000000000..c33e7ed55 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall_list.lng new file mode 100644 index 000000000..53fba7f13 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_catchall_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_list.lng new file mode 100644 index 000000000..d79119142 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_domain_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward.lng new file mode 100644 index 000000000..91c8de4f7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward_list.lng new file mode 100644 index 000000000..6fbccc231 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_forward_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_get.lng new file mode 100644 index 000000000..d1df0ca6e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_get.lng @@ -0,0 +1,17 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_get_list.lng new file mode 100644 index 000000000..624356864 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_get_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient.lng new file mode 100644 index 000000000..f01fe7313 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient_list.lng new file mode 100644 index 000000000..e31964124 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_relay_recipient_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter.lng new file mode 100644 index 000000000..4b9003bb6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter.lng @@ -0,0 +1,18 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter_list.lng new file mode 100644 index 000000000..60ea0a804 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_spamfilter_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport.lng new file mode 100644 index 000000000..8120616f6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport_list.lng new file mode 100644 index 000000000..7a8316172 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_transport_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user.lng new file mode 100644 index 000000000..e704e5b0c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user.lng @@ -0,0 +1,42 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter.lng new file mode 100644 index 000000000..2c4ec7593 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter_list.lng new file mode 100644 index 000000000..31cdd3690 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_filter_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_list.lng new file mode 100644 index 000000000..50504e9c2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_stats_list.lng new file mode 100644 index 000000000..8d2d0a5cf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_user_stats_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist.lng new file mode 100644 index 000000000..b2da2503b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist_list.lng new file mode 100644 index 000000000..9d1bc9658 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_mail_whitelist_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist.lng new file mode 100644 index 000000000..2254ce98d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..2a9bad5a5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_blacklist_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config.lng new file mode 100644 index 000000000..96ab7c2ab --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config.lng @@ -0,0 +1,21 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config_list.lng new file mode 100644 index 000000000..8d7fb329e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_config_list.lng @@ -0,0 +1,6 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy.lng new file mode 100644 index 000000000..39c08439f --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy.lng @@ -0,0 +1,39 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy_list.lng new file mode 100644 index 000000000..e62998610 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_policy_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users.lng new file mode 100644 index 000000000..d529a4124 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users_list.lng new file mode 100644 index 000000000..f7bd251f5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_users_list.lng @@ -0,0 +1,11 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist.lng new file mode 100644 index 000000000..df2fb91ec --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..b81b3e9ad --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/ru_spamfilter_whitelist_list.lng @@ -0,0 +1,10 @@ + + diff --git a/interface/ispconfig/interface/mail/lib/lang/se.lng b/interface/ispconfig/interface/mail/lib/lang/se.lng new file mode 100644 index 000000000..e3a31e332 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_alias.lng new file mode 100644 index 000000000..742a20aff --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_alias_list.lng new file mode 100644 index 000000000..c2fd19e36 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist.lng new file mode 100644 index 000000000..a15814164 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist_list.lng new file mode 100644 index 000000000..497e24d8b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter.lng new file mode 100644 index 000000000..9d5e5f9ba --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter_list.lng new file mode 100644 index 000000000..8c1e5e2e7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain.lng new file mode 100644 index 000000000..dc8cf7bfd --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall.lng new file mode 100644 index 000000000..8108545c2 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall_list.lng new file mode 100644 index 000000000..9f4b84cdf --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_list.lng new file mode 100644 index 000000000..d0c8ba979 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_forward.lng new file mode 100644 index 000000000..be714f48c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_forward_list.lng new file mode 100644 index 000000000..1856a7205 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_get.lng new file mode 100644 index 000000000..5e42823b6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_get_list.lng new file mode 100644 index 000000000..4baf67e02 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter.lng new file mode 100644 index 000000000..e0a2a2f9a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter_list.lng new file mode 100644 index 000000000..728f3d365 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_transport.lng new file mode 100644 index 000000000..a4d7bbc44 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_transport_list.lng new file mode 100644 index 000000000..a96c081e6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_user.lng new file mode 100644 index 000000000..374503643 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_user.lng @@ -0,0 +1,41 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter.lng new file mode 100644 index 000000000..e633c1bd1 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter_list.lng new file mode 100644 index 000000000..2754259f4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_list.lng new file mode 100644 index 000000000..6063cef12 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_stats_list.lng new file mode 100644 index 000000000..edde65bd7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist.lng new file mode 100644 index 000000000..355f8be34 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist_list.lng new file mode 100644 index 000000000..5534d5852 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist.lng new file mode 100644 index 000000000..5a85949ab --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..1b17e6442 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config.lng new file mode 100644 index 000000000..2843133ca --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config_list.lng new file mode 100644 index 000000000..70e49e22b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy.lng new file mode 100644 index 000000000..e876330a6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy_list.lng new file mode 100644 index 000000000..04491ae4c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users.lng new file mode 100644 index 000000000..a93d94dba --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users_list.lng new file mode 100644 index 000000000..ed3d7a399 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist.lng new file mode 100644 index 000000000..5a85949ab --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..d209d17a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/se_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk.lng b/interface/ispconfig/interface/mail/lib/lang/sk.lng new file mode 100644 index 000000000..f981e016b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias.lng new file mode 100644 index 000000000..9bc1f12da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias_list.lng new file mode 100644 index 000000000..de07deada --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist.lng new file mode 100644 index 000000000..40723a2b0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist_list.lng new file mode 100644 index 000000000..f5ffaad58 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter.lng new file mode 100644 index 000000000..973c52259 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter_list.lng new file mode 100644 index 000000000..6f9e80ae8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain.lng new file mode 100644 index 000000000..3f944d820 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall.lng new file mode 100644 index 000000000..57d42f510 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall_list.lng new file mode 100644 index 000000000..b9ea643b5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_list.lng new file mode 100644 index 000000000..e954961ce --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward.lng new file mode 100644 index 000000000..6ff58d703 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward_list.lng new file mode 100644 index 000000000..1f2f72488 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_get.lng new file mode 100644 index 000000000..c1bd07915 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_get_list.lng new file mode 100644 index 000000000..deb73fa70 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter.lng new file mode 100644 index 000000000..03a632d56 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter_list.lng new file mode 100644 index 000000000..05736a842 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport.lng new file mode 100644 index 000000000..e259510b8 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport_list.lng new file mode 100644 index 000000000..c4c17c65a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user.lng new file mode 100644 index 000000000..e76911049 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user.lng @@ -0,0 +1,39 @@ + 1'; +$wb['autoresponder_start_date_txt'] = 'Start on'; +$wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; +$wb['autoresponder_end_date_txt'] = 'End by'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb['name_txt'] = 'Realname'; +$wb['name_optional_txt'] = '(Optional)'; +?> diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter.lng new file mode 100644 index 000000000..1d3966dcb --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter_list.lng new file mode 100644 index 000000000..f2ae6e92c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_list.lng new file mode 100644 index 000000000..aa3a3c20c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_stats_list.lng new file mode 100644 index 000000000..8d9361ee5 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist.lng new file mode 100644 index 000000000..b5caaf450 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist_list.lng new file mode 100644 index 000000000..00c2e4d9c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist.lng new file mode 100644 index 000000000..844c9f323 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..707477f3a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config.lng new file mode 100644 index 000000000..c8de92cb0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config_list.lng new file mode 100644 index 000000000..f2199097e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy.lng new file mode 100644 index 000000000..4cd6a4303 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy_list.lng new file mode 100644 index 000000000..cb21bd264 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users.lng new file mode 100644 index 000000000..f193d421c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users_list.lng new file mode 100644 index 000000000..2865596d3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist.lng new file mode 100644 index 000000000..351ae0e93 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..3e6e0e830 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/sk_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr.lng b/interface/ispconfig/interface/mail/lib/lang/tr.lng new file mode 100644 index 000000000..5878a9822 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr.lng @@ -0,0 +1,47 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias.lng new file mode 100644 index 000000000..1c9499750 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias_list.lng new file mode 100644 index 000000000..4f0690d9a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_alias_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain.lng new file mode 100644 index 000000000..5815d1e60 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain_list.lng new file mode 100644 index 000000000..d96a63e2a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_aliasdomain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist.lng new file mode 100644 index 000000000..77bb386ea --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist_list.lng new file mode 100644 index 000000000..a32e81e64 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_blacklist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter.lng new file mode 100644 index 000000000..fc3901f0d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter_list.lng new file mode 100644 index 000000000..8dae62917 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_content_filter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain.lng new file mode 100644 index 000000000..e8696816e --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain.lng @@ -0,0 +1,13 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall.lng new file mode 100644 index 000000000..3c6338b42 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall_list.lng new file mode 100644 index 000000000..fdec4fd53 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_catchall_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_list.lng new file mode 100644 index 000000000..596262449 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_domain_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward.lng new file mode 100644 index 000000000..154641e99 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward_list.lng new file mode 100644 index 000000000..88df7144c --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_forward_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_get.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_get.lng new file mode 100644 index 000000000..641c6c267 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_get.lng @@ -0,0 +1,16 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_get_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_get_list.lng new file mode 100644 index 000000000..7cd54a18a --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_get_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient.lng new file mode 100644 index 000000000..b5c8724da --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient_list.lng new file mode 100644 index 000000000..36045f4e3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_relay_recipient_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter.lng new file mode 100644 index 000000000..08e90f9fc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter.lng @@ -0,0 +1,17 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter_list.lng new file mode 100644 index 000000000..5caf34414 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_spamfilter_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport.lng new file mode 100644 index 000000000..b9c1d90d9 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport_list.lng new file mode 100644 index 000000000..44d1e00a3 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_transport_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_user.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user.lng new file mode 100644 index 000000000..ed15471cc --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user.lng @@ -0,0 +1,39 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter.lng new file mode 100644 index 000000000..abf45c443 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter_list.lng new file mode 100644 index 000000000..cd8b0780d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_filter_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_list.lng new file mode 100644 index 000000000..ee99944db --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_stats_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_stats_list.lng new file mode 100644 index 000000000..ddb4fa9f7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_user_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist.lng new file mode 100644 index 000000000..05ada4ae0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist_list.lng new file mode 100644 index 000000000..5f795797d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_mail_whitelist_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist.lng new file mode 100644 index 000000000..fe6afeeb0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist_list.lng new file mode 100644 index 000000000..f9dd9ed6d --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_blacklist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config.lng new file mode 100644 index 000000000..1f4a076d7 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config.lng @@ -0,0 +1,20 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config_list.lng new file mode 100644 index 000000000..dd5ce0f34 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_config_list.lng @@ -0,0 +1,5 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy.lng new file mode 100644 index 000000000..11dedf40b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy.lng @@ -0,0 +1,38 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy_list.lng new file mode 100644 index 000000000..1344e8573 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_policy_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users.lng new file mode 100644 index 000000000..b1e3ff81b --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users_list.lng new file mode 100644 index 000000000..095a4bd77 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_users_list.lng @@ -0,0 +1,10 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist.lng new file mode 100644 index 000000000..fe6afeeb0 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist_list.lng b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist_list.lng new file mode 100644 index 000000000..7b9bf4351 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/lang/tr_spamfilter_whitelist_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/mail/lib/module.conf.php b/interface/ispconfig/interface/mail/lib/module.conf.php new file mode 100644 index 000000000..4ea0529d6 --- /dev/null +++ b/interface/ispconfig/interface/mail/lib/module.conf.php @@ -0,0 +1,125 @@ + 'Domain', + 'target' => 'content', + 'link' => 'mail/mail_domain_list.php'); + +$items[] = array( 'title' => 'Domain Alias', + 'target' => 'content', + 'link' => 'mail/mail_aliasdomain_list.php'); + +$items[] = array( 'title' => 'Email Mailbox', + 'target' => 'content', + 'link' => 'mail/mail_user_list.php'); + +$items[] = array( 'title' => 'Email Alias', + 'target' => 'content', + 'link' => 'mail/mail_alias_list.php'); + +$items[] = array( 'title' => 'Email Forward', + 'target' => 'content', + 'link' => 'mail/mail_forward_list.php'); + +$items[] = array( 'title' => 'Email Catchall', + 'target' => 'content', + 'link' => 'mail/mail_domain_catchall_list.php'); + +$items[] = array( 'title' => 'Email Routing', + 'target' => 'content', + 'link' => 'mail/mail_transport_list.php'); + +$module['nav'][] = array( 'title' => 'Email Accounts', + 'open' => 1, + 'items' => $items); + +//**** Spamfilter menu +$items = array(); + +$items[] = array( 'title' => 'Whitelist', + 'target' => 'content', + 'link' => 'mail/spamfilter_whitelist_list.php'); + +$items[] = array( 'title' => 'Blacklist', + 'target' => 'content', + 'link' => 'mail/spamfilter_blacklist_list.php'); + +if($_SESSION['s']['user']['typ'] == 'admin') { + + $items[] = array( 'title' => 'User / Domain', + 'target' => 'content', + 'link' => 'mail/spamfilter_users_list.php'); + + $items[] = array( 'title' => 'Policy', + 'target' => 'content', + 'link' => 'mail/spamfilter_policy_list.php'); + +// $items[] = array( 'title' => 'Server Settings', +// 'target' => 'content', +// 'link' => 'mail/spamfilter_config_list.php'); +} + +$module['nav'][] = array( 'title' => 'Spamfilter', + 'open' => 1, + 'items' => $items); + +//**** Fetchmail menu +$items = array(); + +$items[] = array( 'title' => 'Fetchmail', + 'target' => 'content', + 'link' => 'mail/mail_get_list.php'); + + +$module['nav'][] = array( 'title' => 'Fetchmail', + 'open' => 1, + 'items' => $items); + +//**** Statistics menu +$items = array(); + +$items[] = array( 'title' => 'Mailbox traffic', + 'target' => 'content', + 'link' => 'mail/mail_user_stats.php'); + + +$module['nav'][] = array( 'title' => 'Statistics', + 'open' => 1, + 'items' => $items); + + +//**** Global filters menu +$items = array(); +if($_SESSION['s']['user']['typ'] == 'admin') { + + $items[] = array( 'title' => 'Postfix Whitelist', + 'target' => 'content', + 'link' => 'mail/mail_whitelist_list.php'); + + $items[] = array( 'title' => 'Postfix Blacklist', + 'target' => 'content', + 'link' => 'mail/mail_blacklist_list.php'); + + $items[] = array( 'title' => 'Content Filter', + 'target' => 'content', + 'link' => 'mail/mail_content_filter_list.php'); + + $items[] = array( 'title' => 'Relay Recipients', + 'target' => 'content', + 'link' => 'mail/mail_relay_recipient_list.php'); + + $module['nav'][] = array( 'title' => 'Global Filters', + 'open' => 1, + 'items' => $items); +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_alias.list.php b/interface/ispconfig/interface/mail/list/mail_alias.list.php new file mode 100644 index 000000000..57b7ef663 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_alias.list.php @@ -0,0 +1,79 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "destination", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_aliasdomain.list.php b/interface/ispconfig/interface/mail/list/mail_aliasdomain.list.php new file mode 100644 index 000000000..7cb7a9ee2 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_aliasdomain.list.php @@ -0,0 +1,79 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "destination", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_blacklist.list.php b/interface/ispconfig/interface/mail/list/mail_blacklist.list.php new file mode 100644 index 000000000..8f730125f --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_blacklist.list.php @@ -0,0 +1,95 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "type", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('recipient' => 'Recipient', 'sender' => 'Sender', 'client' => 'Client')); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_content_filter.list.php b/interface/ispconfig/interface/mail/list/mail_content_filter.list.php new file mode 100644 index 000000000..2d16f7dc0 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_content_filter.list.php @@ -0,0 +1,96 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "pattern", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "action", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => array('DISCARD' => 'DISCARD','DUNNO'=>'DUNNO','FILTER'=>'FILTER','HOLD'=>'HOLD','IGNORE'=>'IGNORE','PREPEND'=>'PREPEND','REDIRECT'=>'REDIRECT','REPLACE'=>'REPLACE','REJECT'=>'REJECT','WARN'=>'WARN')); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_domain.list.php b/interface/ispconfig/interface/mail/list/mail_domain.list.php new file mode 100644 index 000000000..34b1fb1fd --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_domain.list.php @@ -0,0 +1,86 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_domain_catchall.list.php b/interface/ispconfig/interface/mail/list/mail_domain_catchall.list.php new file mode 100644 index 000000000..118856b09 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_domain_catchall.list.php @@ -0,0 +1,79 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "destination", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_forward.list.php b/interface/ispconfig/interface/mail/list/mail_forward.list.php new file mode 100644 index 000000000..7af79a5fb --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_forward.list.php @@ -0,0 +1,79 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "destination", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_get.list.php b/interface/ispconfig/interface/mail/list/mail_get.list.php new file mode 100644 index 000000000..0e0beb0c0 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_get.list.php @@ -0,0 +1,102 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "source_server", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "source_username", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "destination", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_relay_recipient.list.php b/interface/ispconfig/interface/mail/list/mail_relay_recipient.list.php new file mode 100644 index 000000000..0302fff7d --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_relay_recipient.list.php @@ -0,0 +1,85 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_spamfilter.list.php b/interface/ispconfig/interface/mail/list/mail_spamfilter.list.php new file mode 100644 index 000000000..91963c0ec --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_spamfilter.list.php @@ -0,0 +1,85 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('1' => "
    Yes
    ", '0' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "server_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_transport.list.php b/interface/ispconfig/interface/mail/list/mail_transport.list.php new file mode 100644 index 000000000..5d3afdd79 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_transport.list.php @@ -0,0 +1,104 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "transport", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "sort_order", + 'datatype' => "INTEGER", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_user.list.php b/interface/ispconfig/interface/mail/list/mail_user.list.php new file mode 100644 index 000000000..a3fc54b99 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_user.list.php @@ -0,0 +1,78 @@ + "email", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "autoresponder", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_user_filter.list.php b/interface/ispconfig/interface/mail/list/mail_user_filter.list.php new file mode 100644 index 000000000..d4c29a57c --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_user_filter.list.php @@ -0,0 +1,60 @@ + "rulename", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_user_stats.list.php b/interface/ispconfig/interface/mail/list/mail_user_stats.list.php new file mode 100644 index 000000000..f7bc46486 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_user_stats.list.php @@ -0,0 +1,60 @@ + "email", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/mail_whitelist.list.php b/interface/ispconfig/interface/mail/list/mail_whitelist.list.php new file mode 100644 index 000000000..b34d97fdc --- /dev/null +++ b/interface/ispconfig/interface/mail/list/mail_whitelist.list.php @@ -0,0 +1,94 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "source", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "type", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('recipient' => 'Recipient', 'sender' => 'Sender', 'client' => 'Client')); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/spamfilter_blacklist.list.php b/interface/ispconfig/interface/mail/list/spamfilter_blacklist.list.php new file mode 100644 index 000000000..d0827844f --- /dev/null +++ b/interface/ispconfig/interface/mail/list/spamfilter_blacklist.list.php @@ -0,0 +1,108 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "priority", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10)); + +$liste["item"][] = array( 'field' => "rid", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,email FROM spamfilter_users WHERE {AUTHSQL} ORDER BY email', + 'keyfield'=> 'id', + 'valuefield'=> 'email' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "email", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/spamfilter_config.list.php b/interface/ispconfig/interface/mail/list/spamfilter_config.list.php new file mode 100644 index 000000000..8d672ff1f --- /dev/null +++ b/interface/ispconfig/interface/mail/list/spamfilter_config.list.php @@ -0,0 +1,60 @@ + "server_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/spamfilter_policy.list.php b/interface/ispconfig/interface/mail/list/spamfilter_policy.list.php new file mode 100644 index 000000000..2b60ff053 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/spamfilter_policy.list.php @@ -0,0 +1,116 @@ + "policy_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "virus_lover", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
    Yes
    ", 'N' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "spam_lover", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
    Yes
    ", 'N' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "banned_files_lover", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
    Yes
    ", 'N' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "bad_header_lover", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
    Yes
    ", 'N' => "
    No
    ")); + + + + + + + + + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/spamfilter_users.list.php b/interface/ispconfig/interface/mail/list/spamfilter_users.list.php new file mode 100644 index 000000000..e088a3bc6 --- /dev/null +++ b/interface/ispconfig/interface/mail/list/spamfilter_users.list.php @@ -0,0 +1,108 @@ + "local", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('Y' => "
    Yes
    ", 'N' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "priority", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10)); + +$liste["item"][] = array( 'field' => "policy_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,policy_name FROM spamfilter_policy WHERE {AUTHSQL} ORDER BY policy_name', + 'keyfield'=> 'id', + 'valuefield'=> 'policy_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "fullname", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/list/spamfilter_whitelist.list.php b/interface/ispconfig/interface/mail/list/spamfilter_whitelist.list.php new file mode 100644 index 000000000..f765fd89f --- /dev/null +++ b/interface/ispconfig/interface/mail/list/spamfilter_whitelist.list.php @@ -0,0 +1,108 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ", 'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "priority", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10)); + +$liste["item"][] = array( 'field' => "rid", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT id,email FROM spamfilter_users WHERE {AUTHSQL} ORDER BY email', + 'keyfield'=> 'id', + 'valuefield'=> 'email' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "email", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_alias_del.php b/interface/ispconfig/interface/mail/mail_alias_del.php new file mode 100644 index 000000000..4d4c5b2bf --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_alias_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_alias_edit.php b/interface/ispconfig/interface/mail/mail_alias_edit.php new file mode 100644 index 000000000..d031d29f2 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_alias_edit.php @@ -0,0 +1,145 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailalias',"type = 'alias'")) { + $app->error($app->tform->wordbook["limit_mailalias_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailalias',"type = 'alias'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailalias_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $email = $this->dataRecord["source"]; + $email_parts = explode("@",$email); + $app->tpl->setVar("email_local_part",$email_parts[0]); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain'; + $domains = $app->db->queryAllRecords($sql); + $domain_select = ''; + if(is_array($domains)) { + foreach( $domains as $domain) { + $selected = ($domain["domain"] == @$email_parts[1])?'SELECTED':''; + $domain_select .= "\r\n"; + } + } + $app->tpl->setVar("email_domain",$domain_select); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Check if Domain belongs to user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailalias FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_mailalias"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id AND type = 'alias'"); + if($tmp["number"] >= $client["limit_mailalias"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailalias_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + + // compose the email field + $this->dataRecord["source"] = $_POST["email_local_part"]."@".$_POST["email_domain"]; + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + unset($this->dataRecord["email_local_part"]); + unset($this->dataRecord["email_domain"]); + + //* Check if there is no active mailbox with this address + $tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE postfix = 'y' AND email = '".$app->db->quote($this->dataRecord["source"])."'"); + if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_mailbox_txt")."
    "; + unset($tmp); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app; + + $domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id); + + } + + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_alias_list.php b/interface/ispconfig/interface/mail/mail_alias_list.php new file mode 100644 index 000000000..f4a3d7cef --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_alias_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'alias'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_aliasdomain_del.php b/interface/ispconfig/interface/mail/mail_aliasdomain_del.php new file mode 100644 index 000000000..52a54a1cc --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_aliasdomain_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_aliasdomain_edit.php b/interface/ispconfig/interface/mail/mail_aliasdomain_edit.php new file mode 100644 index 000000000..91fbf930a --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_aliasdomain_edit.php @@ -0,0 +1,141 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailaliasdomain',"type = 'aliasdomain'")) { + $app->error($app->tform->wordbook["limit_mailaliasdomain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailaliasdomain',"type = 'aliasdomain'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailaliasdomain_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $source_domain = substr($this->dataRecord["source"],1); + $destination_domain = substr($this->dataRecord["destination"],1); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain'; + $domains = $app->db->queryAllRecords($sql); + + $source_select = ''; + $destination_select = ''; + if(is_array($domains)) { + foreach( $domains as $domain) { + $selected = ($domain["domain"] == @$source_domain)?'SELECTED':''; + $source_select .= "\r\n"; + $selected = ($domain["domain"] == @$destination_domain)?'SELECTED':''; + $destination_select .= "\r\n"; + } + } + $app->tpl->setVar("source_domain",$source_select); + $app->tpl->setVar("destination_domain",$destination_select); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Check if source Domain belongs to user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["source"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["source"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // Check if the destination domain belongs to the user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["destination"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["destination"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + if(!$app->tform->checkClientLimit('limit_mailaliasdomain',"type = 'aliasdomain'")) { + $app->error($app->tform->wordbook["limit_mailaliasdomain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailaliasdomain',"type = 'aliasdomain'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailaliasdomain_txt"]); + } + } // end if user is not admin + + if($this->dataRecord["source"] == $this->dataRecord["destination"]) $app->tform->errorMessage .= $app->tform->wordbook["source_destination_identical_txt"]; + + // compose the source and destination field + $this->dataRecord["source"] = "@".$app->db->quote($this->dataRecord["source"]); + $this->dataRecord["destination"] = "@".$app->db->quote($this->dataRecord["destination"]); + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app; + + $domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["destination"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id); + + } + + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_aliasdomain_list.php b/interface/ispconfig/interface/mail/mail_aliasdomain_list.php new file mode 100644 index 000000000..2725d4553 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_aliasdomain_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'aliasdomain'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_blacklist_del.php b/interface/ispconfig/interface/mail/mail_blacklist_del.php new file mode 100644 index 000000000..b11d70d05 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_blacklist_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_blacklist_edit.php b/interface/ispconfig/interface/mail/mail_blacklist_edit.php new file mode 100644 index 000000000..b0ac8c8be --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_blacklist_edit.php @@ -0,0 +1,114 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailfilter')) { + $app->error($app->tform->wordbook["limit_mailfilter_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailfilter')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailfilter_txt"]); + } + } + + parent::onShowNew(); + } + + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from mail_access WHERE access_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailfilter FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_mailfilter"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(access_id) as number FROM mail_access WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_mailfilter"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailfilter_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + parent::onSubmit(); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_blacklist_list.php b/interface/ispconfig/interface/mail/mail_blacklist_list.php new file mode 100644 index 000000000..7e144758b --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_blacklist_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLExtWhere = "access = 'REJECT'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_content_filter_del.php b/interface/ispconfig/interface/mail/mail_content_filter_del.php new file mode 100644 index 000000000..872658997 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_content_filter_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_content_filter_edit.php b/interface/ispconfig/interface/mail/mail_content_filter_edit.php new file mode 100644 index 000000000..d2cd61850 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_content_filter_edit.php @@ -0,0 +1,75 @@ +auth->check_module_permissions('mail'); + +if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('These Filters are only for Admins.'); + + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from mail_content_filter WHERE content_filter_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_content_filter_list.php b/interface/ispconfig/interface/mail/mail_content_filter_list.php new file mode 100644 index 000000000..aa47d9d40 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_content_filter_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +// $app->listform_actions->SQLExtWhere = "type = 'local'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_catchall_del.php b/interface/ispconfig/interface/mail/mail_domain_catchall_del.php new file mode 100644 index 000000000..2560facdd --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_catchall_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_catchall_edit.php b/interface/ispconfig/interface/mail/mail_domain_catchall_edit.php new file mode 100644 index 000000000..219926e3c --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_catchall_edit.php @@ -0,0 +1,138 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailcatchall',"type = 'catchall'")) { + $app->error($app->tform->wordbook["limit_mailcatchall_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailcatchall',"type = 'catchall'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailcatchall_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $email = $this->dataRecord["source"]; + $email_parts = explode("@",$email); + $app->tpl->setVar("email_local_part",$email_parts[0]); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r'); + $domains = $app->db->queryAllRecords($sql); + $domain_select = ''; + if(is_array($domains)) { + foreach( $domains as $domain) { + $selected = (isset($email_parts[1]) && $domain["domain"] == $email_parts[1])?'SELECTED':''; + $domain_select .= "\r\n"; + } + } + $app->tpl->setVar("email_domain",$domain_select); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Check if Domain belongs to user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailcatchall FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another catchall + if($this->id == 0 && $client["limit_mailcatchall"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id AND type = 'catchall'"); + if($tmp["number"] >= $client["limit_mailcatchall"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailcatchall_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + // compose the email field + $this->dataRecord["source"] = "@".$_POST["email_domain"]; + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + //unset($this->dataRecord["email_local_part"]); + unset($this->dataRecord["email_domain"]); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app; + + $domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_catchall_list.php b/interface/ispconfig/interface/mail/mail_domain_catchall_list.php new file mode 100644 index 000000000..f698668b7 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_catchall_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'catchall'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_del.php b/interface/ispconfig/interface/mail/mail_domain_del.php new file mode 100644 index 000000000..9713642dc --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_del.php @@ -0,0 +1,92 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + $domain = $this->dataRecord['domain']; + + // Before we delete the email domain, + // we will delete all depending records. + + // Delete all forwardings where the osurce or destination belongs to this domain + $records = $app->db->queryAllRecords("SELECT forwarding_id as id FROM mail_forwarding WHERE source like '%@".$app->db->quote($domain)."' OR destination like '%@".$app->db->quote($domain)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('mail_forwarding','forwarding_id',$rec['id']); + } + + // Delete all fetchmail accounts where destination belongs to this domain + $records = $app->db->queryAllRecords("SELECT mailget_id as id FROM mail_get WHERE destination like '%@".$app->db->quote($domain)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('mail_get','mailget_id',$rec['id']); + } + + // Delete all mailboxes where destination belongs to this domain + $records = $app->db->queryAllRecords("SELECT mailuser_id as id FROM mail_user WHERE email like '%@".$app->db->quote($domain)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('mail_user','mailuser_id',$rec['id']); + } + + // Delete all spamfilters that belong to this domain + $records = $app->db->queryAllRecords("SELECT id FROM spamfilter_users WHERE email = '@".$app->db->quote($domain)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('spamfilter_users','id',$rec['id']); + } + + } +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_edit.php b/interface/ispconfig/interface/mail/mail_domain_edit.php new file mode 100644 index 000000000..7acf67367 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_edit.php @@ -0,0 +1,327 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_maildomain')) { + $app->error($app->tform->wordbook["limit_maildomain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_maildomain')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_maildomain_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] == 'admin') { + // Getting Clients of the user + if($_SESSION["s"]["user"]["typ"] == 'admin') { + $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER BY name"; + } else { + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $sql = "SELECT client.client_id, limit_web_domain, default_webserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"; + } + $clients = $app->db->queryAllRecords($sql); + $client_select = ''; + if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= ""; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = ($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } elseif ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client.client_id, contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id order by contact_name"); + + // Set the webserver to the default server of the client + $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]"); + $app->tpl->setVar("server_id",""); + unset($tmp); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']; + $clients = $app->db->queryAllRecords($sql); + $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']); + $client_select = ''; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } + + + + + // Get the spamfilter policys for the user + $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = '@".$this->dataRecord["domain"]."'"); + $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r'); + $policys = $app->db->queryAllRecords($sql); + $policy_select = ""; + if(is_array($policys)) { + foreach( $policys as $p) { + $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; + $policy_select .= "\r\n"; + } + } + $app->tpl->setVar("policy",$policy_select); + unset($policys); + unset($policy_select); + unset($tmp_user); + + if($this->id > 0) { + //* we are editing a existing record + $app->tpl->setVar("edit_disabled", 1); + $app->tpl->setVar("server_id_value", $this->dataRecord["server_id"]); + } else { + $app->tpl->setVar("edit_disabled", 0); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + if($_SESSION["s"]["user"]["typ"] != 'admin') { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_maildomain, default_mailserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // When the record is updated + if($this->id > 0) { + // restore the server ID if the user is not admin and record is edited + $tmp = $app->db->queryOneRecord("SELECT server_id FROM mail_domain WHERE domain_id = ".intval($this->id)); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + // When the record is inserted + } else { + // set the server ID to the default mailserver of the client + $this->dataRecord["server_id"] = $client["default_mailserver"]; + + // Check if the user may add another mail_domain + if($client["limit_maildomain"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM mail_domain WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_maildomain"]) { + $app->error($app->tform->wordbook["limit_maildomain_txt"]); + } + } + } + + // Clients may not set the client_group_id, so we unset them if user is not a admin + if(!$app->auth->has_clients($_SESSION['s']['user']['userid'])) unset($this->dataRecord["client_group_id"]); + } + + //* make sure that the email domain is lowercase + if(isset($this->dataRecord["domain"])) $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]); + + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + // make sure that the record belongs to the client group and not the admin group when a dmin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE mail_domain SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE domain_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE mail_domain SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE domain_id = ".$this->id); + } + + // Spamfilter policy + $policy_id = intval($this->dataRecord["policy"]); + if($policy_id > 0) { + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '@".mysql_real_escape_string($this->dataRecord["domain"])."'"); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + $app->db->datalogUpdate('spamfilter_users', "policy_id = $ploicy_id", 'id', $tmp_user["id"]); + } else { + $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ".$this->id); + // We create a new record + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `priority`, `policy_id`, `email`, `fullname`, `local`) + VALUES (".$_SESSION["s"]["user"]["userid"].", ".$tmp_domain["sys_groupid"].", 'riud', 'riud', '', ".$this->dataRecord["server_id"].", 5, ".$policy_id.", '@".mysql_real_escape_string($this->dataRecord["domain"])."', '@".mysql_real_escape_string($this->dataRecord["domain"])."', 'Y')"; + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + unset($tmp_domain); + } + } // endif spamfilter policy + } + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id, domain from mail_domain WHERE domain_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + //* If the user is neither admin nor reseller + } else { + //* We do not allow users to change a domain which has been created by the admin + $rec = $app->db->queryOneRecord("SELECT domain from mail_domain WHERE domain_id = ".$this->id); + if($rec['domain'] != $this->dataRecord["domain"] && $app->tform->checkPerm($this->id,'u')) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Domain can not be changed. Please ask your Administrator if you want to change the domain name.'); + $this->dataRecord["domain"] = $rec['domain']; + } + unset($rec); + } + } + + + + function onAfterUpdate() { + global $app, $conf; + + // make sure that the record belongs to the clinet group and not the admin group when admin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE mail_domain SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE domain_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE mail_domain SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE domain_id = ".$this->id); + } + + // Spamfilter policy + $policy_id = intval($this->dataRecord["policy"]); + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '@".mysql_real_escape_string($this->dataRecord["domain"])."'"); + if($policy_id > 0) { + if($tmp_user["id"] > 0) { + // There is already a record that we will update + $app->db->datalogUpdate('spamfilter_users', "policy_id = $policy_id", 'id', $tmp_user["id"]); + } else { + $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ".$this->id); + // We create a new record + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `priority`, `policy_id`, `email`, `fullname`, `local`) + VALUES (".$_SESSION["s"]["user"]["userid"].", ".$tmp_domain["sys_groupid"].", 'riud', 'riud', '', ".$this->dataRecord["server_id"].", 5, ".$policy_id.", '@".mysql_real_escape_string($this->dataRecord["domain"])."', '@".mysql_real_escape_string($this->dataRecord["domain"])."', 'Y')"; + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + unset($tmp_domain); + } + } else { + if($tmp_user["id"] > 0) { + // There is already a record but the user shall have no policy, so we delete it + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); + } + } // endif spamfilter policy + //** If the domain name or owner has been changed, change the domain and owner in all mailbox records + if($this->oldDataRecord['domain'] != $this->dataRecord['domain'] || (isset($this->dataRecord['client_group_id']) && $this->oldDataRecord['sys_groupid'] != $this->dataRecord['client_group_id'])) { + $app->uses('getconf'); + $mail_config = $app->getconf->get_server_config($this->dataRecord["server_id"],'mail'); + + //* Update the mailboxes + $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like '%@".mysql_real_escape_string($this->oldDataRecord['domain'])."'"); + $sys_groupid = (isset($this->dataRecord['client_group_id']))?$this->dataRecord['client_group_id']:$this->oldDataRecord['sys_groupid']; + if(is_array($mailusers)) { + foreach($mailusers as $rec) { + // setting Maildir, Homedir, UID and GID + $mail_parts = explode("@",$rec['email']); + $maildir = str_replace("[domain]",$this->dataRecord['domain'],$mail_config["maildir_path"]); + $maildir = str_replace("[localpart]",$mail_parts[0],$maildir); + $maildir = mysql_real_escape_string($maildir); + $email = mysql_real_escape_string($mail_parts[0].'@'.$this->dataRecord['domain']); + $app->db->datalogUpdate('mail_user', "maildir = '$maildir', email = '$email', sys_groupid = '$sys_groupid'", 'mailuser_id', $rec['mailuser_id']); + } + } + + //* Update the aliases + $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source like '%@".mysql_real_escape_string($this->oldDataRecord['domain'])."' OR destination like '%@".mysql_real_escape_string($this->oldDataRecord['domain'])."'"); + if(is_array($forwardings)) { + foreach($forwardings as $rec) { + $destination = mysql_real_escape_string(str_replace($this->oldDataRecord['domain'],$this->dataRecord['domain'],$rec['destination'])); + $source = mysql_real_escape_string(str_replace($this->oldDataRecord['domain'],$this->dataRecord['domain'],$rec['source'])); + $app->db->datalogUpdate('mail_forwarding', "source = '$source', destination = '$destination', sys_groupid = '$sys_groupid'", 'forwarding_id', $rec['forwarding_id']); + } + } + + //* Delete the old spamfilter record + $tmp = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '@".mysql_real_escape_string($this->oldDataRecord["domain"])."'"); + $app->db->datalogDelete('spamfilter_users', 'id', $tmp["id"]); + unset($tmp); + + } // end if domain name changed + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_domain_list.php b/interface/ispconfig/interface/mail/mail_domain_list.php new file mode 100644 index 000000000..0d26bd917 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_domain_list.php @@ -0,0 +1,27 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +// $app->listform_actions->SQLExtWhere = "type = 'local'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_forward_del.php b/interface/ispconfig/interface/mail/mail_forward_del.php new file mode 100644 index 000000000..9fc76db42 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_forward_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_forward_edit.php b/interface/ispconfig/interface/mail/mail_forward_edit.php new file mode 100644 index 000000000..0fef7a506 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_forward_edit.php @@ -0,0 +1,141 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailforward',"type = 'forward'")) { + $app->error($app->tform->wordbook["limit_mailforward_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailforward',"type = 'forward'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailforward_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $email = $this->dataRecord["source"]; + $email_parts = explode("@",$email); + $app->tpl->setVar("email_local_part",$email_parts[0]); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain'; + $domains = $app->db->queryAllRecords($sql); + $domain_select = ''; + foreach( $domains as $domain) { + $selected = (isset($email_parts[1]) && $domain["domain"] == $email_parts[1])?'SELECTED':''; + $domain_select .= "\r\n"; + } + $app->tpl->setVar("email_domain",$domain_select); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Check if Domain belongs to user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailforward FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_mailforward"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id AND type = 'forward'"); + if($tmp["number"] >= $client["limit_mailforward"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailforward_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + // compose the email field + $this->dataRecord["source"] = $_POST["email_local_part"]."@".$_POST["email_domain"]; + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + unset($this->dataRecord["email_local_part"]); + unset($this->dataRecord["email_domain"]); + + //* Check if there is no active mailbox with this address + $tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE postfix = 'y' AND email = '".$app->db->quote($this->dataRecord["source"])."'"); + if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_mailbox_txt")."
    "; + unset($tmp); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app; + + $domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_forward_list.php b/interface/ispconfig/interface/mail/mail_forward_list.php new file mode 100644 index 000000000..da5c57d93 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_forward_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'forward'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_get_del.php b/interface/ispconfig/interface/mail/mail_get_del.php new file mode 100644 index 000000000..e66f85202 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_get_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_get_edit.php b/interface/ispconfig/interface/mail/mail_get_edit.php new file mode 100644 index 000000000..f088e220a --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_get_edit.php @@ -0,0 +1,109 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_fetchmail')) { + $app->error($app->tform->wordbook["limit_fetchmail_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_fetchmail')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_fetchmail_txt"]); + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_fetchmail FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another transport. + if($this->id == 0 && $client["limit_fetchmail"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(mailget_id) as number FROM mail_get WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_fetchmail"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_fetchmail_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + // Set the server ID according to the selected destination + $tmp = $app->db->queryOneRecord("SELECT server_id FROM mail_user WHERE email = '".$app->db->quote($this->dataRecord["destination"])."'"); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app; + + $tmp = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_user WHERE email = '".$app->db->quote($this->dataRecord["destination"])."'"); + $app->db->query("update mail_get SET sys_groupid = ".$tmp['sys_groupid']." WHERE mailget_id = ".$this->id); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_get_list.php b/interface/ispconfig/interface/mail/mail_get_list.php new file mode 100644 index 000000000..c08b0645c --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_get_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +// $app->listform_actions->SQLExtWhere = ""; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_relay_recipient_del.php b/interface/ispconfig/interface/mail/mail_relay_recipient_del.php new file mode 100644 index 000000000..acb264c03 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_relay_recipient_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_relay_recipient_edit.php b/interface/ispconfig/interface/mail/mail_relay_recipient_edit.php new file mode 100644 index 000000000..70a18bd3b --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_relay_recipient_edit.php @@ -0,0 +1,59 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_relay_recipient_list.php b/interface/ispconfig/interface/mail/mail_relay_recipient_list.php new file mode 100644 index 000000000..6c9f3b4a6 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_relay_recipient_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +# $app->listform_actions->SQLExtWhere = "access = 'OK'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_spamfilter_del.php b/interface/ispconfig/interface/mail/mail_spamfilter_del.php new file mode 100644 index 000000000..02832b878 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_spamfilter_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_spamfilter_edit.php b/interface/ispconfig/interface/mail/mail_spamfilter_edit.php new file mode 100644 index 000000000..bafdfb4eb --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_spamfilter_edit.php @@ -0,0 +1,124 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEnd() { + global $app, $conf; + + // Getting email from data record + $email = $this->dataRecord["email"]; + $email_parts = explode("@",$email); + $app->tpl->setVar("email_local_part",$email_parts[0]); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE type = 'local' AND ".$app->tform->getAuthSQL('r'); + $domains = $app->db->queryAllRecords($sql); + $domain_select = ''; + foreach( $domains as $domain) { + $selected = ($domain["domain"] == $email_parts[1])?'SELECTED':''; + $domain_select .= "\r\n"; + } + $app->tpl->setVar("email_domain",$domain_select); + + // calculate scores + if(count($this->dataRecord) > 0) { + $app->tpl->setVar("spam_rewrite_score_int",number_format($this->dataRecord["spam_rewrite_score_int"] / 100, 2, '.', '')); + $app->tpl->setVar("spam_redirect_score_int",number_format($this->dataRecord["spam_redirect_score_int"] / 100, 2, '.', '')); + $app->tpl->setVar("spam_delete_score_int",number_format($this->dataRecord["spam_delete_score_int"] / 100, 2, '.', '')); + } + + // Changing maildir to mailbox_id + $sql = "SELECT mailbox_id FROM mail_box WHERE maildir = '".$this->dataRecord["spam_redirect_maildir"]."' AND ".$app->tform->getAuthSQL('r'); + $mailbox = $app->db->queryOneRecord($sql); + $this->dataRecord["spam_redirect_maildir"] = $mailbox["mailbox_id"]; + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Check if Domain belongs to user + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"]; + + // compose the email field + if($_POST["email_local_part"] != '') { + $this->dataRecord["email"] = $_POST["email_local_part"]."@".$_POST["email_domain"]; + } else { + $this->dataRecord["email"] = $_POST["email_domain"]; + } + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + unset($this->dataRecord["email_local_part"]); + unset($this->dataRecord["email_domain"]); + + // calculate scores + $this->dataRecord["spam_rewrite_score_int"] = $_POST["spam_rewrite_score_int"] * 100; + $this->dataRecord["spam_redirect_score_int"] = $_POST["spam_redirect_score_int"] * 100; + $this->dataRecord["spam_delete_score_int"] = $_POST["spam_delete_score_int"] * 100; + + // Changing mailbox_id to maildir + $sql = "SELECT maildir FROM mail_box WHERE mailbox_id = '".intval($_POST["spam_redirect_maildir"])."' AND ".$app->tform->getAuthSQL('r'); + $mailbox = $app->db->queryOneRecord($sql); + $this->dataRecord["spam_redirect_maildir"] = $mailbox["maildir"]; + + parent::onSubmit(); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_spamfilter_list.php b/interface/ispconfig/interface/mail/mail_spamfilter_list.php new file mode 100644 index 000000000..51c75b4cb --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_spamfilter_list.php @@ -0,0 +1,23 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_transport_del.php b/interface/ispconfig/interface/mail/mail_transport_del.php new file mode 100644 index 000000000..b6463a21a --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_transport_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_transport_edit.php b/interface/ispconfig/interface/mail/mail_transport_edit.php new file mode 100644 index 000000000..4223a8132 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_transport_edit.php @@ -0,0 +1,179 @@ +auth->check_module_permissions('mail'); + + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailrouting')) { + $app->error($app->tform->wordbook["limit_mailrouting_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailrouting')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailrouting_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $tmp_parts = explode(":",$this->dataRecord["transport"]); + if(!empty($this->id) && !stristr($this->dataRecord["transport"],':')) { + $rec["type"] = 'custom'; + } else { + if(empty($this->id) && empty($tmp_parts[0])) { + $rec["type"] = 'smtp'; + } else { + $rec["type"] = $tmp_parts[0]; + } + } + if(@$tmp_parts[2] != '') { + $dest = @$tmp_parts[1].':'.@$tmp_parts[2]; + } elseif($tmp_parts[1] != '') { + $dest = $tmp_parts[1]; + } else { + $dest = $this->dataRecord["transport"]; + } + if(@substr($dest,0,1) == '[') { + $rec["mx"] = 'checked="CHECKED"'; + $rec["destination"] = @str_replace(']','',@str_replace('[','',$dest)); + } else { + $rec["mx"] = ''; + $rec["destination"] = @$dest; + } + + $types = array('smtp' => 'smtp','uucp' => 'uucp','slow' => 'slow', 'error' => 'error', 'custom' => 'custom','' => 'null'); + $type_select = ''; + if(is_array($types)) { + foreach( $types as $key => $val) { + $selected = ($key == $rec["type"])?'SELECTED':''; + $type_select .= "\r\n"; + } + } + $rec["type"] = $type_select; + $app->tpl->setVar($rec); + unset($type); + unset($types); + + parent::onShowEnd(); + } + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from mail_transport WHERE transport_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailrouting FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another transport. + if($this->id == 0 && $client["limit_mailrouting"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(transport_id) as number FROM mail_transport WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_mailrouting"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailrouting_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + //* Compose transport field + if($this->dataRecord["mx"] == 'y') { + if(stristr($this->dataRecord["destination"],':')) { + $tmp_parts = explode(":",$this->dataRecord["destination"]); + $transport = '['.$tmp_parts[0].']:'.$tmp_parts[1]; + } else { + $transport = '['.$this->dataRecord["destination"].']'; + } + } else { + $transport = $this->dataRecord["destination"]; + } + + if($this->dataRecord["type"] == 'custom') { + $this->dataRecord["transport"] = $transport; + } else { + $this->dataRecord["transport"] = $this->dataRecord["type"].':'.$transport; + } + + unset($this->dataRecord["type"]); + unset($this->dataRecord["mx"]); + unset($this->dataRecord["destination"]); + + parent::onSubmit(); + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_transport_list.php b/interface/ispconfig/interface/mail/mail_transport_list.php new file mode 100644 index 000000000..42db6aec1 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_transport_list.php @@ -0,0 +1,26 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +// $app->listform_actions->SQLExtWhere = "type = 'local'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_user_del.php b/interface/ispconfig/interface/mail/mail_user_del.php new file mode 100644 index 000000000..cb180fc90 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_del.php @@ -0,0 +1,66 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '".mysql_real_escape_string($this->dataRecord["email"])."'"); + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); + + } +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_user_edit.php b/interface/ispconfig/interface/mail/mail_user_edit.php new file mode 100644 index 000000000..3e769753d --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_edit.php @@ -0,0 +1,328 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailbox')) { + $app->error($app->tform->wordbook["limit_mailbox_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailbox')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailbox_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + $email = $this->dataRecord["email"]; + $email_parts = explode("@",$email); + $app->tpl->setVar("email_local_part",$email_parts[0]); + + // Getting Domains of the user + $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain'; + $domains = $app->db->queryAllRecords($sql); + $domain_select = ''; + if(is_array($domains)) { + foreach( $domains as $domain) { + $selected = ($domain["domain"] == @$email_parts[1])?'SELECTED':''; + $domain_select .= "\r\n"; + } + } + $app->tpl->setVar("email_domain",$domain_select); + unset($domains); + unset($domain_select); + + // Get the spamfilter policys for the user + $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = '".$this->dataRecord["email"]."'"); + $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r'); + $policys = $app->db->queryAllRecords($sql); + $policy_select = ""; + if(is_array($policys)) { + foreach( $policys as $p) { + $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; + $policy_select .= "\r\n"; + } + } + $app->tpl->setVar("policy",$policy_select); + unset($policys); + unset($policy_select); + unset($tmp_user); + + // Convert quota from Bytes to MB + if($this->dataRecord["quota"] != -1) $app->tpl->setVar("quota",$this->dataRecord["quota"] / 1024 / 1024); + + // Is autoresponder set? + if ($this->dataRecord['autoresponder'] == 'y') { + $app->tpl->setVar("ar_active", 'checked="checked"'); + } else { + $app->tpl->setVar("ar_active", ''); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + //* Check if Domain belongs to user + if(isset($_POST["email_domain"])) { + $domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->lng("no_domain_perm"); + } + + + //* if its an insert, check that the password is not empty + if($this->id == 0 && $_POST["password"] == '') { + $app->tform->errorMessage .= $app->tform->lng("error_no_pwd")."
    "; + } + + //* Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailbox, limit_mailquota FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_mailbox"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_mailbox"]) { + $app->tform->errorMessage .= $app->tform->lng("limit_mailbox_txt")."
    "; + } + unset($tmp); + } + + // Check the quota and adjust + if(isset($_POST["quota"]) && $client["limit_mailquota"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT sum(quota) as mailquota FROM mail_user WHERE mailuser_id != ".intval($this->id)." AND ".$app->tform->getAuthSQL('u')); + $mailquota = $tmp["mailquota"] / 1024 / 1024; + $new_mailbox_quota = intval($this->dataRecord["quota"]); + if(($mailquota + $new_mailbox_quota > $client["limit_mailquota"]) || ($new_mailbox_quota == 0 && $client["limit_mailquota"] != -1)) { + $max_free_quota = $client["limit_mailquota"] - $mailquota; + $app->tform->errorMessage .= $app->tform->lng("limit_mailquota_txt").": ".$max_free_quota."
    "; + // Set the quota field to the max free space + $this->dataRecord["quota"] = $max_free_quota; + } + unset($tmp); + unset($tmp_quota); + } + } // end if user is not admin + + + //* compose the email field + if(isset($_POST["email_local_part"]) && isset($_POST["email_domain"])) { + $this->dataRecord["email"] = strtolower($_POST["email_local_part"]."@".$_POST["email_domain"]); + + // Set the server id of the mailbox = server ID of mail domain. + $this->dataRecord["server_id"] = $domain["server_id"]; + + unset($this->dataRecord["email_local_part"]); + unset($this->dataRecord["email_domain"]); + + // Convert quota from MB to Bytes + if($this->dataRecord["quota"] != -1) $this->dataRecord["quota"] = $this->dataRecord["quota"] * 1024 * 1024; + + // setting Maildir, Homedir, UID and GID + $app->uses('getconf'); + $mail_config = $app->getconf->get_server_config($domain["server_id"],'mail'); + $maildir = str_replace("[domain]",$domain["domain"],$mail_config["maildir_path"]); + $maildir = str_replace("[localpart]",strtolower($_POST["email_local_part"]),$maildir); + $this->dataRecord["maildir"] = $maildir; + $this->dataRecord["homedir"] = $mail_config["homedir_path"]; + $this->dataRecord["uid"] = $mail_config["mailuser_uid"]; + $this->dataRecord["gid"] = $mail_config["mailuser_gid"]; + + //* Check if there is no alias or forward with this address + $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE active = 'y' AND source = '".$app->db->quote($this->dataRecord["email"])."'"); + if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_alias_or_forward_txt")."
    "; + unset($tmp); + + } + + //* if autoresponder checkbox not selected, do not save dates + if (!isset($_POST['autoresponder']) && array_key_exists('autoresponder_start_date', $_POST)) { + $this->dataRecord['autoresponder_start_date'] = array_map(create_function('$item','return 0;'), $this->dataRecord['autoresponder_start_date']); + $this->dataRecord['autoresponder_end_date'] = array_map(create_function('$item','return 0;'), $this->dataRecord['autoresponder_end_date']); + } + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + // Set the domain owner as mailbox owner + $domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("UPDATE mail_user SET sys_groupid = ".$domain["sys_groupid"]." WHERE mailuser_id = ".$this->id); + + // send a welcome email to create the mailbox +// mail($this->dataRecord["email"],$app->tform->wordbook["welcome_mail_subject"],$app->tform->wordbook["welcome_mail_message"]); + + // tries to detect current charset, and encode subject-header and body from it to ISO-8859-1. + $fromCharset = mb_detect_encoding($app->tform->lng("welcome_mail_subject")); + $iconvPreferences = array("input-charset" => $fromCharset, + "output-charset" => "ISO-8859-1", + "line-length" => 76, + "line-break-chars" => "\n", + "scheme" => "Q"); + + $welcomeFromName = $app->tform->lng("welcome_mail_fromname_txt"); + $welcomeFromEmail = $app->tform->lng("welcome_mail_fromemail_txt"); + $mailHeaders = "MIME-Version: 1.0" . "\n"; + $mailHeaders .= "Content-type: text/plain; charset=iso-8859-1" . "\n"; + $mailHeaders .= "From: $welcomeFromName <$welcomeFromEmail>" . "\n"; + $mailHeaders .= "Reply-To: <$welcomeFromEmail>" . "\n"; + $mailTarget = $this->dataRecord["email"]; + $mailSubject = iconv_mime_encode("trimoff", $app->tform->lng("welcome_mail_subject"), $iconvPreferences); + $mailSubject = str_replace("trimoff: ", "", $mailSubject); + $mailBody = iconv ($fromCharset, "ISO-8859-1", $app->tform->lng("welcome_mail_message")); + + mail($mailTarget, $mailSubject, $mailBody, $mailHeaders); + + // Spamfilter policy + $policy_id = intval($this->dataRecord["policy"]); + if($policy_id > 0) { + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '".mysql_real_escape_string($this->dataRecord["email"])."'"); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + $app->db->datalogUpdate('spamfilter_users', "policy_id = $ploicy_id", 'id', $tmp_user["id"]); + } else { + // We create a new record + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `priority`, `policy_id`, `email`, `fullname`, `local`) + VALUES (".$_SESSION["s"]["user"]["userid"].", ".$domain["sys_groupid"].", 'riud', 'riud', '', ".$domain["server_id"].", 10, ".$policy_id.", '".mysql_real_escape_string($this->dataRecord["email"])."', '".mysql_real_escape_string($this->dataRecord["email"])."', 'Y')"; + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } + } // endif spamfilter policy + + + // Set the fields for dovecot + if(isset($this->dataRecord["email"])) { + $disableimap = ($this->dataRecord["disableimap"])?'y':'n'; + $disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n'; + $disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y'; + $disablesmtp = ($this->dataRecord["postfix"] == 'y')?'n':'y'; + + $sql = "UPDATE mail_user SET disableimap = '$disableimap', disablepop3 = '$disablepop3', disablesmtp = '$disablesmtp', disabledeliver = '$disabledeliver' WHERE mailuser_id = ".$this->id; + $app->db->query($sql); + } + } + + function onAfterUpdate() { + global $app, $conf; + + // Set the domain owner as mailbox owner + if(isset($_POST["email_domain"])) { + $domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r')); + $app->db->query("UPDATE mail_user SET sys_groupid = ".$domain["sys_groupid"]." WHERE mailuser_id = ".$this->id); + + // Spamfilter policy + $policy_id = intval($this->dataRecord["policy"]); + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '".mysql_real_escape_string($this->dataRecord["email"])."'"); + if($policy_id > 0) { + if($tmp_user["id"] > 0) { + // There is already a record that we will update + $app->db->datalogUpdate('spamfilter_users', "policy_id = $policy_id", 'id', $tmp_user["id"]); + } else { + // We create a new record + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `priority`, `policy_id`, `email`, `fullname`, `local`) + VALUES (".$_SESSION["s"]["user"]["userid"].", ".$domain["sys_groupid"].", 'riud', 'riud', '', ".$domain["server_id"].", 10, ".$policy_id.", '".mysql_real_escape_string($this->dataRecord["email"])."', '".mysql_real_escape_string($this->dataRecord["email"])."', 'Y')"; + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } + }else { + if($tmp_user["id"] > 0) { + // There is already a record but the user shall have no policy, so we delete it + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); + } + } // endif spamfilter policy + } + + // Set the fields for dovecot + if(isset($this->dataRecord["email"])) { + $disableimap = ($this->dataRecord["disableimap"])?'y':'n'; + $disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n'; + $disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y'; + $disablesmtp = ($this->dataRecord["postfix"] == 'y')?'n':'y'; + + $sql = "UPDATE mail_user SET disableimap = '$disableimap', disablepop3 = '$disablepop3', disablesmtp = '$disablesmtp', disabledeliver = '$disabledeliver' WHERE mailuser_id = ".$this->id; + $app->db->query($sql); + } + + //** If the email address has been changed, change it in all aliases too + if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { + //if($this->oldDataRecord['email'] != $this->dataRecord['email']) { + + //* Update the aliases + $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE destination = '".$app->db->quote($this->oldDataRecord['email'])."'"); + if(is_array($forwardings)) { + foreach($forwardings as $rec) { + $destination = $app->db->quote($this->dataRecord['email']); + $app->db->datalogUpdate('mail_forwarding', "destination = '$destination'", 'forwarding_id', $rec['forwarding_id']); + } + } + + } // end if email addess changed + + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + +?> diff --git a/interface/ispconfig/interface/mail/mail_user_filter_del.php b/interface/ispconfig/interface/mail/mail_user_filter_del.php new file mode 100644 index 000000000..81689b17b --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_filter_del.php @@ -0,0 +1,83 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onAfterDelete() { + global $app, $conf; + + $mailuser = $app->db->queryOneRecord("SELECT custom_mailfilter FROM mail_user WHERE mailuser_id = ".$this->dataRecord["mailuser_id"]); + $skip = false; + $lines = explode("\n",$mailuser['custom_mailfilter']); + $out = ''; + + foreach($lines as $line) { + $line = trim($line); + if($line == '### BEGIN FILTER_ID:'.$this->id) { + $skip = true; + } + if($skip == false && $line != '') $out .= $line ."\n"; + if($line == '### END FILTER_ID:'.$this->id) { + $skip = false; + } + } + + $out = mysql_real_escape_string($out); + $app->db->datalogUpdate('mail_user', "custom_mailfilter = '$out'", 'mailuser_id', $this->dataRecord["mailuser_id"]); + + } + +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_user_filter_edit.php b/interface/ispconfig/interface/mail/mail_user_filter_edit.php new file mode 100644 index 000000000..382460a01 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_filter_edit.php @@ -0,0 +1,232 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onSubmit() { + global $app, $conf; + + // Get the parent mail_user record + $mailuser = $app->db->queryOneRecord("SELECT * FROM mail_user WHERE mailuser_id = '".intval($_REQUEST["mailuser_id"])."' AND ".$app->tform->getAuthSQL('r')); + + // Check if Domain belongs to user + if($mailuser["mailuser_id"] != $_POST["mailuser_id"]) $app->tform->errorMessage .= $app->tform->wordbook["no_mailuser_perm"]; + + // Set the mailuser_id + $this->dataRecord["mailuser_id"] = $mailuser["mailuser_id"]; + + // Remove leading dots + if(substr($this->dataRecord['target'],0,1) == '.') $this->dataRecord['target'] = substr($this->dataRecord['target'],1); + + parent::onSubmit(); + } + + /* + function onAfterInsert() { + global $app, $conf; + + $this->onAfterUpdate(); + + $app->db->query("UPDATE mail_user_filter SET sys_groupid = ".$mailuser['sys_groupid']." WHERE filter_id = ".$this->id); + } + + function onAfterUpdate() { + global $app, $conf; + + $mailuser = $app->db->queryOneRecord("SELECT custom_mailfilter FROM mail_user WHERE mailuser_id = ".$this->dataRecord["mailuser_id"]); + $skip = false; + $lines = explode("\n",$mailuser['custom_mailfilter']); + $out = ''; + $found = false; + + foreach($lines as $line) { + $line = rtrim($line); + if($line == '### BEGIN FILTER_ID:'.$this->id) { + $skip = true; + $found = true; + } + if($skip == false && $line != '') $out .= $line ."\n"; + if($line == '### END FILTER_ID:'.$this->id) { + $out .= $this->getRule(); + $skip = false; + } + } + + // We did not found our rule, so we add it now as first rule. + if($found == false) { + $new_rule = $this->getRule(); + $out = $new_rule . $out; + } + + $out = $app->db->quote($out); + $app->db->datalogUpdate('mail_user', "custom_mailfilter = '$out'", 'mailuser_id', $this->dataRecord["mailuser_id"]); + + } + + function getRule() { + + global $app,$conf; + + $app->uses("getconf"); + $mailuser_rec = $app->db->queryOneRecord("SELECT server_id FROM mail_user WHERE mailuser_id = ".intval($this->dataRecord["mailuser_id"])); + $mail_config = $app->getconf->get_server_config(intval($mailuser_rec["server_id"]),'mail'); + + if($mail_config['mail_filter_syntax'] == 'sieve') { + + // ####################################################### + // Filter in Sieve Syntax + // ####################################################### + + $content = ''; + $content .= '### BEGIN FILTER_ID:'.$this->id."\n"; + + //$content .= 'require ["fileinto", "regex", "vacation"];'."\n"; + + $content .= 'if header :regex ["'.strtolower($this->dataRecord["source"]).'"] ["'; + + $searchterm = preg_quote($this->dataRecord["searchterm"]); + + if($this->dataRecord["op"] == 'contains') { + $content .= ".*".$searchterm; + } elseif ($this->dataRecord["op"] == 'is') { + $content .= $searchterm."$"; + } elseif ($this->dataRecord["op"] == 'begins') { + $content .= " ".$searchterm.""; + } elseif ($this->dataRecord["op"] == 'ends') { + $content .= ".*".$searchterm."$"; + } + + $content .= '"] {'."\n"; + + if($this->dataRecord["action"] == 'move') { + $content .= ' fileinto "'.$this->dataRecord["target"].'";' . "\n"; + } else { + $content .= " discard;\n"; + } + + $content .= " stop;\n}\n"; + + $content .= '### END FILTER_ID:'.$this->id."\n"; + + } else { + + // ####################################################### + // Filter in Maildrop Syntax + // ####################################################### + $content = ''; + $content .= '### BEGIN FILTER_ID:'.$this->id."\n"; + + $TargetNoQuotes = $this->dataRecord["target"]; + $TargetQuotes = "\"$TargetNoQuotes\""; + + $TestChDirNoQuotes = '$DEFAULT/.'.$TargetNoQuotes; + $TestChDirQuotes = "\"$TestChDirNoQuotes\""; + + $MailDirMakeNoQuotes = $TargetQuotes.' $DEFAULT'; + + $EchoTargetFinal = $TargetNoQuotes; + + + if($this->dataRecord["action"] == 'move') { + + $content .= " +`test -e ".$TestChDirQuotes." && exit 1 || exit 0` +if ( ".'$RETURNCODE'." != 1 ) +{ + `maildirmake -f $MailDirMakeNoQuotes` + `chmod -R 0700 ".$TestChDirQuotes."` + `echo \"INBOX.$EchoTargetFinal\" >> ".'$DEFAULT'."/courierimapsubscribed` +} +"; + } + + $content .= "if (/^".$this->dataRecord["source"].":"; + + $searchterm = preg_quote($this->dataRecord["searchterm"]); + + if($this->dataRecord["op"] == 'contains') { + $content .= ".*".$searchterm."/:h)\n"; + } elseif ($this->dataRecord["op"] == 'is') { + $content .= $searchterm."$/:h)\n"; + } elseif ($this->dataRecord["op"] == 'begins') { + $content .= " ".$searchterm."/:h)\n"; + } elseif ($this->dataRecord["op"] == 'ends') { + $content .= ".*".$searchterm."$/:h)\n"; + } + + $content .= "{\n"; + $content .= "exception {\n"; + + if($this->dataRecord["action"] == 'move') { + $content .= 'ID' . "$this->id" . 'EndFolder = "$DEFAULT/.' . $this->dataRecord['target'] . '/"' . "\n"; + $content .= "to ". '$ID' . "$this->id" . 'EndFolder' . "\n"; + } else { + $content .= "to /dev/null\n"; + } + + $content .= "}\n"; + $content .= "}\n"; + + //} + + $content .= '### END FILTER_ID:'.$this->id."\n"; + + } + + return $content; + } + */ + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_user_list.php b/interface/ispconfig/interface/mail/mail_user_list.php new file mode 100644 index 000000000..e7cb7c8ad --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_list.php @@ -0,0 +1,44 @@ +auth->check_module_permissions('mail'); + +$app->load('listform_actions'); + + +class list_action extends listform_actions { + + function onShow() { + global $app,$conf; + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('mail'); + + if($global_config['mailboxlist_webmail_link'] == 'y') { + $app->tpl->setVar('mailboxlist_webmail_link',1); + } else { + $app->tpl->setVar('mailboxlist_webmail_link',0); + } + + parent::onShow(); + } + +} + +$list = new list_action; +$list->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_user_stats.php b/interface/ispconfig/interface/mail/mail_user_stats.php new file mode 100644 index 000000000..694202fd1 --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_user_stats.php @@ -0,0 +1,63 @@ +auth->check_module_permissions('mail'); + +$app->load('listform_actions'); + +class list_action extends listform_actions { + + function prepareDataRow($rec) + { + global $app; + + $rec = $app->listform->decode($rec); + + //* Alternating datarow colors + $this->DataRowColor = ($this->DataRowColor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; + $rec['bgcolor'] = $this->DataRowColor; + + //* Set the statistics colums + //** Traffic of the current month + $tmp_date = date('Y-m'); + $tmp_rec = $app->db->queryOneRecord("SELECT traffic as t FROM mail_traffic WHERE mailuser_id = ".$rec['mailuser_id']." AND month = '$tmp_date'"); + $rec['this_month'] = number_format(intval($tmp_rec['t'])/1024/1024, 0, '.', ' '); + + //** Traffic of the current year + $tmp_date = date('Y'); + $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic) as t FROM mail_traffic WHERE mailuser_id = ".$rec['mailuser_id']." AND month like '$tmp_date%'"); + $rec['this_year'] = number_format(intval($tmp_rec['t'])/1024/1024, 0, '.', ' '); + + //** Traffic of the last month + $tmp_date = date('Y-m',mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); + $tmp_rec = $app->db->queryOneRecord("SELECT traffic as t FROM mail_traffic WHERE mailuser_id = ".$rec['mailuser_id']." AND month = '$tmp_date'"); + $rec['last_month'] = number_format(intval($tmp_rec['t'])/1024/1024, 0, '.', ' '); + + //** Traffic of the last year + $tmp_date = date('Y',mktime(0, 0, 0, date("m"), date("d"), date("Y")-1)); + $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic) as t FROM mail_traffic WHERE mailuser_id = ".$rec['mailuser_id']." AND month like '$tmp_date%'"); + $rec['last_year'] = number_format(intval($tmp_rec['t'])/1024/1024, 0, '.', ' '); + + //* The variable "id" contains always the index variable + $rec['id'] = $rec[$this->idx_key]; + return $rec; + } +} + +$list = new list_action; +$list->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_whitelist_del.php b/interface/ispconfig/interface/mail/mail_whitelist_del.php new file mode 100644 index 000000000..217f49e2b --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_whitelist_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_whitelist_edit.php b/interface/ispconfig/interface/mail/mail_whitelist_edit.php new file mode 100644 index 000000000..092f5783d --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_whitelist_edit.php @@ -0,0 +1,113 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_mailfilter')) { + $app->error($app->tform->wordbook["limit_mailfilter_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_mailfilter')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_mailfilter_txt"]); + } + } + + parent::onShowNew(); + } + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from mail_access WHERE access_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_mailfilter FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_mailfilter"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(access_id) as number FROM mail_access WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_mailfilter"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_mailfilter_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + parent::onSubmit(); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/mail_whitelist_list.php b/interface/ispconfig/interface/mail/mail_whitelist_list.php new file mode 100644 index 000000000..b2470084a --- /dev/null +++ b/interface/ispconfig/interface/mail/mail_whitelist_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLExtWhere = "access = 'OK'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_blacklist_del.php b/interface/ispconfig/interface/mail/spamfilter_blacklist_del.php new file mode 100644 index 000000000..d3ca8c40c --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_blacklist_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_blacklist_edit.php b/interface/ispconfig/interface/mail/spamfilter_blacklist_edit.php new file mode 100644 index 000000000..3f7e5f085 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_blacklist_edit.php @@ -0,0 +1,118 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_spamfilter_wblist')) { + $app->error($app->tform->wordbook["limit_spamfilter_wblist_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_spamfilter_wblist')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_wblist_txt"]); + } + } + + parent::onShowNew(); + } + + /* + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from spamfilter_wblist WHERE id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + */ + +function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_spamfilter_wblist FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_spamfilter_wblist"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(wblist_id) as number FROM spamfilter_wblist WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_spamfilter_wblist"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_spamfilter_wblist_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + // Select and set the server_id so it matches the server_id of the spa,filter_users record + $tmp = $app->db->queryOneRecord("SELECT server_id FROM spamfilter_users WHERE id = ".intval($this->dataRecord["rid"])); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + + parent::onSubmit(); + } +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_blacklist_list.php b/interface/ispconfig/interface/mail/spamfilter_blacklist_list.php new file mode 100644 index 000000000..4733bdc77 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_blacklist_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLExtWhere = "wb = 'B'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_config_del.php b/interface/ispconfig/interface/mail/spamfilter_config_del.php new file mode 100644 index 000000000..31357e95f --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_config_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_config_edit.php b/interface/ispconfig/interface/mail/spamfilter_config_edit.php new file mode 100644 index 000000000..26f369de4 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_config_edit.php @@ -0,0 +1,96 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEdit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + + if($app->tform->errorMessage == '') { + $app->uses('ini_parser,getconf'); + + $section = $this->active_tab; + $server_id = $this->id; + + $this->dataRecord = $app->getconf->get_server_config($server_id,$section); + } + + $record = $app->tform->getHTML($this->dataRecord, $this->active_tab,'EDIT'); + + $record['id'] = $this->id; + $app->tpl->setVar($record); + } + + function onUpdateSave($sql) { + global $app; + + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + $app->uses('ini_parser,getconf'); + + $section = $app->tform->getCurrentTab(); + $server_id = $this->id; + + $server_config_array = $app->getconf->get_server_config($server_id); + $server_config_array[$section] = $app->tform->encode($this->dataRecord,$section); + $server_config_str = $app->ini_parser->get_ini_string($server_config_array); + + $sql = "UPDATE server SET config = '".$app->db->quote($server_config_str)."' WHERE server_id = ".$server_id; + $app->db->query($sql); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_config_list.php b/interface/ispconfig/interface/mail/spamfilter_config_list.php new file mode 100644 index 000000000..16cc359dc --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_config_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +//$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_policy_del.php b/interface/ispconfig/interface/mail/spamfilter_policy_del.php new file mode 100644 index 000000000..04d15e079 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_policy_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_policy_edit.php b/interface/ispconfig/interface/mail/spamfilter_policy_edit.php new file mode 100644 index 000000000..795b31b15 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_policy_edit.php @@ -0,0 +1,95 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_spamfilter_policy')) { + $app->error($app->tform->wordbook["limit_spamfilter_policy_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_spamfilter_policy')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_policy_txt"]); + } + } + + parent::onShowNew(); + } + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_spamfilter_policy FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_spamfilter_policy"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_policy WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_spamfilter_policy"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_spamfilter_policy_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + parent::onSubmit(); + } +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_policy_list.php b/interface/ispconfig/interface/mail/spamfilter_policy_list.php new file mode 100644 index 000000000..3d97b60cb --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_policy_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +//$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_users_del.php b/interface/ispconfig/interface/mail/spamfilter_users_del.php new file mode 100644 index 000000000..9bc5e3154 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_users_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_users_edit.php b/interface/ispconfig/interface/mail/spamfilter_users_edit.php new file mode 100644 index 000000000..20ae7fe1c --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_users_edit.php @@ -0,0 +1,111 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_spamfilter_user')) { + $app->error($app->tform->wordbook["limit_spamfilter_user_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_spamfilter_user')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_user_txt"]); + } + } + + parent::onShowNew(); + } + + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from spamfilter_users WHERE id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + +function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_spamfilter_user FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_spamfilter_user"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_users WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_spamfilter_user"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_spamfilter_user_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + parent::onSubmit(); + } +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_users_list.php b/interface/ispconfig/interface/mail/spamfilter_users_list.php new file mode 100644 index 000000000..9d4ea2103 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_users_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +//$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_whitelist_del.php b/interface/ispconfig/interface/mail/spamfilter_whitelist_del.php new file mode 100644 index 000000000..b7e2e36ac --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_whitelist_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_whitelist_edit.php b/interface/ispconfig/interface/mail/spamfilter_whitelist_edit.php new file mode 100644 index 000000000..ddef3ae08 --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_whitelist_edit.php @@ -0,0 +1,119 @@ +auth->check_module_permissions('mail'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_spamfilter_wblist')) { + $app->error($app->tform->wordbook["limit_spamfilter_wblist_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_spamfilter_wblist')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_wblist_txt"]); + } + } + + parent::onShowNew(); + } + + /* + function onBeforeUpdate() { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $rec = $app->db->queryOneRecord("SELECT server_id from spamfilter_wblist WHERE id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + } + */ + + function onSubmit() { + global $app, $conf; + + // Check the client limits, if user is not the admin + if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_spamfilter_wblist FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Check if the user may add another mailbox. + if($this->id == 0 && $client["limit_spamfilter_wblist"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(wblist_id) as number FROM spamfilter_wblist WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_spamfilter_wblist"]) { + $app->tform->errorMessage .= $app->tform->wordbook["limit_spamfilter_wblist_txt"]."
    "; + } + unset($tmp); + } + } // end if user is not admin + + // Select and set the server_id so it matches the server_id of the spa,filter_users record + $tmp = $app->db->queryOneRecord("SELECT server_id FROM spamfilter_users WHERE id = ".intval($this->dataRecord["rid"])); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + + + parent::onSubmit(); + } +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/spamfilter_whitelist_list.php b/interface/ispconfig/interface/mail/spamfilter_whitelist_list.php new file mode 100644 index 000000000..5944ee07e --- /dev/null +++ b/interface/ispconfig/interface/mail/spamfilter_whitelist_list.php @@ -0,0 +1,24 @@ +auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); +$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/templates/mail_alias_edit.htm b/interface/ispconfig/interface/mail/templates/mail_alias_edit.htm new file mode 100644 index 000000000..cfa724b7b --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_alias_edit.htm @@ -0,0 +1,39 @@ +

    +

    + +
    + +
    +
    +
    +

    * {tmpl_var name='email_txt'}

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_alias_list.htm b/interface/ispconfig/interface/mail/templates/mail_alias_list.htm new file mode 100644 index 000000000..489e5af77 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_alias_list.htm @@ -0,0 +1,57 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="source"}{tmpl_var name="destination"} + +
    + +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_aliasdomain_edit.htm b/interface/ispconfig/interface/mail/templates/mail_aliasdomain_edit.htm new file mode 100644 index 000000000..53fd3e331 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_aliasdomain_edit.htm @@ -0,0 +1,37 @@ +

    +

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_aliasdomain_list.htm b/interface/ispconfig/interface/mail/templates/mail_aliasdomain_list.htm new file mode 100644 index 000000000..8761af083 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_aliasdomain_list.htm @@ -0,0 +1,57 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="source"}{tmpl_var name="destination"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_blacklist_edit.htm b/interface/ispconfig/interface/mail/templates/mail_blacklist_edit.htm new file mode 100644 index 000000000..e64fe2d5d --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_blacklist_edit.htm @@ -0,0 +1,41 @@ +

    +

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_blacklist_list.htm b/interface/ispconfig/interface/mail/templates/mail_blacklist_list.htm new file mode 100644 index 000000000..d2f37856a --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_blacklist_list.htm @@ -0,0 +1,60 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="source"}{tmpl_var name="type"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_content_filter_edit.htm b/interface/ispconfig/interface/mail/templates/mail_content_filter_edit.htm new file mode 100644 index 000000000..ffe844e8d --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_content_filter_edit.htm @@ -0,0 +1,50 @@ +

    +

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_content_filter_list.htm b/interface/ispconfig/interface/mail/templates/mail_content_filter_list.htm new file mode 100644 index 000000000..87150837d --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_content_filter_list.htm @@ -0,0 +1,60 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="pattern"}{tmpl_var name="action"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_domain_catchall_edit.htm b/interface/ispconfig/interface/mail/templates/mail_domain_catchall_edit.htm new file mode 100644 index 000000000..6970fbaee --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_domain_catchall_edit.htm @@ -0,0 +1,38 @@ +

    +

    + +
    + +
    +
    +
    +

    {tmpl_var name='email_txt'}

    +
    + + +
    +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_domain_catchall_list.htm b/interface/ispconfig/interface/mail/templates/mail_domain_catchall_list.htm new file mode 100644 index 000000000..0ae6a3189 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_domain_catchall_list.htm @@ -0,0 +1,57 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="source"}{tmpl_var name="destination"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_domain_edit.htm b/interface/ispconfig/interface/mail/templates/mail_domain_edit.htm new file mode 100644 index 000000000..f0dd1a4cc --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_domain_edit.htm @@ -0,0 +1,67 @@ +

    +

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_domain_list.htm b/interface/ispconfig/interface/mail/templates/mail_domain_list.htm new file mode 100644 index 000000000..fabeaad0d --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_domain_list.htm @@ -0,0 +1,57 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="domain"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_forward_edit.htm b/interface/ispconfig/interface/mail/templates/mail_forward_edit.htm new file mode 100644 index 000000000..d64504f1c --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_forward_edit.htm @@ -0,0 +1,37 @@ +

    +

    + +
    + +
    +
    +
    +

    * {tmpl_var name='email_txt'}

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_forward_list.htm b/interface/ispconfig/interface/mail/templates/mail_forward_list.htm new file mode 100644 index 000000000..833a433af --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_forward_list.htm @@ -0,0 +1,57 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="source"}{tmpl_var name="destination"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_get_edit.htm b/interface/ispconfig/interface/mail/templates/mail_get_edit.htm new file mode 100644 index 000000000..2da485e38 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_get_edit.htm @@ -0,0 +1,54 @@ +

    +

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

    {tmpl_var name='source_delete_txt'}

    +
    + {tmpl_var name='source_delete'} +
    +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_get_list.htm b/interface/ispconfig/interface/mail/templates/mail_get_list.htm new file mode 100644 index 000000000..924aa31d6 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_get_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="source_server"}{tmpl_var name="source_username"}{tmpl_var name="destination"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_relay_recipient_edit.htm b/interface/ispconfig/interface/mail/templates/mail_relay_recipient_edit.htm new file mode 100644 index 000000000..4d02075d4 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_relay_recipient_edit.htm @@ -0,0 +1,35 @@ +

    +

    + +
    + +
    +
    Relay recipient +
    + + +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_relay_recipient_list.htm b/interface/ispconfig/interface/mail/templates/mail_relay_recipient_list.htm new file mode 100644 index 000000000..072e9f887 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_relay_recipient_list.htm @@ -0,0 +1,55 @@ +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="source"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_transport_edit.htm b/interface/ispconfig/interface/mail/templates/mail_transport_edit.htm new file mode 100644 index 000000000..5f16db366 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_transport_edit.htm @@ -0,0 +1,56 @@ +

    +

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

    {tmpl_var name='mx_txt'}

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_transport_list.htm b/interface/ispconfig/interface/mail/templates/mail_transport_list.htm new file mode 100644 index 000000000..ede0f2312 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_transport_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="domain"}{tmpl_var name="transport"}{tmpl_var name="sort_order"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_autoresponder_edit.htm b/interface/ispconfig/interface/mail/templates/mail_user_autoresponder_edit.htm new file mode 100644 index 000000000..594f2e416 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_autoresponder_edit.htm @@ -0,0 +1,37 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    +

    {tmpl_var name='autoresponder_txt'}

    +
    +
    +  {tmpl_var name='autoresponder_active'}
    +
    + +

    + + {tmpl_var name='autoresponder_start_date'} now

    + + + {tmpl_var name='autoresponder_end_date'} +
    +
    +
    + + + +
    + + +
    +
    + +
    \ No newline at end of file diff --git a/interface/ispconfig/interface/mail/templates/mail_user_custom_rules_edit.htm b/interface/ispconfig/interface/mail/templates/mail_user_custom_rules_edit.htm new file mode 100644 index 000000000..0ca1b3c6e --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_custom_rules_edit.htm @@ -0,0 +1,22 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_filter_edit.htm b/interface/ispconfig/interface/mail/templates/mail_user_filter_edit.htm new file mode 100644 index 000000000..8a99287fc --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_filter_edit.htm @@ -0,0 +1,38 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + + + +
    +
    + + + +
    +
    + + {tmpl_var name='active'} +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_filter_list.htm b/interface/ispconfig/interface/mail/templates/mail_user_filter_list.htm new file mode 100644 index 000000000..22b3c23ac --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_filter_list.htm @@ -0,0 +1,45 @@ + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="rulename"} + +
    +
    +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_list.htm b/interface/ispconfig/interface/mail/templates/mail_user_list.htm new file mode 100644 index 000000000..254fd8c12 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_list.htm @@ -0,0 +1,58 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="email"}{tmpl_var name="name"}{tmpl_var name="autoresponder"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_mailbox_edit.htm b/interface/ispconfig/interface/mail/templates/mail_user_mailbox_edit.htm new file mode 100644 index 000000000..80f142224 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_mailbox_edit.htm @@ -0,0 +1,67 @@ +

    +

    + +
    + +
    +
    +
    + +   {tmpl_var name='name_optional_txt'} +
    +
    +

    * {tmpl_var name='email_txt'}

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

    {tmpl_var name='password_strength_txt'}

    +
    +

     

    +
    +
    + +

     MB

    +
    +
    + + +
    +
    +

    {tmpl_var name='postfix_txt'}

    +
    + {tmpl_var name='postfix'} +
    +
    +
    +

    {tmpl_var name='disableimap_txt'}

    +
    + {tmpl_var name='disableimap'} +
    +
    +
    +

    {tmpl_var name='disablepop3_txt'}

    +
    + {tmpl_var name='disablepop3'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_mailfilter_edit.htm b/interface/ispconfig/interface/mail/templates/mail_user_mailfilter_edit.htm new file mode 100644 index 000000000..12a6f627b --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_mailfilter_edit.htm @@ -0,0 +1,26 @@ +

    +

    + +
    + +
    +
    +
    +

    {tmpl_var name='move_junk_txt'}

    +
    + {tmpl_var name='move_junk'} +
    +
    +
    + + {tmpl_var name='filter_records'} + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_user_stats_list.htm b/interface/ispconfig/interface/mail/templates/mail_user_stats_list.htm new file mode 100644 index 000000000..47e4b07b6 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_user_stats_list.htm @@ -0,0 +1,52 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="email"}{tmpl_var name="this_month"} MB{tmpl_var name="last_month"} MB{tmpl_var name="this_year"} MB{tmpl_var name="last_year"} MB +
    +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_whitelist_edit.htm b/interface/ispconfig/interface/mail/templates/mail_whitelist_edit.htm new file mode 100644 index 000000000..d8e6b8b53 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_whitelist_edit.htm @@ -0,0 +1,41 @@ +

    +

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/mail_whitelist_list.htm b/interface/ispconfig/interface/mail/templates/mail_whitelist_list.htm new file mode 100644 index 000000000..ad8a69a76 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/mail_whitelist_list.htm @@ -0,0 +1,60 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="source"}{tmpl_var name="type"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_edit.htm new file mode 100644 index 000000000..36058d9a4 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_edit.htm @@ -0,0 +1,49 @@ +

    +

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_list.htm b/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_list.htm new file mode 100644 index 000000000..5594044c4 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_blacklist_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="priority"}{tmpl_var name="rid"}{tmpl_var name="email"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_config_getmail_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_config_getmail_edit.htm new file mode 100644 index 000000000..1bdb88675 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_config_getmail_edit.htm @@ -0,0 +1,22 @@ +

    +

    + +
    + +
    +
    + + + + +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_config_list.htm b/interface/ispconfig/interface/mail/templates/spamfilter_config_list.htm new file mode 100644 index 000000000..0a6680a6f --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_config_list.htm @@ -0,0 +1,51 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="server_name"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_config_mail_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_config_mail_edit.htm new file mode 100644 index 000000000..3526589ab --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_config_mail_edit.htm @@ -0,0 +1,66 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_config_server_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_config_server_edit.htm new file mode 100644 index 000000000..ac45009fd --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_config_server_edit.htm @@ -0,0 +1,38 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_other_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_other_edit.htm new file mode 100644 index 000000000..404067198 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_other_edit.htm @@ -0,0 +1,80 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_policy_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_policy_edit.htm new file mode 100644 index 000000000..b725df5fb --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_policy_edit.htm @@ -0,0 +1,64 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_policy_list.htm b/interface/ispconfig/interface/mail/templates/spamfilter_policy_list.htm new file mode 100644 index 000000000..276dd537b --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_policy_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="policy_name"}{tmpl_var name="virus_lover"}{tmpl_var name="spam_lover"}{tmpl_var name="banned_files_lover"}{tmpl_var name="bad_header_lover"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_quarantine_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_quarantine_edit.htm new file mode 100644 index 000000000..de33b33c8 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_quarantine_edit.htm @@ -0,0 +1,44 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_taglevel_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_taglevel_edit.htm new file mode 100644 index 000000000..aef98d3d2 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_taglevel_edit.htm @@ -0,0 +1,52 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_users_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_users_edit.htm new file mode 100644 index 000000000..01d569922 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_users_edit.htm @@ -0,0 +1,50 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_users_list.htm b/interface/ispconfig/interface/mail/templates/spamfilter_users_list.htm new file mode 100644 index 000000000..f57432706 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_users_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="local"}{tmpl_var name="server_id"}{tmpl_var name="priority"}{tmpl_var name="policy_id"}{tmpl_var name="fullname"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_edit.htm b/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_edit.htm new file mode 100644 index 000000000..3ef8f5fb2 --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_edit.htm @@ -0,0 +1,49 @@ +

    +

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_list.htm b/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_list.htm new file mode 100644 index 000000000..e4c2b20bd --- /dev/null +++ b/interface/ispconfig/interface/mail/templates/spamfilter_whitelist_list.htm @@ -0,0 +1,63 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="priority"}{tmpl_var name="rid"}{tmpl_var name="email"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/mail/webmailer.php b/interface/ispconfig/interface/mail/webmailer.php new file mode 100644 index 000000000..ee2ea3813 --- /dev/null +++ b/interface/ispconfig/interface/mail/webmailer.php @@ -0,0 +1,68 @@ +auth->check_module_permissions('mail'); + +/* get the id of the mail (must be int!) */ +if (!isset($_GET['id'])){ + die ("No E-Mail selected!"); +} +$emailId = intval($_GET['id']); + +/* + * Get the data to connect to the database + */ +$dbData = $app->db->queryOneRecord("SELECT server_id FROM mail_user WHERE mailuser_id = " . $emailId); +$serverId = intval($dbData['server_id']); +if ($serverId == 0){ + die ("No E-Mail - Server found!"); +} + +$serverData = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = ".$serverId); + +$app->uses('getconf'); +$global_config = $app->getconf->get_global_config('mail'); + +if($global_config['webmail_url'] != '') { + header('Location:' . $global_config['webmail_url']); +} else { + +/* + * We only redirect to the login-form, so there is no need, to check any rights + */ + isset($_SERVER['HTTPS'])? $http = 'https' : $http = 'http'; + header('Location:' . $http . '://' . $serverData['server_name'] . '/webmail'); +} +exit; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/datalog_del.php b/interface/ispconfig/interface/monitor/datalog_del.php new file mode 100644 index 000000000..ab52f7b8a --- /dev/null +++ b/interface/ispconfig/interface/monitor/datalog_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('monitor'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/datalog_list.php b/interface/ispconfig/interface/monitor/datalog_list.php new file mode 100644 index 000000000..2a6bf4257 --- /dev/null +++ b/interface/ispconfig/interface/monitor/datalog_list.php @@ -0,0 +1,64 @@ +auth->check_module_permissions('monitor'); + +$app->uses('listform_actions'); + +$servers = $app->db->queryAllRecords("SELECT server_id, updated FROM server"); + +$sql = '('; +foreach($servers as $sv) { + $sql .= " (datalog_id > ".$sv['updated']." AND server_id = ".$sv['server_id'].") OR "; +} +$sql = substr($sql,0,-4); +$sql .= ')'; + +$app->listform_actions->SQLExtWhere = $sql; +$app->listform_actions->SQLOrderBy = "ORDER BY tstamp DESC, datalog_id DESC"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/lib/admin.conf.php b/interface/ispconfig/interface/monitor/lib/admin.conf.php new file mode 100644 index 000000000..a45d44034 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/admin.conf.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/lib/lang/bg.lng b/interface/ispconfig/interface/monitor/lib/lang/bg.lng new file mode 100644 index 000000000..5512e7e07 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/bg.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/bg_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/bg_datalog_list.lng new file mode 100644 index 000000000..8ad63ffd4 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/bg_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/bg_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/bg_syslog_list.lng new file mode 100644 index 000000000..00da5abc7 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/bg_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/br.lng b/interface/ispconfig/interface/monitor/lib/lang/br.lng new file mode 100644 index 000000000..c0b781a89 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/br.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/br_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/br_datalog_list.lng new file mode 100644 index 000000000..04fdf2415 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/br_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/br_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/br_syslog_list.lng new file mode 100644 index 000000000..23f3c6d5d --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/br_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/de.lng b/interface/ispconfig/interface/monitor/lib/lang/de.lng new file mode 100644 index 000000000..b600d2806 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/de.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/de_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/de_datalog_list.lng new file mode 100644 index 000000000..0b6bf9a4b --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/de_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/de_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/de_syslog_list.lng new file mode 100644 index 000000000..bd879a006 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/de_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/en.lng b/interface/ispconfig/interface/monitor/lib/lang/en.lng new file mode 100644 index 000000000..a28cf0924 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/en.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/en_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/en_datalog_list.lng new file mode 100644 index 000000000..1cb7f590e --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/en_datalog_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/lib/lang/en_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/en_syslog_list.lng new file mode 100644 index 000000000..96c1322bd --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/en_syslog_list.lng @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/lib/lang/es.lng b/interface/ispconfig/interface/monitor/lib/lang/es.lng new file mode 100644 index 000000000..63363bcc8 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/es.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/es_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/es_datalog_list.lng new file mode 100644 index 000000000..38f384f58 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/es_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/es_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/es_syslog_list.lng new file mode 100644 index 000000000..17f89f201 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/es_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fi.lng b/interface/ispconfig/interface/monitor/lib/lang/fi.lng new file mode 100644 index 000000000..6b3978da0 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fi.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fi_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/fi_datalog_list.lng new file mode 100644 index 000000000..eb2658261 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fi_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fi_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/fi_syslog_list.lng new file mode 100644 index 000000000..54aaa4e30 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fi_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fr.lng b/interface/ispconfig/interface/monitor/lib/lang/fr.lng new file mode 100644 index 000000000..a322c4f6e --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fr.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fr_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/fr_datalog_list.lng new file mode 100644 index 000000000..e47b9f09e --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fr_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/fr_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/fr_syslog_list.lng new file mode 100644 index 000000000..00da5abc7 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/fr_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/hu.lng b/interface/ispconfig/interface/monitor/lib/lang/hu.lng new file mode 100644 index 000000000..8135d99c5 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/hu.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/hu_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/hu_datalog_list.lng new file mode 100644 index 000000000..a88ef9214 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/hu_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/hu_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/hu_syslog_list.lng new file mode 100644 index 000000000..d306d66be --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/hu_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/it.lng b/interface/ispconfig/interface/monitor/lib/lang/it.lng new file mode 100644 index 000000000..a898c7dbb --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/it.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/it_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/it_datalog_list.lng new file mode 100644 index 000000000..740dff161 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/it_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/it_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/it_syslog_list.lng new file mode 100644 index 000000000..3b372ec0f --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/it_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ja.lng b/interface/ispconfig/interface/monitor/lib/lang/ja.lng new file mode 100644 index 000000000..b08f3b258 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ja.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ja_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ja_datalog_list.lng new file mode 100644 index 000000000..c1f136dae --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ja_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ja_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ja_syslog_list.lng new file mode 100644 index 000000000..598b8d451 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ja_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/nl.lng b/interface/ispconfig/interface/monitor/lib/lang/nl.lng new file mode 100644 index 000000000..331557268 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/nl.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/nl_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/nl_datalog_list.lng new file mode 100644 index 000000000..87e01c2a2 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/nl_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/nl_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/nl_syslog_list.lng new file mode 100644 index 000000000..90a685f68 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/nl_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pl.lng b/interface/ispconfig/interface/monitor/lib/lang/pl.lng new file mode 100644 index 000000000..8ffd29831 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pl.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pl_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/pl_datalog_list.lng new file mode 100644 index 000000000..398ca51ed --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pl_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pl_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/pl_syslog_list.lng new file mode 100644 index 000000000..125494bf8 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pl_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pt.lng b/interface/ispconfig/interface/monitor/lib/lang/pt.lng new file mode 100644 index 000000000..6720285f4 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pt.lng @@ -0,0 +1,139 @@ + + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pt_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/pt_datalog_list.lng new file mode 100644 index 000000000..655e1e3f5 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pt_datalog_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/monitor/lib/lang/pt_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/pt_syslog_list.lng new file mode 100644 index 000000000..f8ff04ce0 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/pt_syslog_list.lng @@ -0,0 +1,8 @@ + + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ro.lng b/interface/ispconfig/interface/monitor/lib/lang/ro.lng new file mode 100644 index 000000000..a28cf0924 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ro.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ro_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ro_datalog_list.lng new file mode 100644 index 000000000..35c79acbb --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ro_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ro_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ro_syslog_list.lng new file mode 100644 index 000000000..572095d8d --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ro_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ru.lng b/interface/ispconfig/interface/monitor/lib/lang/ru.lng new file mode 100644 index 000000000..a4eb13148 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ru.lng @@ -0,0 +1,139 @@ + + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ru_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ru_datalog_list.lng new file mode 100644 index 000000000..1ad3c88e9 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ru_datalog_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/monitor/lib/lang/ru_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/ru_syslog_list.lng new file mode 100644 index 000000000..e940f1aaf --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/ru_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/se.lng b/interface/ispconfig/interface/monitor/lib/lang/se.lng new file mode 100644 index 000000000..499f62cb5 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/se.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/se_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/se_datalog_list.lng new file mode 100644 index 000000000..8ad63ffd4 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/se_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/se_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/se_syslog_list.lng new file mode 100644 index 000000000..00da5abc7 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/se_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/sk.lng b/interface/ispconfig/interface/monitor/lib/lang/sk.lng new file mode 100644 index 000000000..4f84e6c38 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/sk.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/sk_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/sk_datalog_list.lng new file mode 100644 index 000000000..98997242f --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/sk_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/sk_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/sk_syslog_list.lng new file mode 100644 index 000000000..6a28f3854 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/sk_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/tr.lng b/interface/ispconfig/interface/monitor/lib/lang/tr.lng new file mode 100644 index 000000000..3a375a233 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/tr.lng @@ -0,0 +1,138 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/tr_datalog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/tr_datalog_list.lng new file mode 100644 index 000000000..8752c6ba9 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/tr_datalog_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/lang/tr_syslog_list.lng b/interface/ispconfig/interface/monitor/lib/lang/tr_syslog_list.lng new file mode 100644 index 000000000..32346de9f --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/lang/tr_syslog_list.lng @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/monitor/lib/module.conf.php b/interface/ispconfig/interface/monitor/lib/module.conf.php new file mode 100644 index 000000000..5161ba834 --- /dev/null +++ b/interface/ispconfig/interface/monitor/lib/module.conf.php @@ -0,0 +1,160 @@ + "Show Overview", + 'target' => 'content', + 'link' => 'monitor/show_sys_state.php?state=system'); + +$items[] = array( 'title' => "Show System-Log", + 'target' => 'content', + 'link' => 'monitor/log_list.php'); + +$items[] = array( 'title' => 'Show Jobqueue', + 'target' => 'content', + 'link' => 'monitor/datalog_list.php'); + +$module["nav"][] = array( 'title' => 'System State (All Servers)', + 'open' => 1, + 'items' => $items); + + +/* + We need all the available servers on the left navigation. + So fetch them from the database and add then to the navigation as dropdown-list +*/ + +$servers = $app->db->queryAllRecords("SELECT server_id, server_name FROM server order by server_name"); + +$dropDown = ""; + +/* + Now add them as dropdown to the navigation + */ +unset($items); +$items[] = array( 'title' => $dropDown, + 'target' => '', // no action! + 'link' => ''); // no action! + +$module["nav"][] = array( 'title' => 'Server to Monitor', + 'open' => 1, + 'items' => $items); + +/* + The first Server at the list is the server first selected + */ +$_SESSION['monitor']['server_id'] = $servers[0]['server_id']; +$_SESSION['monitor']['server_name'] = $servers[0]['server_name']; + +/* + * Clear and set the Navigation-Items + */ +unset($items); + +$items[] = array( 'title' => "Show CPU info", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=cpu_info'); + +$module["nav"][] = array( 'title' => 'Hardware-Information', + 'open' => 1, + 'items' => $items); + +/* + * Clear and set the Navigation-Items + */ +unset($items); +$items[] = array( 'title' => "Show Overview", + 'target' => 'content', + 'link' => 'monitor/show_sys_state.php?state=server'); + +$items[] = array( 'title' => "Show Update State", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=system_update'); + +$items[] = array( 'title' => "Show RAID state", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=raid_state'); + +$items[] = array( 'title' => "Show Server load", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=server_load'); + +$items[] = array( 'title' => "Show Disk usage", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=disk_usage'); + +$items[] = array( 'title' => "Show Memory usage", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=mem_usage'); + +$items[] = array( 'title' => "Show Services", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=services'); + + +$module["nav"][] = array( 'title' => 'Server State', + 'open' => 1, + 'items' => $items); + +/* + * Clear and set the Navigation-Items + */ +unset($items); + +$items[] = array( 'title' => "Show Mail-Queue", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=mailq'); + +$items[] = array( 'title' => "Show Mail-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_mail'); + +$items[] = array( 'title' => "Show Mail warn-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_mail_warn'); + +$items[] = array( 'title' => "Show Mail err-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_mail_err'); + +$items[] = array( 'title' => "Show System-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_messages'); + +$items[] = array( 'title' => "Show ISPC Cron-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_ispc_cron'); + +$items[] = array( 'title' => "Show Freshclam-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_freshclam'); + +$items[] = array( 'title' => "Show Clamav-Log", + 'target' => 'content', + 'link' => 'monitor/show_log.php?log=log_clamav'); + +$items[] = array( 'title' => "Show RKHunter-Log", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=rkhunter'); + +$items[] = array( 'title' => "Show fail2ban-Log", + 'target' => 'content', + 'link' => 'monitor/show_data.php?type=fail2ban'); + +$module["nav"][] = array( 'title' => 'Logfiles', + 'open' => 1, + 'items' => $items); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/list/datalog.list.php b/interface/ispconfig/interface/monitor/list/datalog.list.php new file mode 100644 index 000000000..330e603f0 --- /dev/null +++ b/interface/ispconfig/interface/monitor/list/datalog.list.php @@ -0,0 +1,91 @@ + "tstamp", + 'datatype' => "DATETIME", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + + +$liste['item'][] = array( 'field' => 'server_id', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => '', + 'value' => ''); + +$liste["item"][] = array( 'field' => "action", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('i' => "Insert",'u' => "Update",'d' => "Delete")); + + +$liste["item"][] = array( 'field' => "dbtable", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/list/log.list.php b/interface/ispconfig/interface/monitor/list/log.list.php new file mode 100644 index 000000000..12dad4a89 --- /dev/null +++ b/interface/ispconfig/interface/monitor/list/log.list.php @@ -0,0 +1,90 @@ + "tstamp", + 'datatype' => "DATETIME", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + + +$liste['item'][] = array( 'field' => 'server_id', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => '', + 'value' => ''); + +$liste["item"][] = array( 'field' => "loglevel", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('0' => "Debug",'1' => "Warning",'2' => "Error")); + + +$liste["item"][] = array( 'field' => "message", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/log_del.php b/interface/ispconfig/interface/monitor/log_del.php new file mode 100644 index 000000000..1c33a21a2 --- /dev/null +++ b/interface/ispconfig/interface/monitor/log_del.php @@ -0,0 +1,44 @@ +auth->check_module_permissions('monitor'); + +$syslog_id = intval($_GET['id']); +$app->db->query("UPDATE sys_log SET loglevel = 0 WHERE syslog_id = '$syslog_id'"); + +header('Location: log_list.php'); +exit; + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/log_list.php b/interface/ispconfig/interface/monitor/log_list.php new file mode 100644 index 000000000..c0587c06a --- /dev/null +++ b/interface/ispconfig/interface/monitor/log_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('monitor'); + +$app->uses('listform_actions'); +//$app->listform_actions->SQLExtWhere = "wb = 'W'"; + +$app->listform_actions->SQLOrderBy = "ORDER BY tstamp DESC, syslog_id DESC"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/monitor/show_data.php b/interface/ispconfig/interface/monitor/show_data.php new file mode 100644 index 000000000..cd3f00dd5 --- /dev/null +++ b/interface/ispconfig/interface/monitor/show_data.php @@ -0,0 +1,139 @@ +auth->check_module_permissions('monitor'); + + +/* Get the dataType to show */ +$dataType = $_GET["type"]; + +/* Get some translations */ +$monTransDate = $app->lng("monitor_settings_datafromdate_txt"); +$monTransSrv = $app->lng("monitor_settings_server_txt"); + + +$output = ''; + +switch($dataType) { + case 'server_load': + $template = 'templates/show_data.htm'; + $output .= showServerLoad(); + $time = getDataTime('server_load'); + $title = $app->lng("Server Load").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'disk_usage': + $template = 'templates/show_data.htm'; + $output .= showDiskUsage(); + $time = getDataTime('disk_usage'); + $title = $app->lng("Disk usage").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'mem_usage': + $template = 'templates/show_data.htm'; + $output .= showMemUsage(); + $time = getDataTime('mem_usage'); + $title = $app->lng("Memory usage").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'cpu_info': + $template = 'templates/show_data.htm'; + $output .= showCpuInfo(); + $time = getDataTime('cpu_info'); + $title = $app->lng("monitor_title_cpuinfo_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'services': + $template = 'templates/show_data.htm'; + $output .= showServices(); + $time = getDataTime('services'); + $title = $app->lng("Status of services").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'system_update': + $template = 'templates/show_data.htm'; + $output .= showSystemUpdate(); + $time = getDataTime('system_update'); + $title = $app->lng("monitor_title_updatestate_txt"). ' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'mailq': + $template = 'templates/show_data.htm'; + $output .= showMailq(); + $time = getDataTime('mailq'); + $title = $app->lng("monitor_title_mailq_txt"). ' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'raid_state': + $template = 'templates/show_data.htm'; + $output .= showRaidState(); + $time = getDataTime('raid_state'); + $title = $app->lng("monitor_title_raidstate_txt"). ' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'rkhunter': + $template = 'templates/show_data.htm'; + $output .= showRKHunter(); + $time = getDataTime('rkhunter'); + $title = $app->lng("monitor_title_rkhunterlog_txt"). ' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'fail2ban': + $template = 'templates/show_data.htm'; + $output .= showFail2ban(); + $time = getDataTime('log_fail2ban'); + $title = $app->lng("monitor_title_fail2ban_txt") . ' (' . $monTransSrv . ' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + default: + $template = ''; + break; +} + + +// Loading the template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl', $template); + +$app->tpl->setVar("output", $output); +$app->tpl->setVar("list_head_txt", $title); +$app->tpl->setVar("list_desc_txt", $description); +$app->tpl->setVar("time", $time); +$app->tpl->setVar("monTransDate", $monTransDate); + +$app->tpl_defaults(); +$app->tpl->pparse(); +?> diff --git a/interface/ispconfig/interface/monitor/show_log.php b/interface/ispconfig/interface/monitor/show_log.php new file mode 100644 index 000000000..d64eedce1 --- /dev/null +++ b/interface/ispconfig/interface/monitor/show_log.php @@ -0,0 +1,143 @@ +auth->check_module_permissions('monitor'); + +// Loading the template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/show_log.htm'); + +// Importing the GET values +$refresh = (isset($_GET["refresh"]))?intval($_GET["refresh"]):0; +$logParam = $_GET["log"]; + +/* Get some translations */ +$monTransDate = $app->lng("monitor_settings_datafromdate_txt"); +$monTransSrv = $app->lng("monitor_settings_server_txt"); +$monTransRefreshsq = $app->lng("monitor_settings_refreshsq_txt"); + +/* + Setting the db-type and the caption + */ +switch($logParam) { + case 'log_mail': + $logId = 'log_mail'; + $title = $app->lng("monitor_logs_mail_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_mail_warn': + $logId = 'log_mail_warn'; + $title = $app->lng("monitor_logs_mailwarn_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_mail_err': + $logId = 'log_mail_err'; + $title = $app->lng("monitor_logs_mailerr_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_messages': + $logId = 'log_messages'; + $title = $app->lng("monitor_logs_messages_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_ispc_cron': + $logId = 'log_ispc_cron'; + $title = $app->lng("monitor_logs_ispccron_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_freshclam': + $logId = 'log_freshclam'; + $title = $app->lng("monitor_logs_freshclam_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_clamav': + $logId = 'log_clamav'; + $title = $app->lng("monitor_logs_clamav_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + case 'log_ispconfig': + $logId = 'log_ispconfig'; + $title = $app->lng("monitor_logs_ispc_txt").' ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')'; + $description = ''; + break; + default: + $logId = '???'; + $title = '???'; + $description = ''; + break; +} + + +/* + Creating the array with the refresh intervals + Attention: the core-moule ist triggered every 5 minutes, + so reload every 2 minutes is impossible! +*/ +$refresh_values = array('0' => '- '.$app->lng("No Refresh").' -','5' => '5 '.$app->lng("minutes"),'10' => '10 '.$app->lng("minutes"),'15' => '15 '.$app->lng("minutes"),'30' => '30 '.$app->lng("minutes"),'60' => '60 '.$app->lng("minutes")); +$tmp = ''; +foreach($refresh_values as $key => $val) { + if($key == $refresh) { + $tmp .= ""; + } else { + $tmp .= ""; + } +} +$app->tpl->setVar("refresh",$tmp); + + +/* fetch the Data from the DB */ +$record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = '" . $app->db->quote($logId) . "' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + +if(isset($record['data'])) { + $data = unserialize($record['data']); + + $logData = nl2br($data); + + $app->tpl->setVar("log_data", $logData); +} else { + $app->tpl->setVar("log_data", $app->lng("no_logdata_txt")); +} + +$app->tpl->setVar("title", $title); +$app->tpl->setVar("log_id",$logId); +$app->tpl->setVar("description", $description); +$app->tpl->setVar("time", getDataTime($logId)); +$app->tpl->setVar("monTransDate", $monTransDate); +$app->tpl->setVar("monTransRefreshsq", $monTransRefreshsq); + +$app->tpl_defaults(); +$app->tpl->pparse(); +?> diff --git a/interface/ispconfig/interface/monitor/show_sys_state.php b/interface/ispconfig/interface/monitor/show_sys_state.php new file mode 100644 index 000000000..75353ffad --- /dev/null +++ b/interface/ispconfig/interface/monitor/show_sys_state.php @@ -0,0 +1,508 @@ +auth->check_module_permissions('monitor'); + +/* Change the Server if needed */ +if (isset($_GET['server'])){ + $server = explode('|', $_GET['server'], 2); + $_SESSION['monitor']['server_id'] = $server[0]; + $_SESSION['monitor']['server_name'] = $server[1]; +} + +/* + * Loading the template + */ +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/show_sys_state.htm'); + +/* Get some translations */ +$monTransRefreshsq = $app->lng("monitor_settings_refreshsq_txt"); + +/* + * setting the content + */ +if ($_GET['state'] == 'server') +{ + $output = _getServerState($_SESSION['monitor']['server_id'], $_SESSION['monitor']['server_name'], true); + $title = $app->lng("monitor_general_serverstate_txt"); + $stateType = 'server'; +} +else +{ + $output = _getSysState(); + $title = $app->lng("monitor_general_systemstate_txt"); + $stateType = 'system'; +} + +$app->tpl->setVar("state_data",$output); +$app->tpl->setVar("state_type",$stateType); +$app->tpl->setVar("list_head_txt",$title); +$app->tpl->setVar("list_desc_txt",$description); +$app->tpl->setVar("monTransRefreshsq", $monTransRefreshsq); + +/* + Creating the array with the refresh intervals + Attention: the core-module ist triggered every 5 minutes, + so reload every 2 minutes is impossible! +*/ +$refresh = (isset($_GET["refresh"]))?intval($_GET["refresh"]):0; + +$refresh_values = array('0' => '- '.$app->lng("No Refresh").' -','5' => '5 '.$app->lng("minutes"),'10' => '10 '.$app->lng("minutes"),'15' => '15 '.$app->lng("minutes"),'30' => '30 '.$app->lng("minutes"),'60' => '60 '.$app->lng("minutes")); +$tmp = ''; +foreach($refresh_values as $key => $val) { + if($key == $refresh) { + $tmp .= ""; + } else { + $tmp .= ""; + } +} +$app->tpl->setVar("refresh",$tmp); + +/* + * doing the output + */ +$app->tpl_defaults(); +$app->tpl->pparse(); + + +function _getSysState(){ + global $app; + + /* + * Get all Servers and calculate the state of them + */ + $html = ''; + + $servers = $app->db->queryAllRecords("SELECT server_id, server_name FROM server order by server_name"); + foreach ($servers as $server) + { + $html .= _getServerState($server['server_id'], $server['server_name'], false); + } + + return $html; +} + +/* + * Calculates the State of ONE Server + */ +function _getServerState($serverId, $serverName, $showAll) +{ + global $app; + + /* The State of the server */ + $serverState = 'ok'; + + /** The messages */ + $messages = array(); + + /** The Result of the function */ + $res = ''; + + /* + * get all monitoring-data from the server als process then + * (count them and set the server-state) + */ + $records = $app->db->queryAllRecords("SELECT DISTINCT type FROM monitor_data WHERE server_id = " . $serverId); + foreach($records as $record){ + _processDbState($record['type'], $serverId, &$serverState, &$messages); + } + + $res .= '
    '; + $res .= '
    '; + $res .= '
    '; + $res .= $app->lng("monitor_serverstate_server_txt") . ': ' . $serverName . '
    '; + $res .= $app->lng("monitor_serverstate_state_txt") . ': ' . $serverState . '
    '; + // $res .= sizeof($messages[$app->lng("monitor_serverstate_listok_txt")]) . ' ok | '; + $res .= sizeof($messages[$app->lng("monitor_serverstate_listunknown_txt")]) . ' ' . $app->lng("monitor_serverstate_unknown_txt") . ' | '; + $res .= sizeof($messages[$app->lng("monitor_serverstate_listinfo_txt")]) . ' ' . $app->lng("monitor_serverstate_info_txt") . ' | '; + $res .= sizeof($messages[$app->lng("monitor_serverstate_listwarning_txt")]) . ' ' . $app->lng("monitor_serverstate_warning_txt") . ' | '; + $res .= sizeof($messages[$app->lng("monitor_serverstate_listcritical_txt")]) . ' ' . $app->lng("monitor_serverstate_critical_txt") . ' | '; + $res .= sizeof($messages[$app->lng("monitor_serverstate_listerror_txt")]) . ' ' . $app->lng("monitor_serverstate_error_txt") . '
    '; + $res .= '
    '; + + if ($showAll){ + /* + * if we have to show all, then we do it... + */ + + /* + * Show all messages + */ + foreach($messages as $key => $state){ + /* + * There is no need, to show the "ok" - messages + */ +// if ($key != 'ok') + { + $res .= $key . ':
    '; + foreach ($state as $msg) + { + $res .= $msg . '
    '; + } + $res .= '
    '; + } + } + } + else + { + /* + * if not, we only show a link to the server... + */ + $res .= "" . $app->lng("monitor_serverstate_moreinfo_txt") . ""; + } + $res .= '
    '; + $res .= '
    '; + $res .= '
    '; + + if ($showAll){ + /* + * Show some state-info + */ + //$res .= showServerLoad(); + //$res .= ' '. showDiskUsage(); + //$res .= ' '.showServices(); + } + + + return $res; +} + +/* + * gets the state from the db and process it + */ +function _processDbState($type, $serverId, $serverState, $messages) +{ + global $app; + + /* + * Always the NEWEST record of each monitoring is responsible for the + * state + */ + // get the State from the DB + $record = $app->db->queryOneRecord("SELECT state FROM monitor_data WHERE type = '" . $type . "' and server_id = " . $serverId . " order by created desc"); + // change the new state to the highest state + $serverState = _setState($serverState, $record['state']); + + /* + * The message depands on the type and the state + */ + if ($type == 'cpu_info'){ + /* this type has no state */ + } + if ($type == 'disk_usage'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_hdok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'info': + $messages[$app->lng("monitor_serverstate_listinfo_txt")][] = $app->lng("monitor_serverstate_hdgoingfull_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_hdnearlyfull_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'critical': + $messages[$app->lng("monitor_serverstate_listcritical_txt")][] = $app->lng("monitor_serverstate_hdveryfull_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_hdfull_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_hdunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + if ($type == 'mem_usage'){ + /* this type has no state */ + } + if ($type == 'server_load'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_loadok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'info': + $messages[$app->lng("monitor_serverstate_listinfo_txt")][] = $app->lng("monitor_serverstate_loadheavy_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_loadhigh_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'critical': + $messages[$app->lng("monitor_serverstate_listcritical_txt")][] = $app->lng("monitor_serverstate_loadhigher_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_loadhighest_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_loadunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + if ($type == 'services'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_servicesonline_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_servicesoffline_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_servicesunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + if ($type == 'system_update'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_updatesok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_updatesneeded_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'no_state': + /* + * not debian and not Ubuntu, so the state could not be monitored... + */ + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_updatesunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + + if ($type == 'raid_state'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_raidok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'info': + $messages[$app->lng("monitor_serverstate_listinfo_txt")][] = $app->lng("monitor_serverstate_raidresync_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'critical': + $messages[$app->lng("monitor_serverstate_listcritical_txt")][] = $app->lng("monitor_serverstate_raidfault_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_raiderror_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'no_state': + /* + * mdadm is not installed or the RAID is not supported... + */ + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_raidunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + + + if ($type == 'mailq'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_mailqok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'info': + $messages[$app->lng("monitor_serverstate_listinfo_txt")][] = $app->lng("monitor_serverstate_mailqheavy_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_mailqhigh_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'critical': + $messages[$app->lng("monitor_serverstate_listcritical_txt")][] = $app->lng("monitor_serverstate_mailqhigher_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_mailqhighest_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_mailqunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + + if ($type == 'sys_log'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_syslogok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_syslogwarning_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'error': + $messages[$app->lng("monitor_serverstate_listerror_txt")][] = $app->lng("monitor_serverstate_syslogerror_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_syslogunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + + if ($type == 'log_clamav'){ + /* this type has no state */ + } + + if ($type == 'log_freshclam'){ + switch ($record['state']) { + case 'ok': + $messages[$app->lng("monitor_serverstate_listok_txt")][] = $app->lng("monitor_serverstate_fclamok_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + case 'warning': + $messages[$app->lng("monitor_serverstate_listwarning_txt")][] = $app->lng("monitor_serverstate_fclamoutdated_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + default: + $messages[$app->lng("monitor_serverstate_listunknown_txt")][] = $app->lng("monitor_serverstate_fclamunknown_txt") . ' ' . + "[" . $app->lng("monitor_serverstate_more_txt") . "]"; + break; + } + } + + if ($type == 'log_ispconfig'){ + /* this type has no state */ + } + if ($type == 'log_mail'){ + /* this type has no state */ + } + if ($type == 'log_mail_err'){ + /* this type has no state */ + } + if ($type == 'log_mail_warn'){ + /* this type has no state */ + } + if ($type == 'log_messages'){ + /* this type has no state */ + } + if ($type == 'rkhunter'){ + /* this type has no state */ + } +} + + /* + * Set the state to the given level (or higher, but not lesser). + * * If the actual state is critical and you call the method with ok, + * then the state is critical. + * + * * If the actual state is critical and you call the method with error, + * then the state is error. + */ +function _setState($oldState, $newState) +{ + /* + * Calculate the weight of the old state + */ + switch ($oldState) { + case 'no_state': $oldInt = 0; + break; + case 'ok': $oldInt = 1; + break; + case 'unknown': $oldInt = 2; + break; + case 'info': $oldInt = 3; + break; + case 'warning': $oldInt = 4; + break; + case 'critical': $oldInt = 5; + break; + case 'error': $oldInt = 6; + break; + } + /* + * Calculate the weight of the new state + */ + switch ($newState) { + case 'no_state': $newInt = 0 ; + break; + case 'ok': $newInt = 1 ; + break; + case 'unknown': $newInt = 2 ; + break; + case 'info': $newInt = 3 ; + break; + case 'warning': $newInt = 4 ; + break; + case 'critical': $newInt = 5 ; + break; + case 'error': $newInt = 6 ; + break; + } + + /* + * Set to the higher level + */ + if ($newInt > $oldInt){ + return $newState; + } + else + { + return $oldState; + } +} + +?> diff --git a/interface/ispconfig/interface/monitor/templates/datalog_list.htm b/interface/ispconfig/interface/monitor/templates/datalog_list.htm new file mode 100644 index 000000000..93eede057 --- /dev/null +++ b/interface/ispconfig/interface/monitor/templates/datalog_list.htm @@ -0,0 +1,49 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
     
    {tmpl_var name="tstamp"}{tmpl_var name="server_id"}{tmpl_var name="action"}{tmpl_var name="dbtable"} +
    + +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/monitor/templates/show_data.htm b/interface/ispconfig/interface/monitor/templates/show_data.htm new file mode 100644 index 000000000..f83440fe4 --- /dev/null +++ b/interface/ispconfig/interface/monitor/templates/show_data.htm @@ -0,0 +1,12 @@ +

    +

    + +
    + +
    +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/monitor/templates/show_log.htm b/interface/ispconfig/interface/monitor/templates/show_log.htm new file mode 100644 index 000000000..b6077277c --- /dev/null +++ b/interface/ispconfig/interface/monitor/templates/show_log.htm @@ -0,0 +1,25 @@ +

    +

    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/monitor/templates/show_sys_state.htm b/interface/ispconfig/interface/monitor/templates/show_sys_state.htm new file mode 100644 index 000000000..904361cb1 --- /dev/null +++ b/interface/ispconfig/interface/monitor/templates/show_sys_state.htm @@ -0,0 +1,25 @@ +

    +

    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/monitor/templates/syslog_list.htm b/interface/ispconfig/interface/monitor/templates/syslog_list.htm new file mode 100644 index 000000000..0bbb03cfb --- /dev/null +++ b/interface/ispconfig/interface/monitor/templates/syslog_list.htm @@ -0,0 +1,56 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
     
    {tmpl_var name="tstamp"}{tmpl_var name="server_id"}{tmpl_var name="loglevel"}{tmpl_var name="message"} + + + + + + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/monitor/tools.inc.php b/interface/ispconfig/interface/monitor/tools.inc.php new file mode 100644 index 000000000..0001bd931 --- /dev/null +++ b/interface/ispconfig/interface/monitor/tools.inc.php @@ -0,0 +1,456 @@ +db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'server_load' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + if (strlen($data['up_minutes']) == "1") $data['up_minutes'] = "0".$data['up_minutes']; + $html = + '
    +
    + + + + + + + + + ' . + ' + + + + + + + + + + + +
    ' . $app->lng("Server online since").':' . $data['up_days'] . ' days, ' . $data['up_hours'] . ':' . $data['up_minutes'] . ' hours
    ' . $app->lng("Users online").':' . $data['user_online'] . '
    ' . $app->lng("System load 1 minute") . ':' . $data['load_1'] . '
    ' . $app->lng("System load 5 minutes") . ':' . $data['load_5'] . '
    '.$app->lng("System load 15 minutes").':' . $data['load_15'] . '
    +
    +
    '; + } else { + $html = '

    '.$app->lng("no_data_serverload_txt").'

    '; + } + + return $html; +} + +function showDiskUsage () { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'disk_usage' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html = + '
    +
    + + + + + + + + + + '; + foreach($data as $line) { + $html .= ''; + foreach ($line as $item) { + $html .= ''; + } + $html .= ''; + } + $html .= '
    '.$app->lng("monitor_diskusage_filesystem_txt").''.$app->lng("monitor_diskusage_type_txt").''.$app->lng("monitor_diskusage_size_txt").''.$app->lng("monitor_diskusage_used_txt").''.$app->lng("monitor_diskusage_available_txt").''.$app->lng("monitor_diskusage_usage_txt").''.$app->lng("monitor_diskusage_mounted_txt").'
    ' . $item . '
    '; + $html .= '
    '; + } else { + $html = '

    '.$app->lng("no_data_diskusage_txt").'

    '; + } + + + return $html; +} + +function showMemUsage () { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'mem_usage' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html = + '
    +
    + '; + + foreach($data as $key => $value){ + if ($key != '') { + $html .= ' + + + '; + } + } + $html .= '
    ' . $key . ':' . $value . '
    '; + $html .= '
    '; + + } else { + $html = '

    '.$app->lng("no_data_memusage_txt").'

    '; + } + + return $html; +} + +function showCpuInfo () { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'cpu_info' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html = + '
    +
    + '; + foreach($data as $key => $value){ + if ($key != '') { + $html .= ' + + + '; + } + } + $html .= '
    ' . $key . ':' . $value . '
    '; + $html .= '
    '; + } else { + $html = '

    '.$app->lng("no_data_cpuinfo_txt").'

    '; + } + + return $html; +} + +function showServices () { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'services' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + + /* + Format the data + */ + $html = + '
    +
    + '; + + if($data['webserver'] != -1) { + if($data['webserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + + if($data['ftpserver'] != -1) { + if($data['ftpserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + if($data['smtpserver'] != -1) { + if($data['smtpserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + if($data['pop3server'] != -1) { + if($data['pop3server'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + if($data['imapserver'] != -1) { + if($data['imapserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + if($data['bindserver'] != -1) { + if($data['bindserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + if($data['mysqlserver'] != -1) { + if($data['mysqlserver'] == 1) { + $status = ''.$app->lng("monitor_services_online_txt").''; + } else { + $status = ''.$app->lng("monitor_services_offline_txt").''; + } + $html .= ' + + + '; + } + + + $html .= '
    '.$app->lng("monitor_services_web_txt").''.$status.'
    '.$app->lng("monitor_services_ftp_txt").''.$status.'
    '.$app->lng("monitor_services_smtp_txt").''.$status.'
    '.$app->lng("monitor_services_pop_txt").''.$status.'
    '.$app->lng("monitor_services_imap_txt").''.$status.'
    '.$app->lng("monitor_services_mydns_txt").''.$status.'
    '.$app->lng("monitor_services_mysql_txt").''.$status.'
    '; + } else { + $html = '

    '.$app->lng("no_data_services_txt").'

    '; + } + + + return $html; +} + +function showSystemUpdate() { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'system_update' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $html = + '
    +
    '; + /* + * First, we have to detect, if there is any monitoring-data. + * If not (because the destribution is not supported) show this. + */ + if ($record['state'] == 'no_state'){ + $html .= '

    '.$app->lng("monitor_updates_nosupport_txt").'

    '; + } + else { + $data = unserialize($record['data']); + $html .= nl2br($data['output']); + } + $html .= '
    '; + } else { + $html = '

    '.$app->lng("no_data_updates_txt").'

    '; + } + + return $html; +} + +function showRaidState() { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'raid_state' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $html = + '
    +
    '; + + /* + * First, we have to detect, if there is any monitoring-data. + * If not (because the destribution is not supported) show this. + */ + if ($record['state'] == 'no_state'){ + $html .= '

    '.$app->lng("monitor_nomdadm_txt").'

    '; + } + else { + $data = unserialize($record['data']); + $html .= nl2br($data['output']); + } + $html .= '
    '; + + } else { + $html = '

    '.$app->lng("no_data_raid_txt").'

    '; + } + + return $html; +} + +function showRKHunter() { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'rkhunter' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $html = + '
    +
    '; + + /* + * First, we have to detect, if there is any monitoring-data. + * If not (because rkhunter is not installed) show this. + */ + $data = unserialize($record['data']); + if ($data['output'] == ''){ + $html .= '

    '.$app->lng("monitor_norkhunter_txt").'

    '; + } + else { + $html .= nl2br($data['output']); + } + $html .= '
    '; + + } else { + $html = '

    '.$app->lng("no_data_rkhunter_txt").'

    '; + } + + return $html; +} + +function showFail2ban() { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'log_fail2ban' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $html = + '
    +
    '; + + /* + * First, we have to detect, if there is any monitoring-data. + * If not (because fail2ban is not installed) show this. + */ + $data = unserialize($record['data']); + if ($data == ''){ + $html .= '

    '. + 'fail2ban is not installed at this server.
    ' . + 'See more (for debian) here...'. + '

    '; + } + else { + $html .= nl2br($data); + } + $html .= '
    '; + + } else { + $html = '

    There is no data available at the moment.

    '; + } + + return $html; +} + +function showMailq() { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT data, state FROM monitor_data WHERE type = 'mailq' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + if(isset($record['data'])) { + $data = unserialize($record['data']); + $html = nl2br($data['output']); + } else { + $html = '

    '.$app->lng("no_data_mailq_txt").'

    '; + } + + return $html; +} + +function getDataTime($type) { + global $app; + + /* fetch the Data from the DB */ + $record = $app->db->queryOneRecord("SELECT created FROM monitor_data WHERE type = '" . $type . "' and server_id = " . $_SESSION['monitor']['server_id'] . " order by created desc"); + + /* TODO: datetimeformat should be set somewhat other way */ + $dateTimeFormat = $app->lng("monitor_settings_datetimeformat_txt"); + + if(isset($record['created'])) { +// $res = date('Y-m-d H:i', $record['created']); + $res = date($dateTimeFormat, $record['created']); + } else { + $res = '????-??-?? ??:??'; + } + return $res; +} +?> diff --git a/interface/ispconfig/interface/mymodule/form/support_message.tform.php b/interface/ispconfig/interface/mymodule/form/support_message.tform.php new file mode 100644 index 000000000..638f6ae4a --- /dev/null +++ b/interface/ispconfig/interface/mymodule/form/support_message.tform.php @@ -0,0 +1,132 @@ + 0 id must match with id of current user +$form['auth_preset']['userid'] = 0; + + // 0 = default groupid of the user, > 0 id must match with groupid of current +$form['auth_preset']['groupid'] = 0; // user + +// Permissions with the following codes: r = read, i = insert, u = update, d = delete +$form['auth_preset']['perm_user'] = 'riud'; +$form['auth_preset']['perm_group'] = 'riud'; +$form['auth_preset']['perm_other'] = ''; + +// The form definition of the first tab. The name of the tab is called 'message'. We refer +// to this name in the $form['tab_default'] setting above. +$form['tabs']['message'] = array( + 'title' => 'Message', // Title of the Tab + 'width' => 100, // Tab width + 'template' => 'templates/support_message_edit.htm', // Template file name + 'fields' => array( + + //*** BEGIN Datatable columns ********************************** + + 'recipient_id' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array( + 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'validators' => array( 0 => array( 'type' => 'ISINT', + 'errmsg'=> 'recipient_id_is_not_integer' + ), + ), + 'value' => '' + ), + + 'sender_id' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array( + 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'validators' => array( 0 => array( 'type' => 'ISINT', + 'errmsg' => 'recipient_id_is_not_integer' + ), + ), + 'value' => '' + ), + + 'subject' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array( 0 => array( 'type' => 'NOTEMPTY', + 'errmsg'=> 'subject_is_empty' + ), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + + 'message' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXTAREA', + 'validators' => array( 0 => array( 'type' => 'NOTEMPTY', + 'errmsg'=> 'message_is_empty' + ), + ), + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10', + 'maxlength' => '255' + ), + + 'tstamp' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => time(), + 'value' => '', + 'width' => '30', + 'maxlength' => '30' + ), + + //*** END Datatable columns ********************************** + ) +); +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/lib/admin.conf.php b/interface/ispconfig/interface/mymodule/lib/admin.conf.php new file mode 100644 index 000000000..3e558caea --- /dev/null +++ b/interface/ispconfig/interface/mymodule/lib/admin.conf.php @@ -0,0 +1,7 @@ + diff --git a/interface/ispconfig/interface/mymodule/lib/mymodule.config.php b/interface/ispconfig/interface/mymodule/lib/mymodule.config.php new file mode 100644 index 000000000..3ff943166 --- /dev/null +++ b/interface/ispconfig/interface/mymodule/lib/mymodule.config.php @@ -0,0 +1,47 @@ + 'Send message', + 'target' => 'content', + 'link' => 'mymodule/support_message_edit.php' + ); + +// Add a menu item with the label 'View messages' +$items[] = array( 'title' => 'View messages', + 'target' => 'content', + 'link' => 'mymodule/support_message_list.php' + ); + +// Append the menu $items defined above to a menu section labeled 'Support' +$module['nav'][] = array( 'title' => 'Support', + 'open' => 1, + 'items' => $items + ); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/list/support_message.list.php b/interface/ispconfig/interface/mymodule/list/support_message.list.php new file mode 100644 index 000000000..e1fd4f50e --- /dev/null +++ b/interface/ispconfig/interface/mymodule/list/support_message.list.php @@ -0,0 +1,63 @@ + 'sender_id', + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'op' => '=', + 'prefix' => '', + 'suffix' => '', + 'width' => '', + 'datasource' => array( + 'type' => 'SQL', + 'querystring' => 'SELECT userid,username FROM sys_user WHERE {AUTHSQL} ORDER BY username', + 'keyfield' => 'userid', + 'valuefield' => 'username' + ), + 'value' => '' + ); + +$liste['item'][] = array( + 'field' => 'subject', + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'op' => 'like', + 'prefix' => '%', + 'suffix' => '%', + 'width' => '', + 'value' => '' + ); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/support_message_del.php b/interface/ispconfig/interface/mymodule/support_message_del.php new file mode 100644 index 000000000..a01ba1a73 --- /dev/null +++ b/interface/ispconfig/interface/mymodule/support_message_del.php @@ -0,0 +1,21 @@ +uses('tform_actions'); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/support_message_edit.php b/interface/ispconfig/interface/mymodule/support_message_edit.php new file mode 100644 index 000000000..8dee49689 --- /dev/null +++ b/interface/ispconfig/interface/mymodule/support_message_edit.php @@ -0,0 +1,33 @@ +uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +// Create a class page_action that extends the tform_actions base class +class page_action extends tform_actions { + + //* Customisations for the page actions will be defined here + +} + +// Create the new page object +$page = new page_action(); + +// Start the page rendering and action handling +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/support_message_list.php b/interface/ispconfig/interface/mymodule/support_message_list.php new file mode 100644 index 000000000..43cd9bc1f --- /dev/null +++ b/interface/ispconfig/interface/mymodule/support_message_list.php @@ -0,0 +1,24 @@ +uses('listform_actions'); + +// Optional limit +// $app->listform_actions->SQLExtWhere = 'type = 'alias''; + +// Start the form rendering and action ahndling +$app->listform_actions->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/mymodule/templates/support_message_edit.html b/interface/ispconfig/interface/mymodule/templates/support_message_edit.html new file mode 100644 index 000000000..6bd86f28f --- /dev/null +++ b/interface/ispconfig/interface/mymodule/templates/support_message_edit.html @@ -0,0 +1,14 @@ + + + + + + + + +
    TODO write content
    + + diff --git a/interface/ispconfig/interface/mymodule/templates/support_message_view.html b/interface/ispconfig/interface/mymodule/templates/support_message_view.html new file mode 100644 index 000000000..6bd86f28f --- /dev/null +++ b/interface/ispconfig/interface/mymodule/templates/support_message_view.html @@ -0,0 +1,14 @@ + + + + + + + + +
    TODO write content
    + + diff --git a/interface/ispconfig/interface/nav.php b/interface/ispconfig/interface/nav.php new file mode 100644 index 000000000..73a637172 --- /dev/null +++ b/interface/ispconfig/interface/nav.php @@ -0,0 +1,102 @@ +uses('tpl'); + +//** Top Naviation +if(isset($_GET['nav']) && $_GET['nav'] == 'top') { + + $app->tpl->newTemplate('topnav.tpl.htm'); + + //* Check User Login and current module + if(isset($_SESSION["s"]["user"]) && $_SESSION["s"]["user"]['active'] == 1 && is_array($_SESSION['s']['module'])) { + //* Loading modules of the user and building top navigation + $modules = explode(',', $_SESSION['s']['user']['modules']); + if(is_array($modules)) { + foreach($modules as $mt) { + if(is_file($mt.'/lib/module.conf.php')) { + if(!preg_match("/^[a-z]{2,20}$/i", $mt)) die('module name contains unallowed chars.'); + include_once($mt.'/lib/module.conf.php'); + $active = ($module['name'] == $_SESSION['s']['module']['name']) ? 1 : 0; + $topnav[] = array( 'title' => $app->lng($module['title']), + 'active' => $active, + 'module' => $module['name']); + } + } + } + } else { + //* Loading Login Module + include_once('login/lib/module.conf.php'); + $_SESSION['s']['module'] = $module; + $topnav[] = array( 'title' => 'Login', + 'active' => 1); + $module = null; + unset($module); + } + + //* Topnavigation + $app->tpl->setLoop('nav_top',$topnav); + +} + +//** Side Naviation +if(isset($_GET['nav']) && $_GET['nav'] == 'side') { + + $app->tpl->newTemplate('sidenav.tpl.htm'); + + //* translating module navigation + $nav_translated = array(); + if(isset($_SESSION['s']['module']['nav']) && is_array($_SESSION['s']['module']['nav'])) { + foreach($_SESSION['s']['module']['nav'] as $nav) { + $tmp_items = array(); + foreach($nav['items'] as $item) { + $item['title'] = $app->lng($item['title']); + $tmp_items[] = $item; + } + $nav['title'] = $app->lng($nav['title']); + $nav['startpage'] = $nav['items'][0]['link']; + $nav['items'] = $tmp_items; + $nav_translated[] = $nav; + } + } else { + $nav_translated = null; + } + + $app->tpl->setLoop('nav_left',$nav_translated); + +} + +$app->tpl_defaults(); +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/remote/index.php b/interface/ispconfig/interface/remote/index.php new file mode 100644 index 000000000..25ebc8f0b --- /dev/null +++ b/interface/ispconfig/interface/remote/index.php @@ -0,0 +1,15 @@ +load('remoting'); + +$server = new SoapServer(null, array('uri' => $_SERVER['REQUEST_URI'])); +$server->setClass('remoting'); +$server->handle(); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/robots.txt b/interface/ispconfig/interface/robots.txt new file mode 100644 index 000000000..61186cb25 --- /dev/null +++ b/interface/ispconfig/interface/robots.txt @@ -0,0 +1,2 @@ +User-Agent: * +Disallow: / \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/ajax_get_ip.php b/interface/ispconfig/interface/sites/ajax_get_ip.php new file mode 100644 index 000000000..603c82404 --- /dev/null +++ b/interface/ispconfig/interface/sites/ajax_get_ip.php @@ -0,0 +1,56 @@ +auth->check_module_permissions('sites'); + +$server_id = intval($_GET["server_id"]); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + + $sql = "SELECT ip_address FROM server_ip WHERE server_id = $server_id"; + $ips = $app->db->queryAllRecords($sql); + // $ip_select = ""; + $ip_select = "*"; + if(is_array($ips)) { + foreach( $ips as $ip) { + //$selected = ($ip["ip_address"] == $this->dataRecord["ip_address"])?'SELECTED':''; + $ip_select .= "#$ip[ip_address]"; + } + } + unset($tmp); + unset($ips); +} + +echo $ip_select; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/cron_del.php b/interface/ispconfig/interface/sites/cron_del.php new file mode 100644 index 000000000..516b4473b --- /dev/null +++ b/interface/ispconfig/interface/sites/cron_del.php @@ -0,0 +1,64 @@ +auth->check_module_permissions('sites'); + +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + if($app->tform->checkPerm($this->id,'d') == false) $app->error($app->lng('error_no_delete_permission')); + } +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/cron_edit.php b/interface/ispconfig/interface/sites/cron_edit.php new file mode 100644 index 000000000..6301fc910 --- /dev/null +++ b/interface/ispconfig/interface/sites/cron_edit.php @@ -0,0 +1,221 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions,validate_cron'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_cron')) { + $app->error($app->tform->wordbook["limit_cron_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_cron')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_cron_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + if($this->id > 0) { + //* we are editing a existing record + $app->tpl->setVar("edit_disabled", 1); + $app->tpl->setVar("parent_domain_id_value", $this->dataRecord["parent_domain_id"]); + } else { + $app->tpl->setVar("edit_disabled", 0); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_cron, limit_cron_type FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // When the record is updated + if($this->id > 0) { + // When the record is inserted + } else { + // Check if the user may add another cron job. + if($client["limit_cron"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM cron WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_cron"]) { + $app->error($app->tform->wordbook["limit_cron_txt"]); + } + } + } + } + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // Set fixed values + $this->dataRecord["server_id"] = $parent_domain["server_id"]; + + //* get type of command + $command = $this->dataRecord["command"]; + if(preg_match("'^http(s)?:\/\/'i", $command)) { + $this->dataRecord["type"] = 'url'; + } else { + $domain_owner = $app->db->queryOneRecord("SELECT limit_cron_type FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ".intval($parent_domain["sys_groupid"])); + if($domain_owner["limit_cron_type"] == 'full') $this->dataRecord["type"] = 'full'; + else $this->dataRecord["type"] = 'chrooted'; + } + + parent::onSubmit(); + } + + function onUpdateSave($sql) { + global $app; + + $has_error = false; + //* last chance to stop this, so check frequency limit! + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_cron_frequency FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + if($client["limit_cron_frequency"] > 1) { + if($app->tform->cron_min_freq < $client["limit_cron_frequency"]) { + $app->error($app->tform->wordbook["limit_cron_frequency_txt"]); + $has_error = true; + } + } + } + + if($has_error == true) { + parent::onError(); + exit; + } + else parent::onUpdateSave($sql); + } + + function onInsertSave($sql) { + global $app; + + $has_error = false; + //* last chance to stop this, so check frequency limit! + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_cron_frequency FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + if($client["limit_cron_frequency"] > 1) { + if($app->tform->cron_min_freq < $client["limit_cron_frequency"]) { + $app->error($app->tform->wordbook["limit_cron_frequency_txt"]); + $has_error = true; + } + } + } + + if($has_error == true) { + parent::onError(); + exit; + } else { + return parent::onInsertSave($sql); + } + } + + function onAfterInsert() { + global $app, $conf; + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"])); + $server_id = $web["server_id"]; + + // The cron shall be owned by the same group then the website + $sys_groupid = $web['sys_groupid']; + + $sql = "UPDATE shell_user SET server_id = $server_id, sys_groupid = '$sys_groupid' WHERE id = ".$this->id; + $app->db->query($sql); + } + + function onAfterUpdate() { + global $app, $conf; + + + } + + function getClientName() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the group-id of the user + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + } else { + // Get the group-id from the data itself + $web = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = ".intval($this->dataRecord['parent_domain_id'])); + $client_group_id = $web['sys_groupid']; + } + /* get the name of the client */ + $tmp = $app->db->queryOneRecord("SELECT name FROM sys_group WHERE groupid = " . $client_group_id); + $clientName = $tmp['name']; + if ($clientName == "") $clientName = 'default'; + $clientName = convertClientName($clientName); + + return $clientName; + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/cron_list.php b/interface/ispconfig/interface/sites/cron_list.php new file mode 100644 index 000000000..68e23163f --- /dev/null +++ b/interface/ispconfig/interface/sites/cron_list.php @@ -0,0 +1,23 @@ +auth->check_module_permissions('sites'); + +$app->uses('listform_actions'); + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/database_del.php b/interface/ispconfig/interface/sites/database_del.php new file mode 100644 index 000000000..aa958a180 --- /dev/null +++ b/interface/ispconfig/interface/sites/database_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('sites'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/database_edit.php b/interface/ispconfig/interface/sites/database_edit.php new file mode 100644 index 000000000..3b06bde96 --- /dev/null +++ b/interface/ispconfig/interface/sites/database_edit.php @@ -0,0 +1,338 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_database')) { + $app->error($app->tform->wordbook["limit_database_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_database')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_database_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf, $interfaceConf; + + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT default_dbserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Set the webserver to the default server of the client + $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_dbserver]"); + $app->tpl->setVar("server_id",""); + unset($tmp); + + } elseif ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client.client_id, limit_web_domain, default_webserver, contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Set the webserver to the default server of the client + $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]"); + $app->tpl->setVar("server_id",""); + unset($tmp); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY name"; + $clients = $app->db->queryAllRecords($sql); + $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']); + $client_select = ''; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } else { + + // The user is admin + if($this->id > 0) { + $server_id = $this->dataRecord["server_id"]; + } else { + // Get the first server ID + $tmp = $app->db->queryOneRecord("SELECT server_id FROM server WHERE web_server = 1 ORDER BY server_name LIMIT 0,1"); + $server_id = $tmp['server_id']; + } + + $sql = "SELECT ip_address FROM server_ip WHERE server_id = $server_id"; + $ips = $app->db->queryAllRecords($sql); + $ip_select = ""; + //$ip_select = ""; + if(is_array($ips)) { + foreach( $ips as $ip) { + $selected = ($ip["ip_address"] == $this->dataRecord["ip_address"])?'SELECTED':''; + $ip_select .= "\r\n"; + } + } + $app->tpl->setVar("ip_address",$ip_select); + unset($tmp); + unset($ips); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER BY name"; + $clients = $app->db->queryAllRecords($sql); + $client_select = ""; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } + + /* + * If the names are restricted -> remove the restriction, so that the + * data can be edited + */ + + //* Get the database name and database user prefix + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + $dbname_prefix = replacePrefix($global_config['dbname_prefix'], $this->dataRecord); + $dbuser_prefix = replacePrefix($global_config['dbuser_prefix'], $this->dataRecord); + + if ($this->dataRecord['database_name'] != ""){ + /* REMOVE the restriction */ + $app->tpl->setVar("database_name", str_replace($dbname_prefix , '', $this->dataRecord['database_name'])); + $app->tpl->setVar("database_user", str_replace($dbuser_prefix , '', $this->dataRecord['database_user'])); + } + + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $app->tpl->setVar("database_name_prefix", $global_config['dbname_prefix']); + $app->tpl->setVar("database_user_prefix", $global_config['dbuser_prefix']); + } else { + $app->tpl->setVar("database_name_prefix", $dbname_prefix); + $app->tpl->setVar("database_user_prefix", $dbuser_prefix); + } + + if($this->id > 0) { + //* we are editing a existing record + $app->tpl->setVar("edit_disabled", 1); + $app->tpl->setVar("server_id_value", $this->dataRecord["server_id"]); + $app->tpl->setVar("database_charset_value", $this->dataRecord["database_charset"]); + } else { + $app->tpl->setVar("edit_disabled", 0); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT default_dbserver, limit_database FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // When the record is updated + if($this->id > 0) { + // restore the server ID if the user is not admin and record is edited + $tmp = $app->db->queryOneRecord("SELECT server_id FROM web_database WHERE database_id = ".intval($this->id)); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + // When the record is inserted + } else { + // set the server ID to the default dbserver of the client + $this->dataRecord["server_id"] = $client["default_dbserver"]; + + + // Check if the user may add another database + if($client["limit_database"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(database_id) as number FROM web_database WHERE sys_groupid = $client_group_id"); + if($tmp["number"] >= $client["limit_database"]) { + $app->error($app->tform->wordbook["limit_database_txt"]); + } + } + + } + + // Clients may not set the client_group_id, so we unset them if user is not a admin and the client is not a reseller + if(!$app->auth->has_clients($_SESSION['s']['user']['userid'])) unset($this->dataRecord["client_group_id"]); + } + + + parent::onSubmit(); + } + + function onBeforeUpdate() { + global $app, $conf, $interfaceConf; + + /* + * If the names should be restricted -> do it! + */ + + + //* Get the database name and database user prefix + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + $dbname_prefix = replacePrefix($global_config['dbname_prefix'], $this->dataRecord); + $dbuser_prefix = replacePrefix($global_config['dbuser_prefix'], $this->dataRecord); + + //* Prevent that the database name and charset is changed + $old_record = $app->tform->getDataRecord($this->id); + if($old_record["database_name"] != $dbname_prefix . $this->dataRecord["database_name"]) { + $app->tform->errorMessage .= $app->tform->wordbook["database_name_change_txt"].'
    '; + } + if($old_record["database_charset"] != $this->dataRecord["database_charset"]) { + $app->tform->errorMessage .= $app->tform->wordbook["database_charset_change_txt"].'
    '; + } + + //* Database username and database name shall not be empty + if($this->dataRecord['database_name'] == '') $app->tform->errorMessage .= $app->tform->wordbook["database_name_error_empty"].'
    '; + if($this->dataRecord['database_user'] == '') $app->tform->errorMessage .= $app->tform->wordbook["database_user_error_empty"].'
    '; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + if($old_record["server_id"] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + } + unset($old_record); + + if(strlen($dbname_prefix . $this->dataRecord['database_name']) > 64) $app->tform->errorMessage .= str_replace('{db}',$dbname_prefix . $this->dataRecord['database_name'],$app->tform->wordbook["database_name_error_len"]).'
    '; + if(strlen($dbuser_prefix . $this->dataRecord['database_user']) > 16) $app->tform->errorMessage .= str_replace('{user}',$dbuser_prefix . $this->dataRecord['database_user'],$app->tform->wordbook["database_user_error_len"]).'
    '; + + if ($app->tform->errorMessage == ''){ + /* restrict the names if there is no error */ + /* crop user and db names if they are too long -> mysql: user: 16 chars / db: 64 chars */ + $this->dataRecord['database_name'] = substr($dbname_prefix . $this->dataRecord['database_name'], 0, 64); + $this->dataRecord['database_user'] = substr($dbuser_prefix . $this->dataRecord['database_user'], 0, 16); + } + + parent::onBeforeUpdate(); + } + + function onBeforeInsert() { + global $app, $conf, $interfaceConf; + + //* Database username and database name shall not be empty + if($this->dataRecord['database_name'] == '') $app->tform->errorMessage .= $app->tform->wordbook["database_name_error_empty"].'
    '; + if($this->dataRecord['database_user'] == '') $app->tform->errorMessage .= $app->tform->wordbook["database_user_error_empty"].'
    '; + + //* Get the database name and database user prefix + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + $dbname_prefix = replacePrefix($global_config['dbname_prefix'], $this->dataRecord); + $dbuser_prefix = replacePrefix($global_config['dbuser_prefix'], $this->dataRecord); + + if(strlen($dbname_prefix . $this->dataRecord['database_name']) > 64) $app->tform->errorMessage .= str_replace('{db}',$dbname_prefix . $this->dataRecord['database_name'],$app->tform->wordbook["database_name_error_len"]).'
    '; + if(strlen($dbuser_prefix . $this->dataRecord['database_user']) > 16) $app->tform->errorMessage .= str_replace('{user}',$dbuser_prefix . $this->dataRecord['database_user'],$app->tform->wordbook["database_user_error_len"]).'
    '; + + + /* restrict the names */ + /* crop user and db names if they are too long -> mysql: user: 16 chars / db: 64 chars */ + if ($app->tform->errorMessage == ''){ + $this->dataRecord['database_name'] = substr($dbname_prefix . $this->dataRecord['database_name'], 0, 64); + $this->dataRecord['database_user'] = substr($dbuser_prefix . $this->dataRecord['database_user'], 0, 16); + } + + parent::onBeforeInsert(); + } + + function onAfterInsert() { + global $app, $conf; + + // make sure that the record belongs to the clinet group and not the admin group when a dmin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_database SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE database_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_database SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE database_id = ".$this->id); + } + } + + function onAfterUpdate() { + global $app, $conf; + + // make sure that the record belongs to the client group and not the admin group when a admin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_database SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE database_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_database SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE database_id = ".$this->id); + } + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/database_list.php b/interface/ispconfig/interface/sites/database_list.php new file mode 100644 index 000000000..d04284368 --- /dev/null +++ b/interface/ispconfig/interface/sites/database_list.php @@ -0,0 +1,73 @@ +auth->check_module_permissions('sites'); + +$app->load('listform_actions'); + + +class list_action extends listform_actions { + + function onShow() { + global $app,$conf; + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + + if($global_config['dblist_phpmyadmin_link'] == 'y') { + $app->tpl->setVar('dblist_phpmyadmin_link',1); + } else { + $app->tpl->setVar('dblist_phpmyadmin_link',0); + } + + parent::onShow(); + } + +} + +$list = new list_action; +$list->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/database_phpmyadmin.php b/interface/ispconfig/interface/sites/database_phpmyadmin.php new file mode 100644 index 000000000..1dc153012 --- /dev/null +++ b/interface/ispconfig/interface/sites/database_phpmyadmin.php @@ -0,0 +1,70 @@ +auth->check_module_permissions('sites'); + +/* + * get the id of the database (must be int!) + */ +if (!isset($_GET['id'])){ + die ("No DB selected!"); +} +$databaseId = intval($_GET['id']); + +/* + * Get the data to connect to the database + */ +$dbData = $app->db->queryOneRecord("SELECT server_id FROM web_database WHERE database_id = " . $databaseId); +$serverId = intval($dbData['server_id']); +if ($serverId == 0){ + die ("No DB-Server found!"); +} +$serverData = $app->db->queryOneRecord( + "SELECT server_name FROM server WHERE server_id = " . + $serverId); + +$app->uses('getconf'); +$global_config = $app->getconf->get_global_config('sites'); + +/* + * We only redirect to the login-form, so there is no need, to check any rights + */ +if($global_config['phpmyadmin_url'] != '') { + header('Location:'.$global_config['phpmyadmin_url']); +} else { + isset($_SERVER['HTTPS'])? $http = 'https' : $http = 'http'; + header('location:' . $http . '://' . $serverData['server_name'] . '/phpmyadmin'); +} +exit; +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/cron.tform.php b/interface/ispconfig/interface/sites/form/cron.tform.php new file mode 100644 index 000000000..2440271a2 --- /dev/null +++ b/interface/ispconfig/interface/sites/form/cron.tform.php @@ -0,0 +1,189 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['cron'] = array ( + 'title' => "Cron Job", + 'width' => 100, + 'template' => "templates/cron_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND web_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'server_id_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'run_min' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'run_time_format', + 'errmsg'=> 'run_min_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'run_hour' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'run_time_format', + 'errmsg'=> 'run_hour_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'run_mday' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'run_time_format', + 'errmsg'=> 'run_mday_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'run_month' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'run_time_format', + 'errmsg'=> 'run_month_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'run_wday' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'run_time_format', + 'errmsg'=> 'run_wday_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'command' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'command_error_empty'), + 1 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_cron', + 'function' => 'command_format', + 'errmsg'=> 'command_error_format'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'url', + 'valuelimit' => 'list:url,full,chrooted', + 'value' => array('url' => 'Url', 'full' => 'Full', 'chrooted' => 'Chrooted') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/database.tform.php b/interface/ispconfig/interface/sites/form/database.tform.php new file mode 100644 index 000000000..a7e30452d --- /dev/null +++ b/interface/ispconfig/interface/sites/form/database.tform.php @@ -0,0 +1,155 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['database'] = array ( + 'title' => "Database", + 'width' => 100, + 'template' => "templates/database_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} AND db_server = 1 ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('mysql' => 'MySQL') + ), + 'database_name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'database_name_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'database_name_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9_]{2,64}$/', + 'errmsg'=> 'database_name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'database_user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'database_user_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'database_user_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9_]{2,64}$/', + 'errmsg'=> 'database_user_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'database_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'database_charset' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('' => 'DB-Default','latin1' => 'Latin 1','utf8' => 'UTF-8') + ), + 'remote_access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + 'remote_ips' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_database', + 'function' => 'valid_ip_list', + 'errmsg' => 'database_remote_error_ips'), + ), + 'default' => '', + 'value' => '', + 'width' => '60' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/ftp_user.tform.php b/interface/ispconfig/interface/sites/form/ftp_user.tform.php new file mode 100644 index 000000000..2b65c8531 --- /dev/null +++ b/interface/ispconfig/interface/sites/form/ftp_user.tform.php @@ -0,0 +1,253 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['ftp'] = array ( + 'title' => "FTP User", + 'width' => 100, + 'template' => "templates/ftp_user_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'username_error_unique'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'username_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption' => 'CRYPT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'quota_size' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'quota_size_error_empty'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + +$form["tabs"]['advanced'] = array ( + 'title' => "Options", + 'width' => 100, + 'template' => "templates/ftp_user_advanced.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'uid' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'uid_error_empty'), + ), + 'default' => '0', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'gid' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'uid_error_empty'), + ), + 'default' => '0', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'directory_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'quota_files' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'ul_ratio' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'dl_ratio' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'ul_bandwidth' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'dl_bandwidth' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} else { + +$form["tabs"]['advanced'] = array ( + 'title' => "Options", + 'width' => 100, + 'template' => "templates/ftp_user_advanced_client.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'directory_error_empty'), + 1 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_ftpuser', + 'function' => 'ftp_dir', + 'errmsg' => 'directory_error_notinweb'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/shell_user.tform.php b/interface/ispconfig/interface/sites/form/shell_user.tform.php new file mode 100644 index 000000000..cd4dadff6 --- /dev/null +++ b/interface/ispconfig/interface/sites/form/shell_user.tform.php @@ -0,0 +1,196 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['shell'] = array ( + 'title' => "Shell User", + 'width' => 100, + 'template' => "templates/shell_user_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'username' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'username_error_unique'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{0,64}$/', + 'errmsg'=> 'username_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption' => 'CRYPT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'chroot' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'valuelimit' => 'client:ssh_chroot', + 'value' => array('no' => 'None', 'jailkit' => 'Jailkit') + ), + 'quota_size' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'quota_size_error_empty'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + +$form["tabs"]['advanced'] = array ( + 'title' => "Options", + 'width' => 100, + 'template' => "templates/shell_user_advanced.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'puser' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'uid_error_empty'), + ), + 'default' => '0', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'pgroup' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'uid_error_empty'), + ), + 'default' => '0', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'shell' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/bin/bash', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'dir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'directory_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/web_aliasdomain.tform.php b/interface/ispconfig/interface/sites/form/web_aliasdomain.tform.php new file mode 100644 index 000000000..1a8dc0b61 --- /dev/null +++ b/interface/ispconfig/interface/sites/form/web_aliasdomain.tform.php @@ -0,0 +1,142 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['domain'] = array ( + 'title' => "Domain", + 'width' => 100, + 'template' => "templates/web_aliasdomain_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('vhost' => 'Site', 'alias' => 'Alias', 'subdomain' => 'Subdomain') + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'redirect_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('' => 'No redirect', 'no' => 'No flag', 'R' => 'R', 'L' => 'L', 'R,L' => 'R,L') + ), + 'redirect_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '@^(([.]{0})|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.\-\,\+\?]*(\?\S+)?)?)?)|(/[\w/_\.\-]{1,255}/))$@', + 'errmsg'=> 'redirect_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'subdomain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('none' => 'none', 'www' => 'www.', '*' => '*.') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/web_domain.tform.php b/interface/ispconfig/interface/sites/form/web_domain.tform.php new file mode 100644 index 000000000..a91e7fb29 --- /dev/null +++ b/interface/ispconfig/interface/sites/form/web_domain.tform.php @@ -0,0 +1,463 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +// Clients may not change the website basic settings if they are not resellers +if($app->auth->has_clients($_SESSION['s']['user']['userid']) || $app->auth->is_admin()) { + $web_domain_edit_readonly = false; +} else { + $web_domain_edit_readonly = true; +} + + +$form["tabs"]['domain'] = array ( + 'title' => "Domain", + 'width' => 100, + 'template' => "templates/web_domain_edit.htm", + 'readonly' => $web_domain_edit_readonly, + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND web_server = 1 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'ip_address' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT ip_address,ip_address FROM server_ip WHERE {AUTHSQL} ORDER BY ip_address', + 'keyfield'=> 'ip_address', + 'valuefield'=> 'ip_address' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('vhost' => 'Site', 'alias' => 'Alias') + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'site' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'vhost_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('name' => 'Namebased', 'ip' => 'IP-Based') + ), + 'hd_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'hd_quota_error_empty'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'traffic_quota' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'traffic_quota_error_empty'), + ), + 'default' => '-1', + 'value' => '', + 'width' => '7', + 'maxlength' => '7' + ), + 'cgi' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'ssi' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'suexec' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'errordocs' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'CHECKBOX', + 'default' => '1', + 'value' => array(0 => '0',1 => '1') + ), + 'subdomain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('none' => 'none', 'www' => 'www.', '*' => '*.') + ), + 'ssl' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'php' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'fast-cgi', + 'valuelimit' => 'client:web_php_options', + 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP') + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +$form["tabs"]['redirect'] = array ( + 'title' => "Redirect", + 'width' => 100, + 'template' => "templates/web_domain_redirect.htm", + 'readonly' => false, + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'redirect_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('' => 'No redirect', 'no' => 'No flag', 'R' => 'R', 'L' => 'L', 'R,L' => 'R,L') + ), + 'redirect_path' => array ( + 'datatype' => 'VARCHAR', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '@^(([.]{0})|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.\,\-\+\?]*(\?\S+)?)?)?)|(/[\w/_\.\-]{1,255}/))$@', + 'errmsg'=> 'redirect_error_regex'), + ), + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +$form["tabs"]['ssl'] = array ( + 'title' => "SSL", + 'width' => 100, + 'template' => "templates/web_domain_ssl.htm", + 'readonly' => false, + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'ssl_state' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(([.]{0})|([a-zA-Z0-9\ \.\-\_\,]{1,255}))$/', + 'errmsg'=> 'ssl_state_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ssl_locality' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(([.]{0})|([a-zA-Z0-9\ \.\-\_\,]{1,255}))$/', + 'errmsg'=> 'ssl_locality_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ssl_organisation' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(([.]{0})|([a-zA-Z0-9\ \.\-\_\,]{1,255}))$/', + 'errmsg'=> 'ssl_organisation_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ssl_organisation_unit' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(([.]{0})|([a-zA-Z0-9\ \.\-\_\,]{1,255}))$/', + 'errmsg'=> 'ssl_organistaion_unit_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ssl_country' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(([.]{0})|([A-Z]{2,2}))$/', + 'errmsg'=> 'ssl_country_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '2', + 'maxlength' => '2' + ), + 'ssl_domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ssl_request' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10' + ), + 'ssl_cert' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10' + ), + 'ssl_bundle' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10' + ), + 'ssl_action' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('' => 'None', 'save' => 'Save Certificate', 'create' => 'Create Certificate','del' => 'Delete Certificate') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +//* Statistics +$form["tabs"]['stats'] = array ( + 'title' => "Stats", + 'width' => 100, + 'template' => "templates/web_domain_stats.htm", + 'readonly' => false, + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'stats_password' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption' => 'CRYPT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + +$form["tabs"]['advanced'] = array ( + 'title' => "Options", + 'width' => 100, + 'template' => "templates/web_domain_advanced.htm", + 'readonly' => false, + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'document_root' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'documentroot_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'system_user' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'sysuser_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'system_group' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'sysgroup_error_empty'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'allow_override' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'allow_override_error_empty'), + ), + 'default' => 'All', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'php_open_basedir' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'php_open_basedir_error_empty'), + ), + 'default' => 'All', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'apache_directives' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + +} + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/form/web_subdomain.tform.php b/interface/ispconfig/interface/sites/form/web_subdomain.tform.php new file mode 100644 index 000000000..b6b1a3c29 --- /dev/null +++ b/interface/ispconfig/interface/sites/form/web_subdomain.tform.php @@ -0,0 +1,136 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['domain'] = array ( + 'title' => "Domain", + 'width' => 100, + 'template' => "templates/web_subdomain_edit.htm", + 'fields' => array ( + ################################## + # Begin Datatable fields + ################################## + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('vhost' => 'Site', 'alias' => 'Alias', 'subdomain' => 'Subdomain') + ), + 'parent_domain_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'value' => '' + ), + 'redirect_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'y', + 'value' => array('' => 'No redirect', 'no' => 'No flag', 'R' => 'R', 'L' => 'L', 'R,L' => 'R,L') + ), + 'redirect_path' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '@^(([.]{0})|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.\-\,\+\?]*(\?\S+)?)?)?)|(/[\w/_\.\-]{1,255}/))$@', + 'errmsg'=> 'redirect_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), + ################################## + # ENDE Datatable fields + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/ftp_user_del.php b/interface/ispconfig/interface/sites/ftp_user_del.php new file mode 100644 index 000000000..479e19a97 --- /dev/null +++ b/interface/ispconfig/interface/sites/ftp_user_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('sites'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/ftp_user_edit.php b/interface/ispconfig/interface/sites/ftp_user_edit.php new file mode 100644 index 000000000..9823813e6 --- /dev/null +++ b/interface/ispconfig/interface/sites/ftp_user_edit.php @@ -0,0 +1,209 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_ftp_user')) { + $app->error($app->tform->wordbook["limit_ftp_user_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_ftp_user')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_ftp_user_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf, $interfaceConf; + /* + * If the names are restricted -> remove the restriction, so that the + * data can be edited + */ + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + // $ftpuser_prefix = ($global_config['ftpuser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['ftpuser_prefix']); + $ftpuser_prefix = replacePrefix($global_config['ftpuser_prefix'], $this->dataRecord); + + if ($this->dataRecord['username'] != ""){ + /* REMOVE the restriction */ + $app->tpl->setVar("username", str_replace($ftpuser_prefix , '', $this->dataRecord['username'])); + } + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $app->tpl->setVar("username_prefix", $global_config['ftpuser_prefix']); + } + else { + $app->tpl->setVar("username_prefix", $ftpuser_prefix); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // Set a few fixed values + $this->dataRecord["server_id"] = $parent_domain["server_id"]; + + //die(print_r($this->dataRecord)); + + if(isset($this->dataRecord['username']) && trim($this->dataRecord['username']) == '') $app->tform->errorMessage .= $app->tform->lng('username_error_empty').'
    '; + if(isset($this->dataRecord['username']) && empty($this->dataRecord['parent_domain_id'])) $app->tform->errorMessage .= $app->tform->lng('parent_domain_id_error_empty').'
    '; + + parent::onSubmit(); + } + + function onBeforeInsert() { + global $app, $conf, $interfaceConf; + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + //$ftpuser_prefix = ($global_config['ftpuser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['ftpuser_prefix']); + $ftpuser_prefix = replacePrefix($global_config['ftpuser_prefix'], $this->dataRecord); + + if ($app->tform->errorMessage == '') { + $this->dataRecord['username'] = $ftpuser_prefix . $this->dataRecord['username']; + } + + parent::onBeforeInsert(); + } + + function onAfterInsert() { + global $app, $conf; + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"])); + $server_id = $web["server_id"]; + $dir = $web["document_root"]; + $uid = $web["system_user"]; + $gid = $web["system_group"]; + + // The FTP user shall be owned by the same group then the website + $sys_groupid = $web['sys_groupid']; + + $sql = "UPDATE ftp_user SET server_id = $server_id, dir = '$dir', uid = '$uid', gid = '$gid', sys_groupid = '$sys_groupid' WHERE ftp_user_id = ".$this->id; + $app->db->query($sql); + + + } + + function onBeforeUpdate() { + global $app, $conf, $interfaceConf; + + /* + * If the names should be restricted -> do it! + */ + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + //$ftpuser_prefix = ($global_config['ftpuser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['ftpuser_prefix']); + $ftpuser_prefix = replacePrefix($global_config['ftpuser_prefix'], $this->dataRecord); + + /* restrict the names */ + if ($app->tform->errorMessage == '') { + $this->dataRecord['username'] = $ftpuser_prefix . $this->dataRecord['username']; + } + } + + function onAfterUpdate() { + global $app, $conf; + + //* When the site of the FTP user has been changed + if($this->oldDataRecord['parent_domain_id'] != $this->dataRecord['parent_domain_id']) { + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"])); + $server_id = $web["server_id"]; + $dir = $web["document_root"]; + $uid = $web["system_user"]; + $gid = $web["system_group"]; + + // The FTP user shall be owned by the same group then the website + $sys_groupid = $web['sys_groupid']; + + $sql = "UPDATE ftp_user SET server_id = $server_id, dir = '$dir', uid = '$uid', gid = '$gid', sys_groupid = '$sys_groupid' WHERE ftp_user_id = ".$this->id; + $app->db->query($sql); + } + + } + + function getClientName() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + // Get the group-id of the user + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + } else { + // Get the group-id from the data itself + $web = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = ".intval($this->dataRecord['parent_domain_id'])); + $client_group_id = $web['sys_groupid']; + } + /* get the name of the client */ + $tmp = $app->db->queryOneRecord("SELECT name FROM sys_group WHERE groupid = " . $client_group_id); + $clientName = $tmp['name']; + if ($clientName == "") $clientName = 'default'; + $clientName = convertClientName($clientName); + return $clientName; + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/ftp_user_list.php b/interface/ispconfig/interface/sites/ftp_user_list.php new file mode 100644 index 000000000..2daaf6b5d --- /dev/null +++ b/interface/ispconfig/interface/sites/ftp_user_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('sites'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +//$app->listform_actions->SQLExtWhere = "type = 'subdomain'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/admin.conf.php b/interface/ispconfig/interface/sites/lib/admin.conf.php new file mode 100644 index 000000000..a45d44034 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/admin.conf.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/bg.lng b/interface/ispconfig/interface/sites/lib/lang/bg.lng new file mode 100644 index 000000000..96c4d23e4 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_cron.lng b/interface/ispconfig/interface/sites/lib/lang/bg_cron.lng new file mode 100644 index 000000000..fecb4ab45 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_cron_list.lng new file mode 100644 index 000000000..ad56ea956 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_database.lng b/interface/ispconfig/interface/sites/lib/lang/bg_database.lng new file mode 100644 index 000000000..36a772a9e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_database_list.lng new file mode 100644 index 000000000..4ca18c1fd --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user.lng new file mode 100644 index 000000000..7627ad7d6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user_list.lng new file mode 100644 index 000000000..b5663c545 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/bg_shell_user.lng new file mode 100644 index 000000000..5e7541320 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_shell_user_list.lng new file mode 100644 index 000000000..254095ecd --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_aliasdomain_list.lng new file mode 100644 index 000000000..c30d559a2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_domain.lng new file mode 100644 index 000000000..d705cb4bf --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_domain_list.lng new file mode 100644 index 000000000..57d63e561 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_sites_stats_list.lng new file mode 100644 index 000000000..b217f80cc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain.lng new file mode 100644 index 000000000..265bb171f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain_list.lng new file mode 100644 index 000000000..d08e40579 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/bg_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br.lng b/interface/ispconfig/interface/sites/lib/lang/br.lng new file mode 100644 index 000000000..f78b138b7 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_cron.lng b/interface/ispconfig/interface/sites/lib/lang/br_cron.lng new file mode 100644 index 000000000..f0739c6d7 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_cron_list.lng new file mode 100644 index 000000000..b974f0fb1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_database.lng b/interface/ispconfig/interface/sites/lib/lang/br_database.lng new file mode 100644 index 000000000..a0f3d6847 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_database.lng @@ -0,0 +1,25 @@ +quaisquer ips)'; +$wb['database_remote_error_ips'] = 'Pelo menos um dos endereços ip informados não é válido.'; +$wb['database_name_error_len'] = 'Nome do banco de dados - {db} - é muito longo. 64 caracteres é o número máximo permitido incluindo prefixo.'; +$wb['database_user_error_len'] = 'Nome de usuário de banco - {user}- é muito longo. 16 caracteres é o número máximo permitido incluindo prefixo.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/br_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_database_list.lng new file mode 100644 index 000000000..449baa8bb --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_database_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/br_ftp_user.lng new file mode 100644 index 000000000..e24355fb4 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_ftp_user_list.lng new file mode 100644 index 000000000..a9540c9cd --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/br_shell_user.lng new file mode 100644 index 000000000..2a99587eb --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_shell_user_list.lng new file mode 100644 index 000000000..512f9fe83 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_aliasdomain_list.lng new file mode 100644 index 000000000..f9dbfa277 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_domain.lng new file mode 100644 index 000000000..5f8321faf --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_domain_list.lng new file mode 100644 index 000000000..dc5200387 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_sites_stats_list.lng new file mode 100644 index 000000000..903c90571 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain.lng new file mode 100644 index 000000000..0a63c460d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain_list.lng new file mode 100644 index 000000000..83511672a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/br_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de.lng b/interface/ispconfig/interface/sites/lib/lang/de.lng new file mode 100644 index 000000000..d921ad4d8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_cron.lng b/interface/ispconfig/interface/sites/lib/lang/de_cron.lng new file mode 100644 index 000000000..f002b126a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_cron_list.lng new file mode 100644 index 000000000..9778e9fa9 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_database.lng b/interface/ispconfig/interface/sites/lib/lang/de_database.lng new file mode 100644 index 000000000..f604997ba --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_database.lng @@ -0,0 +1,25 @@ +alle)'; +$wb['database_remote_error_ips'] = 'Mindestens eine der eingegebenen IP Adressen ist ungültig.'; +$wb['client_txt'] = 'Kunde'; +$wb['active_txt'] = 'Aktiv'; +$wb['database_name_error_empty'] = 'Datenbankname ist leer.'; +$wb['database_name_error_unique'] = 'Es existiert bereits eine Datenbank mit diesem Namen am Server. Um einen eindeutigen Namen zu erhalten können sie z.B. den Domainnamen vor dem Datenbanknamen verwenden.'; +$wb['database_name_error_regex'] = 'Ungültiger Datenbankname. Der Datenbankname darf die Zeichen: a-z, A-Z, 0-9 und den Unterstrich beinhalten. Länge: 2 - 64 Zeichen.'; +$wb['database_user_error_empty'] = 'Datenbank Benutzer ist leer.'; +$wb['database_user_error_unique'] = 'Es existiert bereits ein Benutzer mit diesem Namen am Server. Um einen eindeutigen Namen zu erhalten können sie z.B. den Domainnamen vor dem Benutzernamen verwenden.'; +$wb['database_user_error_regex'] = 'Ungültiger Benutzername. Der Benutzername darf die Zeichen: a-z, A-Z, 0-9 und den Unterstrich beinhalten. Länge: 2 - 64 Zeichen.'; +$wb['limit_database_txt'] = 'Die maximale Anzahl an Datenbanken wurde erreicht.'; +$wb['database_name_change_txt'] = 'Der Datenbankname kann nicht geändert werden.'; +$wb['database_charset_change_txt'] = 'Der Zeichensatz der Datenbank kann nicht geändert werden.'; +$wb['password_strength_txt'] = 'Passwortkomplexität'; +$wb['database_name_error_len'] = 'Datenbank Name - {db} - zu lang. Die max. Datenbank Namen Länge inkl. Präfix ist 64 Zeichen.'; +$wb['database_user_error_len'] = 'Datenbank Benutzername - {user}- zu lang. Die max. Datenbank Benutzernamen Länge inkl. Präfix ist 16 Zeichen.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/de_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_database_list.lng new file mode 100644 index 000000000..b34ac4e69 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/de_ftp_user.lng new file mode 100644 index 000000000..dcd8b0291 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_ftp_user_list.lng new file mode 100644 index 000000000..a2d162c0b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/de_shell_user.lng new file mode 100644 index 000000000..92589ee77 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_shell_user_list.lng new file mode 100644 index 000000000..cd822899c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_aliasdomain_list.lng new file mode 100644 index 000000000..98fb1a3e7 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_domain.lng new file mode 100644 index 000000000..d8cbfcd94 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_domain_list.lng new file mode 100644 index 000000000..71f0e0ae6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_sites_stats_list.lng new file mode 100644 index 000000000..660abfb25 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain.lng new file mode 100644 index 000000000..8b1fa8ddd --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain_list.lng new file mode 100644 index 000000000..ba4fc6dad --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/de_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/en.lng b/interface/ispconfig/interface/sites/lib/lang/en.lng new file mode 100644 index 000000000..36c63bc5b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en.lng @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_cron.lng b/interface/ispconfig/interface/sites/lib/lang/en_cron.lng new file mode 100644 index 000000000..8cb7f08e6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_cron.lng @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_cron_list.lng new file mode 100644 index 000000000..b5c8d1566 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_cron_list.lng @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_database.lng b/interface/ispconfig/interface/sites/lib/lang/en_database.lng new file mode 100644 index 000000000..48d7ea3b1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb["database_remote_error_ips"] = 'At least one of the entered ip addresses is invalid.'; +$wb["client_txt"] = 'Client'; +$wb["active_txt"] = 'Active'; +$wb["database_name_error_empty"] = 'Database name is empty.'; +$wb["database_name_error_unique"] = 'There is already a database with this name on the server. To get a unique name, e.g. prepend your domain name to the database name.'; +$wb["database_name_error_regex"] = 'Invalid database name. The database name may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["database_user_error_empty"] = 'Database user is empty.'; +$wb["database_user_error_unique"] = 'There is already a database user with this name on the server. To get a unique name, e.g. prepend your domain name to the username.'; +$wb["database_user_error_regex"] = 'Invalid database user name. The username may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["limit_database_txt"] = 'The max. number of databases is reached.'; +$wb["database_name_change_txt"] = 'The database name can not be changed'; +$wb["database_charset_change_txt"] = 'The database charset can not be changed'; +$wb["database_name_error_len"] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb["database_user_error_len"] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/en_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_database_list.lng new file mode 100644 index 000000000..ff599d270 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_database_list.lng @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/en_ftp_user.lng new file mode 100644 index 000000000..f5b111639 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_ftp_user.lng @@ -0,0 +1,28 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/en_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_ftp_user_list.lng new file mode 100644 index 000000000..2c4f87f72 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_ftp_user_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/en_shell_user.lng new file mode 100644 index 000000000..80e3e0a4f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_shell_user.lng @@ -0,0 +1,23 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/en_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_shell_user_list.lng new file mode 100644 index 000000000..5b6f613d6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_shell_user_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_aliasdomain_list.lng new file mode 100644 index 000000000..3945d2316 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_domain.lng new file mode 100644 index 000000000..b26014db9 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_domain.lng @@ -0,0 +1,61 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_domain_list.lng new file mode 100644 index 000000000..493350e85 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_domain_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_sites_stats_list.lng new file mode 100644 index 000000000..20f018b82 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain.lng new file mode 100644 index 000000000..6bd3b0895 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain.lng @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain_list.lng new file mode 100644 index 000000000..8273dbd06 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/en_web_subdomain_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/es.lng b/interface/ispconfig/interface/sites/lib/lang/es.lng new file mode 100644 index 000000000..29ce8ded6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_cron.lng b/interface/ispconfig/interface/sites/lib/lang/es_cron.lng new file mode 100644 index 000000000..cce69f3f8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_cron_list.lng new file mode 100644 index 000000000..f2d2ce4e8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_database.lng b/interface/ispconfig/interface/sites/lib/lang/es_database.lng new file mode 100644 index 000000000..70df8eed1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_database.lng @@ -0,0 +1,25 @@ +cualquiera)'; +$wb['database_remote_error_ips'] = 'Al menos una de las IP introducidas no es válida.'; +$wb['database_name_error_len'] = 'El nombre de la base de datos - {db} - es demasiado largo. La longitud máxima del nombre de la base de datos, incluyendo el prefijo, es de 64 caracteres.'; +$wb['database_user_error_len'] = 'El nombre de usuario de la base de datos - {user}- es demasiado largo. La longitud máxima del nombre de usuario de la base de datos, incluyendo el prefijo, es de 16 caracteres.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/es_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_database_list.lng new file mode 100644 index 000000000..66fcbdcaf --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/es_ftp_user.lng new file mode 100644 index 000000000..efa6f3307 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_ftp_user_list.lng new file mode 100644 index 000000000..c96552304 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/es_shell_user.lng new file mode 100644 index 000000000..6bafd7073 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_shell_user_list.lng new file mode 100644 index 000000000..a64cc4e55 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_aliasdomain_list.lng new file mode 100644 index 000000000..a383b3d01 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_domain.lng new file mode 100644 index 000000000..feaa5323a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_domain_list.lng new file mode 100644 index 000000000..f0248c5fe --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_sites_stats_list.lng new file mode 100644 index 000000000..8c31b6fc5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain.lng new file mode 100644 index 000000000..0b799ccd2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain_list.lng new file mode 100644 index 000000000..2b3afa50e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/es_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi.lng b/interface/ispconfig/interface/sites/lib/lang/fi.lng new file mode 100644 index 000000000..4e6e6b612 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_cron.lng b/interface/ispconfig/interface/sites/lib/lang/fi_cron.lng new file mode 100644 index 000000000..648b85c6c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_cron_list.lng new file mode 100644 index 000000000..b5072ec89 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_database.lng b/interface/ispconfig/interface/sites/lib/lang/fi_database.lng new file mode 100644 index 000000000..2d2dcd875 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_database.lng @@ -0,0 +1,25 @@ +kaikki)'; +$wb['database_remote_error_ips'] = 'Ainakin yksi annetuista ip-osoitteista on väärin.'; +$wb['database_name_error_len'] = 'Tietokannan nimi on liian pitkä. Nimen enimmäispituus etuliite mukaanlukien on 64 merkkiä.'; +$wb['database_user_error_len'] = 'Tietokanan käyttäjän nimi on liian pitkä. Nimen enimmäispituus etuliite mukaanlukien on 16 merkkiä.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_database_list.lng new file mode 100644 index 000000000..a231a6fb9 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user.lng new file mode 100644 index 000000000..3e6da305a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user_list.lng new file mode 100644 index 000000000..81c60b6d7 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/fi_shell_user.lng new file mode 100644 index 000000000..94d8ca8dd --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_shell_user_list.lng new file mode 100644 index 000000000..c09edb230 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_aliasdomain_list.lng new file mode 100644 index 000000000..8f5c5ccf1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_domain.lng new file mode 100644 index 000000000..9845b3cf4 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_domain_list.lng new file mode 100644 index 000000000..8f5691c2f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_sites_stats_list.lng new file mode 100644 index 000000000..3d9b079bf --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain.lng new file mode 100644 index 000000000..79f789e37 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain_list.lng new file mode 100644 index 000000000..31fb17028 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fi_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr.lng b/interface/ispconfig/interface/sites/lib/lang/fr.lng new file mode 100644 index 000000000..11bf18ef0 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_cron.lng b/interface/ispconfig/interface/sites/lib/lang/fr_cron.lng new file mode 100644 index 000000000..67722ca78 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_cron_list.lng new file mode 100644 index 000000000..72bd11985 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_database.lng b/interface/ispconfig/interface/sites/lib/lang/fr_database.lng new file mode 100644 index 000000000..a8e5a1976 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_database.lng @@ -0,0 +1,25 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_database_list.lng new file mode 100644 index 000000000..feb751bfb --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user.lng new file mode 100644 index 000000000..466273d2e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user_list.lng new file mode 100644 index 000000000..2281e48d7 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/fr_shell_user.lng new file mode 100644 index 000000000..d80f39a38 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_shell_user_list.lng new file mode 100644 index 000000000..ff862e1b3 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_aliasdomain_list.lng new file mode 100644 index 000000000..b21201285 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_domain.lng new file mode 100644 index 000000000..895ccef5f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_domain_list.lng new file mode 100644 index 000000000..ddf66f8d9 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_sites_stats_list.lng new file mode 100644 index 000000000..41018d301 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain.lng new file mode 100644 index 000000000..8558868ed --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain_list.lng new file mode 100644 index 000000000..9bfbd30f2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/fr_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu.lng b/interface/ispconfig/interface/sites/lib/lang/hu.lng new file mode 100644 index 000000000..c02b30f39 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_cron.lng b/interface/ispconfig/interface/sites/lib/lang/hu_cron.lng new file mode 100644 index 000000000..fecb4ab45 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_cron_list.lng new file mode 100644 index 000000000..ad56ea956 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_database.lng b/interface/ispconfig/interface/sites/lib/lang/hu_database.lng new file mode 100644 index 000000000..621f6a0dc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_database_list.lng new file mode 100644 index 000000000..8560704aa --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user.lng new file mode 100644 index 000000000..a2f816918 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user_list.lng new file mode 100644 index 000000000..54578fd6c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/hu_shell_user.lng new file mode 100644 index 000000000..30d6e0453 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_shell_user_list.lng new file mode 100644 index 000000000..22a38a1ea --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_aliasdomain_list.lng new file mode 100644 index 000000000..a8506ee71 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_domain.lng new file mode 100644 index 000000000..0f042134b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_domain_list.lng new file mode 100644 index 000000000..88ec412da --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_sites_stats_list.lng new file mode 100644 index 000000000..b217f80cc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain.lng new file mode 100644 index 000000000..369622b5c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain_list.lng new file mode 100644 index 000000000..268a1b95e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/hu_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it.lng b/interface/ispconfig/interface/sites/lib/lang/it.lng new file mode 100644 index 000000000..2dd1d27e1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_cron.lng b/interface/ispconfig/interface/sites/lib/lang/it_cron.lng new file mode 100644 index 000000000..fecb4ab45 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_cron_list.lng new file mode 100644 index 000000000..ad56ea956 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_database.lng b/interface/ispconfig/interface/sites/lib/lang/it_database.lng new file mode 100644 index 000000000..8921c1173 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/it_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_database_list.lng new file mode 100644 index 000000000..891b4d66a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/it_ftp_user.lng new file mode 100644 index 000000000..9da271951 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_ftp_user_list.lng new file mode 100644 index 000000000..946962577 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/it_shell_user.lng new file mode 100644 index 000000000..0f2ea6c84 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_shell_user_list.lng new file mode 100644 index 000000000..e6fc063c8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_aliasdomain_list.lng new file mode 100644 index 000000000..e734adb16 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_domain.lng new file mode 100644 index 000000000..2bb621fec --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_domain_list.lng new file mode 100644 index 000000000..a7491480b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_sites_stats_list.lng new file mode 100644 index 000000000..b217f80cc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain.lng new file mode 100644 index 000000000..53ee315c5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain_list.lng new file mode 100644 index 000000000..5ba43b029 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/it_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja.lng b/interface/ispconfig/interface/sites/lib/lang/ja.lng new file mode 100644 index 000000000..4d2723223 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_cron.lng b/interface/ispconfig/interface/sites/lib/lang/ja_cron.lng new file mode 100644 index 000000000..fecb4ab45 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_cron_list.lng new file mode 100644 index 000000000..276b548ca --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_database.lng b/interface/ispconfig/interface/sites/lib/lang/ja_database.lng new file mode 100644 index 000000000..48d7ea3b1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb["database_remote_error_ips"] = 'At least one of the entered ip addresses is invalid.'; +$wb["client_txt"] = 'Client'; +$wb["active_txt"] = 'Active'; +$wb["database_name_error_empty"] = 'Database name is empty.'; +$wb["database_name_error_unique"] = 'There is already a database with this name on the server. To get a unique name, e.g. prepend your domain name to the database name.'; +$wb["database_name_error_regex"] = 'Invalid database name. The database name may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["database_user_error_empty"] = 'Database user is empty.'; +$wb["database_user_error_unique"] = 'There is already a database user with this name on the server. To get a unique name, e.g. prepend your domain name to the username.'; +$wb["database_user_error_regex"] = 'Invalid database user name. The username may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["limit_database_txt"] = 'The max. number of databases is reached.'; +$wb["database_name_change_txt"] = 'The database name can not be changed'; +$wb["database_charset_change_txt"] = 'The database charset can not be changed'; +$wb["database_name_error_len"] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb["database_user_error_len"] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_database_list.lng new file mode 100644 index 000000000..50ed81aba --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user.lng new file mode 100644 index 000000000..837401216 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user_list.lng new file mode 100644 index 000000000..eee5a0c78 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/ja_shell_user.lng new file mode 100644 index 000000000..e87896e0e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_shell_user_list.lng new file mode 100644 index 000000000..18ce00721 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_aliasdomain_list.lng new file mode 100644 index 000000000..7d916734f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_domain.lng new file mode 100644 index 000000000..5e97a9826 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_domain_list.lng new file mode 100644 index 000000000..e987d407d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_sites_stats_list.lng new file mode 100644 index 000000000..53a9ae367 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain.lng new file mode 100644 index 000000000..10b02ecbb --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain_list.lng new file mode 100644 index 000000000..dc91127dc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ja_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl.lng b/interface/ispconfig/interface/sites/lib/lang/nl.lng new file mode 100644 index 000000000..78860abe2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_cron.lng b/interface/ispconfig/interface/sites/lib/lang/nl_cron.lng new file mode 100644 index 000000000..f85eca227 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_cron.lng @@ -0,0 +1,21 @@ +(Shell-commando -> sh, URL -> wget)'; +$wb['limit_cron_txt'] = 'Het max. aantal toegestane Cron taken is bereikt.'; +$wb['limit_cron_frequency_txt'] = 'De cronjob frequentie overschrijdt de toegestaande limiet.'; +$wb['run_min_error_format'] = 'Ongeldige indeling voor minuten.'; +$wb['run_hour_error_format'] = 'Ongeldige indeling voor uren.'; +$wb['run_mday_error_format'] = 'Ongeldige indeling voor dagen van maand.'; +$wb['run_month_error_format'] = 'Ongeldige indeling maand.'; +$wb['run_wday_error_format'] = 'Ongeldige indeling voor dagen van week.'; +$wb['command_error_format'] = 'Ongeldige commando indeling. In geval van een URL, alleen http/https wordt ondersteund.'; +$wb['unknown_fieldtype_error'] = 'Een onbekend veld-type wordt gebruikt.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_cron_list.lng new file mode 100644 index 000000000..1785ec191 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_database.lng b/interface/ispconfig/interface/sites/lib/lang/nl_database.lng new file mode 100644 index 000000000..d4dfbf69e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_database.lng @@ -0,0 +1,25 @@ +(Komma-gescheiden, lege waarden = iedereen accepteren)'; +$wb['database_remote_error_ips'] = 'Tenminste 1 IP-adres is ongeldig.'; +$wb['database_name_error_len'] = 'Databasenaam - {db} - is te lang. De maximale lengte is 64 tekens.'; +$wb['database_user_error_len'] = 'Database gebruikersnaam - {user} - is te lang. De maximale lengte inclusief prefix is 16 tekens.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_database_list.lng new file mode 100644 index 000000000..d6a243e59 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user.lng new file mode 100644 index 000000000..ebf411d45 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user_list.lng new file mode 100644 index 000000000..449092fca --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/nl_shell_user.lng new file mode 100644 index 000000000..f38dca8d1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_shell_user_list.lng new file mode 100644 index 000000000..33568635f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_aliasdomain_list.lng new file mode 100644 index 000000000..a698fad62 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_domain.lng new file mode 100644 index 000000000..ba8743fa0 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_domain.lng @@ -0,0 +1,60 @@ +zie codes)'; +$wb['ssl_request_txt'] = 'SSL verzoek'; +$wb['ssl_cert_txt'] = 'SSL certificaat'; +$wb['ssl_bundle_txt'] = 'SSL bundel'; +$wb['ssl_action_txt'] = 'SSL actie'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domeinnaam'; +$wb['type_txt'] = 'Type'; +$wb['parent_domain_id_txt'] = 'Koppelen aan website'; +$wb['redirect_type_txt'] = 'Redirect type'; +$wb['redirect_path_txt'] = 'Redirect pad'; +$wb['active_txt'] = 'Actief?'; +$wb['document_root_txt'] = 'Documentroot'; +$wb['system_user_txt'] = 'Linux gebruiker'; +$wb['system_group_txt'] = 'Linux groep'; +$wb['ip_address_txt'] = 'IP-adres'; +$wb['vhost_type_txt'] = 'VHost type'; +$wb['hd_quota_txt'] = 'Schijfruimte limiet'; +$wb['traffic_quota_txt'] = 'Dataverkeer limiet'; +$wb['cgi_txt'] = 'CGI scripts'; +$wb['ssi_txt'] = 'SSI (CGI)'; +$wb['ssl_txt'] = 'SSL'; +$wb['suexec_txt'] = 'SuEXEC'; +$wb['php_txt'] = 'PHP5 module'; +$wb['client_txt'] = 'Klant'; +$wb['limit_web_domain_txt'] = 'Het max. aantal web domeinen voor uw account is bereikt.'; +$wb['limit_web_aliasdomain_txt'] = 'Het max. aantal domeinaliassen voor uw account is bereikt.'; +$wb['limit_web_subdomain_txt'] = 'Het max. aantal web subdomeinen voor uw account is bereikt.'; +$wb['apache_directives_txt'] = 'Apache richtlijnen'; +$wb['domain_error_empty'] = 'Domeinnaam is leeg.'; +$wb['domain_error_unique'] = 'Domein moet uniek zijn.'; +$wb['domain_error_regex'] = 'Domeinnaam is ongeldig.'; +$wb['hd_quota_error_empty'] = 'Schijfruimte limiet is leeg.'; +$wb['traffic_quota_error_empty'] = 'Dataverkeer limiet is leeg.'; +$wb['errordocs_txt'] = 'Eigen fout-paginas'; +$wb['error_ssl_state_empty'] = 'SSL: provincie is leeg.'; +$wb['error_ssl_locality_empty'] = 'SSL: plaats is leeg.'; +$wb['error_ssl_organisation_empty'] = 'SSL: organisatie is leeg.'; +$wb['error_ssl_organisation_unit_empty'] = 'SSL: organsatie afdeling is leeg.'; +$wb['error_ssl_country_empty'] = 'SSL: Land is leeg.'; +$wb['subdomain_txt'] = 'Automatische subdomeinen'; +$wb['client_group_id_txt'] = 'Klant'; +$wb['stats_password_txt'] = 'Website statistieken wachtwoord'; +$wb['ssl_domain_txt'] = 'SSL Domein'; +$wb['allow_override_txt'] = 'Optie: Allow Override'; +$wb['limit_web_quota_free_txt'] = 'Maximale beschikbare schijfruimte-gebruik'; +$wb['ssl_state_error_regex'] = 'Ongeldige SSL Provincie. Geldige tekens zijn: a-z, 0-9 en .,-_'; +$wb['ssl_locality_error_regex'] = 'Ongeldige SSL Plaats. Geldige tekens zijn: a-z, 0-9 en .,-_'; +$wb['ssl_organisation_error_regex'] = 'Ongeldige SSL Organisatie. Geldige tekens zijn: a-z, 0-9 en .,-_'; +$wb['ssl_organistaion_unit_error_regex'] = 'Ongeldige SSL Organisatie afdeling. Geldige tekens zijn: a-z, 0-9 en .,-_'; +$wb['ssl_country_error_regex'] = 'Ongeldige SSL Landcode. Geldige tekens zijn: A-Z'; +$wb['limit_traffic_quota_free_txt'] = 'Max. available Traffic Quota'; +$wb['redirect_error_regex'] = 'Invalid redirect path. Valid redirects are for example: /test/ or http://www.domain.tld/test/'; +$wb['php_open_basedir_txt'] = 'PHP open_basedir'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_domain_list.lng new file mode 100644 index 000000000..1158d6dd2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_sites_stats_list.lng new file mode 100644 index 000000000..67ce6f4bf --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain.lng new file mode 100644 index 000000000..58f5be41f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain_list.lng new file mode 100644 index 000000000..db8db0946 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/nl_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl.lng b/interface/ispconfig/interface/sites/lib/lang/pl.lng new file mode 100644 index 000000000..bd25bfd71 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_cron.lng b/interface/ispconfig/interface/sites/lib/lang/pl_cron.lng new file mode 100644 index 000000000..7771708be --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_cron_list.lng new file mode 100644 index 000000000..3c1d83636 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_database.lng b/interface/ispconfig/interface/sites/lib/lang/pl_database.lng new file mode 100644 index 000000000..75b44c439 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_database.lng @@ -0,0 +1,25 @@ +każdego)'; +$wb['database_remote_error_ips'] = 'Jeden z podanych adresów IP ma niepoprawny format.'; +$wb['client_txt'] = 'Klient'; +$wb['active_txt'] = 'Aktywny'; +$wb['database_name_error_empty'] = 'Nazwa bazy danych jest pusta.'; +$wb['database_name_error_unique'] = 'Istnieje już baza danych o takiej nazwie na serwerze. Aby mieć unikatowÄ… nazwÄ™, np.: nazwij bazÄ™ danych tak samo jak domenÄ™.'; +$wb['database_name_error_regex'] = 'NieprawidÅ‚owa nazwa bazy danych. Nazwa bazy danych może zawierać znaki takie jak: a-z, A-Z, 0-9 oraz podkreÅ›lenie. DÅ‚ugość: 2 - 64 znaków.'; +$wb['database_user_error_empty'] = 'Nazwa użytkownika bazy danych jest pusta.'; +$wb['database_user_error_unique'] = 'Jest już użytkownik bazy danych o takiej nazwie. Aby mieć unikatowÄ… nazwÄ™, np.: nazwij użytkownika tak samo jak domenÄ™.'; +$wb['database_user_error_regex'] = 'NieprawidÅ‚owa nazwa użytkownika bazy danych. Nazwa użytkownika bazy danych może zawierać znaki takie jak: a-z, A-Z, 0-9 oraz podkreÅ›lenie. DÅ‚ugość: 2 - 64 znaków.'; +$wb['limit_database_txt'] = 'Maksymalna liczba baz danych zostaÅ‚a przekroczona.'; +$wb['database_name_change_txt'] = 'Nie można zmienić nazwy bazy danych'; +$wb['database_charset_change_txt'] = 'Nie można zmienić kodowania bazy danych'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_database_list.lng new file mode 100644 index 000000000..ca92d9883 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user.lng new file mode 100644 index 000000000..0c49209b2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user_list.lng new file mode 100644 index 000000000..fecbba355 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/pl_shell_user.lng new file mode 100644 index 000000000..ff60f8f19 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_shell_user_list.lng new file mode 100644 index 000000000..850c0eb91 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_aliasdomain_list.lng new file mode 100644 index 000000000..6dd8022e9 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_domain.lng new file mode 100644 index 000000000..5b5106ce1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_domain_list.lng new file mode 100644 index 000000000..62b7455ff --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_sites_stats_list.lng new file mode 100644 index 000000000..e7b96d715 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain.lng new file mode 100644 index 000000000..18e5a936c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain_list.lng new file mode 100644 index 000000000..9ccb0a3c7 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pl_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt.lng b/interface/ispconfig/interface/sites/lib/lang/pt.lng new file mode 100644 index 000000000..d6bc1e110 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt.lng @@ -0,0 +1,23 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_cron.lng b/interface/ispconfig/interface/sites/lib/lang/pt_cron.lng new file mode 100644 index 000000000..373a37dcc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_cron.lng @@ -0,0 +1,22 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_cron_list.lng new file mode 100644 index 000000000..f5cd15a3f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_cron_list.lng @@ -0,0 +1,13 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_database.lng b/interface/ispconfig/interface/sites/lib/lang/pt_database.lng new file mode 100644 index 000000000..5ffc49eb3 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_database.lng @@ -0,0 +1,26 @@ +quaisquer ips)'; +$wb['database_remote_error_ips'] = 'Pelo menos um dos endereços ip informados não é válido.'; +$wb['database_name_error_len'] = 'O nome da base de dados - {db} - é muito longo. 64 caracteres é o número máximo permitido incluindo prefixo.'; +$wb['database_user_error_len'] = 'O nome de utilizador da base de dados - {user}- é muito longo. 16 caracteres é o número máximo permitido incluindo prefixo.'; +?> + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_database_list.lng new file mode 100644 index 000000000..6a09c6901 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_database_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user.lng new file mode 100644 index 000000000..5573ba300 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user.lng @@ -0,0 +1,28 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user_list.lng new file mode 100644 index 000000000..c9f7ed2c2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_ftp_user_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/pt_shell_user.lng new file mode 100644 index 000000000..4e4cddb6c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_shell_user.lng @@ -0,0 +1,23 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_shell_user_list.lng new file mode 100644 index 000000000..f704ab620 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_shell_user_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_aliasdomain_list.lng new file mode 100644 index 000000000..9295fb109 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_aliasdomain_list.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_domain.lng new file mode 100644 index 000000000..0cf10f81c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_domain.lng @@ -0,0 +1,61 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_domain_list.lng new file mode 100644 index 000000000..fadc95c84 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_domain_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_sites_stats_list.lng new file mode 100644 index 000000000..18bf04427 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_sites_stats_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain.lng new file mode 100644 index 000000000..a1f332d9d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain.lng @@ -0,0 +1,41 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain_list.lng new file mode 100644 index 000000000..ce29103f9 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/pt_web_subdomain_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro.lng b/interface/ispconfig/interface/sites/lib/lang/ro.lng new file mode 100644 index 000000000..44f2fbcf7 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_cron.lng b/interface/ispconfig/interface/sites/lib/lang/ro_cron.lng new file mode 100644 index 000000000..8cb7f08e6 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_cron.lng @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_cron_list.lng new file mode 100644 index 000000000..b5c8d1566 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_cron_list.lng @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_database.lng b/interface/ispconfig/interface/sites/lib/lang/ro_database.lng new file mode 100644 index 000000000..07566e810 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_database_list.lng new file mode 100644 index 000000000..9f45d098c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user.lng new file mode 100644 index 000000000..6efddadd8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user_list.lng new file mode 100644 index 000000000..bb4e25df5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/ro_shell_user.lng new file mode 100644 index 000000000..a32638e62 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_shell_user_list.lng new file mode 100644 index 000000000..2916771f3 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_aliasdomain_list.lng new file mode 100644 index 000000000..dd612325a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_domain.lng new file mode 100644 index 000000000..eefd66053 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_domain_list.lng new file mode 100644 index 000000000..e84427d2a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_sites_stats_list.lng new file mode 100644 index 000000000..20f018b82 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain.lng new file mode 100644 index 000000000..fd319c5a7 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain_list.lng new file mode 100644 index 000000000..445ec6ca9 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ro_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru.lng b/interface/ispconfig/interface/sites/lib/lang/ru.lng new file mode 100644 index 000000000..93f0501dc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru.lng @@ -0,0 +1,23 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_cron.lng b/interface/ispconfig/interface/sites/lib/lang/ru_cron.lng new file mode 100644 index 000000000..daa4ed3af --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_cron.lng @@ -0,0 +1,22 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_cron_list.lng new file mode 100644 index 000000000..49c6cbe41 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_cron_list.lng @@ -0,0 +1,13 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_database.lng b/interface/ispconfig/interface/sites/lib/lang/ru_database.lng new file mode 100644 index 000000000..ae0ebeaf1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_database.lng @@ -0,0 +1,26 @@ +любого)'; +$wb['database_remote_error_ips'] = 'Минимум один введенный Ð°Ð´Ñ€ÐµÑ Ð½ÐµÐ²ÐµÑ€ÐµÐ½.'; +$wb['database_name_error_len'] = 'Ð˜Ð¼Ñ Ð‘Ð” - {db} - cлишком длинное. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° имени БД Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ - 64 Ñимвола'; +$wb['database_user_error_len'] = 'Логин Ð´Ð»Ñ Ð‘Ð” - {user} - cлишком длинное. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° логина - 16 Ñимволов'; +?> + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_database_list.lng new file mode 100644 index 000000000..707b9f5af --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_database_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user.lng new file mode 100644 index 000000000..26a4cc1ea --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user.lng @@ -0,0 +1,28 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user_list.lng new file mode 100644 index 000000000..1ba6ad527 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_ftp_user_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/ru_shell_user.lng new file mode 100644 index 000000000..b0a7c7c6d --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_shell_user.lng @@ -0,0 +1,23 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_shell_user_list.lng new file mode 100644 index 000000000..54e40c303 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_shell_user_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_aliasdomain_list.lng new file mode 100644 index 000000000..5bda44b03 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_aliasdomain_list.lng @@ -0,0 +1,12 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_domain.lng new file mode 100644 index 000000000..36997768f --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_domain.lng @@ -0,0 +1,61 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_domain_list.lng new file mode 100644 index 000000000..4e3d84ce8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_domain_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_sites_stats_list.lng new file mode 100644 index 000000000..edd1db250 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_sites_stats_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain.lng new file mode 100644 index 000000000..7a7212bf5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain.lng @@ -0,0 +1,41 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain_list.lng new file mode 100644 index 000000000..a13d51953 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/ru_web_subdomain_list.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/sites/lib/lang/se.lng b/interface/ispconfig/interface/sites/lib/lang/se.lng new file mode 100644 index 000000000..d31e8079a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_cron.lng b/interface/ispconfig/interface/sites/lib/lang/se_cron.lng new file mode 100644 index 000000000..fecb4ab45 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_cron_list.lng new file mode 100644 index 000000000..ad56ea956 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_database.lng b/interface/ispconfig/interface/sites/lib/lang/se_database.lng new file mode 100644 index 000000000..21058d47e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_database.lng @@ -0,0 +1,25 @@ +any)'; +$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.'; +$wb['database_name_error_len'] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb['database_user_error_len'] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/se_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_database_list.lng new file mode 100644 index 000000000..9c4df5704 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/se_ftp_user.lng new file mode 100644 index 000000000..190f4a397 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_ftp_user_list.lng new file mode 100644 index 000000000..6ef3e3760 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/se_shell_user.lng new file mode 100644 index 000000000..0f2ea6c84 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_shell_user_list.lng new file mode 100644 index 000000000..4a9d7cb9a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_aliasdomain_list.lng new file mode 100644 index 000000000..e734adb16 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_domain.lng new file mode 100644 index 000000000..142f1e5ab --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_domain_list.lng new file mode 100644 index 000000000..88ec412da --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_sites_stats_list.lng new file mode 100644 index 000000000..b217f80cc --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain.lng new file mode 100644 index 000000000..a814ed30e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain_list.lng new file mode 100644 index 000000000..1c16bcda2 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/se_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk.lng b/interface/ispconfig/interface/sites/lib/lang/sk.lng new file mode 100644 index 000000000..e56941b15 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_cron.lng b/interface/ispconfig/interface/sites/lib/lang/sk_cron.lng new file mode 100644 index 000000000..21e5a9b41 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_cron_list.lng new file mode 100644 index 000000000..338da15a7 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_database.lng b/interface/ispconfig/interface/sites/lib/lang/sk_database.lng new file mode 100644 index 000000000..ca733ca00 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_database.lng @@ -0,0 +1,25 @@ + všetky )'; +$wb['database_remote_error_ips'] = 'Aspo? jedna zo zadaných IP adries je neplatná.'; +$wb['client_txt'] = 'Klient'; +$wb['active_txt'] = 'Aktívne'; +$wb['database_name_error_empty'] = 'Názov databázy je prázdny.'; +$wb['database_name_error_unique'] = 'V sú?asnosti už existuje databáza s týmto názvom na serveri. Ak chcete získa? jedine?né meno, napr. predradte názov vašej domény pred názov databázy.'; +$wb['database_name_error_regex'] = 'Neplatný názov databázy. Názov databázy môže obsahova? tieto znaky: az, AZ, 0-9 pod?iarknutia. D?žka: 2 - 64 znakov.'; +$wb['database_user_error_empty'] = 'Databázový užívate? je prázdny.'; +$wb['database_user_error_unique'] = 'V sú?asnosti už existuje databázový užívate? s týmto názvom na serveri. Ak chcete získa? jedine?né meno, napr. predradte názov vašej domény pred užívate?ským menom.'; +$wb['database_user_error_regex'] = 'Neplatné databázové užívate?ské meno. Užívate?ské meno môže obsahova? tieto znaky: az, AZ, 0-9 pod?iarknutia. D?žka: 2 - 64 znakov.'; +$wb['limit_database_txt'] = 'Max. po?et databáz je dosiahnutý.'; +$wb['database_name_change_txt'] = 'Názov databázy nie je možné meni?'; +$wb['database_charset_change_txt'] = 'Databázový charset nemožno meni?'; +$wb['database_name_error_len'] = 'Názov databázy - (db) - príliš dlhý. Max. názov databázy d?žka v?. prefix je 64 znakov.'; +$wb['database_user_error_len'] = 'Databázové užívate?ské meno - (user) - príliš dlho. Max. Databáza meno d?žka v?. prefix je 16 znakov.'; +?> diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_database_list.lng new file mode 100644 index 000000000..c76042850 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user.lng new file mode 100644 index 000000000..afc027e42 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user_list.lng new file mode 100644 index 000000000..64e06b4b1 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/sk_shell_user.lng new file mode 100644 index 000000000..0cdf9db84 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_shell_user_list.lng new file mode 100644 index 000000000..73c5e6ef8 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_aliasdomain_list.lng new file mode 100644 index 000000000..8ca467b3c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_domain.lng new file mode 100644 index 000000000..87393706b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_domain_list.lng new file mode 100644 index 000000000..64f197943 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_sites_stats_list.lng new file mode 100644 index 000000000..d8480cbaa --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain.lng new file mode 100644 index 000000000..74cfd761b --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain_list.lng new file mode 100644 index 000000000..8df87d681 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/sk_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr.lng b/interface/ispconfig/interface/sites/lib/lang/tr.lng new file mode 100644 index 000000000..1c3b93e60 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_cron.lng b/interface/ispconfig/interface/sites/lib/lang/tr_cron.lng new file mode 100644 index 000000000..4643bafd5 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_cron.lng @@ -0,0 +1,21 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_cron_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_cron_list.lng new file mode 100644 index 000000000..f54e67cba --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_cron_list.lng @@ -0,0 +1,12 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_database.lng b/interface/ispconfig/interface/sites/lib/lang/tr_database.lng new file mode 100644 index 000000000..63601ca5c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_database.lng @@ -0,0 +1,25 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_database_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_database_list.lng new file mode 100644 index 000000000..f05b2bd1e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_database_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user.lng b/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user.lng new file mode 100644 index 000000000..88602906e --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user.lng @@ -0,0 +1,27 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user_list.lng new file mode 100644 index 000000000..f4c9c3f6a --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_ftp_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_shell_user.lng b/interface/ispconfig/interface/sites/lib/lang/tr_shell_user.lng new file mode 100644 index 000000000..c6d39d321 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_shell_user.lng @@ -0,0 +1,22 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_shell_user_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_shell_user_list.lng new file mode 100644 index 000000000..a72b3e481 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_shell_user_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_aliasdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_aliasdomain_list.lng new file mode 100644 index 000000000..8bbca6090 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_aliasdomain_list.lng @@ -0,0 +1,11 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_domain.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_domain.lng new file mode 100644 index 000000000..a3f9e369c --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_domain.lng @@ -0,0 +1,60 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_domain_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_domain_list.lng new file mode 100644 index 000000000..8dbf8fd45 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_domain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_sites_stats_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_sites_stats_list.lng new file mode 100644 index 000000000..e795c5157 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_sites_stats_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain.lng new file mode 100644 index 000000000..228503614 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain.lng @@ -0,0 +1,40 @@ + diff --git a/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain_list.lng b/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain_list.lng new file mode 100644 index 000000000..44b7bbeec --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/lang/tr_web_subdomain_list.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/sites/lib/module.conf.php b/interface/ispconfig/interface/sites/lib/module.conf.php new file mode 100644 index 000000000..686ae1687 --- /dev/null +++ b/interface/ispconfig/interface/sites/lib/module.conf.php @@ -0,0 +1,113 @@ + "Website", + 'target' => 'content', + 'link' => 'sites/web_domain_list.php'); + + +$items[] = array( 'title' => "Subdomain", + 'target' => 'content', + 'link' => 'sites/web_subdomain_list.php'); + + +$items[] = array( 'title' => "Aliasdomain", + 'target' => 'content', + 'link' => 'sites/web_aliasdomain_list.php'); + +$module["nav"][] = array( 'title' => 'Websites', + 'open' => 1, + 'items' => $items); + +// clean up +unset($items); + +/* + FTP User menu +*/ + +$items[] = array( 'title' => "FTP-User", + 'target' => 'content', + 'link' => 'sites/ftp_user_list.php'); + + +$module["nav"][] = array( 'title' => 'FTP', + 'open' => 1, + 'items' => $items); + +// clean up +unset($items); + +/* + FTP User menu +*/ + +$items[] = array( 'title' => "Shell-User", + 'target' => 'content', + 'link' => 'sites/shell_user_list.php'); + + +$module["nav"][] = array( 'title' => 'Shell', + 'open' => 1, + 'items' => $items); + +// clean up +unset($items); + +/* + Databases menu +*/ + +$items[] = array( 'title' => "Database", + 'target' => 'content', + 'link' => 'sites/database_list.php'); + + +$module["nav"][] = array( 'title' => 'Database', + 'open' => 1, + 'items' => $items); + + +/* + Cron menu +*/ +$items = array(); + +$items[] = array( 'title' => "Cron Jobs", + 'target' => 'content', + 'link' => 'sites/cron_list.php'); + + +$module["nav"][] = array( 'title' => 'Cron', + 'open' => 1, + 'items' => $items); + + +//**** Statistics menu +$items = array(); + +$items[] = array( 'title' => 'Web traffic', + 'target' => 'content', + 'link' => 'sites/web_sites_stats.php'); + + +$module['nav'][] = array( 'title' => 'Statistics', + 'open' => 1, + 'items' => $items); + + + +// clean up +unset($items); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/cron.list.php b/interface/ispconfig/interface/sites/list/cron.list.php new file mode 100644 index 000000000..e5e2ab7de --- /dev/null +++ b/interface/ispconfig/interface/sites/list/cron.list.php @@ -0,0 +1,152 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "parent_domain_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "run_min", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "run_hour", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "run_mday", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "run_month", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "run_wday", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "command", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + + + + + + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/database.list.php b/interface/ispconfig/interface/sites/list/database.list.php new file mode 100644 index 000000000..b0ff42c59 --- /dev/null +++ b/interface/ispconfig/interface/sites/list/database.list.php @@ -0,0 +1,101 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + +$liste["item"][] = array( 'field' => "remote_access", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "Yes",'n' => "No")); + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} AND db_server = 1 ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "database_user", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "database_name", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/ftp_user.list.php b/interface/ispconfig/interface/sites/list/ftp_user.list.php new file mode 100644 index 000000000..7931e7165 --- /dev/null +++ b/interface/ispconfig/interface/sites/list/ftp_user.list.php @@ -0,0 +1,99 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "parent_domain_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "username", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/shell_user.list.php b/interface/ispconfig/interface/sites/list/shell_user.list.php new file mode 100644 index 000000000..e754a800b --- /dev/null +++ b/interface/ispconfig/interface/sites/list/shell_user.list.php @@ -0,0 +1,99 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "parent_domain_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "username", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/web_aliasdomain.list.php b/interface/ispconfig/interface/sites/list/web_aliasdomain.list.php new file mode 100644 index 000000000..233964218 --- /dev/null +++ b/interface/ispconfig/interface/sites/list/web_aliasdomain.list.php @@ -0,0 +1,99 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "parent_domain_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/web_domain.list.php b/interface/ispconfig/interface/sites/list/web_domain.list.php new file mode 100644 index 000000000..057948486 --- /dev/null +++ b/interface/ispconfig/interface/sites/list/web_domain.list.php @@ -0,0 +1,94 @@ + "domain_id", + 'datatype' => "INTEGER", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/web_sites_stats.list.php b/interface/ispconfig/interface/sites/list/web_sites_stats.list.php new file mode 100644 index 000000000..6ad7cc9ac --- /dev/null +++ b/interface/ispconfig/interface/sites/list/web_sites_stats.list.php @@ -0,0 +1,60 @@ + "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/list/web_subdomain.list.php b/interface/ispconfig/interface/sites/list/web_subdomain.list.php new file mode 100644 index 000000000..49ae42556 --- /dev/null +++ b/interface/ispconfig/interface/sites/list/web_subdomain.list.php @@ -0,0 +1,99 @@ + "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => "
    Yes
    ",'n' => "
    No
    ")); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "parent_domain_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain", + 'keyfield'=> 'domain_id', + 'valuefield'=> 'domain' + ), + 'width' => "", + 'value' => ""); + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/shell_user_del.php b/interface/ispconfig/interface/sites/shell_user_del.php new file mode 100644 index 000000000..30ded4297 --- /dev/null +++ b/interface/ispconfig/interface/sites/shell_user_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('sites'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/shell_user_edit.php b/interface/ispconfig/interface/sites/shell_user_edit.php new file mode 100644 index 000000000..c20d2b40d --- /dev/null +++ b/interface/ispconfig/interface/sites/shell_user_edit.php @@ -0,0 +1,224 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_shell_user')) { + $app->error($app->tform->wordbook["limit_shell_user_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_shell_user')) { + $app->error('Reseller: '.$app->tform->wordbook["limit_shell_user_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf, $interfaceConf; + /* + * If the names are restricted -> remove the restriction, so that the + * data can be edited + */ + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + //$shelluser_prefix = ($global_config['shelluser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['shelluser_prefix']); + $shelluser_prefix = replacePrefix($global_config['shelluser_prefix'], $this->dataRecord); + + if ($this->dataRecord['username'] != ""){ + /* REMOVE the restriction */ + $app->tpl->setVar("username", str_replace($shelluser_prefix , '', $this->dataRecord['username'])); + } + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $app->tpl->setVar("username_prefix", $global_config['shelluser_prefix']); + } else { + $app->tpl->setVar("username_prefix", $shelluser_prefix); + } + + if($this->id > 0) { + //* we are editing a existing record + $app->tpl->setVar("edit_disabled", 1); + $app->tpl->setVar("parent_domain_id_value", $this->dataRecord["parent_domain_id"]); + } else { + $app->tpl->setVar("edit_disabled", 0); + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // Set a few fixed values + $this->dataRecord["server_id"] = $parent_domain["server_id"]; + + if(isset($this->dataRecord['username']) && trim($this->dataRecord['username']) == '') $app->tform->errorMessage .= $app->tform->lng('username_error_empty').'
    '; + if(isset($this->dataRecord['username']) && empty($this->dataRecord['parent_domain_id'])) $app->tform->errorMessage .= $app->tform->lng('parent_domain_id_error_empty').'
    '; + + parent::onSubmit(); + } + + function onBeforeInsert() { + global $app, $conf, $interfaceConf; + + // check if the username is not blacklisted + $blacklist = file(ISPC_LIB_PATH.'/shelluser_blacklist'); + foreach($blacklist as $line) { + if(strtolower(trim($line)) == strtolower(trim($this->dataRecord['username']))){ + $app->tform->errorMessage .= 'The username is not allowed.'; + } + } + unset($blacklist); + + /* + * If the names should be restricted -> do it! + */ + if ($app->tform->errorMessage == ''){ + + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + // $shelluser_prefix = ($global_config['shelluser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['shelluser_prefix']); + $shelluser_prefix = replacePrefix($global_config['shelluser_prefix'], $this->dataRecord); + + /* restrict the names */ + $this->dataRecord['username'] = $shelluser_prefix . $this->dataRecord['username']; + } + parent::onBeforeInsert(); + } + + function onAfterInsert() { + global $app, $conf; + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"])); + $server_id = $web["server_id"]; + $dir = $web["document_root"]; + $puser = $web["system_user"]; + $pgroup = $web["system_group"]; + + // The FTP user shall be owned by the same group then the website + $sys_groupid = $web['sys_groupid']; + + $sql = "UPDATE shell_user SET server_id = $server_id, dir = '$dir', puser = '$puser', pgroup = '$pgroup', sys_groupid = '$sys_groupid' WHERE shell_user_id = ".$this->id; + $app->db->query($sql); + + } + + function onBeforeUpdate() { + global $app, $conf, $interfaceConf; + + // check if the username is not blacklisted + $blacklist = file(ISPC_LIB_PATH.'/shelluser_blacklist'); + foreach($blacklist as $line) { + if(strtolower(trim($line)) == strtolower(trim($this->dataRecord['username']))){ + $app->tform->errorMessage .= 'The username is not allowed.'; + } + } + unset($blacklist); + + /* + * If the names should be restricted -> do it! + */ + if ($app->tform->errorMessage == '') { + /* + * If the names should be restricted -> do it! + */ + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + // $shelluser_prefix = ($global_config['shelluser_prefix'] == '')?'':str_replace('[CLIENTNAME]', $this->getClientName(), $global_config['shelluser_prefix']); + $shelluser_prefix = replacePrefix($global_config['shelluser_prefix'], $this->dataRecord); + + /* restrict the names */ + $this->dataRecord['username'] = $shelluser_prefix . $this->dataRecord['username']; + } + } + + function onAfterUpdate() { + global $app, $conf; + + + } + + function getClientName() { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + // Get the group-id of the user + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + } else { + // Get the group-id from the data itself + $web = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = ".intval($this->dataRecord['parent_domain_id'])); + $client_group_id = $web['sys_groupid']; + } + /* get the name of the client */ + $tmp = $app->db->queryOneRecord("SELECT name FROM sys_group WHERE groupid = " . $client_group_id); + $clientName = $tmp['name']; + if ($clientName == "") $clientName = 'default'; + $clientName = convertClientName($clientName); + + return $clientName; + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/shell_user_list.php b/interface/ispconfig/interface/sites/shell_user_list.php new file mode 100644 index 000000000..e6c772404 --- /dev/null +++ b/interface/ispconfig/interface/sites/shell_user_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('sites'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +//$app->listform_actions->SQLExtWhere = "type = 'subdomain'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/templates/cron_edit.htm b/interface/ispconfig/interface/sites/templates/cron_edit.htm new file mode 100644 index 000000000..39f9bc646 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/cron_edit.htm @@ -0,0 +1,68 @@ +

    +

    + +
    + +
    +
    Cron Job +
    + + + + + + + + +
    +
    + + +

    e.g. *, */3, 10-20

    +
    +
    + + +

    e.g. *, */2, 0, 10-12

    +
    +
    + + +

    e.g. *, */4, 1-5

    +
    +
    + + +

    e.g. *, 1-6

    +
    +
    + + +

    e.g. *, 0, 1-5

    +
    +
    + + +

    e.g. /var/www/clients/client1/myscript.sh or http://www.mydomain.com/path/script.php

    +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/cron_list.htm b/interface/ispconfig/interface/sites/templates/cron_list.htm new file mode 100644 index 000000000..31551f26d --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/cron_list.htm @@ -0,0 +1,71 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="server_id"}{tmpl_var name="run_min"}{tmpl_var name="run_hour"}{tmpl_var name="run_mday"}{tmpl_var name="run_month"}{tmpl_var name="run_wday"}{tmpl_var name="command"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/database_edit.htm b/interface/ispconfig/interface/sites/templates/database_edit.htm new file mode 100644 index 000000000..89f1afdb6 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/database_edit.htm @@ -0,0 +1,108 @@ +

    +

    + +
    + +
    +
    + +
    + + + + + + + + +
    +
    + + +
    +
    + +
    + + +
    +
    +
    + + +
    +
    + +
    {tmpl_var name='database_name_prefix'}
    + + + + + + +
    +
    + +
    {tmpl_var name='database_user_prefix'}
    + +
    +
    + + +
    +
    +

    {tmpl_var name='password_strength_txt'}

    +
    +

     

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

    {tmpl_var name='remote_access_txt'}

    +
    + {tmpl_var name='remote_access'} +
    +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/database_list.htm b/interface/ispconfig/interface/sites/templates/database_list.htm new file mode 100644 index 000000000..fa954872f --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/database_list.htm @@ -0,0 +1,64 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="remote_access"}{tmpl_var name="server_id"}{tmpl_var name="database_user"}{tmpl_var name="database_name"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/ftp_user_advanced.htm b/interface/ispconfig/interface/sites/templates/ftp_user_advanced.htm new file mode 100644 index 000000000..1520630b5 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/ftp_user_advanced.htm @@ -0,0 +1,50 @@ +

    +

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

     {tmpl_var name='quota_files_unity_txt'}

    +
    +
    + +

     MB

    +
    +
    + +

     MB

    +
    +
    + +

     kb/s

    +
    +
    + +

     kb/s

    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/ftp_user_advanced_client.htm b/interface/ispconfig/interface/sites/templates/ftp_user_advanced_client.htm new file mode 100644 index 000000000..fd8d617ce --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/ftp_user_advanced_client.htm @@ -0,0 +1,22 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/ftp_user_edit.htm b/interface/ispconfig/interface/sites/templates/ftp_user_edit.htm new file mode 100644 index 000000000..f7588b331 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/ftp_user_edit.htm @@ -0,0 +1,48 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + +
    {tmpl_var name='username_prefix'}
    + +
    +
    + + +
    +
    +

    {tmpl_var name='password_strength_txt'}

    +
    +

     

    +
    +
    + +

     MB

    +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/ftp_user_list.htm b/interface/ispconfig/interface/sites/templates/ftp_user_list.htm new file mode 100644 index 000000000..d281feb07 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/ftp_user_list.htm @@ -0,0 +1,59 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="parent_domain_id"}{tmpl_var name="username"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/shell_user_advanced.htm b/interface/ispconfig/interface/sites/templates/shell_user_advanced.htm new file mode 100644 index 000000000..eb7d8ceb1 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/shell_user_advanced.htm @@ -0,0 +1,34 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/shell_user_edit.htm b/interface/ispconfig/interface/sites/templates/shell_user_edit.htm new file mode 100644 index 000000000..765574350 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/shell_user_edit.htm @@ -0,0 +1,62 @@ +

    +

    + +
    + +
    +
    +
    + + + + + + + + +
    +
    + +
    {tmpl_var name='username_prefix'}
    + +
    +
    + + +
    +
    +

    {tmpl_var name='password_strength_txt'}

    +
    +

     

    +
    +
    + + +
    +
    + +

     MB

    +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/shell_user_list.htm b/interface/ispconfig/interface/sites/templates/shell_user_list.htm new file mode 100644 index 000000000..a7504ac3f --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/shell_user_list.htm @@ -0,0 +1,59 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="parent_domain_id"}{tmpl_var name="username"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_aliasdomain_edit.htm b/interface/ispconfig/interface/sites/templates/web_aliasdomain_edit.htm new file mode 100644 index 000000000..76aca15f8 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_aliasdomain_edit.htm @@ -0,0 +1,50 @@ +

    +

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_aliasdomain_list.htm b/interface/ispconfig/interface/sites/templates/web_aliasdomain_list.htm new file mode 100644 index 000000000..b43f22aee --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_aliasdomain_list.htm @@ -0,0 +1,59 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="parent_domain_id"}{tmpl_var name="domain"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_advanced.htm b/interface/ispconfig/interface/sites/templates/web_domain_advanced.htm new file mode 100644 index 000000000..79a5f6e64 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_advanced.htm @@ -0,0 +1,41 @@ +

    +

    + +
    + +
    +
    + +
    + + + +
    +
    + + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_edit.htm b/interface/ispconfig/interface/sites/templates/web_domain_edit.htm new file mode 100644 index 000000000..836017efc --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_edit.htm @@ -0,0 +1,120 @@ +

    +

    + +
    + +
    +
    + +
    + + + + + + + + +
    +
    + + +
    +
    + +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + +  MB +
    +
    + +  MB +
    +
    +

    {tmpl_var name='cgi_txt'}

    +
    + {tmpl_var name='cgi'} +
    +
    +
    +

    {tmpl_var name='ssi_txt'}

    +
    + {tmpl_var name='ssi'} +
    +
    +
    +

    {tmpl_var name='suexec_txt'}

    +
    + {tmpl_var name='suexec'} +
    +
    +
    +

    {tmpl_var name='errordocs_txt'}

    +
    + {tmpl_var name='errordocs'} +
    +
    +
    +

    {tmpl_var name='is_subdomainwww_txt'}

    +
    + {tmpl_var name='is_subdomainwww'} +
    +
    +
    + + +
    +
    +

    {tmpl_var name='ssl_txt'}

    +
    + {tmpl_var name='ssl'} +
    +
    +
    + + +
    +
    +

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_list.htm b/interface/ispconfig/interface/sites/templates/web_domain_list.htm new file mode 100644 index 000000000..290cf2bad --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_list.htm @@ -0,0 +1,59 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="domain_id"}{tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="domain"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_redirect.htm b/interface/ispconfig/interface/sites/templates/web_domain_redirect.htm new file mode 100644 index 000000000..89e6fab80 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_redirect.htm @@ -0,0 +1,28 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_ssl.htm b/interface/ispconfig/interface/sites/templates/web_domain_ssl.htm new file mode 100644 index 000000000..273855c20 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_ssl.htm @@ -0,0 +1,62 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_domain_stats.htm b/interface/ispconfig/interface/sites/templates/web_domain_stats.htm new file mode 100644 index 000000000..0886460c3 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_domain_stats.htm @@ -0,0 +1,22 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_sites_stats_list.htm b/interface/ispconfig/interface/sites/templates/web_sites_stats_list.htm new file mode 100644 index 000000000..6312b027e --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_sites_stats_list.htm @@ -0,0 +1,52 @@ +

    +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="domain"}{tmpl_var name="this_month"} MB{tmpl_var name="last_month"} MB{tmpl_var name="this_year"} MB{tmpl_var name="last_year"} MB +
    +
    +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_subdomain_edit.htm b/interface/ispconfig/interface/sites/templates/web_subdomain_edit.htm new file mode 100644 index 000000000..2206cf7bd --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_subdomain_edit.htm @@ -0,0 +1,42 @@ +

    +

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

    {tmpl_var name='active_txt'}

    +
    + {tmpl_var name='active'} +
    +
    +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/templates/web_subdomain_list.htm b/interface/ispconfig/interface/sites/templates/web_subdomain_list.htm new file mode 100644 index 000000000..fce2a6ff2 --- /dev/null +++ b/interface/ispconfig/interface/sites/templates/web_subdomain_list.htm @@ -0,0 +1,60 @@ +

    +

    + +
    + +
    +
    {tmpl_var name="toolsarea_head_txt"} +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="parent_domain_id"}{tmpl_var name="domain"} + +
    +
    +
    + +
    diff --git a/interface/ispconfig/interface/sites/tools.inc.php b/interface/ispconfig/interface/sites/tools.inc.php new file mode 100644 index 000000000..65dd45910 --- /dev/null +++ b/interface/ispconfig/interface/sites/tools.inc.php @@ -0,0 +1,126 @@ + no possible output -> go out! + if ($name=="") return ""; + + // Array containing keys to search + $keywordlist=array('CLIENTNAME','CLIENTID','DOMAINID'); + + // Try to match the key within the string + foreach ($keywordlist as $keyword) { + if (substr_count($name, '['.$keyword.']') > 0) { + switch ($keyword) { + case 'CLIENTNAME': + $name=str_replace('['.$keyword.']', getClientName($dataRecord),$name); + break; + case 'CLIENTID': + $name=str_replace('['.$keyword.']', getClientID($dataRecord),$name); + break; + case 'DOMAINID': + $name=str_replace('['.$keyword.']', $dataRecord['parent_domain_id'],$name); + break; + } + } + } + return $name; +} + +function getClientName($dataRecord) { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + // Get the group-id of the user + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + } else { + // Get the group-id from the data itself + if(isset($dataRecord['client_group_id'])) { + $client_group_id = $dataRecord['client_group_id']; + } elseif (isset($dataRecord['parent_domain_id'])) { + $tmp = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = " . $dataRecord['parent_domain_id']); + $client_group_id = $tmp['sys_groupid']; + } else { + $client_group_id = $dataRecord['sys_groupid']; + } + } + + /* get the name of the client */ + $tmp = $app->db->queryOneRecord("SELECT name FROM sys_group WHERE groupid = " . $client_group_id); + $clientName = $tmp['name']; + if ($clientName == "") $clientName = 'default'; + $clientName = convertClientName($clientName); + return $clientName; +} + +function getClientID($dataRecord) { + global $app, $conf; + + if($_SESSION["s"]["user"]["typ"] != 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + // Get the group-id of the user + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + } else { + // Get the group-id from the data itself + if(isset($dataRecord['client_group_id'])) { + $client_group_id = $dataRecord['client_group_id']; + } elseif (isset($dataRecord['parent_domain_id'])) { + $tmp = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = " . $dataRecord['parent_domain_id']); + $client_group_id = $tmp['sys_groupid']; + } else { + $client_group_id = $dataRecord['sys_groupid']; + } + } + /* get the name of the client */ + $tmp = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE groupid = " . $client_group_id); + $clientID = $tmp['client_id']; + if ($clientID == '') $clientID = '0'; + return $clientID; +} + +function convertClientName($name){ + /** + * only allow 'a'..'z', '_', '0'..'9' + */ + $allowed = 'abcdefghijklmnopqrstuvwxyz0123456789_'; + $res = ''; + $name = strtolower(trim($name)); + for ($i=0; $i < strlen($name); $i++){ + if ($name[$i] == ' ') continue; + if (strpos($allowed, $name[$i]) !== false){ + $res .= $name[$i]; + } + else { + $res .= '_'; + } + } + return $res; +} + + +?> diff --git a/interface/ispconfig/interface/sites/web_aliasdomain_del.php b/interface/ispconfig/interface/sites/web_aliasdomain_del.php new file mode 100644 index 000000000..748fb58b1 --- /dev/null +++ b/interface/ispconfig/interface/sites/web_aliasdomain_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('sites'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_aliasdomain_edit.php b/interface/ispconfig/interface/sites/web_aliasdomain_edit.php new file mode 100644 index 000000000..151fad41a --- /dev/null +++ b/interface/ispconfig/interface/sites/web_aliasdomain_edit.php @@ -0,0 +1,114 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + var $parent_domain_record; + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_web_aliasdomain',"type = 'alias'")) { + $app->error($app->tform->wordbook["limit_web_aliasdomain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_web_aliasdomain',"type = 'alias'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_web_aliasdomain_txt"]); + } + } + + parent::onShowNew(); + } + + /* + function onShowEnd() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"])); + + $this->dataRecord["domain"] = str_replace('.'.$parent_domain["domain"],'',$this->dataRecord["domain"]); + $app->tpl->setVar("domain",$this->dataRecord["domain"]); + + parent::onShowEnd(); + + } + */ + + function onSubmit() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // Set a few fixed values + $this->dataRecord["type"] = 'alias'; + $this->dataRecord["server_id"] = $parent_domain["server_id"]; + //$this->dataRecord["domain"] = $this->dataRecord["domain"].'.'.$parent_domain["domain"]; + + $this->parent_domain_record = $parent_domain; + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + $app->db->query('UPDATE web_domain SET sys_groupid = '.intval($this->parent_domain_record['sys_groupid']).' WHERE domain_id = '.$this->id); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_aliasdomain_list.php b/interface/ispconfig/interface/sites/web_aliasdomain_list.php new file mode 100644 index 000000000..4d1697530 --- /dev/null +++ b/interface/ispconfig/interface/sites/web_aliasdomain_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('sites'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'alias'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_domain_del.php b/interface/ispconfig/interface/sites/web_domain_del.php new file mode 100644 index 000000000..185cdd33f --- /dev/null +++ b/interface/ispconfig/interface/sites/web_domain_del.php @@ -0,0 +1,87 @@ +auth->check_module_permissions('sites'); + +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + if($app->tform->checkPerm($this->id,'d') == false) $app->error($app->lng('error_no_delete_permission')); + + // Delete all records that belog to this zone. + $records = $app->db->queryAllRecords("SELECT domain_id FROM web_domain WHERE parent_domain_id = '".intval($this->id)."' AND type != 'vhost'"); + foreach($records as $rec) { + $app->db->datalogDelete('web_domain','domain_id',$rec['domain_id']); + } + + // Delete all records that belog to this zone. + $records = $app->db->queryAllRecords("SELECT ftp_user_id FROM ftp_user WHERE parent_domain_id = '".intval($this->id)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('ftp_user','ftp_user_id',$rec['ftp_user_id']); + } + + // Delete all records that belog to this zone. + $records = $app->db->queryAllRecords("SELECT shell_user_id FROM shell_user WHERE parent_domain_id = '".intval($this->id)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('shell_user','shell_user_id',$rec['shell_user_id']); + } + + // Delete all records that belog to this zone. + $records = $app->db->queryAllRecords("SELECT id FROM cron WHERE parent_domain_id = '".intval($this->id)."'"); + foreach($records as $rec) { + $app->db->datalogDelete('cron','id',$rec['id']); + } + } +} + +$page = new page_action; +$page->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_domain_edit.php b/interface/ispconfig/interface/sites/web_domain_edit.php new file mode 100644 index 000000000..4e8cf0b3e --- /dev/null +++ b/interface/ispconfig/interface/sites/web_domain_edit.php @@ -0,0 +1,477 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_web_domain',"type = 'vhost'")) { + $app->error($app->tform->wordbook["limit_web_domain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_web_domain',"type = 'vhost'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_web_domain_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + //* Client: If the logged in user is not admin and has no sub clients (no rseller) + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_web_domain, default_webserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Set the webserver to the default server of the client + $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]"); + $app->tpl->setVar("server_id",""); + unset($tmp); + + // Fill the IP select field with the IP addresses that are allowed for this client + // $ip_select = ""; + // $app->tpl->setVar("ip_address",$ip_select); + $sql = "SELECT ip_address FROM server_ip WHERE server_id = ".$client['default_webserver']; + $ips = $app->db->queryAllRecords($sql); + $ip_select = ""; + //$ip_select = ""; + if(is_array($ips)) { + foreach( $ips as $ip) { + $selected = ($ip["ip_address"] == $this->dataRecord["ip_address"])?'SELECTED':''; + $ip_select .= "\r\n"; + } + } + $app->tpl->setVar("ip_address",$ip_select); + unset($tmp); + unset($ips); + + //* Reseller: If the logged in user is not admin and has sub clients (is a rseller) + } elseif ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client.client_id, limit_web_domain, default_webserver, client.contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + // Set the webserver to the default server of the client + $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]"); + $app->tpl->setVar("server_id",""); + unset($tmp); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY name"; + $records = $app->db->queryAllRecords($sql); + $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']); + $client_select = ''; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($records)) { + foreach( $records as $rec) { + $selected = @($rec["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + // Fill the IP select field with the IP addresses that are allowed for this client + //$ip_select = ""; + //$app->tpl->setVar("ip_address",$ip_select); + $sql = "SELECT ip_address FROM server_ip WHERE server_id = ".$client['default_webserver']; + $ips = $app->db->queryAllRecords($sql); + $ip_select = ""; + //$ip_select = ""; + if(is_array($ips)) { + foreach( $ips as $ip) { + $selected = ($ip["ip_address"] == $this->dataRecord["ip_address"])?'SELECTED':''; + $ip_select .= "\r\n"; + } + } + $app->tpl->setVar("ip_address",$ip_select); + unset($tmp); + unset($ips); + + //* Admin: If the logged in user is admin + } else { + + // The user is admin, so we fill in all IP addresses of the server + if($this->id > 0) { + $server_id = @$this->dataRecord["server_id"]; + } else { + // Get the first server ID + $tmp = $app->db->queryOneRecord("SELECT server_id FROM server WHERE web_server = 1 ORDER BY server_name LIMIT 0,1"); + $server_id = $tmp['server_id']; + } + + $sql = "SELECT ip_address FROM server_ip WHERE server_id = $server_id"; + $ips = $app->db->queryAllRecords($sql); + $ip_select = ""; + //$ip_select = ""; + if(is_array($ips)) { + foreach( $ips as $ip) { + $selected = ($ip["ip_address"] == $this->dataRecord["ip_address"])?'SELECTED':''; + $ip_select .= "\r\n"; + } + } + $app->tpl->setVar("ip_address",$ip_select); + unset($tmp); + unset($ips); + + // Fill the client select field + $sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER BY name"; + $clients = $app->db->queryAllRecords($sql); + $client_select = ""; + $tmp_data_record = $app->tform->getDataRecord($this->id); + if(is_array($clients)) { + foreach( $clients as $client) { + $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':''; + $client_select .= "\r\n"; + } + } + $app->tpl->setVar("client_group_id",$client_select); + + } + + $ssl_domain_select = ''; + $ssl_domains = array($this->dataRecord["domain"],'www.'.$this->dataRecord["domain"]); + if(is_array($ssl_domains)) { + foreach( $ssl_domains as $ssl_domain) { + $selected = ($ssl_domain == $this->dataRecord['ssl_domain'])?'SELECTED':''; + $ssl_domain_select .= "\r\n"; + } + } + $app->tpl->setVar("ssl_domain",$ssl_domain_select); + unset($ssl_domain_select); + unset($ssl_domains); + unset($ssl_domain); + + if($this->id > 0) { + //* we are editing a existing record + $app->tpl->setVar("edit_disabled", 1); + $app->tpl->setVar("server_id_value", $this->dataRecord["server_id"]); + } else { + $app->tpl->setVar("edit_disabled", 0); + } + + $tmp_txt = ($this->dataRecord['traffic_quota_lock'] == 'y')?'('.$app->tform->lng('traffic_quota_exceeded_txt').')':''; + $app->tpl->setVar("traffic_quota_exceeded_txt", $tmp_txt); + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + // Set a few fixed values + $this->dataRecord["parent_domain_id"] = 0; + $this->dataRecord["type"] = 'vhost'; + $this->dataRecord["vhost_type"] = 'name'; + + if($_SESSION["s"]["user"]["typ"] != 'admin') { + // Get the limits of the client + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT limit_traffic_quota, limit_web_domain, default_webserver, parent_client_id, limit_web_quota FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + + //* Check the website quota + if(isset($_POST["hd_quota"]) && $client["limit_web_quota"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT sum(hd_quota) as webquota FROM web_domain WHERE domain_id != ".intval($this->id)." AND ".$app->tform->getAuthSQL('u')); + $webquota = $tmp["webquota"]; + $new_web_quota = intval($this->dataRecord["hd_quota"]); + if(($webquota + $new_web_quota > $client["limit_web_quota"]) || ($new_web_quota == -1 && $client["limit_web_quota"] != -1)) { + $max_free_quota = floor($client["limit_web_quota"] - $webquota); + if($max_free_quota < 0) $max_free_quota = 0; + $app->tform->errorMessage .= $app->tform->lng("limit_web_quota_free_txt").": ".$max_free_quota." MB
    "; + // Set the quota field to the max free space + $this->dataRecord["hd_quota"] = $max_free_quota; + } + unset($tmp); + unset($tmp_quota); + } + + //* Check the traffic quota + if(isset($_POST["traffic_quota"]) && $client["limit_traffic_quota"] > 0) { + $tmp = $app->db->queryOneRecord("SELECT sum(traffic_quota) as trafficquota FROM web_domain WHERE domain_id != ".intval($this->id)." AND ".$app->tform->getAuthSQL('u')); + $trafficquota = $tmp["trafficquota"]; + $new_traffic_quota = intval($this->dataRecord["traffic_quota"]); + if(($trafficquota + $new_traffic_quota > $client["limit_traffic_quota"]) || ($new_traffic_quota == -1 && $client["limit_traffic_quota"] != -1)) { + $max_free_quota = floor($client["limit_traffic_quota"] - $trafficquota); + if($max_free_quota < 0) $max_free_quota = 0; + $app->tform->errorMessage .= $app->tform->lng("limit_traffic_quota_free_txt").": ".$max_free_quota." MB
    "; + // Set the quota field to the max free space + $this->dataRecord["traffic_quota"] = $max_free_quota; + } + unset($tmp); + unset($tmp_quota); + } + + // When the record is updated + if($this->id > 0) { + // restore the server ID if the user is not admin and record is edited + $tmp = $app->db->queryOneRecord("SELECT server_id FROM web_domain WHERE domain_id = ".intval($this->id)); + $this->dataRecord["server_id"] = $tmp["server_id"]; + unset($tmp); + // When the record is inserted + } else { + // set the server ID to the default mailserver of the client + $this->dataRecord["server_id"] = $client["default_webserver"]; + + + // Check if the user may add another web_domain + if($client["limit_web_domain"] >= 0) { + $tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM web_domain WHERE sys_groupid = $client_group_id and type = 'vhost'"); + if($tmp["number"] >= $client["limit_web_domain"]) { + $app->error($app->tform->wordbook["limit_web_domain_txt"]); + } + } + + } + + // Clients may not set the client_group_id, so we unset them if user is not a admin and the client is not a reseller + if(!$app->auth->has_clients($_SESSION['s']['user']['userid'])) unset($this->dataRecord["client_group_id"]); + } + + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + // make sure that the record belongs to the clinet group and not the admin group when a dmin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_domain SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE domain_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_domain SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE domain_id = ".$this->id); + } + + // Get configuration for the web system + $app->uses("getconf"); + $web_rec = $app->tform->getDataRecord($this->id); + $web_config = $app->getconf->get_server_config(intval($web_rec["server_id"]),'web'); + $document_root = str_replace("[website_id]",$this->id,$web_config["website_path"]); + + // get the ID of the client + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = $client_group_id"); + $client_id = intval($client["client_id"]); + } else { + //$client_id = intval($this->dataRecord["client_group_id"]); + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($this->dataRecord["client_group_id"])); + $client_id = intval($client["client_id"]); + } + + // Set the values for document_root, system_user and system_group + $system_user = $app->db->quote('web'.$this->id); + $system_group = $app->db->quote('client'.$client_id); + $document_root = $app->db->quote(str_replace("[client_id]",$client_id,$document_root)); + $php_open_basedir = str_replace("[website_path]",$document_root,$web_config["php_open_basedir"]); + $php_open_basedir = $app->db->quote(str_replace("[website_domain]",$web_rec['domain'],$php_open_basedir)); + $htaccess_allow_override = $app->db->quote($web_config["htaccess_allow_override"]); + + $sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group', document_root = '$document_root', allow_override = '$htaccess_allow_override', php_open_basedir = '$php_open_basedir' WHERE domain_id = ".$this->id; + $app->db->query($sql); + } + + function onBeforeUpdate () { + global $app, $conf; + + //* Check if the server has been changed + // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway + if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + if (isset($this->dataRecord["server_id"])){ + $rec = $app->db->queryOneRecord("SELECT server_id from web_domain WHERE domain_id = ".$this->id); + if($rec['server_id'] != $this->dataRecord["server_id"]) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Server can not be changed.'); + $this->dataRecord["server_id"] = $rec['server_id']; + } + unset($rec); + } + //* If the user is neither admin nor reseller + } else { + //* We do not allow users to change a domain which has been created by the admin + $rec = $app->db->queryOneRecord("SELECT domain from web_domain WHERE domain_id = ".$this->id); + if(isset($this->dataRecord["domain"]) && $rec['domain'] != $this->dataRecord["domain"] && $app->tform->checkPerm($this->id,'u')) { + //* Add a error message and switch back to old server + $app->tform->errorMessage .= $app->lng('The Domain can not be changed. Please ask your Administrator if you want to change the domain name.'); + $this->dataRecord["domain"] = $rec['domain']; + } + unset($rec); + } + + //* Check that all fields for the SSL cert creation are filled + if(isset($this->dataRecord['ssl_action']) && $this->dataRecord['ssl_action'] == 'create') { + if($this->dataRecord['ssl_state'] == '') $app->tform->errorMessage .= $app->tform->lng('error_ssl_state_empty').'
    '; + if($this->dataRecord['ssl_locality'] == '') $app->tform->errorMessage .= $app->tform->lng('error_ssl_locality_empty').'
    '; + if($this->dataRecord['ssl_organisation'] == '') $app->tform->errorMessage .= $app->tform->lng('error_ssl_organisation_empty').'
    '; + if($this->dataRecord['ssl_organisation_unit'] == '') $app->tform->errorMessage .= $app->tform->lng('error_ssl_organisation_unit_empty').'
    '; + if($this->dataRecord['ssl_country'] == '') $app->tform->errorMessage .= $app->tform->lng('error_ssl_country_empty').'
    '; + } + + } + + function onAfterUpdate() { + global $app, $conf; + + // make sure that the record belongs to the clinet group and not the admin group when a admin inserts it + // also make sure that the user can not delete domain created by a admin + if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_domain SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE domain_id = ".$this->id); + } + if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($this->dataRecord["client_group_id"])) { + $client_group_id = intval($this->dataRecord["client_group_id"]); + $app->db->query("UPDATE web_domain SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE domain_id = ".$this->id); + } + + // Get configuration for the web system + $app->uses("getconf"); + $web_rec = $app->tform->getDataRecord($this->id); + $web_config = $app->getconf->get_server_config(intval($web_rec["server_id"]),'web'); + $document_root = str_replace("[website_id]",$this->id,$web_config["website_path"]); + + // get the ID of the client + if($_SESSION["s"]["user"]["typ"] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $client_group_id = $_SESSION["s"]["user"]["default_group"]; + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = $client_group_id"); + $client_id = intval($client["client_id"]); + } else { + //$client_id = intval(@$web_rec["client_group_id"]); + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval(@$this->dataRecord["client_group_id"])); + $client_id = intval($client["client_id"]); + } + + if(($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) && isset($this->dataRecord["client_group_id"]) && $this->dataRecord["client_group_id"] != $this->oldDataRecord["sys_groupid"]) { + // Set the values for document_root, system_user and system_group + $system_user = $app->db->quote('web'.$this->id); + $system_group = $app->db->quote('client'.$client_id); + $document_root = $app->db->quote(str_replace("[client_id]",$client_id,$document_root)); + + $sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group', document_root = '$document_root' WHERE domain_id = ".$this->id; + //$sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group' WHERE domain_id = ".$this->id; + $app->db->query($sql); + + // Update the FTP user(s) too + $records = $app->db->queryAllRecords("SELECT ftp_user_id FROM ftp_user WHERE parent_domain_id = ".$this->id); + foreach($records as $rec) { + $app->db->datalogUpdate('ftp_user', "uid = '$system_user', gid = '$system_group', dir = '$document_root'", 'ftp_user_id', $rec['ftp_user_id']); + } + unset($records); + unset($rec); + + // Update the Shell user(s) too + $records = $app->db->queryAllRecords("SELECT shell_user_id FROM shell_user WHERE parent_domain_id = ".$this->id); + foreach($records as $rec) { + $app->db->datalogUpdate('shell_user', "puser = '$system_user', pgroup = '$system_group', dir = '$document_root'", 'shell_user_id', $rec['shell_user_id']); + } + unset($records); + unset($rec); + + } + + //* If the domain name has been changed, we will have to change all subdomains + if($this->dataRecord["domain"] != '' && $this->oldDataRecord["domain"] != '' && $this->dataRecord["domain"] != $this->oldDataRecord["domain"]) { + $records = $app->db->queryAllRecords("SELECT domain_id,domain FROM web_domain WHERE type = 'subdomain' AND domain LIKE '%.".$app->db->quote($this->oldDataRecord["domain"])."'"); + foreach($records as $rec) { + $subdomain = $app->db->quote(str_replace($this->oldDataRecord["domain"],$this->dataRecord["domain"],$rec['domain'])); + $app->db->datalogUpdate('web_domain', "domain = '".$subdomain."'", 'domain_id', $rec['domain_id']); + } + unset($records); + unset($rec); + unset($subdomain); + } + + //* Set allow_override and php_open_basedir if empty + if($web_rec['allow_override'] == '') { + $sql = "UPDATE web_domain SET allow_override = '".$app->db->quote($web_config["htaccess_allow_override"])."' WHERE domain_id = ".$this->id; + $app->db->query($sql); + } + if($web_rec['php_open_basedir'] == '') { + $document_root = $app->db->quote(str_replace("[client_id]",$client_id,$document_root)); + $php_open_basedir = str_replace("[website_path]",$document_root,$web_config["php_open_basedir"]); + $php_open_basedir = $app->db->quote(str_replace("[website_domain]",$web_rec['domain'],$php_open_basedir)); + $sql = "UPDATE web_domain SET php_open_basedir = '$php_open_basedir' WHERE domain_id = ".$this->id; + $app->db->query($sql); + } + + } + + function onAfterDelete() { + global $app, $conf; + + // Delete the sub and alias domains + $child_domains = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ".$this->id); + foreach($child_domains as $d) { + // Saving record to datalog when db_history enabled + if($app->tform->formDef["db_history"] == 'yes') { + $app->tform->datalogSave('DELETE',$d["domain_id"],$d,array()); + } + + $app->db->query("DELETE FROM web_domain WHERE domain_id = ".$d["domain_id"]." LIMIT 0,1"); + } + unset($child_domains); + unset($d); + + } + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_domain_list.php b/interface/ispconfig/interface/sites/web_domain_list.php new file mode 100644 index 000000000..085ca05cb --- /dev/null +++ b/interface/ispconfig/interface/sites/web_domain_list.php @@ -0,0 +1,59 @@ +auth->check_module_permissions('sites'); + +$app->load('listform_actions'); + + +class list_action extends listform_actions { + +} + +$list = new list_action; +$list->SQLExtWhere = "type = 'vhost'"; +$list->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_sites_stats.php b/interface/ispconfig/interface/sites/web_sites_stats.php new file mode 100644 index 000000000..f3809807f --- /dev/null +++ b/interface/ispconfig/interface/sites/web_sites_stats.php @@ -0,0 +1,64 @@ +auth->check_module_permissions('sites'); + +$app->load('listform_actions'); + +class list_action extends listform_actions { + + function prepareDataRow($rec) + { + global $app; + + $rec = $app->listform->decode($rec); + + //* Alternating datarow colors + $this->DataRowColor = ($this->DataRowColor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; + $rec['bgcolor'] = $this->DataRowColor; + + //* Set the statistics colums + //** Traffic of the current month + $tmp_year = date('Y'); + $tmp_month = date('m'); + $tmp_rec = $app->db->queryOneRecord("SELECT SUM(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year' AND MONTH(traffic_date) = '$tmp_month'"); + $rec['this_month'] = number_format($tmp_rec['t']/1024/1024, 0, '.', ' '); + + //** Traffic of the current year + $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year'"); + $rec['this_year'] = number_format($tmp_rec['t']/1024/1024, 0, '.', ' '); + + //** Traffic of the last month + $tmp_year = date('Y',mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); + $tmp_month = date('m',mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); + $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year' AND MONTH(traffic_date) = '$tmp_month'"); + $rec['last_month'] = number_format($tmp_rec['t']/1024/1024, 0, '.', ' '); + + //** Traffic of the last year + $tmp_year = date('Y',mktime(0, 0, 0, date("m"), date("d"), date("Y")-1)); + $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year'"); + $rec['last_year'] = number_format($tmp_rec['t']/1024/1024, 0, '.', ' '); + + //* The variable "id" contains always the index variable + $rec['id'] = $rec[$this->idx_key]; + return $rec; + } +} + +$list = new list_action; +$list->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_subdomain_del.php b/interface/ispconfig/interface/sites/web_subdomain_del.php new file mode 100644 index 000000000..91b1662a5 --- /dev/null +++ b/interface/ispconfig/interface/sites/web_subdomain_del.php @@ -0,0 +1,51 @@ +auth->check_module_permissions('sites'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_subdomain_edit.php b/interface/ispconfig/interface/sites/web_subdomain_edit.php new file mode 100644 index 000000000..ec35a1bb8 --- /dev/null +++ b/interface/ispconfig/interface/sites/web_subdomain_edit.php @@ -0,0 +1,114 @@ +auth->check_module_permissions('sites'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + var $parent_domain_record; + + function onShowNew() { + global $app, $conf; + + // we will check only users, not admins + if($_SESSION["s"]["user"]["typ"] == 'user') { + if(!$app->tform->checkClientLimit('limit_web_subdomain',"type = 'subdomain'")) { + $app->error($app->tform->wordbook["limit_web_subdomain_txt"]); + } + if(!$app->tform->checkResellerLimit('limit_web_subdomain',"type = 'subdomain'")) { + $app->error('Reseller: '.$app->tform->wordbook["limit_web_subdomain_txt"]); + } + } + + parent::onShowNew(); + } + + function onShowEnd() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // remove the parent domain part of the domain name before we show it in the text field. + $this->dataRecord["domain"] = str_replace('.'.$parent_domain["domain"],'',$this->dataRecord["domain"]); + $app->tpl->setVar("domain",$this->dataRecord["domain"]); + + parent::onShowEnd(); + + } + + function onSubmit() { + global $app, $conf; + + // Get the record of the parent domain + $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"])); + + // Set a few fixed values + $this->dataRecord["type"] = 'subdomain'; + $this->dataRecord["server_id"] = $parent_domain["server_id"]; + $this->dataRecord["domain"] = $this->dataRecord["domain"].'.'.$parent_domain["domain"]; + + $this->parent_domain_record = $parent_domain; + + parent::onSubmit(); + } + + function onAfterInsert() { + global $app, $conf; + + $app->db->query('UPDATE web_domain SET sys_groupid = '.intval($this->parent_domain_record['sys_groupid']).' WHERE domain_id = '.$this->id); + + } + + +} + +$page = new page_action; +$page->onLoad(); + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/sites/web_subdomain_list.php b/interface/ispconfig/interface/sites/web_subdomain_list.php new file mode 100644 index 000000000..224bba8da --- /dev/null +++ b/interface/ispconfig/interface/sites/web_subdomain_list.php @@ -0,0 +1,55 @@ +auth->check_module_permissions('sites'); + +$app->uses('listform_actions'); + +// Limit the results to alias domains +$app->listform_actions->SQLExtWhere = "type = 'subdomain'"; + +$app->listform_actions->onLoad(); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/bg_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/bg_strengthmeter.lng new file mode 100644 index 000000000..6631f3ab0 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/bg_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/br_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/br_strengthmeter.lng new file mode 100644 index 000000000..ba99f9768 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/br_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/de_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/de_strengthmeter.lng new file mode 100644 index 000000000..52f10189e --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/de_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/en_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/en_strengthmeter.lng new file mode 100644 index 000000000..2a6de41f1 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/en_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/es_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/es_strengthmeter.lng new file mode 100644 index 000000000..f0b4b7337 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/es_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/fi_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/fi_strengthmeter.lng new file mode 100644 index 000000000..914565261 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/fi_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/fr_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/fr_strengthmeter.lng new file mode 100644 index 000000000..23ac2bac6 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/fr_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/hu_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/hu_strengthmeter.lng new file mode 100644 index 000000000..41f7d98f4 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/hu_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/it_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/it_strengthmeter.lng new file mode 100644 index 000000000..3f2b615f7 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/it_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/ja_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/ja_strengthmeter.lng new file mode 100644 index 000000000..ddf1222f1 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/ja_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/nl_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/nl_strengthmeter.lng new file mode 100644 index 000000000..57e86ca70 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/nl_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/pl_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/pl_strengthmeter.lng new file mode 100644 index 000000000..df85c9712 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/pl_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/ro_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/ro_strengthmeter.lng new file mode 100644 index 000000000..27b9ab98b --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/ro_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/ru_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/ru_strengthmeter.lng new file mode 100644 index 000000000..afe7d6e21 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/ru_strengthmeter.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/se_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/se_strengthmeter.lng new file mode 100644 index 000000000..2a6de41f1 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/se_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/sk_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/sk_strengthmeter.lng new file mode 100644 index 000000000..5d5fb7158 --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/sk_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/strengthmeter/lib/lang/tr_strengthmeter.lng b/interface/ispconfig/interface/strengthmeter/lib/lang/tr_strengthmeter.lng new file mode 100644 index 000000000..f9e6cb2bb --- /dev/null +++ b/interface/ispconfig/interface/strengthmeter/lib/lang/tr_strengthmeter.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/temp/en.lng b/interface/ispconfig/interface/temp/en.lng new file mode 100644 index 000000000..5fdc07c91 --- /dev/null +++ b/interface/ispconfig/interface/temp/en.lng @@ -0,0 +1,2131 @@ +---|ISPConfig Language File|3.0.1.6|en +--|global|en|en.lng + + +--|admin|en|en.lng + +--|admin|en|en_firewall.lng + +--|admin|en|en_firewall_list.lng + +--|admin|en|en_groups.lng + +--|admin|en|en_groups_list.lng +WARNING:
    Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> +--|admin|en|en_language_add.lng + +--|admin|en|en_language_complete.lng +This adds missing strings from the english master language files to the selected language.'; +$wb["language_select_txt"] = 'Select language'; +$wb['btn_save_txt'] = 'Merge files now'; +$wb['btn_cancel_txt'] = 'Back'; +?> +--|admin|en|en_language_edit.lng + + +--|admin|en|en_language_export.lng + +--|admin|en|en_language_import.lng + +--|admin|en|en_language_list.lng + + +--|admin|en|en_remote_user.lng + + +--|admin|en|en_remote_user_list.lng + + + +--|admin|en|en_server.lng + +--|admin|en|en_server_config.lng + +--|admin|en|en_server_config_list.lng + +--|admin|en|en_server_ip.lng + +--|admin|en|en_server_ip_list.lng + +--|admin|en|en_server_list.lng + +--|admin|en|en_software_package_list.lng + + +--|admin|en|en_software_repo.lng + +--|admin|en|en_software_repo_list.lng + +--|admin|en|en_software_update_list.lng + + +--|admin|en|en_system_config.lng + +--|admin|en|en_users.lng + + +--|admin|en|en_users_list.lng +WARNING:
    Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +?> +--|client|en|en.lng + +--|client|en|en_client.lng + + +--|client|en|en_clients_list.lng + +--|client|en|en_client_template.lng + +--|client|en|en_client_template_list.lng + + +--|client|en|en_reseller.lng + 0'; +$wb["limit_web_quota_txt"] = 'Web Quota'; +?> + +--|client|en|en_resellers_list.lng + +--|designer|en|en.lng + +--|designer|en|en_form_edit.lng + +--|designer|en|en_form_list.lng + +--|designer|en|en_form_show.lng + +--|designer|en|en_module_edit.lng +Description +

    +Modulename: Name of the module directory. Only numbers, chars and underscore allowed.
    +Moduletitle: Will be shown in the (upper) main navigation.
    +Template file: Template file of the module. Currently available: module.tpl.htm and module_tree.tpl.htm. Default is module.tpl.htm.
    +NaviFrame: If module_tree.tpl.htm selected as template file, enter here the path to the script file for the left frame.
    +Default page: These page will be shown when the module is opened.
    +Tab width: Width of the Tabs in the main navigation. The field is empty by default. You can enter values absolute in pixel (e.g 20) or relative (e.g 20%).
    +Hint: All paths are relative to the directory "web". +'; + +?> +--|designer|en|en_module_list.lng + +--|designer|en|en_module_nav_edit.lng + +--|designer|en|en_module_nav_item_edit.lng + +--|designer|en|en_module_show.lng + +--|dns|en|en.lng + +--|dns|en|en_dns_a.lng + +--|dns|en|en_dns_aaaa.lng + +--|dns|en|en_dns_alias.lng + +--|dns|en|en_dns_a_list.lng + +--|dns|en|en_dns_cname.lng + +--|dns|en|en_dns_hinfo.lng + +--|dns|en|en_dns_mx.lng + +--|dns|en|en_dns_ns.lng + +--|dns|en|en_dns_ptr.lng + +--|dns|en|en_dns_rp.lng + +--|dns|en|en_dns_soa.lng +these IPs (comma separated list)'; +$wb["active_txt"] = 'Active'; +$wb["limit_dns_zone_txt"] = 'The max. number of DNS zones for your account is reached.'; +$wb["client_txt"] = 'Client'; +$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.'; +$wb["server_id_error_empty"] = 'No server selected'; +$wb["origin_error_empty"] = 'Zone empty.'; +$wb["origin_error_unique"] = 'There is already a record for this zone.'; +$wb["origin_error_regex"] = 'Zone has a invalid format.'; +$wb["ns_error_regex"] = 'NS has a invalid format.'; +$wb["mbox_error_empty"] = 'Email is empty.'; +$wb["mbox_error_regex"] = 'Email format invalid.'; +$wb["also_notify_txt"] = 'Also Notify'; +$wb["update_acl_txt"] = 'Update ACL'; +?> +--|dns|en|en_dns_soa_list.lng + +--|dns|en|en_dns_srv.lng + +--|dns|en|en_dns_template.lng + +--|dns|en|en_dns_template_list.lng + +--|dns|en|en_dns_txt.lng + +--|dns|en|en_dns_wizard.lng + +--|help|en|en.lng + + +--|help|en|en_support_message.lng + + +--|help|en|en_support_message_list.lng + +--|login|en|en.lng + 64 characters.'; + +$wb['username_txt'] = "Username"; +$wb['password_txt'] = "Password"; +$wb['login_button_txt'] = "Login"; + +?> +--|mail|en|en.lng + +--|mail|en|en_mail_alias.lng + +--|mail|en|en_mail_aliasdomain.lng + +--|mail|en|en_mail_aliasdomain_list.lng + +--|mail|en|en_mail_alias_list.lng + +--|mail|en|en_mail_blacklist.lng + +--|mail|en|en_mail_blacklist_list.lng + +--|mail|en|en_mail_content_filter.lng + +--|mail|en|en_mail_content_filter_list.lng + +--|mail|en|en_mail_domain.lng + +--|mail|en|en_mail_domain_catchall.lng + +--|mail|en|en_mail_domain_catchall_list.lng + +--|mail|en|en_mail_domain_list.lng + +--|mail|en|en_mail_forward.lng + +--|mail|en|en_mail_forward_list.lng + +--|mail|en|en_mail_get.lng + +--|mail|en|en_mail_get_list.lng + +--|mail|en|en_mail_relay_recipient.lng + +--|mail|en|en_mail_relay_recipient_list.lng + +--|mail|en|en_mail_spamfilter.lng + +--|mail|en|en_mail_spamfilter_list.lng + +--|mail|en|en_mail_transport.lng + +--|mail|en|en_mail_transport_list.lng + +--|mail|en|en_mail_user.lng + 1'; +$wb["move_junk_txt"] = 'Move Spam Emails to Junk directory'; +?> + +--|mail|en|en_mail_user_filter.lng + +--|mail|en|en_mail_user_filter_list.lng + +--|mail|en|en_mail_user_list.lng + +--|mail|en|en_mail_user_stats_list.lng + +--|mail|en|en_mail_whitelist.lng + +--|mail|en|en_mail_whitelist_list.lng + +--|mail|en|en_spamfilter_blacklist.lng + +--|mail|en|en_spamfilter_blacklist_list.lng + +--|mail|en|en_spamfilter_config.lng + +--|mail|en|en_spamfilter_config_list.lng + +--|mail|en|en_spamfilter_policy.lng + +--|mail|en|en_spamfilter_policy_list.lng + +--|mail|en|en_spamfilter_users.lng + +--|mail|en|en_spamfilter_users_list.lng + +--|mail|en|en_spamfilter_whitelist.lng + +--|mail|en|en_spamfilter_whitelist_list.lng + +--|monitor|en|en.lng + + +--|monitor|en|en_datalog_list.lng + +--|monitor|en|en_syslog_list.lng + +--|sites|en|en.lng + +--|sites|en|en_cron.lng + +--|sites|en|en_cron_list.lng + +--|sites|en|en_database.lng +any)'; +$wb["database_remote_error_ips"] = 'At least one of the entered ip addresses is invalid.'; +$wb["client_txt"] = 'Client'; +$wb["active_txt"] = 'Active'; +$wb["database_name_error_empty"] = 'Database name is empty.'; +$wb["database_name_error_unique"] = 'There is already a database with this name on the server. To get a unique name, e.g. prepend your domain name to the database name.'; +$wb["database_name_error_regex"] = 'Invalid database name. The database name may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["database_user_error_empty"] = 'Database user is empty.'; +$wb["database_user_error_unique"] = 'There is already a database user with this name on the server. To get a unique name, e.g. prepend your domain name to the username.'; +$wb["database_user_error_regex"] = 'Invalid database user name. The username may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.'; +$wb["limit_database_txt"] = 'The max. number of databases is reached.'; +$wb["database_name_change_txt"] = 'The database name can not be changed'; +$wb["database_charset_change_txt"] = 'The database charset can not be changed'; +$wb["database_name_error_len"] = 'Database name - {db} - too long. The max. database name length incl. prefix is 64 chars.'; +$wb["database_user_error_len"] = 'Database username - {user}- too long. The max. database username length incl. prefix is 16 chars.'; +?> + +--|sites|en|en_database_list.lng + +--|sites|en|en_ftp_user.lng + + +--|sites|en|en_ftp_user_list.lng + +--|sites|en|en_shell_user.lng + + +--|sites|en|en_shell_user_list.lng + +--|sites|en|en_web_aliasdomain_list.lng + +--|sites|en|en_web_domain.lng + + +--|sites|en|en_web_domain_list.lng + +--|sites|en|en_web_sites_stats_list.lng + +--|sites|en|en_web_subdomain.lng + +--|sites|en|en_web_subdomain_list.lng + +--|strengthmeter|en|en_strengthmeter.lng + + +--|tools|en|en.lng + +--|tools|en|en_usersettings.lng + + +---|EOF diff --git a/interface/ispconfig/interface/themes/default/css/central.css b/interface/ispconfig/interface/themes/default/css/central.css new file mode 100644 index 000000000..e9268d5bf --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/central.css @@ -0,0 +1,32 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) central stylesheet - ISPConfig 3: default theme + * (de) Zentrales Stylesheet - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import core styles | Basis-Stylesheets einbinden */ +@import url(../yaml/core/base.css); + +/* import screen layout | Screen-Layout einbinden */ +@import url(navigation/nav_top.css); +@import url(navigation/nav_side.css); +@import url(screen/basemod.css); +@import url(screen/basemod_2col_left_seo.css); +@import url(screen/content.css); +@import url(screen/uni-form-generic.css); +@import url(screen/uni-form.css); +@import url(screen/content_ispc.css); + +/* import print layout | Druck-Layout einbinden */ +@import url(print/print_100.css); diff --git a/interface/ispconfig/interface/themes/default/css/navigation/nav_side.css b/interface/ispconfig/interface/themes/default/css/navigation/nav_side.css new file mode 100644 index 000000000..f652917b5 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/navigation/nav_side.css @@ -0,0 +1,125 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Vertical list navigation "vlist" - ISPConfig 3: default theme + * (de) Vertikale Navigationsliste "vlist" - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media all +{ + #submenu { + width: 100%; + overflow: hidden; + margin: 0px; + list-style-type: none; + border-bottom: 2px #ddd solid; + } + + #submenu ul { list-style-type: none; margin:0; padding: 0; } + #submenu li { float:left; width: 100%; margin:0; padding: 0; font-size:0.9em; } + + #submenu a, + #submenu strong { + display:block; + width: 90%; + padding: 2px 0px 2px 10%; + text-decoration: none; + background-color:#fff; + color: #444; + border-bottom: 1px #eee solid; + } + + /* Menu Title */ + #submenu li#title { + width: 100%; + padding: 0px; + font-weight: bold; + color: #444; + background-color: #fff; + border-top: 2px #888 solid; + font-size: 1.1em; + } + + #submenu li#title a { + background-color: #f0f8ff; + color: #444; + } + #submenu li#title a:hover { + color: #f63; + } + + #submenu li span { + display:block; + width: 90%; + padding: 3px 0px 3px 10%; + font-weight: bold; + border-bottom: 1px #ddd solid; + } + + /* Level 1 */ + #submenu li#active, + #submenu li strong { + width: 90%; + padding: 3px 0px 3px 10%; + font-weight: bold; + color: #fff; + background-color:#aab; + border-bottom: 1px #eee solid; + } + + #submenu li a { width: 90%; padding-left: 10%; background-color:#fff; color: #444; } + #submenu li a:focus, + #submenu li a:hover, + #submenu li a:active { background-color:#f63; color: #fff; } + + /* Level 2 */ + #submenu li ul li a, + #submenu li ul li#active, + #submenu li ul li strong, + #submenu li ul li span { width: 80%; padding-left: 20%; } + + #submenu li ul li a { background-color:#f8f8f8; color: #666; } + #submenu li ul li a:focus, + #submenu li ul li a:hover, + #submenu li ul li a:active { background-color:#f63; color: #fff; } + + /* Level 3 */ + #submenu li ul li ul li a, + #submenu li ul li ul li#active, + #submenu li ul li ul li strong, + #submenu li ul li ul li span { width: 70%; padding-left: 30%; } + + #submenu li ul li ul li a { background-color:#fcfcfc; color: #888; } + #submenu li ul li ul li a:focus, + #submenu li ul li ul li a:hover, + #submenu li ul li ul li a:active { background-color:#f63; color: #fff; } + + /* Level 4 */ + #submenu li ul li ul li ul li a, + #submenu li ul li ul li ul li#active, + #submenu li ul li ul li ul li strong, + #submenu li ul li ul li ul li span { width: 60%; padding-left: 40%; } + + #submenu li ul li ul li ul li a { background-color:#ffffff; color: #aaa; } + #submenu li ul li ul li ul li a:focus, + #submenu li ul li ul li ul li a:hover, + #submenu li ul li ul li ul li a:active { background-color:#f63; color: #fff; } + + /* Form-Elements in the Menu*/ + #submenu * select#server_id { + margin: 3px 10%; + padding: 1px; + width: 80%; + } + +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/css/navigation/nav_top.css b/interface/ispconfig/interface/themes/default/css/navigation/nav_top.css new file mode 100644 index 000000000..8d2f2c6a0 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/navigation/nav_top.css @@ -0,0 +1,52 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Horizontal list navigation - ISPConfig 3: default theme + * (de) Horizontale Navigationsliste - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media all +{ + #topNav ul { + list-style: none; + padding: 0; + margin: 0; + } + + #topNav li { + display: inline; + margin: 0 2px 0 0; + } + + #topNav a { + padding: 0 1.5em; + text-decoration: none; + color: black; + background: #d3d3d3; + } + + #topNav a:hover { + background: #fc0; + color: #540; + } + + #topNav #topNav_current { + } + + #topNav #topNav_current a { + padding-bottom: 2px; + font-weight: bold; + color: #ff6600; + background: #ffffff; + } +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/css/patches/central.css b/interface/ispconfig/interface/themes/default/css/patches/central.css new file mode 100644 index 000000000..3ed00400b --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/patches/central.css @@ -0,0 +1,37 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) IE-Patch stylesheet - ISPConfig 3: default theme + * (de) IE-Korrektur-Stylesheet - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* Layout-independent adjustments | Layout-unabhängige Anpassungen ----------------------------------- */ +@import url(../yaml/core/iehacks.css); + +/* Layout-dependent adjustments | Layout-abhängige Anpassungen --------------------------------------- */ +@media screen, projection +{ + /** + * min-width/max-width workaround for IE5.x & IE6 + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid no + */ + + * html #page_margins { + /* Fallback if JavaScript is disabled */ + width: 80%; + } +} diff --git a/interface/ispconfig/interface/themes/default/css/print/print_100.css b/interface/ispconfig/interface/themes/default/css/print/print_100.css new file mode 100644 index 000000000..94315a8af --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/print/print_100.css @@ -0,0 +1,31 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet - ISPConfig 3: default theme + * (de) Druck-Stylesheet - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../../yaml/core/print_base.css); + +/* #col1 - x +** #col2 - 0 +** #col3 - 0 +*/ +@media print +{ + #col1, #col1_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + + #col2 { display:none; } + #col3 { display:none; } +} diff --git a/interface/ispconfig/interface/themes/default/css/screen/basemod.css b/interface/ispconfig/interface/themes/default/css/screen/basemod.css new file mode 100644 index 000000000..60f83712b --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/basemod.css @@ -0,0 +1,118 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Screen layout for YAML - ISPConfig 3: default theme + * (de) Bildschirmlayout fr YAML - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media screen, projection +{ + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Formatting YAML's basic layout elements + * (de) Gestaltung des YAML Basis-Layouts + */ + + /* (en) Marginal areas & page background */ + /* (de) Randbereiche & Seitenhintergrund */ + body { background: #EEEEEE url("../../images/screen_bg.png") repeat-x top left fixed; padding: 10px 0; } + + /* (en) Centering layout in old IE-versions */ + /* (de) Zentrierung des Layouts in alten IE-versionen */ + body { text-align: center; } + #page_margins { text-align:left; margin: 0 auto; } + + /* (en) Layout: width, background, borders */ + /* (de) Layout: Breite, Hintergrund, Rahmen */ + /*#page_margins { min-width: 980px; max-width: 80%; background: #fff;}*/ + /* #page_margins { min-width: 980px; max-width: 80%; background: #fff; display: inline-block;}*/ + #page_margins { min-width: 980px; max-width: 80%; background: #fff; display: table;} + #page{ padding: 10px; } + + /* (en) Designing main layout elements */ + /* (de) Gestaltung der Hauptelemente des Layouts */ + #header { + color: #faf0e6; + padding: 15px 2em 1em 20px; + background: #9a9a9a url(../../images/header_bg.png) repeat-x top left; + } + + /* (en) Text Alignment for #topnav content */ + /* (de) Textausrichtung für #topnav Inhalte */ + #topnav { text-align: left; } + + /* (en) Absolute positioning only within #header */ + /* (de) Absolute Positionierung erfolgt nur innerhalb von #header */ + #header #topnav { + position: absolute; + top: 0px; + left: 0px; + } + + /* (en) Text Alignment for #topnav content */ + /* (de) Textausrichtung für #topnav Inhalte */ + #topsubnav { text-align: right; } + + /* (en) Absolute positioning only within #header */ + /* (de) Absolute Positionierung erfolgt nur innerhalb von #header */ + #header #topsubnav { + position:absolute; + top: 10px; + right: 10px; + } + + /* (en) adjustment of main navigation */ + /* (de) Anpassung der Hauptnavigation */ + #nav ul { margin-left: 200px; } + #nav_main { background: #9a9a9a repeat-x top left; } + + #main { background: #fff;padding:10px 0; } + + #footer { + color:#666; + background: #f9f9f9; + padding: 10px 20px; + border-top: 5px #efefef solid; + font-size: 0.8em; + text-align: center; + } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Formatting content container + * (de) Formatierung der Inhalts-Container + * + * |-------------------------------| + * | #header | + * |-------------------------------| + * | #col1 | #col3 | #col2 | + * | 25% | flexible | 25% | + * |-------------------------------| + * | #footer | + * |-------------------------------| + */ + + + #col1 { width: 25%; } + #col1_content { padding: 10px 10px 10px 20px; } + + #col2 { width: 25%; } + #col2_content { padding: 10px 20px 10px 10px; } + + #col3 { margin: 0 25%; } + #col3_content { padding: 10px; } + + /*------------------------------------------------------------------------------------------------------*/ +} diff --git a/interface/ispconfig/interface/themes/default/css/screen/basemod_2col_left_seo.css b/interface/ispconfig/interface/themes/default/css/screen/basemod_2col_left_seo.css new file mode 100644 index 000000000..525204b23 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/basemod_2col_left_seo.css @@ -0,0 +1,48 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Variation of screen layout (basemod.css) - ISPConfig 3: default theme + * (de) Variation des Screenlayouts (basemod.css) - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media screen, projection +{ + /** + * (en) Repositioning content container + * (de) Neupositionierung der Content Container + * + * |-------------------------------| + * | #header | + * |-------------------------------| + * | #col1 | #col3 | + * | 200px | flexible | + * |-------------------------------| + * | #footer | + * |-------------------------------| + */ + + /* #col1 becomes the fixed navigation column | #col1 wird zur Navigationsspalte mit fester Breite */ + #col1 { width: 200px; float:left} + #col1_content { padding: 0 10px 0 0; } + + /* #col2 is turned off | #col2 abschalten */ + #col2 { display:none; } + + /* #col3 becomes the main column | #col3 wird zur Hauptspalte */ + #col3 { margin-left: 200px; margin-right: 0; } + #col3_content { padding: 0px 10px 10px 20px; } + + /* Graphic-free column dividers between #col1 and #col3 | Grafikfreier Spaltentrenner zw. #col1 und #col3*/ + #col3 {border-left: 1px #ddd solid;} + #main {padding: 1em 0} +} diff --git a/interface/ispconfig/interface/themes/default/css/screen/content.css b/interface/ispconfig/interface/themes/default/css/screen/content.css new file mode 100644 index 000000000..ad5a0d2b6 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/content.css @@ -0,0 +1,188 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Uniform design of standard content elements - ISPConfig 3: default theme + * (de) Einheitliche Standardformatierungen für die wichtigten Inhalts-Elemente - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + * @appdef yaml + */ + +@media all +{ + /** + * Fonts + * (en) font-family and font-size selection for headings and standard text elements + * (de) Zeichensatz und Schriftgrößen für Ãœberschriften und übliche Text-Elemente + * + * @section content-fonts + */ + + /* (en) reset font size for all elements to standard (16 Pixel) */ + /* (de) Alle Schriftgrößen auf Standardgröße (16 Pixel) zurücksetzen */ + html * { font-size: 100.01% } + + /* (en) reset monospaced elements to font size 16px in Gecko browsers */ + /* (de) Schriftgröße von monospaced Elemente auf 16 Pixel setzen */ + textarea, pre, tt, code { + font-family: Consolas,"Lucida Console","Courier New",monospace; + font-size: 0.9em; + } + + /* (en) base layout gets standard font size 12px */ + /* (de) Basis-Layout erhält Standardschriftgröße von 12 Pixeln */ + body { + font-family: 'Trebuchet MS', sans-serif; + font-size: 75.00%; + color: #444; + } + + h1,h2,h3,h4,h5,h6 { + font-family: 'Trebuchet MS', sans-serif; + font-weight:bold; + color:#666; + margin: 0 0 0.25em 0; + } + + h1 { font-size: 200% } /* 24px */ + h2 { font-size: 200% } /* 24px */ + h3 { font-size: 150% } /* 18px */ + h4 { font-size: 133.33% } /* 16px */ + h5 { font-size: 116.67% } /* 14px */ + h6 { font-size: 116.67%; font-style:italic } /* 14px */ + + #header h1 { + font-size:2.5em; + letter-spacing:-2px; + line-height:65%; + color: silver; + } + + #header span { + color:#333333; + } + + p { line-height: 1.5em; margin: 0 0 1em 0; } + + /* ### Lists | Listen #### */ + + ul, ol, dl { line-height: 1.5em; margin: 0 0 1em 1em } + li { margin-left: 1.5em; line-height: 1.5em } + + dt { font-weight: bold } + dd { margin: 0 0 1em 2em } + + /* ### text formatting | Textauszeichnung ### */ + + cite, blockquote { font-style:italic } + blockquote { margin: 0 0 1em 1.5em } + + strong,b { font-weight: bold } + em,i { font-style:italic } + + pre, code { font-family: monospace; font-size: 1.1em; } + + acronym, abbr { + letter-spacing: .07em; + border-bottom: .1em dashed #c00; + cursor: help; + } + + /** + * Generic Content Classes + * (en) standard classes for positioning and highlighting + * (de) Standardklassen zur Positionierung und Hervorhebung + * + * @section content-generic-classes + */ + + .note {background: #dfd; padding: 1em; border-top: 1px #bdb dotted; border-bottom: 1px #bdb dotted;} + .important {background: #ffd; padding: 1em; border-top: 1px #ddb dotted; border-bottom: 1px #ddb dotted;} + .warning {background: #fdd; padding: 1em; border-top: 1px #dbb dotted; border-bottom: 1px #dbb dotted;} + + .float_left { float: left; display:inline; margin-right: 1em; margin-bottom: 0.15em; } + .float_right { float: right; display:inline; margin-left: 1em; margin-bottom: 0.15em; } + .center { text-align:center; margin: 0.5em auto } + + /** + * External Links + * + * (en) Formatting of hyperlinks + * (de) Gestaltung von Hyperlinks + * + */ + + a {color: #4D87C7; text-decoration:none;} + a:focus, + a:hover, + a:active {color:#182E7A; text-decoration:underline;} + + #topsubnav a { color: #f0f8ff; font-weight: normal; background:transparent; text-decoration:none; } + #topsubnav a:focus, + #topsubnav a:hover, + #topsubnav a:active { text-decoration:underline; background-color: transparent;} + + #footer a { color: #999; background:transparent; font-weight: bold;} + #footer a:focus, + #footer a:hover, + #footer a:active {color: #4D87C7; background-color: transparent; text-decoration:underline;} + + /** + * (en) Emphasizing external Hyperlinks via CSS + * (de) Hervorhebung externer Hyperlinks mit CSS + * + * @section content-external-links + * @app-yaml-default disabled + */ + + /* + #main a[href^="http://www.my-domain.com"], + #main a[href^="https://www.my-domain.com"] + { + padding-left: 12px; + background-image: url('your_image.gif'); + background-repeat: no-repeat; + background-position: 0 0.45em; + } + */ + + /** + * Tables | Tabellen + * (en) Generic classes for table-width and design definition + * (de) Generische Klassen für die Tabellenbreite und Gestaltungsvorschriften für Tabellen + * + * @section content-tables + */ + + table { width: auto; border-collapse:collapse; margin-bottom: 0.5em; } + table.full { width: 100%; } + table.fixed { table-layout:fixed } + + th,td { padding: 0.5em; } + thead th { background: #444 url(../../images/lists_thead_bg.png) repeat-x; color: #fff } + tbody th { background: #ccc; color: #333 } + tbody th.sub { background: #ddd; color: #333 } + + /** + * Miscellaneous | Sonstiges + * + * @section content-misc + */ + + hr { + color: #fff; + background:transparent; + margin: 0 0 0.5em 0; + padding: 0 0 0.5em 0; + border:0; + border-bottom: 1px #eee solid; + } +} diff --git a/interface/ispconfig/interface/themes/default/css/screen/content_ispc.css b/interface/ispconfig/interface/themes/default/css/screen/content_ispc.css new file mode 100644 index 000000000..46da666ef --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/content_ispc.css @@ -0,0 +1,822 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Uniform design of ISPConfig elements - ISPConfig 3: default theme + * (de) Einheitliche Standardformatierungen f�r ISPConfig-Elemente - ISPConfig 3: default theme + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + * @appdef yaml + */ + +@media all +{ + .pageForm_description { + font-size: 12px; + } + + /* Tab-Box */ + .tabbox_tabs { + border-bottom: 1px solid #d3d3d3; + } + .tabbox_tabs ul { + list-style: none; + padding: 0; + margin: 0; + } + .tabbox_tabs li { + display: inline; + margin: 0 2px 0 0; + } + .tabbox_tabs a { + padding: 0 1em; + text-decoration: none; + color: black; + background: #d3d3d3; + border: 1px solid #d3d3d3; + } + .tabbox_tabs a:hover { + background: #fc0; + color: #540; + } + .tabbox_tabs .active a { + font-weight: bold; + color: #ff6600; + background: #ffffff; + } + + .pnl_toolsarea fieldset, .pnl_listarea fieldset, .pnl_formsarea fieldset { + border-color: #6299c5 -moz-use-text-color -moz-use-text-color; + border-style: solid none none; + border-width: 1px medium medium; + margin: 20px 0; + } + .pnl_toolsarea fieldset legend , .pnl_listarea fieldset legend { + font-weight: bold; + color: #6299c5; + } + .pnl_formarea fieldset { + font-weight: bold; + } + + /* hide line and legend when inside tabbed content */ + #tabbox_content * .pnl_toolsarea fieldset, #tabbox_content * .pnl_listarea fieldset, #tabbox_content * .pnl_formsarea fieldset { border: none !important; } + #tabbox_content * .pnl_toolsarea fieldset legend, #tabbox_content * .pnl_listarea fieldset legend, #tabbox_content * .pnl_formsarea fieldset legend { display: none !important; } + + .codeview { + margin:20px 0; + padding:2px; + border: 1px solid #ffcc00; + background: #fffaea; + font-family: Consolas, "Lucida Console", "Courier New", monospace; + font-size: 0.9em; + } + + /* Lists */ + table.list { + width: 100%; + border: 1px solid #d3d3d3 !important; + } + table.list thead th { font-size: 10px; } + table.list tbody { border: 1px solid #d3d3d3 !important; } + table.list tfoot td { text-align: center; background: #f8f8f8 url(../../images/lists_tfoot_bg.png) repeat-x bottom left; padding: 24px 8px 8px 8px; } + table.list .tbl_row_even { background: #fcfcfc; } + table.list .tbl_row_uneven { background: #f0f8ff; } + table.list tr:hover { background: #fffacd; } + + /* Password Strength */ + #passBar { + width: 101px; height: 10px; + background: url(../../images/meter_bg.gif) repeat-x bottom left; + margin: 2px 0; + float: left; + } + #passText { + padding: 0; + float: left; + } + + /* Systemmonitor */ + .systemmonitor-state { + margin: 10px 0; + font-family: Consolas, "Lucida Console", "Courier New", monospace; + font-size: 0.9em; + } + .systemmonitor-state.state-no_state { + border-top: 4px solid #95A19F; + background-color: #f8f8ff; + } + .systemmonitor-state.state-unknown { + border-top: 4px solid #30302e; + background-color: #cecfc5; + } + .systemmonitor-state.state-ok { + border-top: 4px solid #23fb00; + background-color: #adffa2; + } + .systemmonitor-state.state-info { + border-top: 4px solid #fdff00; + background-color: #fdffa2; + } + .systemmonitor-state.state-warning { + border-top: 4px solid #ffa800; + background-color: #ffda93; + } + .systemmonitor-state.state-critical { + border-top: 4px solid #ff0000; + background-color: #ffb9b9; + } + .systemmonitor-state.state-error { + border-top: 4px solid #ff0000; + background-color: #ff7f7f; + } + + .systemmonitor-device { + background-repeat: no-repeat; + background-position: 12px 4px; + min-height: 80px; + } + .systemmonitor-device.device-system { background-image: url("../../icons/x64/network.png"); } + .systemmonitor-device.device-server { background-image: url("../../icons/x64/server.png"); } + + .systemmonitor-content.icons32 { + padding:2px 10px 2px 80px; + background-repeat: no-repeat; + background-position: 12px 4px; + } + .systemmonitor-content.icons32.ico-no_state { /*background-image:url("../../icons/x32/state_no.png"); */ } + .systemmonitor-content.icons32.ico-unknown { background-image:url("../../icons/x32/state_unknown.png"); } + .systemmonitor-content.icons32.ico-ok { background-image:url("../../icons/x32/state_ok.png"); } + .systemmonitor-content.icons32.ico-info { background-image:url("../../icons/x32/state_info.png"); } + .systemmonitor-content.icons32.ico-warning { background-image:url("../../icons/x32/state_warning.png"); } + .systemmonitor-content.icons32.ico-critical { background-image:url("../../icons/x32/state_critical.png"); } + .systemmonitor-content.icons32.ico-error { background-image:url("../../icons/x32/state_error.png"); } + + .systemmonitor-content table { + border: none; + margin-top: 10px; + } + + .systemmonitor-content * .online { + border: 1px solid #ffffff; + background-color: #E3FFB8; + color: #000000; + padding:0px 5px; + } + .systemmonitor-content * .offline { + border: 1px solid #ffffff; + background-color: #d12f19; + color:#ffffff; + padding:0px 5px; + } + + /* Image-Replacement */ + .swap { background-repeat:no-repeat; } + .swap span { display:none; height:16px; } + #ir-HeaderLogo { background-image:url("../../images/header_logo.png"); height:32px; } + #ir-Yes { background-image:url("../../icons/x16/tick_circle.png"); height:16px; } + #ir-No { background-image:url("../../icons/x16/cross_circle.png"); height:16px; } + + /* BUTTONS */ + .buttons a, .buttons button{ + display:block; + float:left; + margin:0 7px 0 0; + background-color:#f5f5f5; + border:1px solid #777777; + border-top: 1px solid #c8c8c8; + border-left:1px solid #c8c8c8; + + font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif; + font-size:90%; + line-height:130%; + text-decoration:none; + font-weight:bold; + color:#565656; + cursor:pointer; + padding:5px 10px 6px 7px; /* Links */ + } + .buttons button{ + width:auto; + overflow:visible; + padding:4px 10px 3px 7px; /* IE6 */ + } + .buttons button[type]{ + padding:5px 10px 5px 7px; /* Firefox */ + line-height:17px; /* Safari */ + } + *:first-child+html button[type]{ + padding:4px 10px 3px 7px; /* IE7 */ + } + .buttons button img, .buttons a img{ + margin:0 3px -3px 0 !important; + padding:0; + border:none; + width:16px; + height:16px; + } + + /* BUTTONS STANDARD */ + button:hover, .buttons a:hover{ + background-color:#dff4ff; + border:1px solid #c2e1ef; + color:#336699; + } + .buttons a:active{ + background-color:#6299c5; + border:1px solid #6299c5; + color:#fff; + } + + /* BUTTONS POSITIVE */ + button.positive, .buttons a.positive{ + color:#529214; + } + .buttons a.positive:hover, button.positive:hover{ + background-color:#E6EFC2; + border:1px solid #C6D880; + color:#529214; + } + .buttons a.positive:active{ + background-color:#529214; + border:1px solid #529214; + color:#fff; + } + + /* BUTTONS NEGATIVE */ + .buttons a.negative, button.negative{ + color:#d12f19; + } + .buttons a.negative:hover, button.negative:hover{ + background-color:#fbe3e4; + border:1px solid #fbc2c4; + color:#d12f19; + } + .buttons a.negative:active{ + background-color:#d12f19; + border:1px solid #d12f19; + color:#fff; + } + + /* Button with icon and text */ + .iconstxt { + background-repeat: no-repeat; + background-position: 4px 4px; + } + .iconstxt span { padding-left: 20px; } + .iconstxt.icoPositive { background-image: url("../../icons/x16/tick_circle_frame.png"); } + .iconstxt.icoNegative { background-image: url("../../icons/x16/cross_circle_frame.png"); } + .iconstxt.icoAdd { background-image: url(../../icons/x16/plus_circle_frame.png); } + .iconstxt.icoKey { background-image: url("../../icons/x16/key.png"); } + .iconstxt.icoDelete { background-image: url("../../icons/x16/minus_circle_frame.png"); } + + /* Button with icon and without text */ + .icons16 span { display: none; } + a.icons16 { height: 18px; width: 18px; padding: 0; background-repeat: no-repeat; background-position: 1px 1px;} + button.icons16 { height: 20px; width: 20px; padding: 0; background-repeat: no-repeat; background-position: 1px 1px;} + + .icons16.icoDelete { background-image: url("../../icons/x16/minus_circle_frame.png"); } + .icons16.icoFilter { background-image: url(../../icons/x16/funnel.png); } + .icons16.icoEdit { background-image: url("../../icons/x16/wrench.png"); } + .icons16.icoDbAdmin { background-image: url("../../icons/x16/database.png"); } + .icons16.icoLoginAs { background-image: url("../../icons/x16/user_go.png"); } + .icons16.icoWebmailer { background-image: url("../../icons/x16/mails_arrow.png"); } + + + + .blockLabel.email_at { + width: 20px !important; + margin: 1.6em 0.3em 0 0 !important + } + .textDisplay { display: block; } + + /* Form Length Classes */ + .textInput.formLengthBool { width: 25px !important; } + .selectInput.formLengthBool { width: 60px !important; } + .textInput.formLengthLimit { width: 50px !important; } + .selectInput.formLengthLimit { width: 85px !important; } + .formLengthDate { width: 75px !important; } + .formLengthIPv4 { width: 125px !important; } + .formLengthIPv6 { width: 100% !important; } + .formLengthEmailUser { width: 30% !important; } + .formLengthEmailDomain { width: 30% !important; } + .formLengthHalf { width: 15% !important; } + .formLengthDouble { width: 50% !important; } + + /* Individual Form Lengths */ + .textInput#username, .textInput#password, .textInput#passwort, .textInput#source_password { width: 100px; } + .selectInput#language { width: 75px; } + .selectInput#client_group_id, .selectInput#default_group { width: 125px; } + input#refresh, input#retry, input#expire, input#minimum, input#ttl { width: 50px !important; } + + /* --- */ + + a[href $='#logout'] { padding-right: 18px; background: transparent url("../../icons/x16/logout.png") no-repeat right top !important; } + + /* Select Menu with Images */ + select.withicons option { + background-repeat:no-repeat; + background-position: 1px; + padding-left:24px; + } + select.withicons#country option[value="AD"] { background-image:url(../../icons/flags/ad.png); } + select.withicons#country option[value="AE"] { background-image:url(../../icons/flags/ae.png); } + select.withicons#country option[value="AF"] { background-image:url(../../icons/flags/af.png); } + select.withicons#country option[value="AG"] { background-image:url(../../icons/flags/ag.png); } + select.withicons#country option[value="AI"] { background-image:url(../../icons/flags/ai.png); } + select.withicons#country option[value="AL"] { background-image:url(../../icons/flags/al.png); } + select.withicons#country option[value="AM"] { background-image:url(../../icons/flags/am.png); } + select.withicons#country option[value="AN"] { background-image:url(../../icons/flags/an.png); } + select.withicons#country option[value="AO"] { background-image:url(../../icons/flags/ao.png); } + select.withicons#country option[value="AQ"] { background-image:url(../../icons/flags/aq.png); } + select.withicons#country option[value="AR"] { background-image:url(../../icons/flags/ar.png); } + select.withicons#country option[value="AS"] { background-image:url(../../icons/flags/as.png); } + select.withicons#country option[value="AT"] { background-image:url(../../icons/flags/at.png); } + select.withicons#country option[value="AU"] { background-image:url(../../icons/flags/au.png); } + select.withicons#country option[value="AW"] { background-image:url(../../icons/flags/aw.png); } + select.withicons#country option[value="AX"] { background-image:url(../../icons/flags/ax.png); } + select.withicons#country option[value="AZ"] { background-image:url(../../icons/flags/az.png); } + select.withicons#country option[value="BA"] { background-image:url(../../icons/flags/ba.png); } + select.withicons#country option[value="BB"] { background-image:url(../../icons/flags/bb.png); } + select.withicons#country option[value="BD"] { background-image:url(../../icons/flags/bd.png); } + select.withicons#country option[value="BE"] { background-image:url(../../icons/flags/be.png); } + select.withicons#country option[value="BF"] { background-image:url(../../icons/flags/bf.png); } + select.withicons#country option[value="BG"] { background-image:url(../../icons/flags/bg.png); } + select.withicons#country option[value="BH"] { background-image:url(../../icons/flags/bh.png); } + select.withicons#country option[value="BI"] { background-image:url(../../icons/flags/bi.png); } + select.withicons#country option[value="BJ"] { background-image:url(../../icons/flags/bj.png); } + select.withicons#country option[value="BM"] { background-image:url(../../icons/flags/bm.png); } + select.withicons#country option[value="BN"] { background-image:url(../../icons/flags/bn.png); } + select.withicons#country option[value="BO"] { background-image:url(../../icons/flags/bo.png); } + select.withicons#country option[value="BR"] { background-image:url(../../icons/flags/br.png); } + select.withicons#country option[value="BS"] { background-image:url(../../icons/flags/bs.png); } + select.withicons#country option[value="BT"] { background-image:url(../../icons/flags/bt.png); } + select.withicons#country option[value="BV"] { background-image:url(../../icons/flags/bv.png); } + select.withicons#country option[value="BW"] { background-image:url(../../icons/flags/bw.png); } + select.withicons#country option[value="BY"] { background-image:url(../../icons/flags/by.png); } + select.withicons#country option[value="BZ"] { background-image:url(../../icons/flags/bz.png); } + select.withicons#country option[value="CA"] { background-image:url(../../icons/flags/ca.png); } + select.withicons#country option[value="CC"] { background-image:url(../../icons/flags/cc.png); } + select.withicons#country option[value="CD"] { background-image:url(../../icons/flags/cd.png); } + select.withicons#country option[value="CF"] { background-image:url(../../icons/flags/cf.png); } + select.withicons#country option[value="CG"] { background-image:url(../../icons/flags/cg.png); } + select.withicons#country option[value="CH"] { background-image:url(../../icons/flags/ch.png); } + select.withicons#country option[value="CI"] { background-image:url(../../icons/flags/ci.png); } + select.withicons#country option[value="CK"] { background-image:url(../../icons/flags/ck.png); } + select.withicons#country option[value="CL"] { background-image:url(../../icons/flags/cl.png); } + select.withicons#country option[value="CM"] { background-image:url(../../icons/flags/cm.png); } + select.withicons#country option[value="CN"] { background-image:url(../../icons/flags/cn.png); } + select.withicons#country option[value="CO"] { background-image:url(../../icons/flags/co.png); } + select.withicons#country option[value="CR"] { background-image:url(../../icons/flags/cr.png); } + select.withicons#country option[value="CS"] { background-image:url(../../icons/flags/cs.png); } + select.withicons#country option[value="CU"] { background-image:url(../../icons/flags/cu.png); } + select.withicons#country option[value="CV"] { background-image:url(../../icons/flags/cv.png); } + select.withicons#country option[value="CX"] { background-image:url(../../icons/flags/cx.png); } + select.withicons#country option[value="CY"] { background-image:url(../../icons/flags/cy.png); } + select.withicons#country option[value="CZ"] { background-image:url(../../icons/flags/cz.png); } + select.withicons#country option[value="DE"] { background-image:url(../../icons/flags/de.png); } + select.withicons#country option[value="DJ"] { background-image:url(../../icons/flags/dj.png); } + select.withicons#country option[value="DK"] { background-image:url(../../icons/flags/dk.png); } + select.withicons#country option[value="DM"] { background-image:url(../../icons/flags/dm.png); } + select.withicons#country option[value="DO"] { background-image:url(../../icons/flags/do.png); } + select.withicons#country option[value="DZ"] { background-image:url(../../icons/flags/dz.png); } + select.withicons#country option[value="EC"] { background-image:url(../../icons/flags/ec.png); } + select.withicons#country option[value="EE"] { background-image:url(../../icons/flags/ee.png); } + select.withicons#country option[value="EG"] { background-image:url(../../icons/flags/eg.png); } + select.withicons#country option[value="EH"] { background-image:url(../../icons/flags/eh.png); } + select.withicons#country option[value="ER"] { background-image:url(../../icons/flags/er.png); } + select.withicons#country option[value="ES"] { background-image:url(../../icons/flags/es.png); } + select.withicons#country option[value="ET"] { background-image:url(../../icons/flags/et.png); } + select.withicons#country option[value="FI"] { background-image:url(../../icons/flags/fi.png); } + select.withicons#country option[value="FJ"] { background-image:url(../../icons/flags/fj.png); } + select.withicons#country option[value="FK"] { background-image:url(../../icons/flags/fk.png); } + select.withicons#country option[value="FM"] { background-image:url(../../icons/flags/fm.png); } + select.withicons#country option[value="FO"] { background-image:url(../../icons/flags/fo.png); } + select.withicons#country option[value="FR"] { background-image:url(../../icons/flags/fr.png); } + select.withicons#country option[value="GA"] { background-image:url(../../icons/flags/ga.png); } + select.withicons#country option[value="GB"] { background-image:url(../../icons/flags/gb.png); } + select.withicons#country option[value="GD"] { background-image:url(../../icons/flags/gd.png); } + select.withicons#country option[value="GE"] { background-image:url(../../icons/flags/ge.png); } + select.withicons#country option[value="GF"] { background-image:url(../../icons/flags/gf.png); } + select.withicons#country option[value="GH"] { background-image:url(../../icons/flags/gh.png); } + select.withicons#country option[value="GI"] { background-image:url(../../icons/flags/gi.png); } + select.withicons#country option[value="GL"] { background-image:url(../../icons/flags/gl.png); } + select.withicons#country option[value="GM"] { background-image:url(../../icons/flags/gm.png); } + select.withicons#country option[value="GN"] { background-image:url(../../icons/flags/gn.png); } + select.withicons#country option[value="GP"] { background-image:url(../../icons/flags/gp.png); } + select.withicons#country option[value="GQ"] { background-image:url(../../icons/flags/gq.png); } + select.withicons#country option[value="GR"] { background-image:url(../../icons/flags/gr.png); } + select.withicons#country option[value="GS"] { background-image:url(../../icons/flags/gs.png); } + select.withicons#country option[value="GT"] { background-image:url(../../icons/flags/gt.png); } + select.withicons#country option[value="GU"] { background-image:url(../../icons/flags/gu.png); } + select.withicons#country option[value="GW"] { background-image:url(../../icons/flags/gw.png); } + select.withicons#country option[value="GY"] { background-image:url(../../icons/flags/gy.png); } + select.withicons#country option[value="HK"] { background-image:url(../../icons/flags/hk.png); } + select.withicons#country option[value="HM"] { background-image:url(../../icons/flags/hm.png); } + select.withicons#country option[value="HN"] { background-image:url(../../icons/flags/hn.png); } + select.withicons#country option[value="HR"] { background-image:url(../../icons/flags/hr.png); } + select.withicons#country option[value="HT"] { background-image:url(../../icons/flags/ht.png); } + select.withicons#country option[value="HU"] { background-image:url(../../icons/flags/hu.png); } + select.withicons#country option[value="ID"] { background-image:url(../../icons/flags/id.png); } + select.withicons#country option[value="IE"] { background-image:url(../../icons/flags/ie.png); } + select.withicons#country option[value="IL"] { background-image:url(../../icons/flags/il.png); } + select.withicons#country option[value="IN"] { background-image:url(../../icons/flags/in.png); } + select.withicons#country option[value="IO"] { background-image:url(../../icons/flags/io.png); } + select.withicons#country option[value="IQ"] { background-image:url(../../icons/flags/iq.png); } + select.withicons#country option[value="IR"] { background-image:url(../../icons/flags/ir.png); } + select.withicons#country option[value="IS"] { background-image:url(../../icons/flags/is.png); } + select.withicons#country option[value="IT"] { background-image:url(../../icons/flags/it.png); } + select.withicons#country option[value="JM"] { background-image:url(../../icons/flags/jm.png); } + select.withicons#country option[value="JO"] { background-image:url(../../icons/flags/jo.png); } + select.withicons#country option[value="JP"] { background-image:url(../../icons/flags/jp.png); } + select.withicons#country option[value="KE"] { background-image:url(../../icons/flags/ke.png); } + select.withicons#country option[value="KG"] { background-image:url(../../icons/flags/kg.png); } + select.withicons#country option[value="KH"] { background-image:url(../../icons/flags/kh.png); } + select.withicons#country option[value="KI"] { background-image:url(../../icons/flags/ki.png); } + select.withicons#country option[value="KM"] { background-image:url(../../icons/flags/km.png); } + select.withicons#country option[value="KN"] { background-image:url(../../icons/flags/kn.png); } + select.withicons#country option[value="KP"] { background-image:url(../../icons/flags/kp.png); } + select.withicons#country option[value="KR"] { background-image:url(../../icons/flags/kr.png); } + select.withicons#country option[value="KW"] { background-image:url(../../icons/flags/kw.png); } + select.withicons#country option[value="KY"] { background-image:url(../../icons/flags/ky.png); } + select.withicons#country option[value="KZ"] { background-image:url(../../icons/flags/kz.png); } + select.withicons#country option[value="LA"] { background-image:url(../../icons/flags/la.png); } + select.withicons#country option[value="LB"] { background-image:url(../../icons/flags/lb.png); } + select.withicons#country option[value="LC"] { background-image:url(../../icons/flags/lc.png); } + select.withicons#country option[value="LI"] { background-image:url(../../icons/flags/li.png); } + select.withicons#country option[value="LK"] { background-image:url(../../icons/flags/lk.png); } + select.withicons#country option[value="LR"] { background-image:url(../../icons/flags/lr.png); } + select.withicons#country option[value="LS"] { background-image:url(../../icons/flags/ls.png); } + select.withicons#country option[value="LT"] { background-image:url(../../icons/flags/lt.png); } + select.withicons#country option[value="LU"] { background-image:url(../../icons/flags/lu.png); } + select.withicons#country option[value="LV"] { background-image:url(../../icons/flags/lv.png); } + select.withicons#country option[value="LY"] { background-image:url(../../icons/flags/ly.png); } + select.withicons#country option[value="MA"] { background-image:url(../../icons/flags/ma.png); } + select.withicons#country option[value="MC"] { background-image:url(../../icons/flags/mc.png); } + select.withicons#country option[value="MD"] { background-image:url(../../icons/flags/md.png); } + select.withicons#country option[value="ME"] { background-image:url(../../icons/flags/me.png); } + select.withicons#country option[value="MG"] { background-image:url(../../icons/flags/mg.png); } + select.withicons#country option[value="MH"] { background-image:url(../../icons/flags/mh.png); } + select.withicons#country option[value="MK"] { background-image:url(../../icons/flags/mk.png); } + select.withicons#country option[value="ML"] { background-image:url(../../icons/flags/ml.png); } + select.withicons#country option[value="MM"] { background-image:url(../../icons/flags/mm.png); } + select.withicons#country option[value="MN"] { background-image:url(../../icons/flags/mn.png); } + select.withicons#country option[value="MO"] { background-image:url(../../icons/flags/mo.png); } + select.withicons#country option[value="MP"] { background-image:url(../../icons/flags/mp.png); } + select.withicons#country option[value="MQ"] { background-image:url(../../icons/flags/mq.png); } + select.withicons#country option[value="MR"] { background-image:url(../../icons/flags/mr.png); } + select.withicons#country option[value="MS"] { background-image:url(../../icons/flags/ms.png); } + select.withicons#country option[value="MT"] { background-image:url(../../icons/flags/mt.png); } + select.withicons#country option[value="MU"] { background-image:url(../../icons/flags/mu.png); } + select.withicons#country option[value="MV"] { background-image:url(../../icons/flags/mv.png); } + select.withicons#country option[value="MW"] { background-image:url(../../icons/flags/mw.png); } + select.withicons#country option[value="MX"] { background-image:url(../../icons/flags/mx.png); } + select.withicons#country option[value="MY"] { background-image:url(../../icons/flags/my.png); } + select.withicons#country option[value="MZ"] { background-image:url(../../icons/flags/mz.png); } + select.withicons#country option[value="NA"] { background-image:url(../../icons/flags/na.png); } + select.withicons#country option[value="NC"] { background-image:url(../../icons/flags/nc.png); } + select.withicons#country option[value="NE"] { background-image:url(../../icons/flags/ne.png); } + select.withicons#country option[value="NF"] { background-image:url(../../icons/flags/nf.png); } + select.withicons#country option[value="NG"] { background-image:url(../../icons/flags/ng.png); } + select.withicons#country option[value="NI"] { background-image:url(../../icons/flags/ni.png); } + select.withicons#country option[value="NL"] { background-image:url(../../icons/flags/nl.png); } + select.withicons#country option[value="NO"] { background-image:url(../../icons/flags/no.png); } + select.withicons#country option[value="NP"] { background-image:url(../../icons/flags/np.png); } + select.withicons#country option[value="NR"] { background-image:url(../../icons/flags/nr.png); } + select.withicons#country option[value="NU"] { background-image:url(../../icons/flags/nu.png); } + select.withicons#country option[value="NZ"] { background-image:url(../../icons/flags/nz.png); } + select.withicons#country option[value="OM"] { background-image:url(../../icons/flags/om.png); } + select.withicons#country option[value="PA"] { background-image:url(../../icons/flags/pa.png); } + select.withicons#country option[value="PE"] { background-image:url(../../icons/flags/pe.png); } + select.withicons#country option[value="PF"] { background-image:url(../../icons/flags/pf.png); } + select.withicons#country option[value="PG"] { background-image:url(../../icons/flags/pg.png); } + select.withicons#country option[value="PH"] { background-image:url(../../icons/flags/ph.png); } + select.withicons#country option[value="PK"] { background-image:url(../../icons/flags/pk.png); } + select.withicons#country option[value="PL"] { background-image:url(../../icons/flags/pl.png); } + select.withicons#country option[value="PM"] { background-image:url(../../icons/flags/pm.png); } + select.withicons#country option[value="PN"] { background-image:url(../../icons/flags/pn.png); } + select.withicons#country option[value="PR"] { background-image:url(../../icons/flags/pr.png); } + select.withicons#country option[value="PS"] { background-image:url(../../icons/flags/ps.png); } + select.withicons#country option[value="PT"] { background-image:url(../../icons/flags/pt.png); } + select.withicons#country option[value="PW"] { background-image:url(../../icons/flags/pw.png); } + select.withicons#country option[value="PY"] { background-image:url(../../icons/flags/py.png); } + select.withicons#country option[value="QA"] { background-image:url(../../icons/flags/qa.png); } + select.withicons#country option[value="RE"] { background-image:url(../../icons/flags/re.png); } + select.withicons#country option[value="RO"] { background-image:url(../../icons/flags/ro.png); } + select.withicons#country option[value="RS"] { background-image:url(../../icons/flags/rs.png); } + select.withicons#country option[value="RU"] { background-image:url(../../icons/flags/ru.png); } + select.withicons#country option[value="RW"] { background-image:url(../../icons/flags/rw.png); } + select.withicons#country option[value="SA"] { background-image:url(../../icons/flags/sa.png); } + select.withicons#country option[value="SB"] { background-image:url(../../icons/flags/sb.png); } + select.withicons#country option[value="SC"] { background-image:url(../../icons/flags/sc.png); } + select.withicons#country option[value="SD"] { background-image:url(../../icons/flags/sd.png); } + select.withicons#country option[value="SE"] { background-image:url(../../icons/flags/se.png); } + select.withicons#country option[value="SG"] { background-image:url(../../icons/flags/sg.png); } + select.withicons#country option[value="SH"] { background-image:url(../../icons/flags/sh.png); } + select.withicons#country option[value="SI"] { background-image:url(../../icons/flags/si.png); } + select.withicons#country option[value="SJ"] { background-image:url(../../icons/flags/sj.png); } + select.withicons#country option[value="SK"] { background-image:url(../../icons/flags/sk.png); } + select.withicons#country option[value="SL"] { background-image:url(../../icons/flags/sl.png); } + select.withicons#country option[value="SM"] { background-image:url(../../icons/flags/sm.png); } + select.withicons#country option[value="SN"] { background-image:url(../../icons/flags/sn.png); } + select.withicons#country option[value="SO"] { background-image:url(../../icons/flags/so.png); } + select.withicons#country option[value="SR"] { background-image:url(../../icons/flags/sr.png); } + select.withicons#country option[value="ST"] { background-image:url(../../icons/flags/st.png); } + select.withicons#country option[value="SV"] { background-image:url(../../icons/flags/sv.png); } + select.withicons#country option[value="SY"] { background-image:url(../../icons/flags/sy.png); } + select.withicons#country option[value="SZ"] { background-image:url(../../icons/flags/sz.png); } + select.withicons#country option[value="TC"] { background-image:url(../../icons/flags/tc.png); } + select.withicons#country option[value="TD"] { background-image:url(../../icons/flags/td.png); } + select.withicons#country option[value="TF"] { background-image:url(../../icons/flags/tf.png); } + select.withicons#country option[value="TG"] { background-image:url(../../icons/flags/tg.png); } + select.withicons#country option[value="TH"] { background-image:url(../../icons/flags/th.png); } + select.withicons#country option[value="TJ"] { background-image:url(../../icons/flags/tj.png); } + select.withicons#country option[value="TK"] { background-image:url(../../icons/flags/tk.png); } + select.withicons#country option[value="TL"] { background-image:url(../../icons/flags/tl.png); } + select.withicons#country option[value="TM"] { background-image:url(../../icons/flags/tm.png); } + select.withicons#country option[value="TN"] { background-image:url(../../icons/flags/tn.png); } + select.withicons#country option[value="TO"] { background-image:url(../../icons/flags/to.png); } + select.withicons#country option[value="TR"] { background-image:url(../../icons/flags/tr.png); } + select.withicons#country option[value="TT"] { background-image:url(../../icons/flags/tt.png); } + select.withicons#country option[value="TV"] { background-image:url(../../icons/flags/tv.png); } + select.withicons#country option[value="TW"] { background-image:url(../../icons/flags/tw.png); } + select.withicons#country option[value="TZ"] { background-image:url(../../icons/flags/tz.png); } + select.withicons#country option[value="UA"] { background-image:url(../../icons/flags/ua.png); } + select.withicons#country option[value="UG"] { background-image:url(../../icons/flags/ug.png); } + select.withicons#country option[value="UM"] { background-image:url(../../icons/flags/um.png); } + select.withicons#country option[value="US"] { background-image:url(../../icons/flags/us.png); } + select.withicons#country option[value="UY"] { background-image:url(../../icons/flags/uy.png); } + select.withicons#country option[value="UZ"] { background-image:url(../../icons/flags/uz.png); } + select.withicons#country option[value="VA"] { background-image:url(../../icons/flags/va.png); } + select.withicons#country option[value="VC"] { background-image:url(../../icons/flags/vc.png); } + select.withicons#country option[value="VE"] { background-image:url(../../icons/flags/ve.png); } + select.withicons#country option[value="VG"] { background-image:url(../../icons/flags/vg.png); } + select.withicons#country option[value="VI"] { background-image:url(../../icons/flags/vi.png); } + select.withicons#country option[value="VN"] { background-image:url(../../icons/flags/vn.png); } + select.withicons#country option[value="VU"] { background-image:url(../../icons/flags/vu.png); } + select.withicons#country option[value="WF"] { background-image:url(../../icons/flags/wf.png); } + select.withicons#country option[value="WS"] { background-image:url(../../icons/flags/ws.png); } + select.withicons#country option[value="YE"] { background-image:url(../../icons/flags/ye.png); } + select.withicons#country option[value="YT"] { background-image:url(../../icons/flags/yt.png); } + select.withicons#country option[value="ZA"] { background-image:url(../../icons/flags/za.png); } + select.withicons#country option[value="ZM"] { background-image:url(../../icons/flags/zm.png); } + select.withicons#country option[value="ZW"] { background-image:url(../../icons/flags/zw.png); } + + select.withicons#language option[value="ad"] { background-image:url(../../icons/flags/ad.png); } + select.withicons#language option[value="ae"] { background-image:url(../../icons/flags/ae.png); } + select.withicons#language option[value="af"] { background-image:url(../../icons/flags/af.png); } + select.withicons#language option[value="ag"] { background-image:url(../../icons/flags/ag.png); } + select.withicons#language option[value="ai"] { background-image:url(../../icons/flags/ai.png); } + select.withicons#language option[value="al"] { background-image:url(../../icons/flags/al.png); } + select.withicons#language option[value="am"] { background-image:url(../../icons/flags/am.png); } + select.withicons#language option[value="an"] { background-image:url(../../icons/flags/an.png); } + select.withicons#language option[value="ao"] { background-image:url(../../icons/flags/ao.png); } + select.withicons#language option[value="aq"] { background-image:url(../../icons/flags/aq.png); } + select.withicons#language option[value="ar"] { background-image:url(../../icons/flags/ar.png); } + select.withicons#language option[value="as"] { background-image:url(../../icons/flags/as.png); } + select.withicons#language option[value="at"] { background-image:url(../../icons/flags/at.png); } + select.withicons#language option[value="au"] { background-image:url(../../icons/flags/au.png); } + select.withicons#language option[value="aw"] { background-image:url(../../icons/flags/aw.png); } + select.withicons#language option[value="ax"] { background-image:url(../../icons/flags/ax.png); } + select.withicons#language option[value="az"] { background-image:url(../../icons/flags/az.png); } + select.withicons#language option[value="ba"] { background-image:url(../../icons/flags/ba.png); } + select.withicons#language option[value="bb"] { background-image:url(../../icons/flags/bb.png); } + select.withicons#language option[value="bd"] { background-image:url(../../icons/flags/bd.png); } + select.withicons#language option[value="be"] { background-image:url(../../icons/flags/be.png); } + select.withicons#language option[value="bf"] { background-image:url(../../icons/flags/bf.png); } + select.withicons#language option[value="bg"] { background-image:url(../../icons/flags/bg.png); } + select.withicons#language option[value="bh"] { background-image:url(../../icons/flags/bh.png); } + select.withicons#language option[value="bi"] { background-image:url(../../icons/flags/bi.png); } + select.withicons#language option[value="bj"] { background-image:url(../../icons/flags/bj.png); } + select.withicons#language option[value="bm"] { background-image:url(../../icons/flags/bm.png); } + select.withicons#language option[value="bn"] { background-image:url(../../icons/flags/bn.png); } + select.withicons#language option[value="bo"] { background-image:url(../../icons/flags/bo.png); } + select.withicons#language option[value="br"] { background-image:url(../../icons/flags/br.png); } + select.withicons#language option[value="bs"] { background-image:url(../../icons/flags/bs.png); } + select.withicons#language option[value="bt"] { background-image:url(../../icons/flags/bt.png); } + select.withicons#language option[value="bv"] { background-image:url(../../icons/flags/bv.png); } + select.withicons#language option[value="bw"] { background-image:url(../../icons/flags/bw.png); } + select.withicons#language option[value="by"] { background-image:url(../../icons/flags/by.png); } + select.withicons#language option[value="bz"] { background-image:url(../../icons/flags/bz.png); } + select.withicons#language option[value="ca"] { background-image:url(../../icons/flags/ca.png); } + select.withicons#language option[value="cc"] { background-image:url(../../icons/flags/cc.png); } + select.withicons#language option[value="cd"] { background-image:url(../../icons/flags/cd.png); } + select.withicons#language option[value="cf"] { background-image:url(../../icons/flags/cf.png); } + select.withicons#language option[value="cg"] { background-image:url(../../icons/flags/cg.png); } + select.withicons#language option[value="ch"] { background-image:url(../../icons/flags/ch.png); } + select.withicons#language option[value="ci"] { background-image:url(../../icons/flags/ci.png); } + select.withicons#language option[value="ck"] { background-image:url(../../icons/flags/ck.png); } + select.withicons#language option[value="cl"] { background-image:url(../../icons/flags/cl.png); } + select.withicons#language option[value="cm"] { background-image:url(../../icons/flags/cm.png); } + select.withicons#language option[value="cn"] { background-image:url(../../icons/flags/cn.png); } + select.withicons#language option[value="co"] { background-image:url(../../icons/flags/co.png); } + select.withicons#language option[value="cr"] { background-image:url(../../icons/flags/cr.png); } + select.withicons#language option[value="cs"] { background-image:url(../../icons/flags/cs.png); } + select.withicons#language option[value="cu"] { background-image:url(../../icons/flags/cu.png); } + select.withicons#language option[value="cv"] { background-image:url(../../icons/flags/cv.png); } + select.withicons#language option[value="cx"] { background-image:url(../../icons/flags/cx.png); } + select.withicons#language option[value="cy"] { background-image:url(../../icons/flags/cy.png); } + select.withicons#language option[value="cz"] { background-image:url(../../icons/flags/cz.png); } + select.withicons#language option[value="de"] { background-image:url(../../icons/flags/de.png); } + select.withicons#language option[value="dj"] { background-image:url(../../icons/flags/dj.png); } + select.withicons#language option[value="dk"] { background-image:url(../../icons/flags/dk.png); } + select.withicons#language option[value="dm"] { background-image:url(../../icons/flags/dm.png); } + select.withicons#language option[value="do"] { background-image:url(../../icons/flags/do.png); } + select.withicons#language option[value="dz"] { background-image:url(../../icons/flags/dz.png); } + select.withicons#language option[value="ec"] { background-image:url(../../icons/flags/ec.png); } + select.withicons#language option[value="ee"] { background-image:url(../../icons/flags/ee.png); } + select.withicons#language option[value="eg"] { background-image:url(../../icons/flags/eg.png); } + select.withicons#language option[value="eh"] { background-image:url(../../icons/flags/eh.png); } + select.withicons#language option[value="en"] { background-image:url(../../icons/flags/gb.png); } + select.withicons#language option[value="er"] { background-image:url(../../icons/flags/er.png); } + select.withicons#language option[value="es"] { background-image:url(../../icons/flags/es.png); } + select.withicons#language option[value="et"] { background-image:url(../../icons/flags/et.png); } + select.withicons#language option[value="fi"] { background-image:url(../../icons/flags/fi.png); } + select.withicons#language option[value="fj"] { background-image:url(../../icons/flags/fj.png); } + select.withicons#language option[value="fk"] { background-image:url(../../icons/flags/fk.png); } + select.withicons#language option[value="fm"] { background-image:url(../../icons/flags/fm.png); } + select.withicons#language option[value="fo"] { background-image:url(../../icons/flags/fo.png); } + select.withicons#language option[value="fr"] { background-image:url(../../icons/flags/fr.png); } + select.withicons#language option[value="ga"] { background-image:url(../../icons/flags/ga.png); } + select.withicons#language option[value="gb"] { background-image:url(../../icons/flags/gb.png); } + select.withicons#language option[value="gd"] { background-image:url(../../icons/flags/gd.png); } + select.withicons#language option[value="ge"] { background-image:url(../../icons/flags/ge.png); } + select.withicons#language option[value="gf"] { background-image:url(../../icons/flags/gf.png); } + select.withicons#language option[value="gh"] { background-image:url(../../icons/flags/gh.png); } + select.withicons#language option[value="gi"] { background-image:url(../../icons/flags/gi.png); } + select.withicons#language option[value="gl"] { background-image:url(../../icons/flags/gl.png); } + select.withicons#language option[value="gm"] { background-image:url(../../icons/flags/gm.png); } + select.withicons#language option[value="gn"] { background-image:url(../../icons/flags/gn.png); } + select.withicons#language option[value="gp"] { background-image:url(../../icons/flags/gp.png); } + select.withicons#language option[value="gq"] { background-image:url(../../icons/flags/gq.png); } + select.withicons#language option[value="gr"] { background-image:url(../../icons/flags/gr.png); } + select.withicons#language option[value="gs"] { background-image:url(../../icons/flags/gs.png); } + select.withicons#language option[value="gt"] { background-image:url(../../icons/flags/gt.png); } + select.withicons#language option[value="gu"] { background-image:url(../../icons/flags/gu.png); } + select.withicons#language option[value="gw"] { background-image:url(../../icons/flags/gw.png); } + select.withicons#language option[value="gy"] { background-image:url(../../icons/flags/gy.png); } + select.withicons#language option[value="hk"] { background-image:url(../../icons/flags/hk.png); } + select.withicons#language option[value="hm"] { background-image:url(../../icons/flags/hm.png); } + select.withicons#language option[value="hn"] { background-image:url(../../icons/flags/hn.png); } + select.withicons#language option[value="hr"] { background-image:url(../../icons/flags/hr.png); } + select.withicons#language option[value="ht"] { background-image:url(../../icons/flags/ht.png); } + select.withicons#language option[value="hu"] { background-image:url(../../icons/flags/hu.png); } + select.withicons#language option[value="id"] { background-image:url(../../icons/flags/id.png); } + select.withicons#language option[value="ie"] { background-image:url(../../icons/flags/ie.png); } + select.withicons#language option[value="il"] { background-image:url(../../icons/flags/il.png); } + select.withicons#language option[value="in"] { background-image:url(../../icons/flags/in.png); } + select.withicons#language option[value="io"] { background-image:url(../../icons/flags/io.png); } + select.withicons#language option[value="iq"] { background-image:url(../../icons/flags/iq.png); } + select.withicons#language option[value="ir"] { background-image:url(../../icons/flags/ir.png); } + select.withicons#language option[value="is"] { background-image:url(../../icons/flags/is.png); } + select.withicons#language option[value="it"] { background-image:url(../../icons/flags/it.png); } + select.withicons#language option[value="jm"] { background-image:url(../../icons/flags/jm.png); } + select.withicons#language option[value="jo"] { background-image:url(../../icons/flags/jo.png); } + select.withicons#language option[value="jp"] { background-image:url(../../icons/flags/jp.png); } + select.withicons#language option[value="ke"] { background-image:url(../../icons/flags/ke.png); } + select.withicons#language option[value="kg"] { background-image:url(../../icons/flags/kg.png); } + select.withicons#language option[value="kh"] { background-image:url(../../icons/flags/kh.png); } + select.withicons#language option[value="ki"] { background-image:url(../../icons/flags/ki.png); } + select.withicons#language option[value="km"] { background-image:url(../../icons/flags/km.png); } + select.withicons#language option[value="kn"] { background-image:url(../../icons/flags/kn.png); } + select.withicons#language option[value="kp"] { background-image:url(../../icons/flags/kp.png); } + select.withicons#language option[value="kr"] { background-image:url(../../icons/flags/kr.png); } + select.withicons#language option[value="kw"] { background-image:url(../../icons/flags/kw.png); } + select.withicons#language option[value="ky"] { background-image:url(../../icons/flags/ky.png); } + select.withicons#language option[value="kz"] { background-image:url(../../icons/flags/kz.png); } + select.withicons#language option[value="la"] { background-image:url(../../icons/flags/la.png); } + select.withicons#language option[value="lb"] { background-image:url(../../icons/flags/lb.png); } + select.withicons#language option[value="lc"] { background-image:url(../../icons/flags/lc.png); } + select.withicons#language option[value="li"] { background-image:url(../../icons/flags/li.png); } + select.withicons#language option[value="lk"] { background-image:url(../../icons/flags/lk.png); } + select.withicons#language option[value="lr"] { background-image:url(../../icons/flags/lr.png); } + select.withicons#language option[value="ls"] { background-image:url(../../icons/flags/ls.png); } + select.withicons#language option[value="lt"] { background-image:url(../../icons/flags/lt.png); } + select.withicons#language option[value="lu"] { background-image:url(../../icons/flags/lu.png); } + select.withicons#language option[value="lv"] { background-image:url(../../icons/flags/lv.png); } + select.withicons#language option[value="ly"] { background-image:url(../../icons/flags/ly.png); } + select.withicons#language option[value="ma"] { background-image:url(../../icons/flags/ma.png); } + select.withicons#language option[value="mc"] { background-image:url(../../icons/flags/mc.png); } + select.withicons#language option[value="md"] { background-image:url(../../icons/flags/md.png); } + select.withicons#language option[value="me"] { background-image:url(../../icons/flags/me.png); } + select.withicons#language option[value="mg"] { background-image:url(../../icons/flags/mg.png); } + select.withicons#language option[value="mh"] { background-image:url(../../icons/flags/mh.png); } + select.withicons#language option[value="mk"] { background-image:url(../../icons/flags/mk.png); } + select.withicons#language option[value="ml"] { background-image:url(../../icons/flags/ml.png); } + select.withicons#language option[value="mm"] { background-image:url(../../icons/flags/mm.png); } + select.withicons#language option[value="mn"] { background-image:url(../../icons/flags/mn.png); } + select.withicons#language option[value="mo"] { background-image:url(../../icons/flags/mo.png); } + select.withicons#language option[value="mp"] { background-image:url(../../icons/flags/mp.png); } + select.withicons#language option[value="mq"] { background-image:url(../../icons/flags/mq.png); } + select.withicons#language option[value="mr"] { background-image:url(../../icons/flags/mr.png); } + select.withicons#language option[value="ms"] { background-image:url(../../icons/flags/ms.png); } + select.withicons#language option[value="mt"] { background-image:url(../../icons/flags/mt.png); } + select.withicons#language option[value="mu"] { background-image:url(../../icons/flags/mu.png); } + select.withicons#language option[value="mv"] { background-image:url(../../icons/flags/mv.png); } + select.withicons#language option[value="mw"] { background-image:url(../../icons/flags/mw.png); } + select.withicons#language option[value="mx"] { background-image:url(../../icons/flags/mx.png); } + select.withicons#language option[value="my"] { background-image:url(../../icons/flags/my.png); } + select.withicons#language option[value="mz"] { background-image:url(../../icons/flags/mz.png); } + select.withicons#language option[value="na"] { background-image:url(../../icons/flags/na.png); } + select.withicons#language option[value="nc"] { background-image:url(../../icons/flags/nc.png); } + select.withicons#language option[value="ne"] { background-image:url(../../icons/flags/ne.png); } + select.withicons#language option[value="nf"] { background-image:url(../../icons/flags/nf.png); } + select.withicons#language option[value="ng"] { background-image:url(../../icons/flags/ng.png); } + select.withicons#language option[value="ni"] { background-image:url(../../icons/flags/ni.png); } + select.withicons#language option[value="nl"] { background-image:url(../../icons/flags/nl.png); } + select.withicons#language option[value="no"] { background-image:url(../../icons/flags/no.png); } + select.withicons#language option[value="np"] { background-image:url(../../icons/flags/np.png); } + select.withicons#language option[value="nr"] { background-image:url(../../icons/flags/nr.png); } + select.withicons#language option[value="nu"] { background-image:url(../../icons/flags/nu.png); } + select.withicons#language option[value="nz"] { background-image:url(../../icons/flags/nz.png); } + select.withicons#language option[value="om"] { background-image:url(../../icons/flags/om.png); } + select.withicons#language option[value="pa"] { background-image:url(../../icons/flags/pa.png); } + select.withicons#language option[value="pe"] { background-image:url(../../icons/flags/pe.png); } + select.withicons#language option[value="pf"] { background-image:url(../../icons/flags/pf.png); } + select.withicons#language option[value="pg"] { background-image:url(../../icons/flags/pg.png); } + select.withicons#language option[value="ph"] { background-image:url(../../icons/flags/ph.png); } + select.withicons#language option[value="pk"] { background-image:url(../../icons/flags/pk.png); } + select.withicons#language option[value="pl"] { background-image:url(../../icons/flags/pl.png); } + select.withicons#language option[value="pm"] { background-image:url(../../icons/flags/pm.png); } + select.withicons#language option[value="pn"] { background-image:url(../../icons/flags/pn.png); } + select.withicons#language option[value="pr"] { background-image:url(../../icons/flags/pr.png); } + select.withicons#language option[value="ps"] { background-image:url(../../icons/flags/ps.png); } + select.withicons#language option[value="pt"] { background-image:url(../../icons/flags/pt.png); } + select.withicons#language option[value="pw"] { background-image:url(../../icons/flags/pw.png); } + select.withicons#language option[value="py"] { background-image:url(../../icons/flags/py.png); } + select.withicons#language option[value="qa"] { background-image:url(../../icons/flags/qa.png); } + select.withicons#language option[value="re"] { background-image:url(../../icons/flags/re.png); } + select.withicons#language option[value="ro"] { background-image:url(../../icons/flags/ro.png); } + select.withicons#language option[value="rs"] { background-image:url(../../icons/flags/rs.png); } + select.withicons#language option[value="ru"] { background-image:url(../../icons/flags/ru.png); } + select.withicons#language option[value="rw"] { background-image:url(../../icons/flags/rw.png); } + select.withicons#language option[value="sa"] { background-image:url(../../icons/flags/sa.png); } + select.withicons#language option[value="sb"] { background-image:url(../../icons/flags/sb.png); } + select.withicons#language option[value="sc"] { background-image:url(../../icons/flags/sc.png); } + select.withicons#language option[value="sd"] { background-image:url(../../icons/flags/sd.png); } + select.withicons#language option[value="se"] { background-image:url(../../icons/flags/se.png); } + select.withicons#language option[value="sg"] { background-image:url(../../icons/flags/sg.png); } + select.withicons#language option[value="sh"] { background-image:url(../../icons/flags/sh.png); } + select.withicons#language option[value="si"] { background-image:url(../../icons/flags/si.png); } + select.withicons#language option[value="sj"] { background-image:url(../../icons/flags/sj.png); } + select.withicons#language option[value="sk"] { background-image:url(../../icons/flags/sk.png); } + select.withicons#language option[value="sl"] { background-image:url(../../icons/flags/sl.png); } + select.withicons#language option[value="sm"] { background-image:url(../../icons/flags/sm.png); } + select.withicons#language option[value="sn"] { background-image:url(../../icons/flags/sn.png); } + select.withicons#language option[value="so"] { background-image:url(../../icons/flags/so.png); } + select.withicons#language option[value="sr"] { background-image:url(../../icons/flags/sr.png); } + select.withicons#language option[value="st"] { background-image:url(../../icons/flags/st.png); } + select.withicons#language option[value="sv"] { background-image:url(../../icons/flags/sv.png); } + select.withicons#language option[value="sy"] { background-image:url(../../icons/flags/sy.png); } + select.withicons#language option[value="sz"] { background-image:url(../../icons/flags/sz.png); } + select.withicons#language option[value="tc"] { background-image:url(../../icons/flags/tc.png); } + select.withicons#language option[value="td"] { background-image:url(../../icons/flags/td.png); } + select.withicons#language option[value="tf"] { background-image:url(../../icons/flags/tf.png); } + select.withicons#language option[value="tg"] { background-image:url(../../icons/flags/tg.png); } + select.withicons#language option[value="th"] { background-image:url(../../icons/flags/th.png); } + select.withicons#language option[value="tj"] { background-image:url(../../icons/flags/tj.png); } + select.withicons#language option[value="tk"] { background-image:url(../../icons/flags/tk.png); } + select.withicons#language option[value="tl"] { background-image:url(../../icons/flags/tl.png); } + select.withicons#language option[value="tm"] { background-image:url(../../icons/flags/tm.png); } + select.withicons#language option[value="tn"] { background-image:url(../../icons/flags/tn.png); } + select.withicons#language option[value="to"] { background-image:url(../../icons/flags/to.png); } + select.withicons#language option[value="tr"] { background-image:url(../../icons/flags/tr.png); } + select.withicons#language option[value="tt"] { background-image:url(../../icons/flags/tt.png); } + select.withicons#language option[value="tv"] { background-image:url(../../icons/flags/tv.png); } + select.withicons#language option[value="tw"] { background-image:url(../../icons/flags/tw.png); } + select.withicons#language option[value="tz"] { background-image:url(../../icons/flags/tz.png); } + select.withicons#language option[value="ua"] { background-image:url(../../icons/flags/ua.png); } + select.withicons#language option[value="ug"] { background-image:url(../../icons/flags/ug.png); } + select.withicons#language option[value="um"] { background-image:url(../../icons/flags/um.png); } + select.withicons#language option[value="us"] { background-image:url(../../icons/flags/us.png); } + select.withicons#language option[value="uy"] { background-image:url(../../icons/flags/uy.png); } + select.withicons#language option[value="uz"] { background-image:url(../../icons/flags/uz.png); } + select.withicons#language option[value="va"] { background-image:url(../../icons/flags/va.png); } + select.withicons#language option[value="vc"] { background-image:url(../../icons/flags/vc.png); } + select.withicons#language option[value="ve"] { background-image:url(../../icons/flags/ve.png); } + select.withicons#language option[value="vg"] { background-image:url(../../icons/flags/vg.png); } + select.withicons#language option[value="vi"] { background-image:url(../../icons/flags/vi.png); } + select.withicons#language option[value="vn"] { background-image:url(../../icons/flags/vn.png); } + select.withicons#language option[value="vu"] { background-image:url(../../icons/flags/vu.png); } + select.withicons#language option[value="wf"] { background-image:url(../../icons/flags/wf.png); } + select.withicons#language option[value="ws"] { background-image:url(../../icons/flags/ws.png); } + select.withicons#language option[value="ye"] { background-image:url(../../icons/flags/ye.png); } + select.withicons#language option[value="yt"] { background-image:url(../../icons/flags/yt.png); } + select.withicons#language option[value="za"] { background-image:url(../../icons/flags/za.png); } + select.withicons#language option[value="zm"] { background-image:url(../../icons/flags/zm.png); } + select.withicons#language option[value="zw"] { background-image:url(../../icons/flags/zw.png); } + + .panel_login { + max-width: 80%; + min-width: 680px; + } + +} + diff --git a/interface/ispconfig/interface/themes/default/css/screen/uni-form-generic.css b/interface/ispconfig/interface/themes/default/css/screen/uni-form-generic.css new file mode 100644 index 000000000..f9e0f390c --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/uni-form-generic.css @@ -0,0 +1,136 @@ +/* Uni-Form by Dragan Babic [Superawesome Industries] - http: //sprawsm.com/uni-form/ */ +/* Some rights reserved - http: //creativecommons.org/licenses/by-sa/2.5/ */ +/* Do not edit this file directly, make your changes to uni-form.css in the same folder */ + +/* ------------------------------------------------------------------------------ */ + +.uniForm{ margin: 0; padding: 0; position: relative; z-index: 1; } /* reset stuff */ + + /* Some generals and more resets */ + .uniForm fieldset{ border: none; margin: 0; padding: 0; } + .uniForm fieldset legend{ margin: 0; padding: 0; } + + /* This is the main unit that contains our form elements */ + .uniForm .ctrlHolder, + .uniForm .buttonHolder{ margin: 0; padding: 0; clear: both; } + + /* Clear all floats */ + .uniForm:after, + .uniForm .buttonHolder:after, + .uniForm .ctrlHolder:after, + .uniForm .ctrlHolder .multiField:after, + .uniForm .inlineLabel:after{ content: "."; display: block; height: 0; line-height: 0; font-size: 0; clear: both; min-height: 0; visibility: hidden; } + + /* A class to be used on a label that contains a checkbox or a radio button */ + .uniForm .inlineLabel, + .uniForm .inlineLabels .inlineLabel, + .uniForm .blockLabels .inlineLabel{ width: auto; float: none; margin: 0; display: block; } + /* IE shows borders & padding on checkboxes and radio buttons if they are declared on an input element, remove them */ + /* Legacy/Inheritance fix */ + .uniForm .inlineLabel input, + .uniForm .inlineLabels .inlineLabel input, + .uniForm .blockLabels .inlineLabel input{ border: none; padding: 0; margin: 0; } + +/* ------------------------------------------------------------------------------ */ + + /* Styles for form controls where labels are above the input elements */ + /* Set the class of the parent (preferably to a fieldset) to .blockLabels */ + + .uniForm label, + .uniForm .label, + .uniForm .blockLabels label, + .uniForm .blockLabels .label{ display: block; float: none; padding: 0; line-height: 100%; width: auto; } + + /* Float the input elements */ + .uniForm .textInput, + .uniForm .blockLabels .textInput, + .uniForm .blockLabels .fileUpload, + .uniForm .selectInput, + .uniForm .blockLabels .selectInput, + .uniForm .blockLabels select, + .uniForm textarea, + .uniForm .blockLabels textarea{ float: left; } + + /* Postition the hints */ + .uniForm .formHint, + .uniForm .blockLabels .formHint{ float: right; margin: 0; clear: none; } + + /* Position the elements inside combo boxes (multiple selects/checkboxes/radio buttons per unit) */ + .uniForm .multiField, + .uniForm .blockLabels .multiField{ width: auto; float: left; } + .uniForm .multiField .inlineLabel, + .uniForm .blockLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; } + .uniForm .multiField .blockLabel, + .uniForm .blockLabels .multiField .blockLabel{ float: left; width: auto; margin: 0; } + .uniForm .multiField .blockLabel .textInput, + .uniForm .multiField .blockLabel .selectInput, + .uniForm .multiField .blockLabel select, + .uniForm .blockLabels .multiField .blockLabel .textInput, + .uniForm .blockLabels .multiField .blockLabel .selectInput, + .uniForm .blockLabels .multiField .blockLabel select{ width: 100%; margin: 0; } + +/* ------------------------------------------------------------------------------ */ + + /* Styles for form controls where labels are in line with the input elements */ + /* Set the class of the parent (preferably to a fieldset) to .inlineLabels */ + .uniForm .inlineLabels label, + .uniForm .inlineLabels .label{ float: left; margin: 0; padding: 0; line-height: 100%; position: relative; } + + /* Float the input elements */ + .uniForm .inlineLabels .textInput, + .uniForm .inlineLabels .fileUpload, + .uniForm .inlineLabels .selectInput, + .uniForm .inlineLabels select, + .uniForm .inlineLabels textarea{ float: left; } + + /* Postition the hints */ + .uniForm .inlineLabels .formHint{ clear: both; float: none; } + .uniForm .inlineLabels .multiField{ float: left; } + .uniForm .inlineLabels .multiField .inlineLabel{} + .uniForm .inlineLabels .multiField .blockLabel{} + .uniForm .inlineLabels .multiField .blockLabel .textInput, + .uniForm .inlineLabels .multiField .blockLabel .selectInput, + .uniForm .inlineLabels .multiField .blockLabel select{ display: block; width: 100%; float: none; } + .uniForm .inlineLabels .multiField select{ float: left; } + +/* ------------------------------------------------------------------------------ */ + + /* Required fields asterisk styling for .blockLabels */ + .uniForm label em, + .uniForm .label em, + .uniForm .blockLabels label em, + .uniForm .blockLabels .label em{ position: absolute; left: -7px; } + + /* Required fields asterisk styling for .inlineLabels */ + .uniForm .inlineLabels label em, + .uniForm .inlineLabels .label em{ display: block; position: absolute; left: auto; right: 0; font-style: normal; font-weight: bold; } + .uniForm .inlineLabel em{ position: absolute; left: 7px; } + +/* ------------------------------------------------------------------------------ */ + + /* Messages */ + .uniForm #errorMsg, + .uniForm .error{ + } + .uniForm #errorMsg dt, + .uniForm #errorMsg h3{ + } + .uniForm #errorMsg dd{ + } + .uniForm #errorMsg ol{ + } + .uniForm #errorMsg ol li{ + } + .uniForm .errorField{ + } + + .uniForm #OKMsg{ + } + +/* ------------------------------------------------------------------------------ */ + + /* Columns */ + + .uniForm .col{ float: left; } + .uniForm .col.first{} + .uniForm .col.last{} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/css/screen/uni-form.css b/interface/ispconfig/interface/themes/default/css/screen/uni-form.css new file mode 100644 index 000000000..008885af5 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/css/screen/uni-form.css @@ -0,0 +1,130 @@ +/* Keep in mind that wherever you see 'Required property' it means that the property must exist */ + +/* ------------------------------------------------------------------------------ */ + + /* Generals */ + .uniForm fieldset{} + .uniForm fieldset legend{ color: #333; font-weight: bold; font-size: 100%; margin: 0; padding: 1.5em 1.5em 1.5em 0; } + + /* This is the main unit that contains our form elements */ + .uniForm .ctrlHolder{ padding: 3px; border-bottom: 1px dotted #dfdfdf; } + + .uniForm .buttonHolder{ + text-align: right; + background: #CEDEEF url("../../images/buttonHolder_bg.gif") no-repeat right; + margin: 1em 0; + padding: 8px; + } + .uniForm .resetButton{ float: left; } + .uniForm .primaryAction{ font-weight: bold; } + + /* This class gets added to div.ctrlHolder to highlight the row */ + .uniForm .focused{ background: #fffcdf; } + + /* .inlineLabel is used for inputs within labels - checkboxes and radio buttons */ + .uniForm .inlineLabel input, + .uniForm .inlineLabels .inlineLabel input, + .uniForm .blockLabels .inlineLabel input{ float: left; margin: 0 .4em 0 0; } + .uniForm .inlineLabel span{ float: left; width: 90%; } + +/* ------------------------------------------------------------------------------ */ + + /* .blockLabels (default style, will be applied even if you don't class the parent element) */ + .uniForm .blockLabels .ctrlHolder{} + + .uniForm label, + .uniForm .blockLabels label, + .uniForm .blockLabels .label{ margin: 0 0 .5em 0; } + + .uniForm .textInput, + .uniForm .blockLabels .textInput, + .uniForm .blockLabels .fileUpload{ width: 43%; /* <- Required property */ } + + .uniForm .selectInput, + .uniForm select, + .uniForm .blockLabels .selectInput, + .uniForm .blockLabels select{ width: 43.5%; /* <- Required property */ } + .uniForm textarea, + .uniForm .blockLabels textarea{ width: 43%; /* <- Required property */ height: 12em; } + + .uniForm .formHint, + .uniForm .blockLabels .formHint{ width: 55%; /* <- Required property */ font-size: .9em; color: #777; position: relative; top: -.5em; } + + .uniForm .multiField, + .uniForm .blockLabels .multiField{ width: 43%; } + .uniForm .multiField .inlineLabel, + .uniForm .blockLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; } + .uniForm .multiField .blockLabel, + .uniForm .blockLabels .multiField .blockLabel{ width: 30%; margin: 0 10px 0 0; } + .uniForm .multiField .blockLabel .textInput, + .uniForm .multiField .blockLabel .selectInput, + .uniForm .multiField .blockLabel select, + .uniForm .blockLabels .multiField .blockLabel .textInput, + .uniForm .blockLabels .multiField .blockLabel .selectInput, + .uniForm .blockLabels .multiField .blockLabel select{ width: 100%; margin: .3em 0 0 0; } + +/* ------------------------------------------------------------------------------ */ + + /* .inlineLabels */ + .uniForm .inlineLabels .ctrlHolder{} + + .uniForm .inlineLabels label, + .uniForm .inlineLabels .label{ width: 20%; /* <- Required property */ margin: .3em 2% 0 0; /* <- Required property */ } + + .uniForm .inlineLabels .textInput, + .uniForm .inlineLabels .fileUpload{ width: 35%; /* <- Required property */ } + + .uniForm .inlineLabels .selectInput, + .uniForm .inlineLabels select{ width: 35%; /* <- Required property */ } + + .uniForm .inlineLabels textarea{ width: 35%; /* <- Required property */ height: 12em; } + + .uniForm .inlineLabels .formHint{ margin-top: 0; margin-left: 22%; font-size: .9em; color: #777; position: static; } + + .uniForm .inlineLabels .multiField{ width: 60%; /* <- Required property */ margin: 0 0 .3em 0; } + .uniForm .inlineLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; } + .uniForm .inlineLabels .multiField .blockLabel{ float: left; width: 26%; margin: 0 3% 0 0; } + .uniForm .inlineLabels .multiField .blockLabel .textInput, + .uniForm .inlineLabels .multiField .blockLabel .selectInput, + .uniForm .inlineLabels .multiField .blockLabel select{ width: 100%; margin: .3em 0 0 0; } + +/* Focus pseudoclasses */ +.uniForm .ctrlHolder .textInput:focus{ outline: none; /* Get rid of the 'glow' effect in WebKit, optional */ } +.uniForm .ctrlHolder textarea:focus{ outline: none; /* Get rid of the 'glow' effect in WebKit, optional */ } +.uniForm div.focused .formHint{ color: #333; } + +/* Columns (they are floated left by default) */ +.uniForm .col{ width: 37.9%; /* <- Required property */ margin: 0 2% 20px 0; } +/* Use .first and .last classes to control the layout/spacing of your columns */ +.uniForm .col.first{ width: 39%; /* <- Required property */ float: left; clear: none; } +.uniForm .col.last{ width: 39%; /* <- Required property */ float: right; clear: none; margin-right: 0; } + +/* Messages */ +.uniForm #errorMsg{ background: #ffdfdf; border: 1px solid #df7d7d; border-width: 1px 0; margin: 1.5em 0 1.5em 0; padding: 7px; } +.uniForm .error{ background: #ffdfdf; border: 1px solid #df7d7d; border-width: 1px 0; } + + .uniForm #errorMsg dt, .uniForm #errorMsg h3{ margin: 0 0 .5em 0; font-size: 100%; line-height: 100%; font-weight: bold; } + .uniForm #errorMsg dd{ margin: 0; padding: 0; } + .uniForm #errorMsg ol{ margin: 0; padding: 0; } + .uniForm #errorMsg ol li{ margin: 0; padding: 2px; list-style-position: inside; border-bottom: 1px dotted #df7d7d; position: relative; } + .uniForm .errorField{ color: #af4c4c; margin: 0 0 6px 0; padding: 4px; background: #ffbfbf; } + +.uniForm #OKMsg{ background: #C8FFBF; border: 1px solid #A2EF95; border-width: 1px 0; margin: 1.5em 0 1.5em 0; padding: 7px; } + .uniForm #OKMsg p{ margin: 0; } + +/* +IT IS STRONGLY ADVISED TO MAKE YOUR CHANGES AFTER THIS COMMENT BY REPEATING (COPYING) THE SELECTOR FROM ABOVE, +AND MODIFYING IT WITH YOUR OWN PROPERTIES/VALUES. THIS IS RECOMMENDED BECAUSE IF YOU HAPPEN TO RUN INTO TROUBLE, +YOU CAN VERY EASILY REVERT TO A GENERIC STYLE OF UNI-FORM. BEST OF LUCK... +*/ + +/* ------------------------------------------------------------------------------ */ + +/* This is the main unit that contains our form elements */ + +.uniForm .textInput, .uniForm .selectInput, .uniForm textarea { + background:#FFFFFF none repeat scroll 0 0; + border: 1px solid #DFDFDF; + padding: 1px; +} + diff --git a/interface/ispconfig/interface/themes/default/header_logo.png b/interface/ispconfig/interface/themes/default/header_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..38ba1ebeb45ebb798f808b1d2a06da2b8bad0d97 GIT binary patch literal 36266 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ai.png b/interface/ispconfig/interface/themes/default/icons/flags/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..74ed29d92616c86757d3c0ec04378301c8f591b4 GIT binary patch literal 643 zcmV-}0(||6P)ocPy#thD++(+#W%SS0Qvp^`1%0+_yGC)0QUL-|M&m^ z`T_tk0M7pe&iDc7fh@K74M*k&0{8f*88BG;;GY6ve?;&4{{Q>_{{8&^`u+g@|Ns5} z|C?Nv0*Gb#mu+n4z6ZW~#qjy_|6ji&ZeIEMk16oyzH)i@Pk$MNxLARR?a#kwpMS72 zF)}cG2M8dRUN*~81wCz%$A2$f`_IL|A|w6j^RHtc7{2`lYG-KkQ{(*knSqh%3kzr7 zs%s1kKL7#%F#yj00-^B^D;pD^^AqC)4C(?1m>@q26ceiU4*2{4`u_d~@vQ*ykp&A1 z3h$o${r~^~`vQo?Pm-bY@cm79zVQG5%l!B6)Riap%L`bGemnT<@2|iAfl64!%YWS~ z`p0YY_dig_cYpw5WYAmG*lPLk!;jy8|NZ#~MF0Q%{rCG1ko^Di`(Fhkd3F{?py0c9Vg{{gA~^#>F<|Nj5KapBR^@Bf~CXSi|t;lF=C z8-4)<5DUX^V9+rDCI3RuUy#}V{s46X!}R~}@4ug&fA|+@;n!b(1zCZ900KKMX({{sIILBZE*UQbc|SngJt$+`m9Kz!<;5 dBm+Qz0RWL%NC2%sdjkLf002ovPDHLkV1lARHI@JX literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/al.png b/interface/ispconfig/interface/themes/default/icons/flags/al.png new file mode 100644 index 0000000000000000000000000000000000000000..92354cb6e257be2cade71cb825027ce8d9efc06d GIT binary patch literal 600 zcmV-e0;m0nP)PbXFRCwBA zyv)hK@{fUmi2(>${xJOc&A`II@PmN?BKC`c;SU)710$d~Kmf4-r6niy16BY3`}g0! ze=L9h&Uybegp-Ns@87v^zGQMU|NZla@z1Y+zkdVKmFbHB0*HkH4F0@)&iwE1;&GRLuzkX(OGXMMa``@o$|Ni_2x(y(Jn3#TnHT?el|IhC;U%pHK`}6Df z@2@|9J^lXU=Z~KvfBzi*^!4A*U;lv`e*Fge3Lt=(82$q_`~m9z|ND;$!(WEqze~6o ze}X|JFO$H(U+VvX#{c{avi3L7@c;n?3L&6l7=Hix`}emN<6i~#|7+iUWBL8-&##}m zKKx5zXJr5LA80nvkwCM6egFs{po9Y?& zL6B;olm7ns#=rm&Kp-3b{RIXY(1{??Ha=$NKfkS+|9@us$Mfg+93j@fzkY#y2y!;i z&kO(o1PWH5>zPHwn7|>;0Mz;WPl13iP!Y(WKYy4&4hBXMSPugOKmaiw2gk!dq!|4J mj$lZE0R~eis zC&uN{cDQ8`!@ZNLOqwtoG6nhzPx}SV-d6yzFfcIz75{(rngJyDkKrFw8iaoThHCr$ zo8k9wMhS^O3=9AP!~%5B|9}4(ASQtkLN$m1CV&5705X362095KfLKJhW;OjWdGY7l zzrX*$DuLu*pcFC#NdEr)SL!$SY=)lz0mSm_*B_u)|AM4JP)(}33zy1Lc&_o7? zKL7y)bkd){fBym<_v`mxpbeRs`+WRVot-5A{r$IX$CJFg13u{3eX_{0R++j zR}GCkSy{&4zk!krKoTg(2n-k?g31B}5JW!NMq0d0000q< zM7LZb@rX?|r)2RP-+aO3(7q?c3+$-Vv0E)PxM3SDV%@s`#GkZvw_x^WBa~uq3^l}t zWdf(j(=(>^SgETc#5#EZT(4ObRkfxbzP9G;yza0;Ygc8-_*?EP(ca#`l6-Z6D0{tL zQ4|~MCSi!9Q9YkW=V$ix#EqZ!rc?eWA0TwdVID+3aqrYUXUhCI)Ad5!(cP!BhhW$Ayb2&r8kK!bz*2`~UE W(Ndrek0Jg50000J%=P)w(EZ*psMAWc{xGB7YS zhjy&b0004wNklJMvs33UixfE$Xhc~}~ zw|4S{A8L}%Om`(hI~FKb8uNFj4Zw@vF-N5;t3jB zQ!+`#T|L4Wi=zY^&nI}2O8~I8ILwdp8e64XwvQ{gT6Q#OfM#r%8cne_R z0F+LDBSe=%_ZD3x*nEG<>U4msCBcB^*=&~awxPQhHHt?SJV*8?P*QML4|%(Di!p$J z!kEuU#^LH$gV!IfiDHZAbQOrlJ`q~x`k5q-R#Yp0h#E0U3%V{@?g1~sc`6u&@B9D& N002ovPDHLkV1kti?vDTf literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ar.png b/interface/ispconfig/interface/themes/default/icons/flags/ar.png new file mode 100644 index 0000000000000000000000000000000000000000..e5ef8f1fcddb9fa0b89c353430e9640c122445cc GIT binary patch literal 506 zcmVNL7TW{{R0! zJP>i}(MpzaSkj z=eqvqa`^|6{{QbQRQ11q3~Vg_kG}Z}5I`(hw}ncX8D4$|h64jUK>or*=^r$dfI%n0 z$3MKz;!F0w91GjkkV%_X`@4 wKR^hm`X5LwD9*v?4;TUC6Bz$&3;+QJ0QLcJ=WT{TU;qFB07*qoM6N<$f>3bX%K!iX literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/as.png b/interface/ispconfig/interface/themes/default/icons/flags/as.png new file mode 100644 index 0000000000000000000000000000000000000000..32f30e4ce4eedd22d4f09c4f3a46c52dd064f113 GIT binary patch literal 647 zcmV;20(kw2P);Rmc0RI30 z|Nj5|{Q>>`0R8>{{QLs@`vM01^D6+%Ap+Y10Qw3Sr3ED)s=c}b05Jg0{{#dC0RR60 z)z$y}`~dv>0Q&p?0Q>ne0Khr|#}EMN1`-ttJvaFq6VTDg`OMJS*4F}vg#m0fQ1$QM z42u6QTCg3Kt8+Li1J#Y_zUd>4Lw{URe1tEjLbKmY(S0M7pd(g2qsJ0|z;{R`~d z`n<6E*3bb41p*Zr{{R344LkeqyaMyV01O!W0PZ0+TjlEQ0st`p&i?@b0Q{Gi0m{n% z`T6-B``1JQx+4kM0{rp_FfRy7P6Qq%_1|&<`|JPx`Uew8u)+%h2+ zdiAI7xt}_}e|$CmbI9$2>u h*D)|iF)#oG7yty8`q2#I8zBGy002ovPDHLkV1j5VEF}N{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/at.png b/interface/ispconfig/interface/themes/default/icons/flags/at.png new file mode 100644 index 0000000000000000000000000000000000000000..0f15f34f2883c4b4360fc871d7105309f1533282 GIT binary patch literal 403 zcmV;E0c`$>P)@|4`Xj5kLT%`al?B=W5I`&prl$WjwHQRjfmQ&G0jUOA z@&|Dug_Rm`2Y251|$~)1M2@@6mI}!8O6olw6y^Q z5X--d7nzS8`+x5q12kBmVFD!~j6c5_fMKno0(1^Q0I>i=is|LjXX40RRttS6cG0UZ?;7002ovPDHLkV1fxUnjZiF literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/au.png b/interface/ispconfig/interface/themes/default/icons/flags/au.png new file mode 100644 index 0000000000000000000000000000000000000000..a01389a745d51e16b01a9dc0a707572564a17625 GIT binary patch literal 673 zcmV;S0$%-zP)>fJ3En$GhGS>sbE%%m3$AD)q?8M9y>88-}kR7#RKlk!P~Y_PLuF7~U~3`~nC7 zF#yj00ZUDdpLsm{7ajP|&HwoK0Usg|6%f4L_{`Mi{rvv-`ukf=Ed&Gs-sA7L!Q7*a zj{*QO0M7pb%?Sw^g@yy{>ihEY{`vU@3=8@G0rvO$i3mOL`~mv-`W+b$Mmr&io5dg< z5v!7q0*L95jt`TzK8Kd(Utv)OSp_aLv){6ccV+Z`{Q2+asKUU&aO3`Kpz6wW8wp`< z28M3{0mSqnB#A*-c*8%1=RD#sSOwMznKA3=e&iEzwo{cA=PgXK`2OQ}gqId83!|%* zA_Kz@fB*n70M7pdECCwp4H&@R`1|(w-}M5x*74i)0}%fAt;XafA{48))#>Z>?CD#}*e}Ret0tl$#*RMZ7}Jl7Z|M45`5*URzH9L z{rmSnPy;{!u>dsyO%meg+00000NkvXX Hu0mjfN{&}S literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/aw.png b/interface/ispconfig/interface/themes/default/icons/flags/aw.png new file mode 100644 index 0000000000000000000000000000000000000000..a3579c2d621069c8128d7cf16440d5e45a3ab3cd GIT binary patch literal 524 zcmV+n0`vWeP)^}0h@W9fA9JOn#opKkr#VO<{LPm{QLg}EdH3Vb1Zzpp zqiZ+XNBm%5{`ViKi{bCTe}Dh~2a+HyfB%6Q|9}7eKVjxEfB<6Q<6r}-{{7;G=hB{; zLB+p+|Ni^;|DXT={s75;AoBO$f4@PDf8sps4FCQC1Q64wUw^h*hy4HZXO3U)@85qw zD*pci8U|DWQu_BVi2MUWKoOv;00M{w=;|*lY_o%kegGx^{`&*A{SSok_usF-P)oof z|A86+0*K|;FQAM6fB*FtoEI&bZG5mq328#as{}<$F zWDQ{Ffz1MH001phxCBNdC_2H6U$AI~GQbEJqg*Ti0R{kQ(yH?TRrCY^ O0000^@RCwBA zRL|V|7QjV)*ul;Rlceqc6W0{`~_8AeMg& z|LUXE8U8c=`}dziv6P|mEu%JjM}pqh@65md|Ni~w->=_)fBgZXe?Nc!ot?WGAOHX{ z0M7pe`uG9>{{ZXo`u+d?{`u+u=j#9V2j%Sc^797z|N8p+{rLO+`TP9&`u!FW2mk>3 z0#G;xDFDDQ2vg|)-@5Zw?JVTrAxNs~5&|AZ;5uWfQ`vUsMGm`>aGWoI7=P|oW>%~E z|Kk8dq@aG@HzdsB>fj@shYzX-a%=q<(frSYmfLIv5{HbzQ${~M_P_y6C&m>3uU0*DFd0+8#0#Gk)^|NLQBRAyCBeB9H+Wn{=Mr@*PJ_ZKV< zB>w@GFfafF5Ks>TBP0ZV{bBt5_ve*sKkwd`OiO#eX6=u=cfX!E#rX3NBT(umNC7Yu z0Ro8S7X#4ce?Xr63$phg)Bk64X8r&5``_O`AFf^jc>p5y?+^38KVKLa00M}`wU!~x z=I_1Fe}Df4D*yZI@1I|PfBgnRptt`0`2{iqMpRNPo|?TW>MPOFW(r1_!xlT-yep5|G*@e%^SFxf#DC32@n7=0M7pe00011 zNe=7o{FIuhzQ(sjF~t7>`T+s_0sj00{`>*}`~Uy^|Ni?^Z7Tcx|FW0O0tlpm;s5{T z+df{s^E1rDZN;v4VP>0|8GkY`{`&t1s2YfV{r~st=KUYCl59Xr00M{!Xv@F<41fPH zoWA^R$>xvtF5yd$xc~X{7o-}f=ig7DY9RXc``_>1K-c{N2q2&ahQEIq{`~z1RCDs; zw*~7zIJ!sAKj8J}&!7K)enC|K{|nUc|Mwq|27mwp*#K1f8;Jh=2byv8+}GKw-@AGz z%-rMu^XK3HKtBLA{Qvdq*I%FsKn(x^1k&&qY(LP_Uw?q)|3jz0PF?=a(?4bU?qHzN z5I+E=z&88?2q2IKpz*){`~&I%+VJc5-=Dw#?LYB#!lHLRL7BZ8-NZ5x*TXaKmf6TZ20qEQj`^F;~x-W z05U+*fBxNj@_W(7kJ(ujGnWgh$g%(Z2hso#K#U9wI~hQ+`3Dk_7z`j1tL#*2FTcgW f@C+EF009O7>dRn2w6d?H00000NkvXXu0mjfueTzu literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bb.png b/interface/ispconfig/interface/themes/default/icons/flags/bb.png new file mode 100644 index 0000000000000000000000000000000000000000..0df19c71d20d7fdc06e1cba01028983439b2bdae GIT binary patch literal 585 zcmV-P0=E5$P) zj51&U|NhG$_=oZTA7 z0mJ{l|Ns2{|Nr-Y#^3*c{=WU_!>_-;fvROCxPdkR1P~M0Xa=C_KR`47{sXG+pY!Yf zqu=)*{%)W0>;M0szkdJy_507SKYxDz`3KYh5I`&-cY{^``2$3Z|NsB`^ZWO@y}$qd z{r%_nFQBC$4Is{6hz5WF0@(mI8^j0N`~Tl>LzQ1Ye}a&q>MtPo*RQ`|OMu4x1!@2Y zAfSdne}TsT{`c$8-(P?J0c~)w`~?J`zx?#Dg*yp^z&88=2q2IKpt(TRKniTbum8-y z1bBWi0e#F0wgIH{FVJ|Pxj-8L0tgsNfByUdJMs7b-@h3^8h-!E3i%CU{QCW$1*GB6 ze~`2PfHeF82q2&aU>N+96yg32bmdP5238q{|Gydk0=52OVEN6!@<&OA7Z~7wL16>b z@DCt>7#SFn85mf=5eY;LZ#OUe_l@D-2Zn#Y82<4v{9|E|jkRQ8_`$&N0jL_N03g5s XX0T^_9W~6o00000NkvXXu0mjfXpthO literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bd.png b/interface/ispconfig/interface/themes/default/icons/flags/bd.png new file mode 100644 index 0000000000000000000000000000000000000000..076a8bf87c0cedcce47099c6b74b59f2c9d1dbce GIT binary patch literal 504 zcmVCcfPV}OzZe+)fYC1)`hmpw%>WR9L@~Dk00x0r!@5ksR;+hV0>ZLfIcBS@orh;x zv}95za5W)x_7^}bV3YqpdH?h;NZnuSC%?V#{+0gl`~RQckJx{&l>NO~;@7XgzkdJz zEh{VwR0LSuiyWGR{aKQ z00-R5+27mwp+3@G@Um)kt zzdstU{yWl9SIB_0ft3II3)BD*KrA2|{``^Tm;4PDy`=a1tTre>fEI#8 u{{2z<2NVVaum*qtVq}m+iAaI~Aiw~?reC_kVQV=60000gsB+3J~Dn`pdxgmx19A{hgns>oXkhsL8>j&wfIu2Rsv+R_ zAB5T1GyoL?1Q1BWpFe+p|Nf1n;TJ-~Kd@?uhChFRHUI<=#0HS!U%!8$YJib28yLY( z0tg_G2B7i3e*FSj@aq@44gY_`jRywQ69xu=0D?FP=vyd&x*M*V6|CV8P{Uu4OBfgc z0tjNmA4y3`us8lPG6H?}8%zRafgb(Cp!5f*6oP{xAq} rF#LPR@IoIX4%E%Yz;K6w0U*EtuUcjA`-_J300000NkvXXu0mjf+>pV; literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bf.png b/interface/ispconfig/interface/themes/default/icons/flags/bf.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5ce8fe1237a18d6809a5570024eb108cb14a3e GIT binary patch literal 497 zcmV@|4`Xj5kLT%`al?B=W5I`(ov;U*021-Lr1*!W5(gW7O z@cTDV13&<=05Ky_HBiN$KMcQt819e>gHP`g_|Np;&&;0(C^$RHS>olZ*Q41X9v27}ar6#W9}0h{^{OajIK0?h(y z_zOe~zZd`lhy{p$|NA4!EeST}?;nUxkP49VfMx;1;V%&U|N9rH;SU2q05LM8GXV8K n(H~UyA0);fa6B_H00bBSQ>$p&WfB*UmB!B(-`wPhZ^#?@C^U5EbbPyl_g=3Hc01Sh${{P9=HB%4| z34*<3-m=C?^;L%miR{xQv2*hU;8+Y&0Dxf-W~KjsusWFAC4@j0#9_j;X5z6SjRhH> zd}sd(7FPhVFdSi!*Zj@;_Sc`kfByUdk|3A-`STmZ_yb~qxIp9o{E-p)bLt=iKmf7) z+|Ix(`{&<1pm88mK&}8g1WG~}e||Ik`OB#Cw~m1UAb?na(Zlrn4}+v6P!1@{@CT$5 z&-#|8y{IY2iKmf5omHz(^qAp)ym^JhN+jk7Vet{H$(Z8=>|AV=V zva&!M00M{!p&AHub^kXuF^G#pRQ&(-8^nMkpk@XJfB<6o_wOIv5C1P;X6Wwu|KUB< zc%X*g2-OTg#J~U$KumBafq;(A|A`a+OH08N{X($;=pP0KfB<5Fs|GR7oM!0i{{QYB zSm|$=!=N@Wf}I2qKuka<{f7YtBjf)QCj1u{`~UM7nrdKh0c`*VF+c!8{Q&j%sZ;-Z zd;dRshENS5{{S`og~Sg)05QIL^-54s5b7kL(8GuS8yfz9{>%Ui`+q-vfW*P*^_43C z0mK4S`s2qBh&}(NP5W0_$$%QQ@R)`GfB*vkck5Jby^kNv00000NkvXXu0mjfy0pt~ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bi.png b/interface/ispconfig/interface/themes/default/icons/flags/bi.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc2e30cfc47452d5bef949628e955a522d59e50 GIT binary patch literal 675 zcmV;U0$lxxP)$wbBBJ zMTk#;k4<3e#ePFE;{?TciOx=-NpIdg`t|#dcz^$YFqm+of7AU<7UGr+0t^5F#PsJM z(2)${Jd)SmT+KY5@!|h>po)L5-!r~>3uJux|0`&Jz~QGy6a*CiGyVtq1|Wc#zWw|0 z_y6C2|NnAvaR2)A>-NX%|3Ci{R?!hvH~jzU``ypCK7Rkq&&~h)FDNvCApj5nF#yj0 z0_X_*{{Q{_|NQXv@Av-qBMmR$teo!O*6-%u-J+8r3n~2s`s?uP{Qmp>{`~+900M{! zNC9;}eE(3IS9-C{62AZc<>Jx>%af}0@?r&05Jg0 z{{#T;0Os`NWh`ko4>SM%|Kw(60099Kad7|t0qcf^`tR-^sIP`Fhru7lkI#w#>Hq?W zkzqQ+@08y_|9v}t;{CEE%)%nTc=-MC@P)7S@!~g$((Ud|+28Q224FCZIGXF0FQ1zcbfB*dX_lJRr z;s3wCNa|2D02KoSAbE^!0Dxf-mZ69ApkCb5fP^9ydGO$cm6w`kGj(t#`M{tFlLo%j z*4%mm2&CaJSn02SzkrtfWBLcO;r%bLy5Gnoqrh)qC;VKmZT`F#yj00W%wG zw4zx17##T6*Z=hN0Tvey7!|wG?K;V)0{r{_`}_X<{Qmp<|NQ*_`}@YSvI2-@&cAgG z*R?p0?_>V(@&EVlEP?{x|1esA`||VNU68t8zyJRJ_3zg&hTp&0WMzR?0R#}s1|E|% zRV}tRkH6o2#3;(nsVMXI-pgBmh17ms`TzTu!pfBl%*_9R;OEbWDJei#0R#}sGpDd$ z96Spi@~bn7G5z{~^_!ZLy2#s;5B~o8&G`G*|6f0Ap0WS=_rFd2C(ubi4FCZEF#yj0 z1a!1=2e0}MwgDi3SU@2S4mePl{012eQ4J-3 z|Mm`933BS6zyJRJ1;ztF0D(08|NVzmQWB*4&)@%$um=Y`lmy1W-@hDx{{qQh3=9AP x#JH7#;TJ3-|G=X54_FW_j)5c_0|P*S0RT0dOSD~(4;cUe002ovPDHLkV1hfJDkcB` literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bn.png b/interface/ispconfig/interface/themes/default/icons/flags/bn.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb09849e9b5712e9cdd8a2c25035da201535cf5 GIT binary patch literal 639 zcmV-_0)YLAP)8n_8%|dG+hlCr-g% z|9<~wU<9iE{r}%DMphZ1Jpcj3%*DZBWo-@72DFWlk(-gj@!ngb-$#D&C_i9e{QvLY zw|{?r|NHlgiHY~?^IHG`05Jg0{{(k=dF}7->+9=cXlNG}79t%T{rC3_t(pA#`tSX# z4jKOh|NsB|;rr`({{a5__y7Wk5omBxQSrlv5B>nb??0VZ8qCZrpS+?}gatn>o%-+B zPl=+||6st##PspQ2Y>)#{Cu5(QJ~_^?faD-pMV;E|7MwLubjQ@B-gLso$mVYgECpU zxpfp2fEt*XnBKpC4-fz`0M7pb@zVeZ8g>5r-~k2r`Sbhd;{WmN02I(80QmHEv)Ik{ z>H7Nm`}_MdF)?FhWi>T50*LYBMFw`s0-y$le?J(QfB$Fr_2c8e-`_!j`0PG|ckZ*_ zzkY$-`sc5Tips@{7Xbo@1sGC5IYwrQfB%2{|MTZR!ygX*-%McG4cZmTY ZzyK0(F$K@T-Dv;-002ovPDHLkV1la=J3;^e literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bo.png b/interface/ispconfig/interface/themes/default/icons/flags/bo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7ba522aa7e948d581478432643c230eed1a658 GIT binary patch literal 500 zcmV^3LvnC{|x`%yaFl$ss8ha0V@6XKS=c-5cwO(_{}IL0ki=i zfLOjo{AE-9^-mn=h(G`Tfz|!{{r?|W+uz?{^yeR#!Nm9NlRN`J0I_^YV&Ikj@%Q)F z|Ns9m{0FN3^Z!3k!*8HnFvf4N5xas50L!z?-wXsAPk7$ ze<1l+iQ((fPYeJ7#KQ200VpKFA^{3Nph^G!{9^b86oDW}(Ek1R7ZiL9e}Ret0*H}e qBRB&8AR!3%7c6cef(%d+Aiw~vBYd|xMihYn0000j-HAXl7XJGjM{~r+i{r~sxzrQwG-&h#_Y&p;L z=ieV7_s^f-zyJOD{rC5(+EoAn1k&)I;s3Kw&;LT?{{2}P{Pq8T&j0^^J4?LvUd;UK z&+k8ffB*XXONL(tXahh1fi?X94^$0Q>Z$uRRO)Y4)uapmB!2(-ul(c1=C+V!kAF`) z$PCo;`_FHns{jIs3Fu;wy-Z(c2YwAz{&V4aXk?bejFO*Op&u`@i~PecqBpL@DIoojb8mb+WHGK%fG2>)a3=iVf_~v+`s?*1;!`?Kmai^I3i*ZIYtpN f{g(k500bBS@Ns{bTs^2gCr95H^s6Fo1}O2_S$Nfl}4;<}o-r{^R8Q_xtzX z|Nnu?|Ni^;2gm@D3=F@4EC#P1& zzuV{ie)#0qf2Lnh)j(~3VeG$ufPMl9Aczeh3x56n#l!R`HRQLfpFjVwfkN;%I39k( zVgne^e?jDThF>oL0*Hk{T6(^^8pGqq44*zhqZ1OZzkZ>_F(mFeH~<0+0A4S6=>Lb* QN&o-=07*qoM6N<$f&=*Yr2qf` literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bt.png b/interface/ispconfig/interface/themes/default/icons/flags/bt.png new file mode 100644 index 0000000000000000000000000000000000000000..1d512dfff42db1ea3e7c59fa7dd69319e789ee12 GIT binary patch literal 631 zcmV--0*L*IP)?&DC3JV7l?ccjcgB=Qq4l4w|Q;eOZ4z|IjsEI`#PYSloM|AFHF zfy)2>XZQ=$@t;lU|F1tRzpnmg{PUOLH{-8A|F{4CvUU?d0I>k|0TuuM^_1cNUy$nm zzZn?*{^!*ACzSEy$NyhHzB0Wn`TXRU=!%=n%Ci4h82|!^32gR%glZtk^6USnb00o@ z{`LDW>%U)&BK_|-y-75RkKVi&O=|xC<=6keK+72b0*D2q;Xlai|Ns9mF#h@fM(h;aV>^!x1-zNu02XV-n@ zm3imZ@&EI0hChG)|NZlafdL?Zn1I0yH26P<=DUx29QQsc%}izF;QV-S-hYOl|1V4z zX|a-<=Kf#g*Z)7i{{y|szyJ_HEKEEM|C#>$KmJzoZa)M2-~Wm-e7Cl+vi)L|kY`}} z&A$F20RV*|BkB*O Rz6SsR002ovPDHLkV1m;fPLlut literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/bv.png b/interface/ispconfig/interface/themes/default/icons/flags/bv.png new file mode 100644 index 0000000000000000000000000000000000000000..160b6b5b79db15e623fa55e5774e5d160b933180 GIT binary patch literal 512 zcmV+b0{{JqP)O=a{vExMP2%`MCSoB^FIcLe_%lf;|~%E5I`(IQNh}3Ao>6Q|DFUXMn*>AqQd`w z|1kXd^B;tM|Njjl{{hM0zwd6?1Q0+hV1xeud-4=Wy?p-%sO`^#2S61Jzk!N?s)6X& zzhA%p|N6}=D+{y%Ab`Lc{sL9~1=0UN4*CD*7s%9KAf+JHKs~=eB-8KTKvw|-5R1&; zzd&a|ob(5%^Z$Q=wHy9p13+aOpFRNu5F>N&`Tk_-7w>=n{RejQzkfh&Kn{rf10?_b z{tFTZibx5v&dxav5I~H7|Ney-|DWN1$%1FyagzUW0464;_wU~W1Q5$TW@eGxtUvee z3vAf*8|igK9~@*rr66bh|NrkNM8z+V zAV?>O@ek;bKfu6d00k6 zPW&$KB`I@TtA?2x@Q~7pdcWi#1>DDZ2>MuG0I@IumHuaV^&7|soAMvT0IK){RtF@1 zgH;3B;_Qq-34j1%{P^)BFE1~|NkA(gBv!!4$aw$$eSiRB1ga=2D|__l(H|iA4T2Ex z>lc`SQ9x2&UjE?0g8%`<0`lvhzd$}*14J4{IhY2@0~G@V5J82%q9;EBlXu0U&@_82I`BfBC|Yn~P8llm?myQ3_K18=`^X_ivyEfB<6p_xd%%#*GZ! z-C&_V5IGPDK|g;X*gypg3;+Sd!XPTj0Q7fK5>&$Y{sHB| zjK9DB00sa3QR4q|tc?L6fSCSm+3>HW`NxbYpP7GsX8sK%KS9yYPfWi)GJ)AFzdp14 z{>t>1fsFwmfLQ*Ci!yxq#8guv=_mQ;-(Rp{AoSPbXFRCwBA z{KboB21 z`ppP*BG3|`!vO*asNvt=e_;3gWsp&PA@E<2jYs6ilRy6-zmSku5?~OOP=5aV@4sI_ zSN#QP00zQ!JD>SpAKYgR_QStF|9~F;2M|Ck zz%U1e+FyoWe;B_0VVclq;}vp_kNy3hKMWrj7*{kqJbMcaQ;_Pve;I)x1Q0+h46j}> zeiN4E1lkA+>|e|*mzJsW^M3)l^W_^hf&c&c`Mv->`48yHFF-%s0|+3-*GLfwiRNz% m3}3(u4lrUsie?}H2rvLBbQv(L;??y40000e`b1WGV} ze#gbd^&bp=ef-GykAYc$@BhDltSqdeSy?RXJpcawy+5fJAb?mHcsPJ&{d@EF@4HtJ z)qno||1xd*zaM|Ot4f#|8A1AQ-~Pubz$7IBv;-i4SQvovfB*ge{fFVtAE4aNE7yPi z`^Eg=5yP(^Ur(Q5`TLjM%#`8#_rHuB|9}1hItd_vSpNO`#qjs<|KGp=|NIHm@MXqK z79K7}ZvOwQ9Df%s{`~lX*xI%KzW-!k{Lc96Cr|@G0I@Lq`0?-epMSr9|NHeD?&umBG}6iH(DSogJte zDERNk_kV0Zng09%Itd_vSb&=T{rt@+B*66dJ0my{fpNkvBm!jpV_;xnVgd@XDk?Dx zh=IJyzyJ_HjJJUrz)|>#fr0nRl^;KTz#|yK`2G9$BS%LzureS32rvK^u`=B;c)+&+ O0000d94tALrX!Wj0S6V-v9sr07*qoM6N<$f?*uARsaA1 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cc.png b/interface/ispconfig/interface/themes/default/icons/flags/cc.png new file mode 100644 index 0000000000000000000000000000000000000000..aed3d3b4e4467c33717ab3e2f61596e06113f9bb GIT binary patch literal 625 zcmV-%0*?KOP)Vbu`-)NXk-Y`p?2$B#e1 z{(buQ`}e;;zyJNd_UF(2w_nb@VUiUP2igD-Kuin_BL6vl`zgIQV*mR8|8G|2U!T7I zn`-)Ow$bxne}9LGfB5z5*XcJ*K(;aeSD>o^0st`p&i@1e@&c~g4N@7~{}B9V!5sbp z`j|K8<@Nq-&kt=P>@pAZ`T7Q#;RiPl^j;kSgdzX}05Jg0{{#R8=f>y-z~LG0`u_d< z{QLg=2?6_k)DH^)`=sFo8YTUi-v;{r`o8J{6Wj>^)c^vB2^cJY|Nnmc_5b@He}DY@ z_51JdufKoSslWR1>-W9)3`r;XfsXn0`_Fc($H!lT!V@5Xn1Igu{qOIuf50&L{qg7D z?|*(LofMGa_%_k-*{}b_0g?9mMSwvE)Bq4bEIr*1})*zF_+U)&LMdEMOb{Nb-vOh6FrNC(tkd{&4;N%g_D$&)>g> z0^hO}m?z%iIsOJ1mka;_#K>R{i_RZNQ42x8VJSe8f#Ern2@qfa%&RHCyvg>Q00000 LNkvXXu0mjf=TkSf literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cd.png b/interface/ispconfig/interface/themes/default/icons/flags/cd.png new file mode 100644 index 0000000000000000000000000000000000000000..5e489424884d2ec9e429f70d69af00edf242a077 GIT binary patch literal 528 zcmV+r0`L8aP)JkPqeYl28iLgD=0{><0$P44T5yOrT$dE?(KkwMFdoG^-J zGv9P)Kk|i5`lcNgUUAbboca5{hI)v&h!9!~`Yg)Ld}$VwYqqXn@gVLi>3LSVGm1W? z3qnDJAk6chH(u7f~FohUBCxfQDx8?5BQsCcprAnfVhO SHC~zk0000@|NZ~|iEi8i zh~?j3h8^dV0y&$fY|i?}`2XK;hJSzm|G$6#|L@;V)&KqZ3sU;$?>`_ZF38C6g#jRd z7@s_ODJ3Nev=9gw8UKSQhX4P)z5oCE{eQ>y|1j|H-+x9%#`EXT0R#{W1H*5i5@u$g zs{agN2m-%;fixfipeaCQpFe*F2q2cU!)f`}`5%6M06O*WzrTN({{8*;CkCkD_wPBk z=llWket~@P=ieVecEOTuB>(}$vTge|RYlbYUmpDW_v_E!KfnL|{{8n?G|>28zowm@ z_UrGj-+zAtrGTUoztWctUjPD#h2amw@BhDn5OHz(52cFPg zot=T34qlT?57Mzkg5?0ssOG0Ftp>paW8OyZ`_I07*qoM6N<$f+2k} AjsO4v literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cg.png b/interface/ispconfig/interface/themes/default/icons/flags/cg.png new file mode 100644 index 0000000000000000000000000000000000000000..a859792ef32a02b41503b5ab5f216191af397e02 GIT binary patch literal 521 zcmV+k0`~ohP)i@P`2b{=v9^Ktp0uZ001fLMSM)r!?%mH+B91 z=ii?+(ckX8zrd=&8g~5t-|*}I50LQ;KzRlRfB=Hn08;wv->)Q*Kc0LLgTdsU-~VfV z{r~#=|1XdRMzE6r0tlo5X#B6gzhXrG`18Y*0!g6iieLY~Kvgqz}`W zLWO>Z3Lv@r7+CdZpiy8Ae}EeP0z(_<2Y>)#Vfe-1#`njMUlORAfdMG=o8iiD#%aG9 z#Q!h|feZ$rzkeYJ=p=vuV)VVru?7U|?FE@Zm|i>fBlzF zc~M_qKf%h=bAcoS;}NE7f8|yFe%B9?;;8%o@BeG_!|(4qhyo=(h-XBmKHXpc{~y!A z`THH3fsDVeudko)ARzm9UL&JI!+~uEM*rBES1=kd6zV%LH0J*N$gIQAc0y}k9qTFv z4h1oVG?rB#zNY^8{QUp5wE>>R#S4NZQd1i@F)*?OF@6y}@zmk^!Gr7L9asuAf!ae1 z{{CbBBH^Az=(+fAb?mHzA!MjRs*H~|NF=I z{~td;@BjZG-hUVsqZ#w(|L@=b|NQ>{d(*K^00G3pzycQk`jp|{UxvSb;p*Vv_V?Sr z{{Q;@@3$6WKrBG#F*5vR z`2XiW&+Xo6{KsbP_-SF+DJF`pL$*;0gaz z7NKVhyo`U;4*0+SK#>rfFFfafF5DUYXKh;r+@n*scPQUy6`!63S zGXn!71H*qtMn-04W+o=4|487=moEST#KiEAA;m(3;Xgy1iO{3BKc9a12~-UM7^Z`) z1qdLZI~bN-c=z}J|D88K{QmR*&tHcBxB*ZDKmf5Ya0q<-!`is-{h$8~f7m(x{QZSX zH3Jv`1P}|uy*o^wIGI2G`1kie)4zYe_&EQ6|NftW0ohon1}3I|Z{7d|5aVBMp0ssVo0Ek~;W>Z#0SJsA+2j`G% zv|UVeYYs-#Sn6_J90h1VosR?LBU7{U1rQ6+R0f9sPrg3=`~UA>#=n0a|7Q67_y6zT zP{j57|G!`V{{zu)Mn+knB>(|98e;E17s>tTLaMG-~Y>h{r`!g0jL-tfS4HmF#P%V_xIo5zyJLP zk|2W%e*G8w^1X|KC618W{eAoCFX+EI literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cn.png b/interface/ispconfig/interface/themes/default/icons/flags/cn.png new file mode 100644 index 0000000000000000000000000000000000000000..89144146219e6fbec7eaa89e1bf4b073d299569e GIT binary patch literal 472 zcmV;}0Vn>6P)$bmtfBa_T{rmsVufH!rO2O)W0!b+P{TrwO zAb?mv&i(NBbu;G`sX*)cv$d*%>MiL-(QdhpkjakVmyu%k;sfcNRj;yhJaxT5MTg0u5&QfH8#Bf O0000XbC_7v4G9~kE;3? z$h?1GrT>4y7{3|*{r>Zd0U&@_82$jY{AFPH^Plk#hy=QU5o|Ds0oDLyFn~2M0QE2c z1P~*G;PKK9g@-SH{rUU<_aC4k|G@~v`1Kn|{`&=C|M{yZ!G37cNq_)iVfexD=MNA8 zh5p0Hf4_c1v;p<}|Ak}_F!%rh2&CcXZ-(!`82&@8$XA^gF6?xq}zd#y5N`WeVBbyB+frxZH0- literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cs.png b/interface/ispconfig/interface/themes/default/icons/flags/cs.png new file mode 100644 index 0000000000000000000000000000000000000000..8254790ca72f98d9e79d94bdfcb8839b1fd434ad GIT binary patch literal 439 zcmV;o0Z9IdP)|s3jQ%L{DG0k=ogG+0SLgMnA-pV!aytqt1(q3VU5g2cTadE%W~lnu`}m; z-504zOD10s2K8+~RqF^K7O;8$o;>*sR0>r0`!|sM`x~eNg#P~i_4n8BzrTI~MgGdl z@-i@d0|+1%Q&SyHO(9WHu7Cgk{{@--A8b6x2B1zb1BygNIks=N00WJ{7y^0)%zz1kWJN^&bany+5X-;o*O`wU`+x5q12BMq=+`e0f-vAB ze||Ik`OBc90(3J#0I>iAmFf2%21!Yv97q%>_xm>^i2a8FLV}HlAfRG^0AlbRVNjfdgKH->)<41fMG{Q1Z53yA)}NHF>VM86o=*Z=~EMTLRklg;&|8vY-+ zh5rBh|L@=bKM?ZoKOp1JpMQV<{rmmr|L=eQfFkpA_5cJB<7Wm2?&_*f&z|!oCH%Iq zVPN&@1^xa7gnxhi`TP6#zh6KNfByZH;9_972M|CY z4S#m*VEXjw_teQhfB)LctFzlGTKpda#8eRa1F`|=V+j!s1_l{`0AhU0z`&K2_5c3; z?|=UACdB;@3Hy%?Ffai9!1(6P8-M@;JL%7#4}bn}Wu*W1^8Nqk|9@zxfJk8Yg2Rge z5=!5G`~e6c79IwMkAMHSMfCl8%kXF6O^EHl82Alg`~}6s-@pI={`>#;Kf}J}IRF8~ zc$$I1RCFdZQi0L={}0epF!T#d{sWT?V3G+SzyRi{Q|!NXWpDrh002ovPDHLkV1m+z B7Bv6> literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cv.png b/interface/ispconfig/interface/themes/default/icons/flags/cv.png new file mode 100644 index 0000000000000000000000000000000000000000..a63f7eaf63c028615b2ded5878b5e14a7dbe962f GIT binary patch literal 529 zcmV+s0`C2ZP)*82p^=00=`tlmIeOf&y&dk@6oT z&CV8YCOfMzZ7b-;WHc4ffO0*K`UGc#9pHKW{n=1`s=Y4`sB0UGuD|F2(+4xFrs{6A+r|Fh*S$P>SRGs(%l z+O-QHfEa)O{tdAK=ovi517(5A-n@AO5I`)f0sl(Vm><0RZzq2;(QtLuuFT6X6;y@p zb-8u)9gSFj-3}5^z@SqUX4qfA01!aT3<}j|#!Osn3@^V(zxysO&hx#~ZN`f)vS*$d zpLlA?$HBnM&cM&k$j1o^^oKjY0t65vgZ)>ehy*ei5K#*ZyWju7F%Ll?01#jRixNU5 T4U6zw00000NkvXXu0mjf>cZT~ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/cx.png b/interface/ispconfig/interface/themes/default/icons/flags/cx.png new file mode 100644 index 0000000000000000000000000000000000000000..48e31adbf4cc0074f40e95f87c1f103b91fe270e GIT binary patch literal 608 zcmV-m0-ybfP)Uz~~Q*L}q{yKmai^Fs!d`Rbj9@@=xl~KZbvQ|NZ^*|L@=bfBpc` zKOp-38^rz{DEepVv)`L`Yyt=%76t}3hHqR?<~aN{I`!9n&u`}MKs~?z|Ni|Cihlk3 z1w?Q7fI4M?HUI<=3&<7!82Y{{Q;@?^mDN?|=V) z{r~^ll=rtu5CcE}F#**BRkyY(adR>Mc_H{~T5^XRV~oVFSgBv#s=t2z{grn0SJIVV z|Ni~D^5u8)5(a<(0%_pmV<{@S{pr)+Nt0E6|KyV7{&xHKulY}Z0S*2Ic2cIyuhSoY z&3*a@=p=vu0%~ALNs$10lZEA9e*W!WzkWV{%9A7hYlh}ewm<)V{rd@2{rBIm&Idr} z{RV0P2mmnv&i?}d08{q%2kh+oUtbt0DGA2L@2{yn^Xv%Q%_4hjZ2Q{KfBuh*0fWjOcoPYi>{Qk`ejtlm`TPy!Q@c0|K1n4Ay00P>u ul!4(JQe+}W>@P40kp+Sq42=5$0t^6?P(4CrvcmZQ0000s1`2Y9I{~ve$KWO@Yukru?KTxgz{s9CK3*7Y} zZC_6Qf4TJkuQ&gHzW)Di+kXz$|9k=eg(Cm|XMz~|=g%L20Ahjo4`KiVr|y5|U;qEV z`p@?NKb!P_9;^R?@o<+hfSm*oKp+h;f&YIQ*bg)L>I;A4WVP82*P-nR{;Wu@%{Vvyu7@~4txIf`R>OD+-01E zIfRil07L2S-Mat*#Q65@TRuKMWMi;}EJy%|ff@h;2;_%%@7_UT@edf{0+7H22rvMY Ws9gjvbyTka0000? z0048MLcfb{@Lpld*gfdL?Z zSQvhRtN^J#x6%GQNHxSfxHgc;AD{-1tAIKH0tl!9q}uD*5!1Kl8Kk6va!f$;fJ%WL z`2Cv^NdEc54D$xi27mx!VfgXqT8ME7!~2)OPy-`SXu#NiAkhzFFflLy1Q-A_8F>@M S6G{sJ0000h<6BFn%a z@b8~2SoNP@zd$;E{sbbRuHQd?{QCI=sNwhbA3*&Qe}GP900=;09NYi^fU@pUdVa9*13;+Sd!tjgXKhXQEMobL97(p6<{RLvMGBN!7 j!N9=G@a-1^K!5=NcXWu!7_DDe00000NkvXXu0mjfeQx^H literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/dj.png b/interface/ispconfig/interface/themes/default/icons/flags/dj.png new file mode 100644 index 0000000000000000000000000000000000000000..582af364f8a9cb680628beae33cc9a2dbe0559f4 GIT binary patch literal 572 zcmV-C0>k}@P);we;9uK`S<6~zaM{qBL9B<0yBR7V`E_e2q4D) z|Nnpa!Ep64!{fLA8NdLj;oraifB*mg`;Xx-kn#6Fhzn-q&in!pKrBENJRA&WD*ySo z7*5@0`26EP69WTC_22)0z>5C-g{l_hVFa245I`UeKudt6h7^Mc@BgDW81BCO4-x~L z`sXhc{R3+I%fRsKA3y*x{R6rHsA1>M|6jifb2E4w{z{xB{`~z5CPC;Y7bk|9<`c2PXgjR$^CT@Hzz$KrBEfF#?VC z^aSdB^z+g5SJMxCJOGqNsQwQkfr0#&=?~CJ009Kjz|71H^!MIRd#Ajb^76;aUyQ$y z%m(TN#spBq-#`C>zGeUjAdrR+|30kwu=eoBL!3-pGMq9%bs!`E|ACMovw

    4;Zk2 z8GbPU1Q5%#7t@Nb6*GKbU;u{yA29j{CVzn$|6qa)V3LCYAiw~8(_SNKujRx50000< KMNUMnLSTY(1rd4x literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/dk.png b/interface/ispconfig/interface/themes/default/icons/flags/dk.png new file mode 100644 index 0000000000000000000000000000000000000000..e2993d3c59ae78855f777c158a6aae6c1fb5c843 GIT binary patch literal 495 zcmVh!ZNvLM`<}kPiIA3?K?Zl!VJuS0ABN12uI2v;s z000mK68GQM4oDR3?|C6;zBc4LR82Q1eETXSa+3nD0Ad8%4|Ml`Fn}2U{~ypshW{9V zk%{T!hYtV&#KHiVV*o?2zW>+&Bgm+K00G4EikX==E9>w5`yf~S`o*<00G4K6dZ++hy)_Bw{QPEdi2K7 l5H1Kw2asrHVqgFWFaQRwS@oh;XP^K8002ovPDHLkV1foV*8Tth literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/dm.png b/interface/ispconfig/interface/themes/default/icons/flags/dm.png new file mode 100644 index 0000000000000000000000000000000000000000..5fbffcba3cb0f20016c9717614127b89db4c9664 GIT binary patch literal 620 zcmV-y0+aoTP)yt}{r~U(pZ|aU z{rk@#!dhJXj+vP`D&$&!2yPR?Jud5I`&tqo00z_V3?cpb$_)%#~li z5Bw?p&G@T5&5h~tB<;UIJ-`3_mgbQL+5iwhOdtm^{QZlh+Tg>NcGo{qR#UR9ewx4g zlzHy^uRp(j{rmOj?;oHBfB*n70M7pb{ow!s5r+W$=Kufw0RQ~_o$a1N^GPoTT-yiw z&XGVBSbe$r0&xrf|M~#~9P-zx0st`p&i?@b004Y@cH`sX`~3X;`}>j`1PlZ1WGkKd zF1~FN+w&9T}cJeJULy4V8r?0tNHM6WN&<2126ppbC05A-~q$vMCOd&N)3^rn&3WaiZo>@dB zxpL5=L>h@#UjVT%{Q39iA58Ths0J3s|NohoLF&Lt!8(8c18V>XAjZFc|1vT%{s#lF z^Kb%2CZ>-cJ^%y|<6Q;@;r#qR4;}z*|Nr|B$h_ab1b6QI%fu2>dIV_O?>~RRu82tM4=f|&Ke}8;oX5+eBw}y?G6)5=s|Nnnr@aNATAPEpaEN{Mj=m^OD z&%p5S|G&Tg{{H#<7bL;LEGj9<&cFmz{_j5mJbLs9Ab?m{m{|TZ{D1lB9Z2clKfnI{ z`ThHs^2c9)q;CF`l>Eoa3N#g>nv07INCE^93jWH3lKe}28-VENu!{qxMpm&svFOiawo%#4hT5U&FS z5Yzu(KY%Xz`RDh~-yl6N|NT~b@qz9A2lm1$Hf43G`D-AmnZXVNY5)izCWas1fbRMA z8?52ykLBVV-&q+tkKFpbbOC=r`2SzOfQo=l0_p*hfB*gk2q2IKpzD7Eo%H+Hk6%A8 za57|Q3rv;f;d1r)FDv_xg9F*eKs^8f#KQ37)2~0jMR){${rwHH2k3S7pO3`Z{#jf7 z{|`16Y&=9YkOT-IMh0&|hF9+yelRe6V}O#tcxPkSx96}BCoe=1&?OKCkOT-Y05IoG U$(*n^qyPW_07*qoM6N<$f?|9Y@c;k- literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ec.png b/interface/ispconfig/interface/themes/default/icons/flags/ec.png new file mode 100644 index 0000000000000000000000000000000000000000..0caa0b1e785295d003869330fc4e073dce07e7f6 GIT binary patch literal 500 zcmV1sCzZm}g`N!}J$oTi?|G$4gL7*^D3`7C}Kmf5Y{CmeN)&f@km*M|^ zrvE_l-~a!AA&BAspa1{=fXIJ9!9O2vbOQts3j+fX{b%^|8m0my0Yd-4N`WN9@BjaR z=no^SIM8~400P%s(0a|A0FHhM?*o#se9Q zEZ;b|7ytr@MWm#zEz$bb`!9d~{{Q>$@1MW_!07MqKOpw+zkh)g(B$8L|49h*Ov!x= z5I`*NZ%IAX?Fbu$UUAQCA3`wxix_2=I& zAouq_SzðCcuS!~%52Kai0?gF&VORsRAR2~rJG2PFT1^!)w@)C_d-AAkU2Vc75Z z*R<@y`9z1vevIh)-p7{p`5C+7f|6l;f1_&?! X)GmJPc-xs)00000NkvXXu0mjfGFPrC literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/eg.png b/interface/ispconfig/interface/themes/default/icons/flags/eg.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3f7a10b5757b006948ea4436fb242d02dc9a4e GIT binary patch literal 465 zcmV;?0WSWDP)LAHVtk{r`=k{y)(2e*gi*sIRYISXlV_^=qKp{(!;n-+xj9 zUjemETFMXP0$m6sfwJP_;%#kh009JYeOg-Dy?gh5gTXH_fG|KLm<2Qhs6|CZ<>JMQ z009IFR-loRl9E6vpeV=!FaTTi8)D~Q7yv2;2q2OXK!5=N{?|@pNV(X=00000NkvXX Hu0mjfG@sA` literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/eh.png b/interface/ispconfig/interface/themes/default/icons/flags/eh.png new file mode 100644 index 0000000000000000000000000000000000000000..90a1195b47a6f12c70d06cb0bd0e4ea88d7bfb03 GIT binary patch literal 508 zcmV`hKmn*~pz%QT=MPXRKmaj;?1ifa0xhloNlE|L zuK&--1mwx?-uoV+`qwW8u#*4+i1F_GyFwg7fByafIr{%Uh)$p>Ae%w(|Nq~=m~|`# z{`_H7QhIal96$iEC^sml1*F~kc<(nb4FCQ91q_kDz!3TkBLDsd`Sky<|4qNomi`s~ z`xoeVfB<3v8uI)9A4wibp!A=AfB%5B0nwj-e?TNKsQ>@@`|oeijK3Q@{{o!^5I~F! y*$fQd7#Mzm(H|HCnf(WhfND7yc3x%x2rvM-AWsdQI)rrq0000&KpNnxA)<^73~VwoKqoOWF#%15i9uxn0tlqx)vH&?arx`ryF**H{9<5mxO9m@ mNC@PFfB*h~9RdUZ0R{j9;Y1$IN+(bN0000&(jx%j7OGE_~DVuFcQkgj@33fJv($pjj zgoNxWFM>pG#K4X+%S_Ys!f>f$mib36%ekHNec$;y5njB{!+Y`YzVGwA&4mTVh%ikU z03gD2Hn&LPeNu%hDG7PUvzrphs|^(-as$IIo1LmPya%Hc0Qn*6qc4XX3oKoa+Z)_XBQk8 znPA)XelBh#6J<)fj|w>7X+~Yun^@Bp4$+N z6L8rb{%QnJN{fql*fJH1L*2YjUlB~CXS&&LY)1V3h&68|x1_5-(4l3HUgs~3JvLXI z$_D=zL{dTnq9RK`-w~w|sCYqqA;@OoAE0!{9Gi+cF%zA>5*8OAiXWs z!A~!@Tb_6WJ;mn(q~>CYJ~Oq(|Mc`miY)G1d$)?S_lf*=dz3nd-8+hwz5w#U=!7L- z+Ve0W8Werm#o=KvYxRVVNtM9!poHk%m;Y{gxKdXC|Y{ fc0^aUlspXz7vm>S7OoCUZUIwXLGJ6E%Z+~lY(hhH literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/es.png b/interface/ispconfig/interface/themes/default/icons/flags/es.png new file mode 100644 index 0000000000000000000000000000000000000000..c2de2d7111e3cb59cf6511dd2ab045e824bdb43e GIT binary patch literal 469 zcmV;`0V@89P)@|4`Xj5kLT%`al?B=W5I`&pe;NKW0^Ri&h`xRJ_x;0v zUa?=y?0^3M|NZ~}FE9c#{{3cP{Qd6}13&;Vf!z&M{pZWqKYu4MFm$tgedF}w=P#IQ z7-9gT-$11R0mKA$(qEu4%ok$*y!^wMRm*x;`R7|k6yu?K{s8?55I{^|9{?Tjhec2I zv+6&FhFWG_BbNVc|Ns94tNRJp!0`V!Py;{!F#$2enB#XZaohg-5%Tlk#oa&nzQW9g zl0Y{D4gK?n0U&@Fe=;yIr=|V7caH%YEYL84k`Tt9-wc2LGODP&y?7BIfLMT@X8Qey zK~fSFpuiXa$^kk7RCwBA zWQbH``0|MX0{;DB`1Ob3-!Fz=zZw28fY1*HhF@R=VQ?@21P}|ur+3w` z_wT=dfByab`{x&s{PXYspTB>919^Y{{Qd`I{N9v10U&@_7=ExZ{APUe{`KE~Al1MB z{rb!Jhml3<_uqeCzux)%bv7|NkFAvw@aK@N+YWG5`bsF#yj00sZ{|0ReUZ0OJ4u`~d&_lgxzd z_7grGtKje;)ax=32IqJ>VE_O6|Nr{|0Uz@6!2*a0?AgCSJ_s@V{`!jztXlEUzkg2h zOW%AK0ILQg2A~)NKmdU>0L=y=29PKt(~s@sMWK)O87MU|4G0ImPt*+y7s`{{I1L_{;G9FVHyv z0R+;(^!pEkq$JpwzYKqVGyVRp{reTr#sB4{{{Q&{G@Ah!GGGK$3=lw!Ux87Egcwk{ eXi`7`5MTfy3O%OUuKb?>0000W@Y84;!#FdBh{DWNV{85G^eR=U#)*62qRvoaLX5p!7Lm^{g>IM$Q zMs{Q_?l?+2NRuC{19iOmU$>t9;*>tnC_qaIU+T2fR7nFyd0Z0-b-MgLN zL~_)yI%8}kwU1=sY!YIJllUc_pyhtI4TcZ)*Lyi~^>58dcXu!D%H5T!AO`R!zyPR# VdiZ30KxO~{002ovPDHLkV1g_p%GUq@ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/fam.png b/interface/ispconfig/interface/themes/default/icons/flags/fam.png new file mode 100644 index 0000000000000000000000000000000000000000..cf50c759eb28b5962720aa1ce0617a29003e477d GIT binary patch literal 532 zcmV+v0_**WP)SU^I57#IKohy|#uQJDd#=|98& zUrgMLRb~JG{$u$2m+|*M=0AU#{`@s%|H#1h=ih%I`g`z86F>lpk-UOTf}FCMD80)oDIYC+&q4vMR0s0&DpH|L=c>-#`S^3sJ`m zRPz_88i@Y=|MmYr*an6_AO0`^1P}|uzkh%JGXi;k8UFtPIt#4m|G)nbm0000FP2AE)Ir2{}>qlLBSs|`Qg(SfB<4)VqlOE;Q=cD|Nnn$ zna02W|Nj1E&`=Tpav_4q;M$#E00G4E4{SI@`q`VGKvVzz{r4XmU}R+c_2(Zz0I~c7 zs`v*r?Dty(;z&PFFXX zRA5t=4x{1SIibD)Vqy6A2V^D4P_SySA|L?j2ip1XFA)9%V~_%1r~w2J3=}{2Oiu1 f7(RXZ0uW#T>&I!FfdIJb00000NkvXXu0mjfj-u42 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/fj.png b/interface/ispconfig/interface/themes/default/icons/flags/fj.png new file mode 100644 index 0000000000000000000000000000000000000000..cee998892eb316c3293ef2d52afec9218bdbbc03 GIT binary patch literal 610 zcmV-o0-gPdP)2C05Lr?a%1G+Sb3M_ z-f!*)-&mJ@lxC7weD@!u;s2li|9<}wjr{Zf&o8mqKR`Cn4*&rGF#yj01QaSLwCD}R z0w(ww8v*|PzTN}jB`Pj8{QK|!{{8;|gOCLd|L9jy6{oELG6Dcq@B)aDq496GGsCmb z5T7wXTnzN$?|=Wl{r{i6vr6{G)xV#={AXc)t!L+QBoiQjSb+Zc`=1dU2n>I~p8E|B z6OfY_{`1$ji1Pn`9_T5yZrhJfj0}g~00a;V(9A!7nZZWFG{8az7^c++|9dI@cmDl* z!Nvb)UorrL86bdIfbsI1fk}{;;V;BV|AE?oY(}v2K-{x07*6Kx`SfB<4-V2A|A=r2_C101z~ iU~vp#0R6xN5MThlzdwv9U#bcK0000}CO1*!he@c;k+ zfB*mg{rg{#hxPwIh8G{d0|o#7{Raep|AEAFCm#U_AQp((@4x;AD*Xo({rB(3@4q1y z(m>63@(hzyJPYWMEi%>@iRTXyxzU zAo>qT2S^W413&<={Q1WKlmMyz`(Hzv@8AD_R~~+N^7b200Z@m&0zc4{Q@7rNwftxJ z^$Q??fEu9g1Db8CAq;fMkDq@pJa`8*&sI~^TtyHla^%`8uswf)HUI<=3()%@Pl0^! zf8Ui?K|l%XeRX{Qd(n@juAHz(D*15I`UefB!>$cK-hRUqIf!|Kj}Y zKt+#Ue>r^ZHOMRf{y`i940V72V*2%m0pg)Q5O4ka4>U8*PAAEH2(%ZZ;ol#C0AiF(UW*)& q3=s4Oj6m#vP&UxAe?ZIt5MTgFMVEBke8_SD0000BE0lK=nzFYgc)d0A2*B+AFf z2joHok-@WP&j1351!6Wt`q9fjf1W;g`1ALFY=DuG5oiNI0I|ST{|2JJ|Ni~?`|A$_ zRt*pr0t5gt0M7pe4IJopi4@}M{rvp?{Qds``}+I+|3-D|`uqR;{Qmm<|NHy?`uqO- z{Qn;q1i_Qs0*LV@1A}N|@t-FT{{IC^{`vn0sPGp^)o&2vABgb_!eEtCyu9%!Kmf6* zGhfda5_|CT&#%8A#S0%rhKer*8VNG{57cZ3sU*g7is3Rq0I|G(Bf-nd3vr@r@vHy8 ze*OIQ@9-oMOb-A(eJ@7=Ab?mP;SCW2x*O<#U%#>Y7zqCS`2!F@APw*!ml9!S{vjhP z$_zA&0R;fLP(1(v#Q5^%OL#2G%0Af7VC%@R_vTF*lgG%);U`26kn-@hOg zU%!6+4+cOs(0HIde9xZz`}Onxub&LUB0x(30+2WcIRJn#2ut|?gWYu1Cf+!-K%B8# zdf?1WA}#uZ8oj7u>$I1i0Al&`=O0k%-@icgAIJnM0xA6maSq6BK-ECw|NZ*S`0Lj% z1_pot6puj;05Ax`F!=umqj7^frO?t|3^&I1kxUq9yECc+jQpY84SWH_0#pxl$?v~F z@*hy-KN0|X07U)z`4{NpU%#2aHUI<=%a31wK(7Du52Oc(|3O^?R1IN+RRjI-n*kVB z3=9AP#PZ|EACPLGJ%9cJNh|>9B%spYzZw7h1%?tp0I_@ndg9MNE>313@6R75NcceF zkr51-#U+7;F#`Sf7i0rK0I_`g_NQ&Zk)EZ(2O=d>QH$KN3zEi7S9u{+2K>GX4ds`2QcM z=+A$K-~a!^(JwH9Fn%*K{{Cdb01!YdV9)*qi~a#?`wdg{8%Z^Y!NB>w;@|&31~6!UgVU(k2*|8J(R-+sudaynhucHbwAMTnor{mwqO^w7JHzaBsT z{O^B8RYf5+LvDs&KmRKVd78=o{`1#HTiEo_OolaGleS)G+IQ#sUI`b*pv<`1zCJ=H0jd{{2S>p`ri%{LsXJ%FbMS z$#S`6f|?OG!^Jxczkf6Q`UNF{l0Sd`ad7zm>({^EzyAS6{{CgrkluOb3l1A>ZU2~A zK+FZ=zkmP!`TOVhpFbzBzFaPmD2$N3;+$pK?>zdet`f0002ovPDHLkV1gy;I?Vt8 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gd.png b/interface/ispconfig/interface/themes/default/icons/flags/gd.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab57f5489bb9ebb6450cb27f4efe0cfb466144e GIT binary patch literal 637 zcmV-@0)qXCP)@|2i2MUNJEAGBA`g{QJZ3ub1IpEW7h{~Z4K zJ3#Qa=Q1XS-;5h0el2+U>(Te$zyAID&HDTIKad810Ad2W{jW5`@9y)AKr^5J{4Kqa z;cw*UKQW)B)-pW&@%z{RUqB7N{{H&&_Ycr?fB*vd;rG8kGw%JlqX`uK!_D~nn&&T_ z*-Q+-7;nUX=6mt$`7e;3-;BTi{QC{m01!YRC;j>JdmqEEKMa4Icz%Tm{+4F_^}h({ z_1{sye%WyRp84|E^4Gur0Kxx1e;6150*D2Oe>41%=Kmef^V^IA7&yOx!2%AYU;o*D z%dq`!;`!w)_PhDb-(PS30!;@9Adn3rpZ_$9NHVegX88Y?;V;N+#{WPzFy?-P;*ar< zJ?CFrnZE^h{{CWM00h;Fvzl@K2fHp9I6dqaaxb00=Mu XLcuQ~?TP?t00000NkvXXu0mjf`7udf literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ge.png b/interface/ispconfig/interface/themes/default/icons/flags/ge.png new file mode 100644 index 0000000000000000000000000000000000000000..728d97078df1d07241ae605dff2f2cac463be72e GIT binary patch literal 594 zcmV-Y0^8x|9^h-OG^F+g7@$L?BC01YQ`Wbb?43;K=s|G$6#bNnb!1Cx>Qe>QfY2m>?Izi&U8 z1o&Rm*8l_%%a6%3nS?}u4*37)&;Q?l7=Q-<`}?1Z>;KQLY|KmGQ@ZWEch0Jnt zUmm{%2p|@g=ujpTGX@n^21dqzKYxO4`1a@2NuYivJ4XgKw*UYBFf%g!{qd7YP>5~& zE`R_4F#yj00OjT7{QUg;`}^~|xBB|}`T6Q!vcs262Lz;t$n|1+qbnVARhhy8{z5C(*C%JTg?tEV3%;s64O@&5h$(1-*>2%Ak`A87BFlP7^( gh&l)WvH=1N0MfQja}g1cO8@`>07*qoM6N<$g4hNuZ2$lO literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gf.png b/interface/ispconfig/interface/themes/default/icons/flags/gf.png new file mode 100644 index 0000000000000000000000000000000000000000..8332c4ec23c853944c29b02d7b32a88033f48a71 GIT binary patch literal 545 zcmV++0^a?JP)lgG%);U`26kn-@hOg zU%!6+4+cOs(0HIde9xZz`}Onxub&LUB0x(30+2WcIRJn#2ut|?gWYu1Cf+!-K%B8# zdf?1WA}#uZ8oj7u>$I1i0Al&`=O0k%-@icgAIJnM0xA6maSq6BK-ECw|NZ*S`0Lj% z1_pot6puj;05Ax`F!=umqj7^frO?t|3^&I1kxUq9yECc+jQpY84SWH_0#pxl$?v~F z@*hy-KN0|X07U)z`4{NpU%#2aHUI<=%a31wK(7Du52Oc(|3O^?R1IN+RRjI-n*kVB z3=9AP#PZ|EACPLGJ%9cJNh|>9B%spYzZw7h1%?tp0I_@ndg9MNE>313@6R75NcceF zkr51-#U+7;F#`Sf7i0rK0I_`g_NQ&ZRCwBA z{Lg>@|4`Xj5kLT%`al?B=W5I`(ov;U*021*0XgD3^5{teN< z@cTDV13&-@;@|`T5QYI@3O)ok?1DO<2trehc#kXh!0Z4iC6of!=I9L4Jz5Qk(jP`l zJOKo8(qFLXAF#IH8`u5XwDI@PAHNy@|4L4RsD^0x1N0+605O4m05bkR14QCiMDQ;; z>0h$aKjWi;+@CNFzZm}i25JBZAQt8_hOB_!_dovn^Y72^zrTL{{r&6TuiuWpfB*e$ zwD}j1{Ph<^0%eu?|D0`P00`k|9}4iHT+`$2p~p=WCoxfpgkZGj{YEt g{DC2GLI4Ob02tU}a;hkw5&!@I07*qoM6N<$g4!w08~^|S literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gi.png b/interface/ispconfig/interface/themes/default/icons/flags/gi.png new file mode 100644 index 0000000000000000000000000000000000000000..e76797f62fedcbfca8c83c51951680d6a6e9081f GIT binary patch literal 463 zcmV;=0WkiFP)VoB37QQ+R{;bN6GSUi z+kb{HA3p-oUOth}-@kwP{0U71P%%INK{Y@H82)oDp3V0Dt?T`39Pi$;RTl%zL?{P4 z2_S%&kW~Z0x6qjPzkeV9`s>}VU!Q7P|1&Wm)PrpR2q2b!5Hle5FfeebsWZ)5spT9vc*+3O2}Iw&|Nr{sqx*C2&8&?7c>c4n{QvVC zD9-TjFQbI?+i42`0*K|`>)%Y*uQL4o{r~rGhChE9{`~$Pz`@Ka$@uLpb; literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gl.png b/interface/ispconfig/interface/themes/default/icons/flags/gl.png new file mode 100644 index 0000000000000000000000000000000000000000..ef12a73bf9628ff5a67b81bd980d9c5d2b2c0f05 GIT binary patch literal 470 zcmV;{0V)28P)J{teTOL@z0+>00G1VRSiT77W_YWkm2*^|KGm- zfAHXcOY8ruSJ7+$Itd_vn4oTd_U!+mLkz$F{Qvdq|L@-*^6S_C%a&nk00990)`(*=-xesBS%qG0|gf?f~#iu^9N|j9|i`10Ac}ZUz>% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gm.png b/interface/ispconfig/interface/themes/default/icons/flags/gm.png new file mode 100644 index 0000000000000000000000000000000000000000..0720b667aff506d7892c5c301af04e6bbf932751 GIT binary patch literal 493 zcmVwRhhvIeu00_fCKU~B)yH$s9sXS^B!W{?M(W&}hPbMwO z;*cg65E@7haJ!!XVgYOW|Le(9kkY?@fpY);{sqc`6amR!K*q2CzkUI^Y_hUI(*XjA zMdSH%VNp?r|Ns620Z1T|}fB<6Q zlw#oF`Oo_sVk+2%KTsoq3?TP6gz@)3Ki_`_=6?VI#CZSdeQ9y&f57m8xf%uh13`xW zAjrhTbmsgSfB<4-$Y)3kNW1sx-tWJ^f#}!YUqA$5fJva>FJQR-`S({vK;>fVMSuWe z0mcW=Ig;FxKxv@ppTFP`1*!N0BL9M&0|dYz`1hCL7Xv^5F*2kxF#KQuvOqEU3km&! jiTr^fV1zR<00bBS-TrJ5MX@2w00000NkvXXu0mjfGz`_@ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gn.png b/interface/ispconfig/interface/themes/default/icons/flags/gn.png new file mode 100644 index 0000000000000000000000000000000000000000..ea660b01faefde01ad2527a6abcf7d1a5c1b0526 GIT binary patch literal 480 zcmV<60U!Q}P)@|A6>41A`El{SSoRd}EL3@|NdrR`1}9=ZwUJP z@AvHwzkdDu1yn7|BMY<#Ab?oFX8(t({tZ$6>;L~hU=2XVuU~(E|N0Bk07O6y00G1T zbT=bV^`Afg|NLS2{ReI~M8m&-NE-fuGynt;*hzmtW+Q3%1=j#1fvO=I{`~y|)Bq4b zU?=?r84r{KY4``%041R|`~%zYhXEjfz)k`h|LYgXRlk0r+3@c_)IERx{rUUv4^RU@ z0D&|xgN*;p0Mzyy>QQ8EKn=iP{qyfH5CNS85I`UeOuzpyNJ@hA{P_#yFfjaPWc&?| zr{By>f0X$D{QV0G@4r9|{}=!Qi18~pg5ikaD#Jf9Xfy-Svu_Nh0nj)GNi#731Q-A_ W8E1tdJ(&;y0000P)fLk0D%}*I7ff3uKv?i+N*~ULWZ>4 zW5%k%a3T{@*`z6pma6eF$JtK+F@C*&o=d^t|Ns9GOCXH@*Z?CVuP#7nB5Y|1kmu|NQ^=?>FP0zrYX%2q2aZH;)P`n*#-K1r9WbfYOYN z??RUX1P~*`M}`*mir*mb{sxCVG>rbhqT(MY2L1y54rHu+wi6(L7#SX-$0bVa{(;3h egu%oB5MTiLH(5{VMZMqv0000u-`~Ig{`~p> z=MRwl_xtx>F!}G#@4vq{&D;bKKrBFA+{}CzK0Nsg1pog2{{I_D14*DX1pWH^3y6RW zSzcL&Zwvqd#Pa7K10w^wlkmIISh(4kI3GTJhN2$mzJLD! z0*D0|DC|s(0(}1j8UFtJ4HA_S5@P=M@9)2VV#30}-~k05FvNkXnV5ck`2-L^EDTKl zn1259n3DG7^QXUm{{H**3#f!E|`n6Mz6>fhdBj29g(UfB*aM-=Dw#|NaG$fByXc1LXhxFC@THKjjKQ05P&# zA9gbr+SsEBRPB^?1!&T?30hEBFhHFGv5AR^>DH}B00G4E=NHV45I6k$@0N4rAH*g9 z{zDN+_&*OP%Y{RC0Ro8e#fvv0A_7PTA~XKMG0?q08}8kE2oOLl>koag&}IJi^WT4% zN&g{c!yE%t3}J9_Fdy0V1t5S}4xV|TB*XjR%dfvcU;YDm6wdeu;Q~GU4JP)J`S$qz^!f=A3G?{>83*rF;63vB|NHv-`~3j>`uzF%_#GV;x3_Tu z05Jg0{{&$2KZ#9J4f5RdzRdzC6Ae5p=(o+T{uB7y^ZNSwN=h$cVmJ#62-nx+ob%l!TKAE1V~I16T$|E1+i#l`u&y!03t z7ytqQF#yj01Tv_Ick58z;rzG}_y7F-%)*RRAv1X@1^f8;`}+eA4+yBm#PKA>w6y_L zQ&a!|00ICp0M7peY0>I$KneW(?7rp&{QCm?`vUdU)NRiG`uYI-`}gbY@;Dai8vP{| z4h7uY=>Px#0*Hx$0pxvffc*LW3+PFp{}_J#0ty11^n2!vLjod>mX_Jy|Cz2{eHy3% zAb?mH7=HZ$2N_TWSP@V&gaITO7A`uvc=2f<_uIFxDk_pd4FCZI)bI_+mz3lOl7E0f z{^u`PGlT&Y`3GeD{rm6lUtS;y)Bq4bz=+dkVE6#Ehk@Y-82x6z3jhKP0OI&0DF;s+ Q-T(jq07*qoM6N<$f)`^cRsaA1 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/gt.png b/interface/ispconfig/interface/themes/default/icons/flags/gt.png new file mode 100644 index 0000000000000000000000000000000000000000..c43a70d36424b66f1627216ad988cd23a4be9285 GIT binary patch literal 493 zcmV|9}7f|M~m>&%ghRD!%{(5DNnfNcHoNKp}=7 ze;EG#|IZ9j4hBF)cVB@t{Qmo2T96TF4?qC109^ty;2+Qi2B0xObN{1)Uw^{8{`KJ4gZ0H zP(J{D2s9NSfWR7{27t^!x8NVhN&g{E`Ueb#e*ggla?+pwj3Cv27=VUhwE^V&zaVoN z82$hR5DUYve}Dck14V%vK+Z)23?LgAK*7ZT@-zbjKmf4-BkT7+CNVw+pd~+kF)%WM zL>VCz0|PT7gS-eZm>Gd?16jcE4PH%g~!@=<9&!2x_@aEGW jS9>vVD)6R*AQp(xFW-Wt{{mJ2|NHk};Jc-)O#kPzME?5A`1{ZQ-#|To{!0im{$XGM z2p}eq*?*y`{{RjC%V7Pj<(}hvo^Z>=hrJ-xK=d0#0&M^~2_S%&fR6tAp8=>2$p8C? z0q7F5H=q9h`}OesIT^OczkdG%sRkpU6i@>|0I@Lq1-k@j0La}yZU2}V|JX_T{{Q!% z>EEtDfBydd!vuBJUq+w?fB<6o2X+#W53~WS;s2M<|9d72Yseq)`11cZJHs!aS-+wF z1}X*!ASNLG{ST%Ze}QTk7ytqY@{}>p)on&BOV)*xm;om>72$%sP!HhqD7ytr@1teTu4J7{m`^Wh2AGglm{~UiA z82u;s5_9PZ|FH1)~3de={)r1*?FgUtsi`kx>?C4?qC1 zfX)8@|LZe*d2K>lZN0{{I4*^b@QIr~;(tA5`a`e}Ddhy$ldQAPvkwr9kh3`~WiS7Zcc2 zh-#qDKOj^7{QC<;3||-k0tlpm>GvN7NlB2NKYyjTe{-?^h8PLd@aHekus?tQg2Ee! zfN=^CK#X6(5e!Gd)(i|h;JEn(j5jcXFhHq*fkB7?Aiw}&uW^ngBcx#f0000J&k9ol;AaCAG*Vvs6lsG2f+AJUecp&K4&zS7@MzJZZ+RCHJO2~-cn~)8*ZB# z%#~(Seaqctb3On>xdArM!+zLfe2=iS%3k1HK82I)yo62#|&;D2*%o~N(LQ$HrxFU=@<#wgQDty7s|5?>qxBTrc>UoBZ!}1le z#)a`Pq~$aEPO=D0fO80I7h5SSMqU=q48*j9Qb*%7#+Pi|ervSf?0bSFwKsAPn1FO| zKH_&kh#AJmvOUSnl~!1AmcaNJM5awz`0DF46>zWZuCh$z(7uBp0to4w2iu-uj zV9oc#M;CkJ!OT_8;~(;r&Cw`0K3r=(%@VWyiIA#;S}+n)^}q>|)QZ|IaYyyY!;frq z6mATysX~aM!z!n$rJ$=27fpoIr3iB{q|Gr32uDRa3PcNj==OQGHve|07^1DbtUgzuEQ=j%rDF literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/hk.png b/interface/ispconfig/interface/themes/default/icons/flags/hk.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c380ca9d84d30674f05b95c2f645b500626c07 GIT binary patch literal 527 zcmV+q0`UEbP)00;JD`K-EmLvOuK( z0R&e6?>|)a-@i;iz|8zVIqAQ;I)|_@BNM~FU%wy-s0ZjAfB<3vx(uZH&mV?Ae;64V zIcsYEzkmP#{)7J;N}0Ju0muUq%~ z^Jl0Zz)k`PASO^y0(FCg{s2v4J zf4+RlSW)rg;lp2_Kl2?q^5yYkpazCNzyJOD%k=jzP%%INf#Tuc?>~%^l1w0DfWH6z z1E^V4lvz;l%d1x`a&jQQ{ROE8h7C|LKmaj5WMKG(8n4KVKd5of#=rm&U;y%qJ?5>3 RVzdAN002ovPDHLkV1mTk^F06n literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/hm.png b/interface/ispconfig/interface/themes/default/icons/flags/hm.png new file mode 100644 index 0000000000000000000000000000000000000000..a01389a745d51e16b01a9dc0a707572564a17625 GIT binary patch literal 673 zcmV;S0$%-zP)>fJ3En$GhGS>sbE%%m3$AD)q?8M9y>88-}kR7#RKlk!P~Y_PLuF7~U~3`~nC7 zF#yj00ZUDdpLsm{7ajP|&HwoK0Usg|6%f4L_{`Mi{rvv-`ukf=Ed&Gs-sA7L!Q7*a zj{*QO0M7pb%?Sw^g@yy{>ihEY{`vU@3=8@G0rvO$i3mOL`~mv-`W+b$Mmr&io5dg< z5v!7q0*L95jt`TzK8Kd(Utv)OSp_aLv){6ccV+Z`{Q2+asKUU&aO3`Kpz6wW8wp`< z28M3{0mSqnB#A*-c*8%1=RD#sSOwMznKA3=e&iEzwo{cA=PgXK`2OQ}gqId83!|%* zA_Kz@fB*n70M7pdECCwp4H&@R`1|(w-}M5x*74i)0}%fAt;XafA{48))#>Z>?CD#}*e}Ret0tl$#*RMZ7}Jl7Z|M45`5*URzH9L z{rmSnPy;{!u>dsyO%meg+00000NkvXX Hu0mjfN{&}S literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/hn.png b/interface/ispconfig/interface/themes/default/icons/flags/hn.png new file mode 100644 index 0000000000000000000000000000000000000000..96f838859fd2aed975f5f4134050fdbc0486ce1e GIT binary patch literal 537 zcmV+!0_OdRP)yNpn^YtfB*U? zE6K^g@B<)#SlTBTcsfda`|@_0R#{e$UZ3l|Ic6l=B#}T zWCl5lg}RFY8S^$g{qgfJOdc2ve*glAv3c@IFK6|y-~NDH^$#cn3{a5k!L9^_5>O@B z$^W^zSlTD;0tg^R28Q0WdbfK|zW)9V43odV{`~*->+kR1AO=tbO#T4}-G3E1?u#4x z0Ro5x7#++k42m+GppXWk{}2W^;6Y*k7i(1vOT1`b$6{=&w9#5#oJ b00=Mu*}Zhb7k&Za00000NkvXXu0mjfKokPk literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/hr.png b/interface/ispconfig/interface/themes/default/icons/flags/hr.png new file mode 100644 index 0000000000000000000000000000000000000000..696b515460ddb670acb7e9de4438aaf21fc5fb77 GIT binary patch literal 524 zcmV+n0`vWeP)@|4`Xj5kLU3fF!G{fyDoR{}_Q36Vv~H|Ns5{^Z)NZrr*Dqe*gae=g)r_`DNuw zfB*t(VEF(4$y0{Ee}M=nS{mB(NB;kxJOBSE{F_{n`2Y8>|G$0##TjK~fi?gH5EIz! z|8Uj6|NiY-l-<0|OxA@1MWlzkmOI;leLR z$De1;{4g{7^y$;LZ{NOt{rct07a;lk`E!5(f@%OM1_PkhC8`eE9egqWbga z&p;hdpFRZ$Adm)#>fe8W4*Ct02B|hR1*-n0rS<;(dx&bFRY1n$$BzL5h>;=uaC^Mc z(+@v?|NZ~x@4w%F|9yUZW7+yTpo@LH>e(bUfFghX{rmIxzpNnpimU?w0mQ=a>kp9s z8>AGffmuv7DrFgv!3yU7{`2q8f1ngFoPlxn4AoS-S!;e2821p2q{((sbfB+=MK@k8U5Cg$|VB~~? z2XKWZk_lAZtGhi{|56nPieMKY$Bq=4KgZ0muK;2JYWn}5;nka8K-GUCa!{rJenZIL z|9<}gF~mh#ftCOS5DU<%|Ns8~1)2?0{RgZLWF&|Ls)lL+iU2hL1Q5&LKMX(>AUTM^ zNU9+S#0FXN@8@rz^Zx+^5DWL07wmsTIe-5EX@IBzTJ`52%kO`z5F362$-h7b*KaNc zh6exv#P}EJiR%3Sk01R1^NZmZ(C**=fB*Xb3rzn04HN{CU^bJS()(Sf00M~R4FdxY z(0f3MKYtkh0!g5OAQFsz{e$TF`x|H}%fCO*7#IKo2o$W~FaxWA8VofRr202h8w1#j zz=!|{Ah3qte;CCj89_$={rBfLBSbS$5J>(7`GW}-*g)q41Q6q6a2)=FMdm+9l%onl dL?8elzyJ+{hsuy4pm6{I002ovPDHLkV1hP90PyYjz{{0J*12TXlP$`i71!VmC|LYf!%PK1iv=Z0I@Lq zVgLrRB#$I8Q2qeT`3KSlX8!?(3s3+U9e@9T1Mx3N13&;VGFUSJ^?=Y13Wr{r~&-|6d^ahvDC! z|G)qK`}^nrA0Ybu|2K$nd)6X=0AgWa1{?O`IRi-PU$8V7{r&w9sOb0ae<0Pr|Nr{M zEF}%J0U&@_82&N|Y=e#y>zg27mx!0Xgp5*S}vr z{r~fq0csvl>92pk!P<5VDfB!NI2#TFQ3lKnzfB%Al=06ZHfFW+c#KiRe{d<4_V)^&)A0s0pNIe5S)eu>r zF8~6F38(?TQZ#J<0R*xEXct5e0}KG|WIzExE=U%r7$AT^8h-rv@ecwRzz_$3Xaxu` Y0RLik?wUgPu>b%707*qoM6N<$f;0ZTz5oCK literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ie.png b/interface/ispconfig/interface/themes/default/icons/flags/ie.png new file mode 100644 index 0000000000000000000000000000000000000000..26baa31e182ddd14106e67de1ac092a7da8e4899 GIT binary patch literal 481 zcmV<70UrK|P)1Ab?mHSU}=WzCQi??=KL1`SXRBmG?g! zeExSVgb4YXfjasA0Ybs`#&c5^XvcLUqDM3{{9AP00d^^H2e48-+%sM)d02u=%hct8G!N( z3;+QH((o5-_OE}xfO;@2_y=+i*h!3FCjkTyNW*WSt$#tPfB*dj3@CIxKqoQ$2DuvO z1O^6x00KJ+r1UogVe!Ksu!etsL5P6?Ab?navG)7lA4zUWkT?GPWdcP410y3N0|YR! zFo-FE!v&-P=p=vuVq_>~VE6=zV^DnmVAx)=U5ZNz6vaS)0m(NHWW2-wfs+9Q00bBS XO2cxg3=*#z00000NkvXXu0mjf|9Z^l literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/il.png b/interface/ispconfig/interface/themes/default/icons/flags/il.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca772d0b79b255872cde2fb29060bbbbad950f2 GIT binary patch literal 431 zcmV;g0Z{&lP)WlqUuh`uiUU82D1+EBLb>EWz|Nj3k zj6%@>aVJ0ku|Ql5RsEk~{?`9D9{=ZO{V&1vKX2lHHJSgJ0SFC1p8y096I?Y|?05b{XcgblKTHZ zfByjpAQrd=h&?HOAa>`R|6Hv9XB30N3RxDY7$AV4en1PH(j<7uAT&Tc4G=&q@-F{c z8i9e$01Rv(35=ybe;NM%WdxES!M~uG0dj%y@b5pvikg1_0mOLw_HE>d#AF}?ph|!M Z0{|%qc@l5wel7q2002ovPDHLkV1m6PxaI%= literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/in.png b/interface/ispconfig/interface/themes/default/icons/flags/in.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d7e81a98d705da8d7054e77e7d311805659678 GIT binary patch literal 503 zcmVl^KlW*80IEmzVa(K3*_6 zG7fg0I9Zj&0woGah`r_&Kwu3FK=xChQigwjfh>?7kc!_h@)sEWW@MKI+5iwhEdRtz z89B8WSj7JS|MwrL=l|b3uZ7Osk^B4auaUxSRgtG4v;Y11_x}$gi|9Y8?EnG9`1|i) zCPv2p|ADsrhuF4k`@Nr^zUpfTpS$xp!A}Wj4A3Yb2~_s}<0pUsVqyY2p8>1`g1&zJ zsVvR4Yya)fUw{4wtNss>0tLxGfB<5GmnRH!zxweH8<(Mq0N7e&^ba6_ z7#WHgIs!VLeti1p-=9B!fB*jb=l8$ge}LrQ-#`%%`S%Y9{re-sFSERHIY0ohF#KVF z2*K4Ml>Ykz*ZJq)UtlmW{9*tIAQm77@e!0?Mfa}mS!7%=x2KmY(S z0M7pbTSu9imq`K?75n7n_u%3MB_szB3#hl|A07@E6$<6-<>30S5egmg@cSkZL+Ix9 z0st`p&i@3O7{&wE8wU3C1oia^`T7CwI=ckcau@Q71iA1L?!*;{7^Nm*&$?GLJd|NjPb3=0E0KfCb4 z#nAu(05Jg0{{-+tQ26`)!^rI-{P_e371QGlF%9qW_x;Sb;QRdk{r*xJJ*zy?_rWgu z&$=$1lYjzR(%pFe+p|Ni$IOoG{eTR0XemVUia$~;LXXZeDO z0096o0M7peXKyl1N+90g@dyY5ARP|N&gc{s2^<#+#>?j*9u48*^A9U5-*(6(kqBPq zC^|QM0*Gbi#3NFYyicBf1{wyk;Wx-spzFb0kX0fvuWZ`CzyHEKd)}3G%ew&r05Jg0 z{{dZPvvzMc=Kqyj=IHYZ2nGGUe(f)J7ZwZK+v5TV s=!a5B6v9X#`iH^&14cjw13-WQ0BQ>oQ(TIK+W-In07*qoM6N<$f`&OQ@|4`Xj5kLT%`al?B=W5P+gNxB&nJfgpGfTOih;e`=>T z5jZ8;?_>v5xi(~iU^udv!6f5$jpNVh2O?$m1OPDr&i?@Y{r&#_{`vm=wBfh>{Qda+ z{Pz3$!R5rm=Ee2+`0e-d?)LGV)1LD5^!4@i=jZ1F2;wA$U5|F$_;B;f&rf1p(qbG! zCte(9VPa-y5lGpbZn4ZFhzcT9$vfdqmuG z@j$ZG>u9())mkwqmYHSd7eFi*FJ3%$?AX0~_kM%HFED^GKqQ#;=g)7T_f%9=fX)F3 zAdr)QMoCIaf{X{6{|BNG$o>N%f#5F;02KoS5XlH2zyJ$0KZ{``H1_}i002ovPDHLk FV1nFR>VE(L literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ir.png b/interface/ispconfig/interface/themes/default/icons/flags/ir.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fd136aee534ecb59914e336cad18d18ead2a4a GIT binary patch literal 512 zcmV+b0{{JqP)r;gUH{1e{Y(x2_S%2fSMQ?7@vH7`tSc=xS~J*|Ni>>`_JFszyAFKs{8d9NdA)L zm1AIH00;mv0M7pew_3Ln1`-ek5ajjb8VVZW^Whu|9pCfc910uY_2L}~8{YEX9t$4Z z@!Kj9D)d(L0*LYN-@lBEj6f&-|Nox>4F7-s`Ty{t|Ns8~x3>Pz!S){pfXY67`UDU_ zOc38f#US*GW&hv2{?Eqpf6;>f$N=n5fB<4bR}BO)G5?=F{eR-b|HMQT_5c3^H2?$< zb1geNgNn-kGiMln{`!CM;{TsNL8PAke-;*?JV+Z*eYOvhv$==KunT1sF?AKYlWZiGf7_{AKv_o8k9wMiBcC z1B3*kzkfmK*Ds)AfB<6r3XWMgVnF4hNdW;sfB^vU;z%SnI0)(h00004s{hykP}!$Xp8x`g@iqg4NJaUd z$B+Mm%>4cD_iu*Zzrl=O|9^qF|9<`Y547mdFIIVlOMCYL1Q5sui18rvfj0Ph3vJwt z)dnUeruXmP0|XEYv&@95W{1bGfWG{@sKWZ+FOVO6s`df7U=M&0& zKrFzJ{`2=AL>j0Rra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrIztFq(O~IEGZ*N=lh=;=qSyMwWku z27eMOW_|f0uQeek^e_9g7KH|eq{JVG0^UaP2Jy4}|L^JL_3uCblfVD@mnS9t`~UCn z|MT(+KT|KOfz%~1cG~~^_2vEk{SFNQ?Cjg~|NsBWy<%2im{vp^YdeS=hk-Cyo6U`Hgs{l4FR(w#{P`G0;a3G2@YSmzI~fu(ZE1> L{an^LB{Ts58L6#6 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/jm.png b/interface/ispconfig/interface/themes/default/icons/flags/jm.png new file mode 100644 index 0000000000000000000000000000000000000000..7be119e03d203695325568174b72522124bb2f12 GIT binary patch literal 637 zcmV-@0)qXCP){QLU}0{l%6`#}@@_VD{9F|q;xF#yj01gpgWJ+A*m zGUYZW{T>4SpXmF{^Zon(`}_X;`}_MY3j1pm`Wy}V&B*(tydCWT00ICp0M7pd0000m zGd#J&@cQ@tG$8vu6a54J`qTCN{{H)06Z&u*`VIU0o2UAMn)~_v4c^|~0*D2u;qTwS zKYspMz5CDEtAAp>e+Mf5)@1$t_wR2Fu3uNK{_0!&`}CDxK-+|V{{|`s2p}dP{`2SW zZ!oxe=XdSY-}fK=Qse!l!T0O_!(X}WAk`4?=MOLh7ytr@32Xz9{pZ*3U(#Z~DiVIl zOa8j^;n%JAKjo!$j^Xni)Y$z6WB&k?3JlvV7}WR}00ImE Xyv9Bjb9W)}00000NkvXXu0mjf@Xt#6 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/jo.png b/interface/ispconfig/interface/themes/default/icons/flags/jo.png new file mode 100644 index 0000000000000000000000000000000000000000..11bd4972b6d5f134045d4e8ce134601ea9b5654f GIT binary patch literal 473 zcmV;~0Ve*5P)M00|Ni~>`!`VeZ#eh`f&K#;fdS|pfB*tJ>FU-06DIsWc#z@uumAs9{`&>~&q~MQB#;&cfB*tH z31sk|Jq+K!KjiuK-^&B5YLK~LCjkTy3s3{|pFco7yH$Tr@L>D>cm1y|D}MvS>F@7f ze}Db{_vg<)5c|)+zsmedM_Y~p1Q1BWd$vDo!X?isvq}Pk|KA^w>VH5L!1(y{_x~TD z9$-NK{r~sxzrPHB7ytr@v6F$JJdlAwh=Ji34E;f3{DCq4fk_4ifB*vkxQ1J~H9>i| P00000NkvXXu0mjf0T$ba literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/jp.png b/interface/ispconfig/interface/themes/default/icons/flags/jp.png new file mode 100644 index 0000000000000000000000000000000000000000..325fbad3ffd3075a4a84d8d898ad26ef7d3e0d56 GIT binary patch literal 420 zcmV;V0bBlwP)9whYk?f=!Q|Ns8||JN@lTD;`{R1ZWk|EGa3dAO8ObDh3E3Cb;oH_5X#1 z|NHy@|M?558b}5Q|Cf`4hZv9q2p|@?lb|{i68>{>{ol0lx`{mi O0000=G`P)0NEt6k^VGA)9E1hT9ocRoN>wSfaWv)?-raRm?)Slj<6Po6w} z{P+i;{`~nD6~!ec29@~tkBNo($fnHz0mS%{fq}QS{_m4#|Ns2?|K~SQUHy-* z`HU>AfB)8feAoK(-@hL}|Nr_0bQ_Dj+^xMk00K}f2RQ&hFc1JYLgN3=lsJ)M+p3uR zWC5ydAM*!ly4H1hsiEFvIU^1)HH_GYz!QMsIYt5i1c4ZMLC4DfztdU-q)WGxxg;|L zi3%uAJ2fm~N8&I2%AdL;`{4^9#;e!&D=C-&Lk8;9|NlO`c*HPy9@C${KeOWnB;`P2 zATRu9VP-jSWFD-S8kh{*zoh2aO#pT8A2W0o(w3 z|5bef!~)j#|KF3RAf-U``!@sYUq;#A42-}3UHtv;%kTfcfBpOQ3nmTE<|1vNq z0ns0zZx{dq2xP;5h!=kY&G_~A;V*`-zy9<8Vi5ZI|I4p`PkusG11$kMn1KNxfWUtE z{TpHc!>?a|&i!W8{>5bQ`~TnHf3N=fz5nHq%!z>% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/kh.png b/interface/ispconfig/interface/themes/default/icons/flags/kh.png new file mode 100644 index 0000000000000000000000000000000000000000..30f6bb1b9b6c5bf355f67a17531fa73beafa6639 GIT binary patch literal 549 zcmV+=0^0qFP)P;@arD~1pHxO_zPr1&>t9y%wPZrAQpyS3=Ms1K-T|%K*j%o>i_=z2W0&D^Y8ax zhQELQ{rLl7|Ns5_-|C4+00M}Gf#D0s|6k8u{RAokD*W^JKSaeZAp18+HBcQ8{rdA) zTAYJ{;SE3lu^j&CtN66?*W<_k{(=kvTJiVSPc{h&pyuy)ZZrJ(`}gOM|G$0#rP$=; zY#H_d1P~L*>3>1SGXDMzbOE=49-9EaM0J&9T`emwH;=g~P!Ocy*DnU30tNVGcpOKXK;IXGH`G*aB%Pig@_cF{AXeP^XnG~{rU5QfdL?ZSim;?VE{Sy z7c(ax6CWR+s|%BWAkauYPfsQR0VXz9sPSMM00M{!7+@fO0fqklmFn#S3Nf;>{s#gU z7DjgV{|pRrOO`MKef9?wUO?vn1P~(w!@{x_lZQ{f0d@UhVEX<0FF08K{sNMJKnNIa zzrX(mdR{@6d*A9+009Ja65pra?7SkZU^!3-{)PrTC`>`Y0b%_6|LHH#J`sQb0@|>a n0T_AEh(trkF%3aX009O7j5IT?Rho+J00000NkvXXu0mjf2r}#E literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ki.png b/interface/ispconfig/interface/themes/default/icons/flags/ki.png new file mode 100644 index 0000000000000000000000000000000000000000..2dcce4b33ffe1f40d490cb1a2e03efe22ea56155 GIT binary patch literal 656 zcmV;B0&o3^P)8t@U|NsC0_uv12fBrK4XN%za&+zB_ z{P)aXfBpaa=ii?{|9}7d|NHmt1seeZhy|?e|DWei8UFwK|L5=jKYtkh{P{kK2}m(L z`||tm?|;94|Ns5#-_IY+QnEm+00M{!r2OxHhJR4iK=k+TZ>A77)*#lue}Db^^$Tb= zko*TE|NI8J3LpSOb8Z9x2m%4nC$a{*Gqe90@enzQH`ta%tA$7d{Sv5iP&~x@8dMF~ z(;dfh&fyCHF#yj00oRR-9sTeJMNR(n^YxvS3U`G57YhIQc>VqR{rPSM@(uBDU=5F+ z{|5&5hj_*A{sI6o0M7pbe|x2IYDAmA_)R$v7XIy^!u#*~18PtP{r&xWnDPVw`hiji zey{rM^8J)$5m8%@0*JA9=57`qRaXnayHCFDJ@r1pR}vUfQ&&Fu_xE3Vu+-%{U$!58 zQy3!)avcufO?mzv0@a%gl z1HS+N7!IC&H?5`#AOHX{0M7pb00(zPR4BWp;5AJa{{8^XwcY>#`eSh{`1tyzm&^bF q{8L{tuE6I1;oe7AG|b!z0t^7P6ga05`yJ%~00001r;P)}L!W`0l>rF;|7So3KrTcC!ho;=0*Gbf0S0@;YBwbYEs=i=3_$ev|Np-X41fOr z{{tp}0~v7g%iT=?0mQ<{9!@# z-(SD~{`vL)_wRqdfBpaan?+XX#@15+0mRIp%kY{1qrJR?xs-YLhQhSVzk_f6;`sgh z57Tc3#$ODKzZsZ*F#y?2e^`Y0-&}tV5I|5HD)yDjz7nmS1pU~~aVF#A6wD&YtO00ImETIDprOD_2B P00000NkvXXu0mjfKOhx^ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/kn.png b/interface/ispconfig/interface/themes/default/icons/flags/kn.png new file mode 100644 index 0000000000000000000000000000000000000000..febd5b486f3f90056637b23caa26d838fbadd7d0 GIT binary patch literal 604 zcmV-i0;BzjP)h(K@ANy8uaQvQ^_nWcs z*Z-GL)eL_?t_B7*Kmf7KbznHW;LqhtK<$TZ9ej=*TGLweOZn#S|EVB#AOzI#2dDw) z)4xDJ00a;t5ND<*{rU5ogY7p9)8EGU->gS|Gwk>cG!LX2Y%nmu8NlfEl`8-N#0ZOI q248)K1w0H4M?n#d6+r+%fB^s&Q!OA|2rzyC0000Cs@aq@DuRlQczuzDZ5@KTj2q4CTH~*`MftCON|DS>3-+w6c z9|(gO{~7-O`v>9vKX&5_Kmaj*WME|P@B8=S6~kYUnG7sU|G#_z>G}QV|KC3#^7rq5 ze}4b}^_xjb^7)+E00G1Tlwy4KiiwGVIVgltUY_yi&tI!o|Jl8p;n#15-@icU*KbCk z6Mz3^`1ON{fdL?ZnEnBs@%JyYzyH5mxBfr4|7*t%=AfYeY;6C2{Q{!DKY#uG1wwy- z+}}Xm3;+QH(!lWNFN3HElfM4XRjZk-tp4-xFo=l!{|(XrbkBdVP9XXJ&!0aG3;+Sd z1adCWtuJ2w-n@w=AmGpT?F`?)|9k%Y-_M^QML&N+RfBB+Dh3E3pdT0*fp#rf!j_o$ zUs8faP3>oG?f*A#7{O)(oeuE;(0C>wVqgFWAQqr4|9E)*J$m%5y#o|bz~KAxm4S=v zKP&4$usU!k0b}RSKS4oYgaHH)%c-;9wWL`3={r0|OreK!5=N4TMk7RCwBA z{P_JV0}}Z6?;n_iu%H+Q{s1vR05Jij`8c?M=-GouSI=K${m;n9!7aeW#m~(x$j!^i z%zXLG*~fS9it_V|2?zl-00a;V#NgMjUvJ&I^~3uQB4T37ii-d5-u?gQ&wmw_XD?o^ zUAsm=P*7M%NJdr`Xazt3fo%By|Nn;%AAbM-ZD?YwEG7BBxA%WR!T-FR|8><0Vxn$d zUT@yKdH&)BP#Mq$fB<3y`hl076R7Rgt5;mSyo`Gea7>-}|M%}Nf0%y${3VbO@hKwm zAWK?W z+TGp#<;$01Vv<1pdP-ancZ!Qkd3bmLHK?nrgX5I}Ab=R3zkQ1wk#LIP517FKVgLC9 eRt>}e0R{ktF&Q^6#MUGL0000@P)xg`upqGzh6Lx zERQVE2><~E((v!!|G%IA{@M07EI*V_ln=0RjjdN{oM|h)7EO z{{7?6U#34`ML_iD4-=RKMg|km5|FijfgS(|AV#2u+YAh13=HqUkqe1m1{eb(!T=Kl c0)PMm0G()MDW>>^I{*Lx07*qoM6N<$g4p`a`Tzg` literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ky.png b/interface/ispconfig/interface/themes/default/icons/flags/ky.png new file mode 100644 index 0000000000000000000000000000000000000000..15c5f8e4775b2b68e0360c1f4ff1f37e61611276 GIT binary patch literal 643 zcmV-}0(||6P)0{QUt82Kj15^L?rd`uqE`oNxjFF#yj0 z1e^fI2i-9Q(8&Vs@%;Dq2on+Z{QuwM00sm0@b~}!1OzrH#hk+X+Tt}E6bb+U_yPbi z0M7pcvI;2tA|wYPA^Z*x0300&EGqR875n@A_WS?(`uvdQq*oFTSt1&p=b-!h{Qv;{ z0st`p&i?}PGCBeX39IA)-~tZg`v#`;6$Tz2`uqI%`ThF(|NnA-^wR?L!uSAshx_~g z0000205Jg0{{tif814-hz}E2g`1#%M`@GEN)${-9=jr|Z1Nim(?*qH%B39iMC&AR2 z>ggNf+PVUWW##cF5^jI~{P}h24a1+`jKBZ?zJB$|uU|aB82|la`WF`1`0wBUe?VZ- zRnf8uXahh1u`n?Z4sYX?@pO{;x_8g;0tl$# z2T+})81L`j|Nel$KOpz_zrTNegN!(Tli}h6pb7teeq#K~3=Aa(fB<4-V9 d!wLWb3;+YKCC*ol*cJc)002ovPDHLkV1loTFLeL_ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/kz.png b/interface/ispconfig/interface/themes/default/icons/flags/kz.png new file mode 100644 index 0000000000000000000000000000000000000000..45a8c887424cff6eb0471f5a1535139b965e241e GIT binary patch literal 616 zcmV-u0+;=XP)g01!ZoKn?Fz`<^k#?O_Q1 z`=8<8e}=z6_5c2{{QvRuAM+0emcRf01JR%V|9}7gKjGLHfB<4)U|@L0AiL;yFw=jq zasNSbGXHKG{NMlfpWxpAK41Q^gEaj6FV4=$@arEy05LIu!2gi{Gync$`1$|;-~a#q z|NCw7f0xa__4fbPn*ZDO{onuJ|3JnA^#F|o2q31v4F4ql-&_7K9cVD)|KCjiesKSP ztM&iLe}uy71TZ z|DRv){|H?Bqoe!x=x?wkfBu3(0w91`fMN3Vzue;gQUCt^|MZVr;{RRU{|DCmOS=6} z@%2BU5C8a_|1a6~&;1YB8$b;J0mKBvKpP_e^#OhS_CN2(f86)~DtrE)Yx94t!v9OT z|MTDe69TJd_zQH>zdry01PrBrQvYt3|7!q-C@@&>{!_XBPnqZ6E6@K61pYml`M2uu ze+NdW22lI}1Q5_kK)3wPV4bt}e=;a?{xkdrMUmL?|7pP3c>kYY0b~&4U$AjN34j1% zWLW#P{SRLy(>r)v0s|Y${(}_LK*N79FfcIy1Q-CnX{(%t#68R664G@6GIJN-*24NrwB3rW+v!ydOp^Ef6{n_)(btIFVjHa=pdp6)} zz^!@$h^2tpKUmc4)64h&|Ni?2LVth#{QKwk-@kwU{{Q=j;qSk{fBpc`pWlD@C4}l3 zHUR_xF#yj01d}3g9TFqw{rUX<|NZ>{`TG464+L38761SLpR(uO=J){s0Q&s>`~3bJ z6bIb^kphT`;m^O{e;I!LWBmP>@yDNkj7*H>@iN-VTtHNrD96Ue^ySz8pMMxZ=pRTg zKmaiT)&Bj@@b3@E4ZnZ>72sjw}n?8s2>T{qV)lKMV{%|NQ?241(YPff@h;hz00Cp!a_N2HF7% zr}y9gR8D)C;wJ_Sx5=xYz5MWpi4mv-=yjk&KmiL7K#aZ&_9^w5@1DH=3l15e)xUl~ z-0=7B?|)4HL4sh3f5LL21siGr0*GY=!$H*K#ZR;BJ~dv8zS`wDeeIR3;>1y|KC3hK=RLTAp0Mf zWcc&@%EC-|_DIyI;S5 zZoa(f#*3@};Q;9GfBygi2&4h78pxV*WHQhn|Nk-k{`>pa-{0-~I{v`b{|EZ(4?qC1 zz%@X;G0|`0)6dV-R;K{9rJ5v|%9;KB_nVP{8R7~c2@pVx*BKb3t8)H6dH@UxP=NgY z{qNULVEFv`^^@@rIK+N~gX`}f7I~!;+fM-m5DPFa{(t+%C?E(7W+q^;{`t)a3di3} zzd^yz010JK%>4cT^&8LzfB<5=h#HaqkRlk)Wq^@D01#jR5K~0vg#SK#00000NkvXX Hu0mjf%Ubyh literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lc.png b/interface/ispconfig/interface/themes/default/icons/flags/lc.png new file mode 100644 index 0000000000000000000000000000000000000000..a47d065541b0d998da832e1981b479097a9b36aa GIT binary patch literal 520 zcmV+j0{8uiP)#-NSZgwz{Qh@GSmETWyIzrrS!pkkqDDw`CEYY|A1Dxfxke?UP9EWUlaZ{K@! zXYTRdfWyFioqIm+xW_M=V(hYvbO?~5ZHkEt37xh?rY1@PqM%`P+i2w@_wXJJO#nzA zheNt~+w1B3H|fqGMx=x!lms6SMy;uqQ4R``NH&49%B_cditsDHI6DHXLNubec}E0~ zb8dy|txA`rTkZMN{rCM3FV`MqlfuwZrz$X1)+?ntF|UvTkD3M?FxSaem74ag}Vzy5sA+`s~GjvDl6>(E?=UGu{=w?r5#MJIwhn?GrT#s zeRSo}v&#TUmcjL&mxEF>2%EIxN+SI=O=izlM$T5JH;yv-C%^zTfK|9CLa`qJ0000< KMNUMnLSTZ|5$YcR literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/li.png b/interface/ispconfig/interface/themes/default/icons/flags/li.png new file mode 100644 index 0000000000000000000000000000000000000000..6469909c013eb9b752ca001694620a229f5792c7 GIT binary patch literal 537 zcmV+!0_OdRP)sI{|q~>>TZ2$qp!tjsj_dmuxH+6SkQv+K1^Dpafp!@&+{r#8W&u@@le*a|z zk$)I|{ss9HAb?mjKkZQc#wYOgBhb-*|NQ;?=l9<~e?U(E{r5MB3DgSYf*4|4g1Z=I z0R#}sfv@v<-|;cLeDMG8um8XQ{Qv#?|LOa4L zz5|hefaLFgf557NB#8Tm`R|`M3=9AP!~zPVKOloaN+E`UP5lQo8*B+s^WVQre?jpA z5I`*dz#16EB$cmd~05Jg0{{#R40Cvt10RRAw z`u+d`{`)-+^5ON`yb$y0|Ni^@{rvm=`~3g>{0I^G8ZGb(2;2e)q~Yi9|KETAVEFqN zi2na)xwe&yo%hS1uZ%yx{Q;WF%<}W+mp@!0-yWP|m)B$h2q2(_|NnsK|6hiGKudoE zUGn9{-`6*oEmQ72y~rUb^YQPmzn@?Idwh=T>wA{p3V#3shzY3p@87?_|NZ&@_cy~| zpmRZP`1kJ@JI^@8AFa{s9OeCZO+ts{j1?4b<=-Nd5zA z`2GL?FD{9%H@9*#{QvEce@o8hC9n7wpg7QIfB<3vS^!iHvfyK-U8V5ZH#le}4S|yXQB^Nt}W|`Q?5-JjKDn&hY;a$Df~n9-WqyG5z}b zHWMS`AAkU20!9tv|KD6JO#c`e|FbePFfi-*z4`Hxjg_16|9{rM|5*PsvHt$a@%k1I zzvO#v;hz8j#Q5o)BT__yf)$AVfxHBa6HpujodJ?%_y>%AV59*A7yy`5b5c`Z!JhyC N002ovPDHLkV1l?nIh6na literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lr.png b/interface/ispconfig/interface/themes/default/icons/flags/lr.png new file mode 100644 index 0000000000000000000000000000000000000000..89a5bc7e70711575c1ee3b83cc2be7f0e1fb29c5 GIT binary patch literal 466 zcmV;@0WJQCP)2Y|A4{o z-@kwT`t|eY&mTX2eEM}Kp+i!_T03wQQEla((gZiC0cs^;{c3|jAkj>009Kl@aN){ zC);;k0UG-E&);Xo*&wq)roznr3pD=Ezu&)DC1p;}S_BY4jKAN$W)>8Nm;toyKW@Ot z#Ps&Y4S)b*xg;zq)7SR<*)x!NAa?^@4{|ZkY%l|8FPQu15397y$%U%{0*LYZ>zAxx z8}J(slm+_X#f@tK0mO1iR9wET{^!#tU}GSb{Q3uSG}s1+e?a74b~(9Y%Qpf95aZY9 zPuWDo(ENa58%O|%pI^NU5I`*FB&GkLM&}>Ys6}P~0YHEO0B+J}4VS0Fk^lez07*qo IM6N<$g3a05u>b%7 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ls.png b/interface/ispconfig/interface/themes/default/icons/flags/ls.png new file mode 100644 index 0000000000000000000000000000000000000000..33fdef101f74e38e2422bb85dc8a31bbf1da326b GIT binary patch literal 628 zcmV-)0*n2LP)NT^udI6UX~&u_xA`izWBNXkIq%g^6Y%Pu{8|3yZC zlYxl^Ab?nacHcU-^!@XD|Nj5|`r(zVwkHE4BV6^xC+~{3+xxCp=yQ1PA~B|JUd6PoU1p;PCnS`uh0!`Wt}y4#)fi z@&Nb%0tn=Xmv@c{N@*}KFh0M&kIP1>YRmQG4?lbdn);9N*SEXB6{h}Te)Ie9Zy;d! z#Q+chF#yj01pfa18Ye&*C_n-K{_XVnU82h1@caA!0{i;;`V*Y{7}WX#^!xhz{Qms? z{`>&^00Ic4fsvW@|G$6Ruf6C#{P_EiKfi$f`+Dz}{FL7;Z+`vz4fMjFe?Sd?fe5Gp zAb>y`UVr&E@!c&!7K){sO`Ozkh)melY+9 z5KGUl3lpbYV0iHf6xF}JF{n*t;A3C_dhHtn&^!?O1t$N2Nj?UE00RIWZBXJNY9>Gc O0000 zKY#!H`S<7dzuzGA_xCRl`Rmu;Um!M^l;`6=xPSp5fLIuQF#P%V7sv;y25A5(1xW+7 z{Q_w~Xakza@Pz>&fLMUe`uqRSpZ|Y=>VQIE8-4+ehiC(l5cdDyKm=3_5I`(zTN!l! z|Nj0Es0O49Xx6_!5M^MM5b`fj@gGk4KbtNx00a<=83P0Vn?HYFf{Xx4|Nr&tKga?w z11|FC_y0eCSvdcCFfafF5XlYnMRN&=-B{`>{W0U03nA0WvHB!TYz`r< y{$OAL2q4DW;E4VQBmbdt8IZ(*2pDGo0R{jiB6maa(%qQ=0000! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lu.png b/interface/ispconfig/interface/themes/default/icons/flags/lu.png new file mode 100644 index 0000000000000000000000000000000000000000..4cabba98ae70837922beadc41453b5f848f03854 GIT binary patch literal 481 zcmV<70UrK|P)?-#?r-wgj45C|ZESQtLMVW?~Zs{a4) zALIXj41fOq2a1uNeOQW%&E= z|DQh$fB%40fEE4z10q3;-;ClCKpOx8h=su~@}N>;ErcnO|V^hXG82+5i4Q+5aFU0|N&GK!5=N X;lz1sunOP500000NkvXXu0mjf*7env literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/lv.png b/interface/ispconfig/interface/themes/default/icons/flags/lv.png new file mode 100644 index 0000000000000000000000000000000000000000..49b69981085ff54568907cd51a56a1e5d8b01ada GIT binary patch literal 465 zcmV;?0WSWDP)TuF);jrk;v#5jAUY900)zv`N|Ns31p}&9s{rUUv@1OsF{`>=? z-@pHYNg(_0@82^wZ2|}&78a1v|Gz$Y3Q`J0Kshi8lm?N%fQ(=Ne*FS+xn*U6mIDM3 z3(!4({{8=rtQsf{G!?8Agn$gN2Dab7KQS->1Q6rPlP7uPKoY|E^ZWmwzrbJwx)~sVSb)*-|Mwp*NlCCVfB*i0>4ZfB zFhYR-gakS;`Tzomv6O+~6D%TsAw}vh)M$o8KMw-~K!5=Nd?C`~#DJkl4QvBtQTT<=hAW5C&pkLRXaMS_oX@ePCublh%7`S0>4^BHJ{X z&jSWU1bzAnAdrUt4F8|~c=q?-U!ZD;3Wy>I`UNEa{sJFg8g4-`_wR00IcC z0c`wlknw+DNZ2$-$7NDlT|NlUo0ap!i1F~k2r~my1Y5)izkcK~h z{{rRU9);Krw*=%9uq;py&^Z7B1lI8X4~o-~jQ<6)85pKOHYf~%iU9%$qyZ=)&LIKv z04P8aRsoF!DgoLL3cdee4gVMb0*H~J5hWs_B!uw~i3^Ex1_pot0|0+0kn{N-xWWJc N002ovPDHLkV1lkWn<4-J literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ma.png b/interface/ispconfig/interface/themes/default/icons/flags/ma.png new file mode 100644 index 0000000000000000000000000000000000000000..f386770280b92a96a02b13032e056c3adfebfa18 GIT binary patch literal 432 zcmV;h0Z;ykP)@|4`Xj5kLT%`al?B=W5I`(ov;U*0{`Ko0*gOW1x?dnY zU=0kve*-lD1P}`lGXhluRs8wG@Eb_}{{H{>S-s!?{`@vR^^5K2FR(pO4M5WY0*DFZ zqCZG(`2G8?)UU4`zrJw%x*-cw4MBhY08Ix7Ah47E{sH^x7s!U+ztwL3`tbkv-#@=J zum1jzWCJ7ENdN%^b`n?!@|4`Xj5kLT%`al?B=W5I`(ov;U*021*0XgD3^5{teN< z@cTDV13&<=05Ky_HBiN$KMcQtBo?#b8i1w)1P}`YD=UMn?0*)P|9^oV_=9jUlG7n1 zgOt?2g9iZui1GF7*Fr)<|ABx33~>V{CZ_AxuLA@S%fEmBAbhajaRP`eP%%INfiyrk z1T_G`pFe*90tjjYTn_{=GBPrt03a7C3lKmc4KH52_yY$2zyM+rgbiXafFO_o^aD@| aAix0StzUbk+v2SN0000M*00(~<{@!wBU}0eR!0_)M!#^$%c|o1wA4mpD0t66HlA)zv9Z3HD2a;wKuKxf3 zKLhV?#{Ykr|9@us&njQ==l`GI|Ns8^_xsQFIm-b82&94GKf}}4zyJRI4@Cd}JZ511 zyk#BtzrVk|eZKww|NG~I-~WGu5Q~)bF9rsH0Ad2#1T-6>`p@704FCVWdiqyE_S>%? zzn?t&`v3p0|G$6zgQ7n`R{;bN6VP4%{xkdmsRoGvjXbc2Q*ib#i+$e?>}LD_@7KRy zzyJOE_4n5=pu>QE00u!g^X8F}1){Re7)$pq2>GzRP>hz5WF0{Q`{ z7%1`&WXbP;Kox)fFb41M1d2p!76A1_RfAN3oCFX+Kn)0M$tdvjY9_8yH^9QVjn@nfZP*{rmI(|3?O9b~d@cVAX$tK?&3V z5I~F!3@gDg2t{v?r~d;6^$&1NgV7;ZP#i-L5C8-i0C2iwRaxXp%>V!Z07*qoM6N<$ Eg62#MXaE2J literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/me.png b/interface/ispconfig/interface/themes/default/icons/flags/me.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7253558ab939481a85cc06dcc4d73503afb9f0 GIT binary patch literal 448 zcmV;x0YCnUP)l$FJ^m&#tWvBA4C(n)b76qu^ z3TjKJi*u=MzAs;^(tHqT@6cZ|8AHxz+0T%zR}I9mkc`8faCz48MN^H2?$<3((yN)j;^`52o304M1f80R+|X9}Iwu*X+N)@cjDs2c+lU z?_dAGBv9wyKfl@e{~Tjr001}1@4rADVDj%Tpgtwu-=}^u z00a=o2DtG+^6#HtKYxRyQB?o^{pa7Gzs!FaUNHa!5W-0i5^f%h1nT_t=O0kRUm#-m z!vGLKP#fTS#5u+P{rv~@0nkXGhChFS;q~V)5d8o97pUPE13&;VK7Rc89~k`k^9M+( vx2Q8b0Y@nl1JFDW`UNKcfk_?)fB*vkB(P&2-J7g<00000NkvXXu0mjfGX%sy literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mh.png b/interface/ispconfig/interface/themes/default/icons/flags/mh.png new file mode 100644 index 0000000000000000000000000000000000000000..fb523a8c39d40401b9abcfb144a73cbb2d76b286 GIT binary patch literal 628 zcmV-)0*n2LP)qpJCu1p{#SASZ=3QjbPhlO05Jg0{{#T~{M_a8tGL(@4F<^6===Qr`uzX+`vVjI z>RSuFND|!tCprH%UjG&-`Tqfgkh}r_F#yj01OWa1_W1j+!`}P+|NQ*@_xS<*{r*D) z#ao8o+xY#_%t@QS?0~yfBW+Wj{_zyJQv%*f2f%)|)v=^uaq0&4j6{l|Ybrbh`TZ`2ITPyN!~wBya;Q+wXO z|N8qsP{n^H7N*~zApZOB??0dhfB*t%@KJoPW~Y4ZyXB%oU++J<@%!g5F#%3te)iws z==lAQ0jwGr+CT&T00a=DyL0x5XB;1||6pKv0FF^K^bd&vjBEyg00RK!=O6aq+V@KU O0000p}y_ZxVsQQo9l8qD!tQ%&&F2zEbEdU-v3mY$p-gb*;wwp?LFG<9EeNpZLj7Q z>zeacpNZ>XJG@0bcmXcALo;Ad(L@#C92p0~G#aM!FfF0T7^YIJVVFaIl|0gRpSyF_ z@0dgJ{oT}qqUk#4;-a-U9Fej5EJ`tIE9)E!qDfL@GEq>vEDI}q@P8EmenIHxu!*Cc zLK?@%1j7u0A`mPlm`kyT;5daWs;EH!+LV0IWO0Zyj4+sHxRqia#e9ki#cu?^6YQn9 zOfZ8&4uw%r9nR_}FG?tJ1sBpnAsdGMh7pA$Mlm3ABvgz9aj&GrxaT8{1^YB+UzPEM zQQ5*0;(QnblJRNh>E*%16wccXl466KPu9Lk=M%$}%9~Z3xs9na6KbZ+^U;AoQ+JVg=BO3kgY$Vuu?iP6r(sQV=EH;Iwf|hcN2Nd zPl_EfW;$kS3zh=H4ojC&X!7Bd!`~OdX{VxLp z5dC3f{KL%rhe`hT|Cm4jfB*jf2Sk3^vlaWpqpU2@27mx!VE|eEAE^2d5dHlPWd8sE>;L~hU=6?i|N8~f1J=Os z`!`SnKmdWv|I6_A575egAcQa*n+Bj_fB<3vdK75(@4vtQ{Do`yh0yRHtQw*LD9^wE z5I`Uef5B$|`u7W{2T22%M6!Vq>?D8y0%`dD|M#!IAl1MB{`!Yz!@u8fUYwuxex*z#9GlH2{4I3~mO10Ac~g+V6jVB)KI)-uUyEi4o|t-;5vX%A}^sE-TCS?;peW@7xO)zGwLT z>;Lb2Aa%cf{|B;v0lB{!Wo3aj00dxJ4sHN|VGstA{YR$4C2D_2_!cBcz(8l;%*ju; z_5-pDt^fjRVEX=(;rPk#zkV}({q}dw+K<0~Gco-B2UY|%8?FIpIzRw{{P+Lo&pY>j zzJB!i)2Bb*-v4F%#qjU=2Y>(qX<+*Ohe1*jY|LMVKOmiqU?UkIBoO`m3qe4|00G4K6*VFmu*EK13J3rK Z3;;9iRuWt9^;rM_002ovPDHLkV1h$@)rkNA literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mn.png b/interface/ispconfig/interface/themes/default/icons/flags/mn.png new file mode 100644 index 0000000000000000000000000000000000000000..9396355db45a8ee040c790782209868acaad4b85 GIT binary patch literal 492 zcmV@{}>pU8D26lh`@M2^zAEy;6E4#hyVhJ1te8n&0xjw|I|OmAOC9q@qGTx`1kMs zKYtki{9$JJ&B6L7=Kt^CKt7QCvS|}Q0D(0y{Qoccl;O=^hIfA-|M~k7Bn3tPfBpOS z`}Y4|zknP@Sy`YB00G1VQttboLEtY##9yH3?>`J++5f+PL6rRiQNLgu1_potVgX{t z{eKx$|NOuHhk@zOpC3@OA=>```VZI207MK7009KDfg$woe}>=xgMa@Q`TZMV99$1f z=+7UZ=>P!)^22||KmS$!{Ac;a@cR$YT8L7JY6c`57{N{g2q3VN{s9Bw7X!l|paf9r z=TC&I7$7zP9Rm!dKY#u(FaQJ)NCWfVKmVWoW?%y` zm}dTA_#*kA1?Z>0QqoLZAnySq0pv->KTM2<4My5DUW>hHBSpkmCRUfavf4zkmMxWn=;={POe9 zpZ~vq|NHajABg<@_xGlmn*aic1*nOE;s2AbPk~B-;NSn>+$?|p{{I~>&N%tu*Drs5 zfBO0B*Z*HY)v`RYKsx~fhzW>+Cjb5S_s>6&>Le+qufKnBv&bF%YWVBlABO)w3uGC7 z{rLq%Ks`WL0R#{e(EPs)fB*akI^_5N|9=)g|N8#t9~WuY61}otf4Tqs`!(tD7m$X( zzkdG%X#fZyCZKPCW&?Et`7z=QS^~DI8Yx-=nhgK{7whGvYgWDg!B8&G1k~{7FHk81 zKmY(S0M7pd06qXVA~x>%?)v`v$?y7WENVL!I|c#<=Jn<;5-<%03=swpg4MkH|N9RH z59P$=0*D2u3CIB%01Ag+CC5rQSvY_G`T70NcNRvLcR${}{{9+hIZ*cRKadRo0R++j zv0Gk5I)>DQ+oULEUYSww-@{VeP#&z`*?j4i%tcfB<3v#u_k;CAlSmszIWE zes6rZ@!!9HKqG(r{Q)GE1e8GG4GeUkhF=T-0mR5q%E0gm7LmVTk@^EErhg$tKMw;y afB^u%K|axUkwLit0000IqP)p`2X)eQ1zd`|Kz0p8A$%R z`bTZnZKVTj3KfeK`2Ky*5B&e@&)?sFfZ#7s13&;VG5q=W=RZg_5SU54z5Mv&imk%` z|FW?#NF2HHZpKX|PKHOnfBpIO`|qDW|9~0*0*DFdzkh#$Hv9ux`j_+Xe->2}ZC)XM zHV0!dKPS0Ur}$Y}|Nr_6wBa96o`K;HKmdVl_zUt7(16dMgtTSeTz>rQ?Z?ko?mjsC zklD%d+V79-zd^=BZ2$-$7GT%`Z2%eY=kMmT9MVkp=Y%mFes6g9+4CZ|=Y~?>`*tz_ z9Sja7kOqJN0yzojravHW{k?SeQ|&okK5=fKkARLe6n%c?uEf?;0ubZ>f;9XA2p|@Q zU%!CHiwJW41sn7GB}e}J|9v$?qW1mmH(Bw2pdk4RbO%twKY##YWMEE2jz}>2 jgG53Y5Cqh~01#jRFwa04;J&RL00000NkvXXu0mjf4K^ZQ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mq.png b/interface/ispconfig/interface/themes/default/icons/flags/mq.png new file mode 100644 index 0000000000000000000000000000000000000000..010143b3867f21e7791b8254e806b325c13b2895 GIT binary patch literal 655 zcmV;A0&x9_P)$g8u&g1qF5h0Q6aJN-{1Mbz`Ie0O|k$ z{sM@ZfzzR@(T$Ir&B098+eukMUeMl2+1^x^fq~&CAE%jZ{^O4ipMU-bgNM&P{`mQajg9%ivrm#DT>t+4XJGgP z5I`&pzyAFG^Do#{Ra%^vg_(hwneqG2-w+MozW@IH=Wj)-86P+6=Wo9l8G*Kb0|+3- z*{jc+=}JF+`H7W<>HmKQUT#*P1{)(8poaY?9|3*x^4(W97N$Rc|4EDS&R=&5Ab=SE z{{73y$Ox4F`Rgyx2o@H`|EK_{=f}^#%*+g|tSlctd;ka_mU(L~nd(ak@UpY9GCq0n z(2rN05Jg0{{a96b$W_S@ACL(Rxa}M z`G=gy|Nj54lTiQv|3YG^`}+MH7z}h_G^4TA+~V=RqI&{}iQ&&bpkF?J{dw&CQ*JI+ z5dlsHn4|vw{rBhJzZb8+p1k+fF;B_XE! z42<9q0s8Xa-+!garV_&3Uw`~!Vgv;%KmY+HvKbgYfiyF)F);jMVE6!x-Ip&{0DU4U p=>-f&1_my$6wo1$fFwYG0RX)13*@;vt7rfK002ovPDHLkV1lt{Hh%yB literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mr.png b/interface/ispconfig/interface/themes/default/icons/flags/mr.png new file mode 100644 index 0000000000000000000000000000000000000000..319546b100864f32c26f29b54b87fe1aee73af21 GIT binary patch literal 569 zcmV-90>=G`P)rBb0vs`uywH-=91j zzd+y*NDt6q00G1Vbl+cwzkmM!`SbO+m+YTk|9<^u`R%^_m*bXSzgT|#{QE0P`4>nh zQ2ZZA13&;V0loO=-(MgHX#3gMzn3`u{`KzHucyC$Kl}CT<*&8wzt6n|ss8o%*Pp+C zfTjZk5DUl#p#T2<`NjV0^vyqym4EMy|26&E??3;3WoiC?{O#A4)4zWSfZPMI0U&@t z8bCe+8UPFj-d`E(e|zZv%GLeN@c(z$rC;+8f>rHtN0D&|BIS>OtI{AOC zx$tZGDUcCBkzc|7XAeyp!)#=hy@sHz%Z8Nmi!G71?uGb{rk^vkcEsO8W!D1Ad0T=%Vj%gtVfB*vk>3V2g53(}_00000NkvXX Hu0mjfpCtxQ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ms.png b/interface/ispconfig/interface/themes/default/icons/flags/ms.png new file mode 100644 index 0000000000000000000000000000000000000000..d4cbb433d8f9fe49f06585dc46ee15593e3e621c GIT binary patch literal 614 zcmV-s0-61ZP)w!6%f1G{My^>{rmp(`~Up={s8&+{Qm#<{R63-jRF8M0M7pe zp74|h+7SfEy9M#{{`U3;5)b(M0y+2j#`QMv`vWF8IQ;$o{QUp?{QmLR&;S7V0*Gk~ zkHv3!H5OU9Kb*Y(q-ELEH9vC;U*%N({+r?VuV26a{F4-VqagC^H&EN}zd$De1Q633 zj~FHafsLPJA96}RV-#A)X~v?X^MOAye@1K9u&05Jg0{{zeC zH7h(V@9+2F_Xpti2mAc}=j!&)<^S{h0sZ;_Q7ob~2($C-{v8Cq(%>lF*}4LV2^e-j zV}AbzqQAd@=ogUu2Vs2v^{02G<;{1(|2aQ(EV23Z2N=G800M{wXv^O}|A7VrH9+)$ z7=NG)mcRcxm)QV402KN07wDuv009Kl@CPU%A;t|Pff9c}I{*Fo2PXf3L>PYm|M&kd z6T{yxzy1Ri0|XEw14AS%MzNxQNDQDd27mwq0OfZ^Ej7^!+W-In07*qoM6N<$g6Gg9 AMF0Q* literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mt.png b/interface/ispconfig/interface/themes/default/icons/flags/mt.png new file mode 100644 index 0000000000000000000000000000000000000000..00af94871de66cd0fbf0ca8e46dc436d66e2f713 GIT binary patch literal 420 zcmV;V0bBlwP)Io>l+&W2PtRx|M&0z2M_*#`0)SN z@BhDl{r~j~sG3n$7H9)N0I@K!uxMy#e*W?mp&AJO{R1fisrv=e1J=Os`!`SnKmf7) z1AD;K%nYO&458rnZ>;h=xCZfJy-Z2&4h30>ylo1|%C8 z!A=4QAQtS#|N9SD2R9xVP=6R000Ic%Boqz*|DhQF2dLpM!{5I^H2?v`f~*=Iag5B& z3^Fndyu3hzLFn&a2m+c75I`Us-n@D94+enNf~Z%o__l08i(?1?2rvLmwOi|Xk;8TX O0000wT1SlAdCl&Y)$gVg>5qW^#Y{{Qp$|KC6V{`~n5M8AIn z$$wxH$UeVm6F>m5>|$VWV&MJy|4IE<4N06-W9 zfN4+=|Nq*iiwn$Q2C&jbT&$=TD3oCSlHOGFpRx(;BY;>KBo9alsWSh04>T2o{{H<9 zq`@}){__Va_~#GM1}QP2gACgN0*LYNU!Z^U|NnpRpWzq7|3Cl#|Nj5~7gmyqN$LIj zQvdWzhA$B4g=Z%5I`U&fgJtk z_g|1x{{H;?U6oxK=&at?J**6@V8K5Oe}Dh~1#%?NbbtT?*#Hy-y7l+}Kff9N{$pgg z_WK6Ie}+7v0!uEdpa1{-Wc>4s0pu$NunhnK1op#kuysJ&8U8Z;`FH#0jm^LQ>Tv2E z__*)izhD3U{sq|pR0FmFAb=oF`osMFS8?ijP~d>v`s?4X6Tl#928Ghke_*>=zWoA* zI8ZS_0I~c5+3<%^Qj!Z4rNibE_6+kRtZU3J46>yw zfWS`r^B2emYGC;Nhw;yEHn21ZK^Q<1%m5k+3<-b$0%`dF7h*inus>j>Kov-;VIf zD*pWek$*v<0SxiK|NjEzfQkVEh>@X`f#DO--wX`DVCWAL;}4AS4@`0~00bBSj-y@M TF2~k{00000NkvXXu0mjf^ET$> literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mx.png b/interface/ispconfig/interface/themes/default/icons/flags/mx.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc58ab3e3552b74d990d28a0f500e9eb6209dfe GIT binary patch literal 574 zcmV-E0>S->P)LFc1LT4cKmY-iGBrkbGB7ay`}g

    Nzrc?B z!}RAj&|v@p#KiFL&)@$*g@6D2{reke@BjagZ=QH_|HA5tt#{7v1Ul>guV4Ru|Ni&u z_rKqNfHnXG5DUYvUm)ZE{sF26>H%tC6A=5t#K$G4Eg-G_A87rbKVS#^0WyF#00a;d z1Ca3#WHt~1jRI=eclPL04k1AU{avRH{sTG*Y{UOQAO!R;KmY+XFaVtnvEdic(+vNe zOr8IIc?-17*~$Z`|L?Eg|G`fB4^+g!01!YxCouq>54Pd=FQ6a({TC7tjr5F#2GXxz z|3N{=01TJ^fBykB00a<7!|#88#Ce2)8ovGh$;ikEv=>5x7)(s8a literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/my.png b/interface/ispconfig/interface/themes/default/icons/flags/my.png new file mode 100644 index 0000000000000000000000000000000000000000..9034cbab2c02704b65fba6ecc4a7a1c1d053b6c5 GIT binary patch literal 571 zcmV-B0>u4^P)Z-xKO+5@Bcl`=5c~|G$6#Vc^TNX8-{JF#yj01a@w+002>mTdm0Dxpa1{C#)An)W@eTA0)PNwiNI_f1h_u_DTrb&+z}xv;{Wj zFGj0Cgf$G002ov JPDHLkV1gu%1+M@A literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/mz.png b/interface/ispconfig/interface/themes/default/icons/flags/mz.png new file mode 100644 index 0000000000000000000000000000000000000000..76405e063d43f2f3b5b9cae4f76d9f1c73cea25b GIT binary patch literal 584 zcmV-O0=NB%P)d!0?ZO;SY>NM!#Sr3j;s^4&s;y01$=&U~zyG1R{bN8&$-J2AZUB z{O~2s*67}BSLujJh!l{(TM_&V!SLx<0I@JIFetqFAHVYHe9OP56#xDPD){#oDEIpx z82$bI>))?me}4fPvfQ#j8vp_bq~ZU+|9p&pvv&RstuJJil>ZL~|9}umff)b({bONa zxh{1bAb?oDF)-ZV`m5;k=ljw>l6BpeezVN}{rlPPKR~N~|N8X{NCKH4>bI<%?516t z00M{!=o3jd#=5m)yzyNB8Nca#eH--U&Fe3(f#?+keR}os(@P+F`}Hl*IRF8~0t}ng zTmN>%etWlrgX7)b6MtD}{$cp_8-#v?7>pqD50GU3{f7;x0U&@Fe=;yIS7rUbaG!zu z&%cJ+j{>}Z{{3SByBg&1|Nj_3~Dr2e;Gh>zZrofD5`!lF#Z7{ z2B7#~hM#}`y~Cfd!0!j9&~4{}>qlfDw=_GI6Spo7yiaSL1(R34j0qF#yj00RRApetkm@ z3-<^I`04Bn_xS?+{Qmv@{`~y?GBy}bOB@O2-v*J4|MK+z`}_2=vH}QbDjOT??*y+^ z9PHma=D0k1DE9l$Z%$6;=mbqObq>D1hX4By|NHgp|L;GHwRPtz;{gH)sDXiz;U6Qz zZ)V2dKoY20MNK$ASA+NcQ;z)f|Igq2|MmO7w9@DL!aL%O?v>U60R+_W>(dw3rWqbw zY+vs`7YYhj_p}$}TRP+a`c40T|N0L!J1pWwjPJac>kgmX!|;RwAb@}x{`~&)@5xJE z5fO>bZXLnj?>WlS|KEEGbn$;~p|4%Vx0QJ+&gI^Ic|%b^5f~5v0R*z)@87>RPSSB9 z(mdPNGA>^D|K~4|Gn`ysXGCuKcCvq8=a*k!egj?m?>8{m00Ic8fvd1cUx@iTXM5HE z^H)FyGjo2eEq-FG+;YA1)Puvn7=8hj{`vO@7;-=x00M~R?)3!82NxK-n*V?K1yZeJ z{HiGaByR2;1J+usHUNMy48Q{FH!M8N)Pwp9Y)wTFo81A^+}-HTA|tp~ zO4-IyLWKVGUAVv#KrFzpU^vb8&*4vW%&*_Sfp-5+Oa#jR{(FIy5oqwQKVTa`BqPut z3=9AP#KLU;d%N^MnR|>Uj{MoN{TEQv&!4|iQhqnS=35v13ux)DKYxDz{qyJVA7#|2T literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ne.png b/interface/ispconfig/interface/themes/default/icons/flags/ne.png new file mode 100644 index 0000000000000000000000000000000000000000..d85f424f38da0678471ef4b3dc697675118bc7e0 GIT binary patch literal 537 zcmV+!0_OdRP)pTI(!tjlO;rIXl@1HV&)cpmDGW-GR z`3+L^2aNvy`v2$G|KGnEMPz|W00M~d>&=s#l8OvKbwEpiHvESG2>tK>|GyyO9|$ut zvpzk42q1u17-V!9I61+pfvQ08|BZwH@16Yr=jVTUlmA*S|6zcEk@1g`6+i&7`~&$E zYA%%V^7j8zTmS$3{hyirzos*?2B2bq00L=%yMh7Y5+V8jy0-s+|NJkm_8$o_f}Hjb zAb?n|yt|^zto-ZmuYW+t0)q+&<<KJ>BgrQT zRQ>1Q-#;J~AoS`6pHRCwBA zU~p!DquG0BzkdJv^XJbWKYo1u_VxSs@1MSW+P$@#L70Jomw|zm0SEvBhy{qNbE|>m zzkmO1v}^=;1(+C_zx@3C{m*wPUMbGM98Q`}5v}3B|NZ&>_xGmUO#lG|(!jv*|H=EO zfB*gc{`33)|Nj{n|Mza|{r>BFYe?(AfB!%K_3?Y%L>Z^l>!7{V2qIffI$#e zz5f4~?wt{_jNwA=k=tvV8m;04hxH1ClNsp|jaD0d_yUND;Sa;#|9^ps{`~n3bQJ?5 z!?D}Pp1*tk?A@~oJ0>vvX8@W7)C|%C)&LMdARGSt{R`y$`S<5P0|@TEy!-p_?>~S2 z1lj|1A`hhCuT1`^U1^@yK06yzfAV)~#?EnA(07*qoM6N<$f^cITh5!Hn literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ng.png b/interface/ispconfig/interface/themes/default/icons/flags/ng.png new file mode 100644 index 0000000000000000000000000000000000000000..3eea2e020756c41abf81f765659a864c174f89db GIT binary patch literal 482 zcmV<80UiE{P)E-@kt#fq(zr{dlL|rVbPb$^K$sU||3VAQpx%4ArjH z5b1ya|A`BUvomopF#HDspdkBi_LzW}KMcQr|NHa%@9#}BHvt3?3s4hK`pMU)fB*dj z0+88E|KR{Ac>Ck+U;lpn{`Xs!M;2%gKmf4-G0FZ zKmdWv|I6_A&;LJv{(%shYM_N64Szv401;3FKmf4-Jp?oxsQb@fum%PU8~*%)I0>i# zs2CuCKpOsn%?64Bg>X9QKhy?*00Lh)xZD#`v33$e!wuw~|G$AI0?h>~ z1_&UqlR!#;Ll9OQ{s1-n2ZahyF+c#Z0Amdp#**BUAaDHn%gD$G3dPzV3};X@Gl13bFaQJ? Y0MmSSAW;3b&Hw-a07*qoM6N<$g7#LQDb&XuwlP!fzJKM z`1`}(|Np-K;|B=>MS!;cWf13KY+LvSAb?md?)rCHn)&`aU^p;VI>1V00D#b-){yc34R8!1Sqb680000@|4`Xj5kLTv#?55wQzKoX38|NjLffBpXj6#2y{D-E;(Ab?mHL=FGT z$TP6>fK>na1GWK({(upf0nrSU5*Gz(00%w4e}91F-@gjtJbOE500a;V!?RECzy5mt@dro_q~YJM-#~SLe}OeX zNT7y4|NilCvNABd0|+1%hF>6clER!2lYo}|1|zVkK=SXOfB*mf{rC6ZKVbL)odgg- vjKFAPVE6?_e~=h|kVO7~qZmRm0R$KTYszPUy89K;00000NkvXXu0mjfB$dbi literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/no.png b/interface/ispconfig/interface/themes/default/icons/flags/no.png new file mode 100644 index 0000000000000000000000000000000000000000..160b6b5b79db15e623fa55e5774e5d160b933180 GIT binary patch literal 512 zcmV+b0{{JqP)O=a{vExMP2%`MCSoB^FIcLe_%lf;|~%E5I`(IQNh}3Ao>6Q|DFUXMn*>AqQd`w z|1kXd^B;tM|Njjl{{hM0zwd6?1Q0+hV1xeud-4=Wy?p-%sO`^#2S61Jzk!N?s)6X& zzhA%p|N6}=D+{y%Ab`Lc{sL9~1=0UN4*CD*7s%9KAf+JHKs~=eB-8KTKvw|-5R1&; zzd&a|ob(5%^Z$Q=wHy9p13+aOpFRNu5F>N&`Tk_-7w>=n{RejQzkfh&Kn{rf10?_b z{tFTZibx5v&dxav5I~H7|Ney-|DWN1$%1FyagzUW0464;_wU~W1Q5$TW@eGxtUvee z3vAf*8|igK9~@*rr66bh|NrkNM8z+V zAV?>O@ek;bKfu6d00KAO>U2WB)$@6+CBT{3ok>^7H@y{~6FRKmalQ{r8#S z4^Xx6Je&%q%J2@E@iKAb=Rv<(vO+e^|@#56B5{*~0Mg z>UitA{$OPI`~Tk`F#7!u z%=q{3H<BYX7n!%ts-g52=?&#%8AHvnDo=g*(t zU{@(f3Lcro01!Y-3_uV4{%5PNloM>zp5gQNALI8Qf4=|z|KsPsAHV+n`1$wy&wt;4 zfzU5-=mP{0FqD1)U3&iJ)0b~Q-+l7x$B&=CVSxxV`w!S3U{3%6(9;Y60R+_W0~jFx z85t(6Ir{$dcL`zMKcF!E2U7}WK$QOlX#fZyMg|5;)aZo7D4hMD0TloQ7ytwk}@P)zKX@%&%DST%gMqDF&nJ<9}^SM9e)7=i1G97Xij+!pc8>s z0}TKw06GH{9{>J;c@WiqflO8wrXNp!0t65X1H*raF>uuoM}q1_&UQ zzyE+PV}l7nR6|1@Xe}f}K_mmn5Fh~%KtLN9K+(a>4Du5*FzA2|{m;zE0Q4slD+}03 zKxJTefLQ+k0*D1@+|Oq}Kt_TL2e}yHXa<;L{(_vY&wh05Jg0 z{{*4}t^?F62l4F%@9_Wk_yrLV`1}4n_xiEzG57obO$p>A_3H5V5SZl@9UBk;0Q>>~ zF#yj00jE58tx;oDUfVAO7ZA^g)(IQ}Y8G-;ZB^s|2r!a55}@Ef&J{K=uDyPxdE3 z4FCZEF#yj011R$m=m{0X((d>7`QGgNy~*X%==~K4{m|+BO$p;F|LeE!5zX@o6aMwK z|0Cnry8?)1@m-dDW`RF^3@85Z{`vj)H~*iTuYX^D_V?HC|LG63e*OOQ`}ZH9+h%{4 zR^kLX2_S%&fc^l6#;?EsK&pTL{q^hL&)-1T|AVLlN&WsC!*d@f`}fa3pay^dVgYLS z^XKpHUw?lCNw6Z2x?f-t$o}(Zg7`(je_wy{{yg~C5U2qlfPfml0Rvc4oChck)CmlD zkWL^2sNoMV9{$c|wex0wa`2z{-@pGE82$nT5F-OaFayIEq`3SAj@n=l%a5DE9w9oI(Q6o;?Ey zAdrT?A3yTg*!;YE_t&FGSk*xQBO~LVKYsuMhzTgoEGG70+cq{OrGLMF<5CR)KqmnN z5F^kJDrIFqfoA{t^Z)mszkh!J|NR@N^WQHZ-f!>?ZqK&!y&{zFIzP0wn(b{R37FH0BS}Z;-(ZzkW0R z`o;JgO8$qifBy!003d+C8bA*C^$+NzU%!${e*gOW>-S%fvmgwhvw&=%Tb23#oNZ?S z2p~`>{R0^fayL*XP!U2MkOb-c1#;`ZzkmMzW%$Pc5I_(c{;*0)g6#S8SB49$^)FDx zACSQydx0wd{{073{+Hno13&;Vu4Mp{AoLGRCWbOF`~tJSfrb9TxDaUu27mwq0KDvZ UcsT?Vy#N3J07*qoM6N<$f`X&bC;$Ke literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pa.png b/interface/ispconfig/interface/themes/default/icons/flags/pa.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2ee9a780955566cc7dc2f59ce175f32d3731a0 GIT binary patch literal 519 zcmV+i0{H!jP)|lVPPN>g8sl5Km-s#EI@faK0YA%?%RKmGG2!N|AD;!zX}Teef|3X z_wWCI{=muCn>GOi5DUcMXP^GBIsf;|&;M~|Oj3M||NsC0d;h_|&!7JP`u*?sum8V( z0aY`}$^xwd2q2IKptK|}gRT_Am!FIf)j$AI2PS_*H2ec11_potVu8EfUYUvEKf`}G z`1lE^`X5*+Sm$r%-@k!200a<=Rv$}~=bu-f|Ns5_|IfewfBrH6Nrpdvs+^pde*a>f6qSrfAZn~Z?Fa+2||AuS*t4lqXH%-ra!^K00G3r z@ax~7e+)2nAoSxWko^y??$?YNza~t8coi7j009Kl08{<<|1U847wF+XP}P60U;n*# z@9*{N{$9Nb{(u|?WHSN*&{SqkP0pSkP;|=6L&63i zfEXEE-vV95@Z%rDuRkCLl>P7efnPxL{(%8d!yj-G00Mvj0{}mHT?%@XEt>!U002ov JPDHLkV1lK4=}rIu literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pe.png b/interface/ispconfig/interface/themes/default/icons/flags/pe.png new file mode 100644 index 0000000000000000000000000000000000000000..62a04977fb2b29b96d01ffef3b88b6bf2ff05862 GIT binary patch literal 397 zcmV;80doF{P)@|A6@UbB2E)`X3x9D*gjYK@dOyv49j-R|ARv|Nb!om5Pi12buAo@&A8j1_q}8 z|NqCt{Qv#?|DQiV^2?@8009Kn!0`Y7lcx-S{{qo}h;n3b`}Y4|zksS4Wo3aj00a;V z*zEsM)xUqEs|Es~YOn@|-@kzx00M{wh#7&Zfj0j6!|?mhe@uX+0cadR0D+zK=P$&S z1T_5l12i2VfWS`r`v>f&U-&gJf}I2qKwu{UjsNuvF#Z0+ASnqp<}V}$85tQ7(W#^a2}2+PDh3E3#;-`R r2#VqJ=b;e{^dbb<+Crtk03g5s0zF}bJ8sS=00000NkvXXu0mjfKVzU% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pf.png b/interface/ispconfig/interface/themes/default/icons/flags/pf.png new file mode 100644 index 0000000000000000000000000000000000000000..771a0f652254b4e891fc73910aab38967864da54 GIT binary patch literal 498 zcmV3lobsI zohi_A`bB&J!~)dH$ngL7lczwX3_#UDxxarw>LBRX?|;94{rmL`$Yzn1{l&ll5I~Ht zU%nI;6$RPw9|VBf|1(_vbYnFmA3K-0+yDOt{~_StKSoBzkDopP1Q63dnCt(82%zd$ zpFb}6I_2!oo##J&nDhVtbEpQW0tSEpVuGrMivIupee<8UpWZS`Uj1hH_v_am-&g;K z1CTfW0R#{WvT7jw$rQ2Wy6P|4+kZd)xq2}(*g=aGrk)Yxu73al#Db(Bq?4D0-N;b? z5G()RfB&pB<@s4TkY)e;`2!F@EcYcO{->q=ymt>64xqsK^^5b@FIO-F$h{9?`~e2* zUv?FhqZcm%1P~}#|Nj2NBq_=8`#0mCzd$+0-@loGnqiRuWPl>)F9-k?0|XG`aR!E8 ou!#JF#Q1|6-w+1S#{dBa0Kx%7Vg$%BF8}}l07*qoM6N<$g2}Akn*aa+ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pg.png b/interface/ispconfig/interface/themes/default/icons/flags/pg.png new file mode 100644 index 0000000000000000000000000000000000000000..10d6233496c10e52ead975c5a504459fad68ffb8 GIT binary patch literal 593 zcmV-X0Hv=@BjaQ|F{1AU+wpQ{$Kys{`!CTH>0fVKL!SX0Ad1a`1cQJ=-<7ptZmH9SAnX3 z{Q_yQ`~BbL*ME+m|K)!Dcl`DLKS&U$0U&@t8vg$M`{&P}#F!W*N5{%vzvln`{r&f^ z{||ospYrSf)?fc0{rZ3A*Z(w-2B2bq00L=XVPVP4%$zZO`i8aZ($dmav$E#>{B`Z@ zum6{R{h$5&|A}A!9e(}a_zUO_pbY>4IGm#s06-9cg3a4XeYH!D;D>_*`V5R3;NTtr z%*@^Mq=>M$LXVh`5jChqDeaf800L?F_U+sH_3M8E<^KOyQ&ao$p literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ph.png b/interface/ispconfig/interface/themes/default/icons/flags/ph.png new file mode 100644 index 0000000000000000000000000000000000000000..b89e15935d9daf25173f89a36d8111824fda5db5 GIT binary patch literal 538 zcmV+#0_FXQP)N~0_Y@w0Al+04@f;`V3_{@|8#9F=K6XQ9UY*azdwKd1Cc)=8bAo50U&@_7#Kb? zFg*PK|H1$NTnr5Nxw#FRn^&xvtbK0f`#-;cuKxpc)t_H~fDExeq6ZmH0|XFI1NZ;` zGXMXp{AUnj_^>}zDz4B$`$1}#7U0X2MOU=aELU!7sY=Kr&1{QvMCSsj$|2dLpM12Fg)7ytqY zsKMy}yX6c^FZ@4woIyZ63`(G)I*8l(j07*qoM6N<$f~Z~XumAu6 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pk.png b/interface/ispconfig/interface/themes/default/icons/flags/pk.png new file mode 100644 index 0000000000000000000000000000000000000000..e9df70ca4d63a979e6bcea2399263c081ce5eaeb GIT binary patch literal 569 zcmV-90>=G`P)`{xe>ko^7oADI06=l8$gn`UeR2p|@S@&Et-|M&0Ts{jIsi2(+HrUEqpC9EW^)CAOaJl^^9-%lBC8BHP081)#ChQGgo zHUI<=3(zGH+B`^Tu)Z%{q{PpYS&%;j+KluCr=pK*_e;5D)h=t+bKO_wx|Lu6N(?HnJ zN6`lu;-7zgR^V0GaA(7wCwqWF2h;!%KrH_l5Kj8_?>EpHKuhXR);;uSzaAK9KY#yZW@T0p zQ2G1+FVF^n0AhUp{`o&J`0?k5YKbbt8;l4>j(9ExfB*vkhsr>Vq>*li00000NkvXX Hu0mjfu=^7c literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pl.png b/interface/ispconfig/interface/themes/default/icons/flags/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..d413d010b5b097c4e0a4604eba86dad79567ed16 GIT binary patch literal 374 zcmV-+0g3*JP)Ab?mv3iQ8Nu5A{|6C_|Nk>HFfjc`0biay0|+1% z2B@O{$c+Ek03##gzdwHf0*Hl3)etG5lK=vU1?W~rxN0!OqXDP`Ab?mH`1u+7`u;zA z_W#cxhChG)!_n{G|9=A+zrl>(AX#bYe+w4^1Q6Is4VEzI_51&? zUm!LT$@u9L&^Z7B1a=Zw2xL66B2?87%l|Mi00a<712fnG3~)u5+Wr7F{AKw27w8;- z00L=X`u&GNQW9*;Uxq&*os3{386YGO{rw9;K*az7#P}5)xp2gQ%0-g`0)PMm0MPYZ UsK>Njp#T5?07*qoM6N<$g4HXSwg3PC literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pm.png b/interface/ispconfig/interface/themes/default/icons/flags/pm.png new file mode 100644 index 0000000000000000000000000000000000000000..ba91d2c7a0de26e554979f6351d42a1a4e22de3b GIT binary patch literal 689 zcmV;i0#5yjP)#D@XkmAv!xDMMW8-mEZ&mK%|%B2@pa*J{pUD?(_ahBqlG}*TVt; zF#yj00{;H~{{a8``T70x^5Ww5-{JLFN2dS#-{Io#@$TjE?&8zZ_V@JO>E`A8`2YX_ z`~rx{;oS`3$G61pUY_{!-0$E2{{CbX;QPSJ^3BEStfg-V`n;-q6+;t+Xyw zOy)sS^8$#8OF-b~@87@v{bTs||L?z_Zq~=&zGIaZd&b4_{m<{;|Ns5^`sL5xKflEU zUjXHSP67x3F#yj01nBVe84eEr00I90|NZ{}FelkBB-0BC^O2xB85HWz)f)HsDi#s! zMLEolpK<^Iq5=Rh0M7pb=>Px;h=2d#;^FNBZtPGJ5bKP1n*{>+?(qio_5k|){tF25 z`1Sjqtv%A&PR-7P0st`p&i?}b008M5=kFQg|M&R&{r=?U4x6PnhWa{`B$w z?CApk{rU?E^8f<&008;|hy@rKe}6M^a>=kt2+9et{QJXr>zQ5ua`W#$8JQS={rbi5 z^Ctr{)6XBj7@3%V17i>%fEb@MFnj<<;{gVSbOv{z8Q{qN1r~!u@ISB;HgNQF0R$KT X>6#2<48ze<00000NkvXXu0mjf$fQr4 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pn.png b/interface/ispconfig/interface/themes/default/icons/flags/pn.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9344f575bc92f4c1a5043e6e7d0a8b239daa64 GIT binary patch literal 657 zcmV;C0&e|@P)$VEDzr@CQtS7ytnPF#yj0 z0a0(~eP|Fd7x&oU`XvhO+V>M05dgm54eRCe)!y3s`vCp^_5Az)`uqj_{QRhrlmY-T z0M7pd#W4OILofm6?eh2PFCO>E*7Xbx0@lgN z0st`p&i?}F01o{F1pxvB0QdR->g@pe`}O_>?Enew{R9F2_ajBO3l7@{2K78Gz9u`z z008^~05Jg0{{!Vds4FN77!dx<`5YAi^1B#F4D8&$5I)oT72fOU?&Jm;1k~m5*82ws z?b$fe$;$!&F#yj01PbEP9OVUy$0!>9?*iHF&;9=9{2wXIjNS}D{P+g={1WdM4-6DF z>gCe?_5uI^`T_tk0M7per>)2uHb&;=(#87${QNQl(a`kw{Py}Y1nctu{`UwC>ihis z2n-DS{QU(1_5c9-0*DC|aR2`P{`;Tl?{DV6zkmJy$H?%Xjq&fFKfk|zXRCbma58?r#f z00G1Tv;`<3F2eQa&)+|P|NZ&>@AqGj(m#Ly0)zk56?XydpHmj-@bfY4J_0oTA3y*x rGBBhgM-@1KAF z|M~a-&+mVKfs8*8^zZj?AObQ@tXl^VK#U9w|7)um9zFT5!1JoGnu}M2{r|uJ|AC@F z;y(;9F@d=M{=L6-3m|})KsNsS&&$bh^PO0375Ag3EPt6;7?_!X=sz3*^#j#0Gyh{@ z0SF+Vlm3Z`F-Ar(?BDbM+y#c5od5B%>y$nn=KcNZ|L>nr$AC#T8JS}%RsaMLPy>UR z34^BAe{Qb-hmSD)`~82~jewZHH;sOtVgB{~2T_Lx z^M7~ue_6TzObGu%0nl7VM#g8?t^ouP$PYjMFazDG!uzbThlgL98zlelKgeJZ;~z*Z zSPxJG!?$k$0R+;(`ulr=6P)M00|Ni~>`!`VeZ#eh`fLE8Q){QmQQ=eGY$|NqCtU}^v=1iBd@fS3^8`SJ7r@8ADF ze*C{^(f_{w|JZZ@y#o+HED**2KY#i6{~yEeU;qEJ{Pzp|pOucqNnlF=0*DFdB%s0n ze*I+l{{11(um4^iSXF}z{SS2YKY#!N`GNV*AE2Jys=p_Au>JnK{@0e3zk%WO_xG>A zzkdJw^XDIk{pa6bWqzfjEk^+Y2&CaX+n+VzlIN6JC4s^J?+-}zKcEU=eEj+Q{|`_P zFrfeb|NHmfUxq&n00G3<$-qz^$iN`P!0-!({va{_z!?9)Bm)CLfB^vHpj0t%_B3$- O0000op82)aAGO;3n0AgYI#891D4N?IF|Ns4E{L7&Dm*MXp#y@|U|NLS4 z{rmr)KmTFmmra`h0*Hly38?u0llM=#nEx6H|J4!x{U`A6pVzdvv{Rd?JIrI9L zs`Fos+0`Q4a^C}Q0+k5A1KaQ$>Lf<6lK=vUh2aka(D+|}f9<^YM_B9kC$A?0Z|}3+ z`ptao7t>dSY6f5^0o~2O01!YR8-T_G^}PA>yZ7X8cHUpx=KlJ_{+sC?ST#h$AD{+c zSpNn30U&@_7``$5{_{tYU-I{#-$2g*Lz_YNHw#c5FVJd`!65YaF9ZRd1Q0-s48{x$ s?-&?Px# literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/pw.png b/interface/ispconfig/interface/themes/default/icons/flags/pw.png new file mode 100644 index 0000000000000000000000000000000000000000..6178b254a5dd2d91eeaa2a2adf124b6dba0af27f GIT binary patch literal 550 zcmV+>0@?kEP)~nkZ zGRMDC%7~XK0S0Tx8Wd7-QG59jKr9SQAk|O4{{Q=*0jSzY^rW5C9>)KFc0aM(`^fh9 z|Np=Kfe=u&EDs~YzkdJ$!~!z=-~YcrJO42FE6xsAYGq`2_Mbt_P-yG_e|4Mhx&31J z|LZSE!|%TgKvw|-5ED@OU$BE2n0|Z9O=M(v1mpqrFfl%gR9?uy{Oi{rkOq*RfB%6# z1PCA|pp${Bfd()#{N!P|4fj41<69Aq$E=K>;Tryc4F(7xpbZRv|AD;q^*8I6-->Vz zfB*5n`o{nM2Peo6f5F}W+3*h_fS7<7;^vxc*?8?`g7w0kCk@cHxaHDByoH$n$~K0fYN5BQR!wAqjL2Kmai^lz(OTgcO%Q oK%!9YKcr{|u^AZn7ytqc0H_5zuk@Q*SpWb407*qoM6N<$f;OS^T>t<8 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/py.png b/interface/ispconfig/interface/themes/default/icons/flags/py.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8723c06408828ce68a932ff472daabecc64139 GIT binary patch literal 473 zcmV;~0Ve*5P)@|4`Xj5kLT%`al?B=W5I`&pU%&omV`KRD53KJ$2txq_ zg7fbmh|k3I@68*40Al&@kBy(1nSq%Zss!k?M~{APS@-YvZ#JJG201x|0gQ}qez5@r z5EI0wa6>`h%cteq@9Mue|Ns2{KQdro`19u4 z9*F+^0|+3-w;#WAv9bOIX#?r_2Xj8qX@CF21pWab0}C_Lljko10*H}8@M3d^)Z>@G zf!6*0!vH4#gGo5!|DS*V{{HzdC&9L6!fAj26p=v+03Zy*=I{f8|9_}7o838uP_pBd z=z9{Sra^iHOE|+IC{ z-`~G~{{ZRVfB*dX11A6d`CYbrEkFRVK#Yg0UeQ$d`q2ZhA|Uz&)bIy{egR1#X&Imb zfB<4bR{ihazwp{dkXn!mkfPsU#_wMs1hfID1|Wb~;Esc6TU=EJGWFLlunkbN!Q9_} zL0)432p}e)sSwo=4bd$f5a~a^fBpd(3|0LbOac`E1P}{Q!+)sq|NsB}pI=e{a>g%& z)4?|U{s;0mNCQ9sG5v!Z57O~Jp}QY!5N0Be0)lgG%);U`26kn-@hOg zU%!6+4+cOs(0HIde9xZz`}Onxub&LUB0x(30+2WcIRJn#2ut|?gWYu1Cf+!-K%B8# zdf?1WA}#uZ8oj7u>$I1i0Al&`=O0k%-@icgAIJnM0xA6maSq6BK-ECw|NZ*S`0Lj% z1_pot6puj;05Ax`F!=umqj7^frO?t|3^&I1kxUq9yECc+jQpY84SWH_0#pxl$?v~F z@*hy-KN0|X07U)z`4{NpU%#2aHUI<=%a31wK(7Du52Oc(|3O^?R1IN+RRjI-n*kVB z3=9AP#PZ|EACPLGJ%9cJNh|>9B%spYzZw7h1%?tp0I_@ndg9MNE>313@6R75NcceF zkr51-#U+7;F#`Sf7i0rK0I_`g_NQ&Zji7_t0d_@@ozArL?Su`s;*Q{AKpRQ~TD44PX+*q00taD0I@Lq1k(S2nt`tR{g)9*1H=ZfhCe_Je;NM%1^NLXfPkU&2dGq1gcanC zzsyWb(hLmW7#V^70~+_6f#nZ_(jSmgFakOWAb=Pd7`8Gn`~pjZT=;x%FbfOAzdzu3 l1(F{a{)I#17yR-T)##NTdjqb^wzQ(`1@?t)Ix4MUXz556teM9A7Ic zq_@itH|pv>q+zrjZJ^Hx5bj=fD{5McI3ol<@^-l_@~tZGV7p>1CU&qG~{YccyC-q z$8~P)6sG{nMmQy85K$E6L33rja$x-b9$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ru.png b/interface/ispconfig/interface/themes/default/icons/flags/ru.png new file mode 100644 index 0000000000000000000000000000000000000000..47da4214fd9edb383687c1d4f84fe8b42a51ceb2 GIT binary patch literal 420 zcmV;V0bBlwP)X|NRSO0LlM<{-BURBqYRGSojej zfLOL~|EH_V_~;P>Nc10*D0|Jxss< zFi1)Q<$$6LU}rIc*dU*QNFV}+9T))>0|XG`SD?F)5CbX~O$rDA0t^5@iDe$xIAIn5 O0000N_~0!B1ZtR02zJmAl3i>|Nr}+@!x-t zvcLa8?7#n*fB$3p|L;$z$Rx)9zm`4EX`B2HAb?mPX21FhQ~^@@2dMNf!=L~E|NQ+A zWdHd6KUK1c=hsc9f8Rnyezh^=0R#{e(Ek5GMIci_s{j0D`2GL?@4p}ozrlKzzsUIh zhw0@n(cNzYfer%*AeP_1{{8vS`0Fp&84w#lmi+$#)ARI~X!Y&+KyeWsW`<9n00M~d z^G^m==F0#79{mS71ZX;t`~_q%fY`tPf!Mzw;*3o4FJA8j2p|?NkT1UdXZrG=;TOYy zh@M|qNhT&CJ~jq`0Ac}pl#vl6#K7 zFA)9u_3syi0VMzY2QmHtx&Qtu@&7&0&HxaAAvs6^7=(cU7?W7&6Z-$piRe`dyDK`^ zN$WO$zWL=wEu!PO?Vu9@iVSM&8cWvf2p~p=WCn&G3_$lI&>tl77dYY}Tp)vm0U*Et X__=7oxWDB`00000NkvXXu0mjfV`BRN literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sa.png b/interface/ispconfig/interface/themes/default/icons/flags/sa.png new file mode 100644 index 0000000000000000000000000000000000000000..b4641c7e8b0dd79aafaa73babdb525d3d2dc6a8e GIT binary patch literal 551 zcmV+?0@(eDP)4!1u&@QJ10&`rk^HbMk8Ee|uIe&H zS+;4$DbWCt7$DsBz5oJg0IGiW@flDZ69W^F_wDDmUw?kFvatRB^XvPsAO9KtfBpI8 z%a6}8Lb5=`00G1TbjJVx|9}4ZVWnuJEUfzZ$EVZx<$*voWzTGcp~$d(=+V{_?X+ z3y#kPS_RYq5I`UeU<=TsD9Bk~@o?qi&=DPd(?v86a{(`&&3I*E&g8|Wo?Sn;v*0j086Wc~d66UYT>00&^E24DBZ$$%)DV9SRUYEY{Wn z85tspN%!Z^Q&_X+!-^Gee*b1;`1hkUW~HJ2(d(c7|`w2)m##KhU^#|s1eh2YzMVW-Z(;)C{QJl7?-Rp6DTaSP8U8UK5I_L2Ffe?nu66~hU^Xzg zV`^IR|NmbGhChsd{xGln!xZ`Z|DQkqe?!SHn>GOi5KsdU{eSZ0I}_6%bMu4$|G#2j z_zP0e_xu0e-~WI8{{Q>e|6jj=B8;-KKpOx8hy`TyKZd`5nT(9?%F2RO|M~TQ@}K{E zz)C@?e?v4d{QeEp01!YxcLP=bXJGj0<#nFn|DXSVfvSK1-v%}nhwkOu|GvKejg0<-0ptJwK&1cy1oE`H<`Z?5M+~$7{9gq& zn~(3mv&(;P@Bi|05T(EW{(k!9>4UEid{_Ab1OPDr&i@1e0Q5gX)c>UW0I2)_6d3&w~i*%}NQ0G05Jg0{{#gAwk6j%|K36Wcrx-Z zDBuV5-R-~I;@8;l*yr}=_xShx{`~y_{Td7!{r>#`1^@zxvDKIVAJ?B1c2ZXvZZlkB uU;qZ}2Vg*eW0eWa_yywvNgf7(00RJ0?>)A@UfIF`0000~{{6QA+oUi>E@sC6|Npy9I|mRz%!e*p z2Rq5%zu9WWBC0CAb^-aHZc7E^YzcK`=8X^WVaOP zAZs{XYh)0l^y~V&U!Q;f1_jw4fB*tH>G!)IzutbUPS7xun>*B|^YmYFnaxh5oFnsv|ie?b{2U7L_4Fkgm jhERtq_4+^_K!5=N1|KO))1zs%00000NkvXXu0mjf8-+Z0 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sd.png b/interface/ispconfig/interface/themes/default/icons/flags/sd.png new file mode 100644 index 0000000000000000000000000000000000000000..eaab69eb78776f8593b41c8fdc3fd65a86119a0a GIT binary patch literal 492 zcmV`tbb&P~tyW8d(D~GxMiUp8x`gh2bB=pZ|ZjUUI!&{yK1G;4d%$ zIuA;MS%3cg{`2Rrii*m`ix&X`h=t(`1IH^)u0vdsLXv;@{sQG7;18Jf2Mqqg05F6A i0*HaZmVqPy5MTgGElxU<64PS<0000a|fPuet^$h(7pHv_{jfB<3vn*8q{15ov!pR5qo|Ns4BVf^v!57RHO zo?l?}`yWs<(7C?=0*LYNK?X*pGKOD3v;Q#s|MUOfZxH$qCjb2cBQWFtZ$@_cPkRpn z1P}|u9|n-AAQdnT|9?TXAyk7H4FCQBl>h_~&`AvcLF)bhMS(&{8jwh^2qVzve;5D) zh>=0RIIAq+{+o}$pxEl(3%2T)`P!1-fBt~{@Pp~sA7J?W`}60ovKZgl)=2;X#KQ37 z&mWM7{{H^+4`$e}UqIEMAo>Rk|KALM|1kdh!vsX^3=B^I0*D0|DL|!?{M^6*VPKPH z00z{*-?BnHps)wJ`QKllIe-8D1EGJQNCgNWMh3}bctpOPvlbWzK!=K^+cJPc;};D5 g19O2S13-WQ0NlBGh$rR(5C8xG07*qoM6N<$f_QiWUjP6A literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sg.png b/interface/ispconfig/interface/themes/default/icons/flags/sg.png new file mode 100644 index 0000000000000000000000000000000000000000..dd34d6121073fffcb2fcb5b9402b3e6361cded35 GIT binary patch literal 468 zcmV;_0W1EAP)dtOYis{Le*Dj#JuDs`KNc)tl9OYUmifJZ zA4uJ=-~WIA`uFP>kj*SB3$z3vfIu4l|NYA>FaP8D^M5;ba1<8<4f|GC2UPm+H&ER# zkRGsxe?Y{*01!YRC;dKnkj2`X)zkCW_8s5b+Wvn23^5y|0jv~A0#!5q{{4%A0U&@_ zfL8pya^=_l{r?#l8F+XY{;)G~as30ko(ZTFY%s&0Ka9WsFiJ`S6$1niy`;Hnv5 zfRT}r0R;fL{~@sn5I`&p|Ni}W_wFAQ`~gBVzyJ~jk&qMs5MThRyiZo6SsHx+0000< KMNUMnLSTY6dB!#X literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sh.png b/interface/ispconfig/interface/themes/default/icons/flags/sh.png new file mode 100644 index 0000000000000000000000000000000000000000..4b1d2a29107be96413eb86e64a75ac7a3ba5793d GIT binary patch literal 645 zcmYL{Z%9*77>Cd9?woAXO+#E-F%m^1b0Xy*Qky9{B^@hJqB6}jOKKPc70u1CS|Ug( z7>SA^1`5-}4+VvY=3G*k2%(8O!OWTIn!4?td(P>GANugV4?p-l@2B^fCONIbD;IAODX_{rV|BCn_NC>%qlWoHrzH=l|0Y^Rhgkwr%>N3 z(d)FjlCqjgyY4&yRH!;rb)|Z-v~HjxIkvar`*JLyzxBc-B?Ix`3*qGz4q3JAd`#LY+Xw^k(ph!n`d2H7`aI`Eh(LrOLs%9g zj93;8ws%s88WHkIqXqnSf?YSjh=@dF-}4L7dS0HFB@iNj8OY*&4>%Dn8t&*i)aXz6 zSX_wQ?~e=9UcwhrAtAf8XLVoTbE5+<^|-KK=D&>)yX6u!zrPCrbEr|4Yi(XyIGTQI zFEDsraAY{)DhUd*DN;Q?!uSxvkoT|31dF#>2L0DGeRcNZNehm>xm~}-9q?gtV@Qz` zv-lB19|m}3LHcg92}TUOb+%v(0bnUhB(5rQI9?ZY)h~Hw=%2Au&~WB@t;^kVE@F0Y z%=8f1ZN}R1MniiNxkJ!a;3!XFerfimE2A;1XJChGXJ=)MAVRubE8WFo1T(1Cmhdfa ztzC{Qms6asjkstFkFp5L#maeek84Y+NtW^Wf=SRytjpC1=BCX4NH^VxnQ`+YXocAv zR?lKskkKZN7D>{S3>4;4+gPYYq0_5iq@jsB^}M0yMT0|p`lM;R_dwbVrBg^4RRbsq Y$WB%-43-yHbAJTXS^1gPjGK@C0`m$%7XSbN literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/si.png b/interface/ispconfig/interface/themes/default/icons/flags/si.png new file mode 100644 index 0000000000000000000000000000000000000000..bb1476ff5fe8e0d3af4fc6bd11e513d95fd9cccd GIT binary patch literal 510 zcmVm9@#;PEzrU@Gx(rNA|FHo^Mn<3|00G3vEO>ZAhtlWIf1*N!=PZ8p<;&lH z{~7-L`S<7dzu$lU0~x=8==VP$LqeQ==EOq)0mSn6{g=m2e$<)X`O9Zpu5&$Np~P9Kn=gZ0kf<1I-4a zUtk1c`~{K>fBu3(0U&^Y8d(1RW7^4V^6LZG89>!QBmXe{`pfY9FT=0Dj8O6)!|#7g zK*az7#L~(TO=a{vExMP2%`MCSoB^FIcLe_%lf;|~%E5I`(IQNh}3Ao>6Q|DFUXMn*>AqQd`w z|1kXd^B;tM|Njjl{{hM0zwd6?1Q0+hV1xeud-4=Wy?p-%sO`^#2S61Jzk!N?s)6X& zzhA%p|N6}=D+{y%Ab`Lc{sL9~1=0UN4*CD*7s%9KAf+JHKs~=eB-8KTKvw|-5R1&; zzd&a|ob(5%^Z$Q=wHy9p13+aOpFRNu5F>N&`Tk_-7w>=n{RejQzkfh&Kn{rf10?_b z{tFTZibx5v&dxav5I~H7|Ney-|DWN1$%1FyagzUW0464;_wU~W1Q5$TW@eGxtUvee z3vAf*8|igK9~@*rr66bh|NrkNM8z+V zAV?>O@ek;bKfu6d002F*|Nr~{=Pyu%qcHbB24G}l{PX7zKmY(S0M7peLS*D^UKK~y z+6(XH|9gD^r>6bY*OZ>+`2GX^{Qmv@{`~#_{QUm>{r(dW1b1xK0st`p&i@3&%J4-( z6Giy=|7vRh4-WrbUHx`??d0*<@CX3>{QLa=`~Cm?`~Ld;{u~zu0R89!i0SVi2B1U! z{r&fU#+3gbKmA|6l!@v8=U+^J{{8>`mjUR&KfnL~{sUtC1qTg400I5L26X!4i0my} zo;{uZo#CfPX{7DT1DwDAf(-fnkMZ|^ra%9I0mS$d6bftr0mQhUfkCOfiE zM%HqlKU{maemr>kAILSo!3gZ8-+$N@WcKe}3J^dnRtyZx@9+FOdynDWy$P0%j62V; zZC)?>`}hA}zy1SB2;@n0006p>>h67sJD!pI8@uK6+#GPW%ce@CEFZM znTD)%K!F4J_qpc@AQp(ZPk%rA2T{TB=kLG2fBygZ4O9eD_xsnsUl6u5yEM=SfB<5# z6|+@gR}o|u1R4pn+XF1YrQf2oylS zAbS3(sBkhcTmc9mV6grHN=r(zLW3F{=D&YK84x>x_WT70A}|U80*H};VI?9O(a}F7 e1_Utx1Q-B;QgQb4eH!Wj0000PEol7!5I{@}e;EG$`~Mq){{FvoV+so& z6Zek;JYV*``O13q$!wq?2!V|I&+z9TKmf4-@!$W9Km&lr1Ie!(IeUNcyZo#F`{&0p z?&{CqnEw9%50U)~((nf$fIu4l{AK07*qoM6N<$g2hARp#T5? literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sn.png b/interface/ispconfig/interface/themes/default/icons/flags/sn.png new file mode 100644 index 0000000000000000000000000000000000000000..eabb71db4e8275a5bfb7b1b8f3a8374d50da95db GIT binary patch literal 532 zcmV+v0_**WP)6{xSen|M~Ox&!2yPfTn)={d@hr-#`EU4p90fz>J~+=oo+i0%`d3@9*!wzk#ZO z2WQUEDXOGe*gO;$t?-?1~^z5 zels!xNuY7SApXOk^arFAjDSu82p~p=WCoxfknArIdOZOgs+`19}IpFa%0{xSUi1L7diFBr+f01$veIX40Tgn<}np4MoMn3N`o$god9 zrkzn;+j{#q5F}xeh49xZuI$05IKi0v3Lq917Le*!UxBJYN`Vr8|1$jj50VD5fvSOw z-(ZF~46zx($8#~-kUKOh9u19TNY0I~dG z`1hBA5y<}g_y4cI3}({*g*gAq^Z#dL_#dnH|JmpNJMaAe2etv|3x;0|00G4G>kr86 zzYquf`+xk=e@^EAQat}9xc>97{@;He<|?3qzo3u+2q2a}APrzwf*tnl_y6c6m z5?7266~G|=0}2mdsDK;{bP_-SF*1~XW%vY(NDyK`u#uw~6h{mUJPZH<1^~BhckWKq{Jk|L6Yw|Nrm*vcLXk{sL#*k)f0!)jRF?KX6FHLLC_7zyJOQ#RJf}AnqSv4E_E0 z_d>^cfB<4-C}v>z1dGUDNRj#r9OZBkNc8hC00bBS^Nnc?6(4BA00000NkvXXu0mjf DM=x{`~^7feaw| z@9%GBrr%pd7ytr@3Fu&;D>$G0;d%9&ckUlP_FsJLznOpkI<);49~%fU|NOOg<1c>p zU%YI;<@gu?0tjRS1JJ?0e*b^_hvDg;|Nnpg`SWY#%HJzjff!!CzZWj}wP?w&U%!5b zMg95nhXEjfKpOu4{R2W=zZm2}8km@V1qJfIu3a z^ZvQT`ny}__wU`%Fad@Sg!~P3A(#OSI%WR9r+OFw0*K`e1H&7RKZ`vj#ee<&!}=E_ z2M*0Ye}N7Llfc;c2aF@2)L(`#3;+SdxR!w-xR`AxVx?>``QKoX4p z{r>$=Qj`^FFF*h>?mzuiS(feBuYdplGyMPm{~rVab^il$89+1;fd$yvm=2wM1rR`t zfB*hvWMl+7=|4yZ16bGpcem@l{$rO?srZisfXY67`UDU_ED+y9gdmKw*T0{<`x@v9 zlkZkl}Tegi}1FC>)y z`~`;fe+5al?K4jS1P}|@5C%z67NEr6KmWj?{{J^f1u*QH|Ne!BH7L;kfnp0FfEXE= rk23safJY>Z`~zeELt=n*00bBSq*!cC{}>3t00000NkvXXu0mjfg_GrH literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/sy.png b/interface/ispconfig/interface/themes/default/icons/flags/sy.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ce30dcb79b443ebc1615fe4889cc26e2d762b1 GIT binary patch literal 422 zcmV;X0a^ZuP)@|4`Xj5kLT%`al?B=W5I`)SK7Qoo3V-qKd5l^# zgv$taFhBq?zJ2?apPwJU>mjm?jEr~g+yMw6Mj$IKE$!aDd%wZp7Z^YoAQH^_^XK=U zKYvwJR4!h;2oOM^VEz63kEEm|Pzoptl!JgjVAdZn_zMF-#Q*_BG6D!N0MDLEDh$KY Qwg3PC07*qoM6N<$f z|Nj36M1Mf!|33`>e*gaqWCO|HKwFtO#a&sZ0t5gt0M7pel4t!zdFAutyc%F2ByLSib7d z-@iY8{9s{WsjaVha_-{UlG^LGvEO)A^**!$6$1ni3ljqaFhGRYPy6$qf&JG{kKey{ z|N8ae_ixs}{}``bdDhkT?#VOp#VvoBm>H#|fo1~)5aY*A1~#Xrf1jTKgW~`H-wePI z{Ri~aZw6pM{r$!84-_k)u=@Ltg1)Cf2{xiF#iKZ95W~`fDE7~ z|1pDN1{?_>vH!pR*Zxoe2p~qo;+=0k{eVOy5dHe~@Bg1a48OqWACLsaJOfY!7)!uZ dz{3I%U;rfUVNTmRI(Yy9002ovPDHLkV1m_xKPvzL literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tc.png b/interface/ispconfig/interface/themes/default/icons/flags/tc.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc1156bec3389e54d3c5bb8339901773a881e68 GIT binary patch literal 624 zcmV-$0+0QPP)Mt z2Fbqp@bUfi_XiXZ_x%As_WHU2H1hfc9TM^w3-JC0{^0Bg`~MgK0Qv%mWs{6kqN+Cc z+b3Uc-enXLWmi^s_2~6APR{Qy8GilxQ)j#p({t5y7`^LQ4&lw9Z0Ra5^`SSP!?%<&3?fU!$2L%N9{QCa@0Qv%mW$D2m zA^~iFet$Uihac>@UpF6ozx?O#ufL4HfBpRUndtzp5U;>@#TUPR{|1KG4}bt-0)`aO z`@jDF|MM3p^6S^{zdwKf{q+mXVfa4fgq7?27ZxvH%|34Sm*EEk!#{ukVgYLS^A{)$ z3^fq>3urc&4I=;kz4MwgW4X`2zkh%J`Om=vauPrQ0X6*k{pY`=2p7%A_P)?P zUwuVdAkKe=-@h3}_C6p$AOxEwQo+UIeHT5%mg3lYGL;@HP(LjqG0$?6F}(Ht8A z0K*^*BsuTDFa|;zm9Mc;PRcq|KMMBO%8|{GkrU*a2x&r-3HS3`xnqW1|R~39RolBu`vAj19S<{HjoWK z4L}tj8-Qm20eTwfuYbROLyY(bwgDi3SQvf*HG+%>>H*pSauQI_zkmNAP67ugNCPlf z{{97O00g6G8FFbZ~XHln?_bqJeH^V)*lb;YTJ&0)m(r7ytqc06HRil3NF`RsaA107*qo IM6N<$g5!7R+W-In literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tf.png b/interface/ispconfig/interface/themes/default/icons/flags/tf.png new file mode 100644 index 0000000000000000000000000000000000000000..80529a4361941e01d1def5d581bf2847cf99fef6 GIT binary patch literal 527 zcmV+q0`UEbP)KfiwinSYl|od6I(APxT+{=azr6>87_{|pZw{QvzM zh#vfW|M&NwU%!FG-`~IfN=xzq?EwhD!Wi2C0Dv&)|Bp?Zs+hPi0R-LQn75%cY-O8s zAPsw;Q!9X27=Hcx_y6DDzyCn0!4P6RP{Xg^fBpb%_yyDhbQs7f8-Qku33L4cS@IvK z8OZ(n2kOgTzyGb@ek0IRW9ouaN6$P0x*s5bfH4)06qlIj4>;1{Yyp4(0|4dQTo>gF RMrQy3002ovPDHLkV1fdR=hFZH literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tg.png b/interface/ispconfig/interface/themes/default/icons/flags/tg.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa00ad4dface0a9c23744ab451cec0443f187bf GIT binary patch literal 562 zcmV-20?qx2P)@|6mN}b_RwI3=Dr@=ogG+VE_mq7La^(HIVqv%*^=nCj$%1|9}7Uoj(8m`RC6+ zAo~61@1NiQe*Xrt|Nh=Ea}z)Sfi-Y&{FjhmFg0aZxaj}$=L~=U)(L)O`TP6-zu*7= z1Ib@N^zYwqCU)6YF9v`BVgi}{>lcH)J%gU!|J)p)>i@rg^Kt&>WCWsLoQyxgk29dnvBpN5vQb0*LYVQ3gi&tp7jnGyMMp z@*mKbe}4Uk_!#8f-w;8De}5R+mEP<>2M|CkH{LKvi2wQh{WmZi827ytqc0C8?ZF&p#S!~g&Q07*qoM6N<$g49|K A6951J literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/th.png b/interface/ispconfig/interface/themes/default/icons/flags/th.png new file mode 100644 index 0000000000000000000000000000000000000000..dd8ba91719ba641502bc7ffda16c25dc71b2066c GIT binary patch literal 452 zcmV;#0XzPQP)@|4`Xj5kLTn#2^O%5QJf({+!S7KyMr1NSdb0?wsyYS6cNVdko7wub89?$EL;)x)00Ic8;m6; z*ldXL$Yz5{poPB}7`^}m5DPc2nu@9r4=+1782$pC1a=$HjDKJ@i17#P6G=(#Q>V-T z0*LYF&!5c9%>VxV!xcCX0F(uW(%ZLh0Ro8SA3Hl!NeKhQjeq|#{05SL7=Ql;MhF4{ ujRQ&nZP~jQAb=RZqDCa1IEDa#00RK>mSUL#9?hx%0000(5Af|u+{y|g&!S9Ft%(8imf-XR*|Ns8{XO&`< ztN44b9;zJZ^?&~W0*LYB$B#TbJpUo){|D*(`>^x>w|gKB?9z<#wQ%E^n3(S0zYh>V zEO6uD3`W^f29Wmu3`mZF`w$?27#UO<(rVJ~y}I}N&+p%VfB*XP3y6U1Uw^?QNbuL6 zzrX+d{i`Cbal7Zfib@b53s27mx! mU=U|u;Adc9XCM*)1Q-C-v^a{iiydVE0000+lNu{Qmp=|FW6D0*D1<1Ovm9m%kYQ|7p*Yo3ikU z7~kiESLFZv{{Q#iA0zqwf4<*Xu-*CD8$MYncA&8U0mQ`ckKy0n|9}7f|MB&2MbDkQ z1j{KKBL!IA2(Z7F;(zkuBe#mo9TT;SzkoLU{s(jwKmai@{QdX$=kGt?etVi7(p9*e z(|o73K&5wiaQBkXEB9so{`tH8jIplb^d$ZPi5h|uLD4*o5RnOS|{Qd{@Cr~j!0D)}y0}8T#$FHit{lE#dc*g~k_utsL zxj&Wpto`+k?f2h5mv;mM4gK>M6!-uE1hnA~P_?8O+wWh(`!4wX{Cn2j=z=is`~Uxb zzx=@K_DcEUJ7IZAUZAu8{sn~+Kmai^Fsw$4O9qB73=GeJhA}V*Ffg!yW&gnt6F`6g Y0QOrYft$MNbN~PV07*qoM6N<$f;FEW z@b~ZkKS1)&|37~i{`~p>`}cn&^2?@800G1T)Nta$zvt>t<757@uK4@^{4bCmpb7~3 z1tfp{|Md&VW|Wov$G`v(Kp+kO{{26+>+jbuf7A2+upj>Wf7$Q%RxoV1$N0e}Fas1Q1BW)@@rKJa|xATBWA`D>(WW1JFHv zzy7cP0k+{MTm!^O009K@!>LoJmn~avX#S_9;5YZ-KmTX``u`YaHjD&?*dJiPF#rS* zNW;&cKP?=87yABYZ~OCq-%n(9P{tpi22h9t6$1niNQ1e-pD1xDrvBdy@BT2zfI@>2 zY$OAO1fsuxAqeOsfB<52Wnfst00RHO2+qJn5C9Nh04p0wT74^6IRF3v07*qoM6N<$ Ef~oTCkN^Mx literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tm.png b/interface/ispconfig/interface/themes/default/icons/flags/tm.png new file mode 100644 index 0000000000000000000000000000000000000000..828020ecd0f6fc73348373c9e7a235fdced09de7 GIT binary patch literal 593 zcmV-X0VKiqu&g@GZ_kb&V31Gky(*8`UselaloV1SZ886W^4001!n&i@1e004Y* zk0R&!|NaLC5DIk$@CyeC@AU9ebDYiJ)zswL{Qdm<{`>p<{rmm%TMiuO{1voVt6d+$)WVk%^O){nwx0zkdJv^%rQ#Z=eQ%0Ac}Z`19}Y zkI%oqe*ekA`2WvehFzDBOo*xZ{rB(cQ`_&qdGhP`Z=jyvAOx}jAb?nae){+CFDvWc zZ(siLa{c@D=g;LQw^HX+sY@u`d-M3!$G1SGAWQ!Ifj9{ufLMTG0<_`#=U?|Ye)D|< z8pH7G?=PVA*@stt1I-4xpA0e#40jk9 f${7d%fB*vk3(!F(w2U8u00000NkvXXu0mjf+94t7 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tn.png b/interface/ispconfig/interface/themes/default/icons/flags/tn.png new file mode 100644 index 0000000000000000000000000000000000000000..183cdd3dc98c6957bde83f375a431e543a3ce9e4 GIT binary patch literal 495 zcmV@|4`Xj5kLT%gT|L_r@28Q3iff@h;hzaCwplYy<4FCT9KXmB7 zhQ|Nt)Bg(#gN*m^{Qvt8$Of<_K(zn?!~}BDpT8hi0uj&>pxItt|NHv>A2{&e(C|Mm zFGw7s;m;qS=>P!)((wQ9AF!W(0sZ}7M&|#9_5TYB{zpfHZ20g2t^wjCfB*tH2_nSs z8?4R7=Kq6S{f9wP5^T(0hI#XVIvK%6GC)WrB}fdh6SO{nUiXv3iAlW}aH!uJM5J&?vILH{_iZHeP0c!XQ3PuJ7 zfB*t%VEX-sK~fTI%wL8-Af1e0BN-qh5dHlNK|sX-0mS$fH6j^sMDRaYQUC}r0RA0L U-~OCsp8x;=07*qoM6N<$f)6&Rz5oCK literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tr.png b/interface/ispconfig/interface/themes/default/icons/flags/tr.png new file mode 100644 index 0000000000000000000000000000000000000000..be32f77e9910c0896c1ee8e7ed4f0edf815a517e GIT binary patch literal 492 zcmV@|4`Xj5kLT%yy% zCxE~j7#aURc>+`lQtjr(@bBOM9XtMi`UFz<>-YcPzyAOF1!ObI$^vZw2q2J#|6qeb zs-vSBOie-Rl$HN?bb!_U0_g#3VEFwTr~x2=m_Y6Zss`GqsL0^t^nd#F|4B*zH*EO- z_3QuT%m4H6g6)A?0#pkSKujPf{rCwIb#eU5`( z{s2t}2q2J#|9}60{Pg58FvR|AYlEDjruP5RC6KEgJ^H_IA4CJhNdN)F0>q49OBog~ z{?Etvzo-c07$As@{Qu?4|3!FoS~(Xu$ujuK&Ki|5;f$7pYF;Nfxh(xqFs zZUMDjzjMbfEbRY>5C0Dx`v3aP|JSeozj_5kj66I)?%V+g05Jg0{{w&k0RJ5w0P^!X zSy|WJ-R9=z(aMV97z{4myy=pj4$^bx3|zy{hYtY)h`Ao9!QA5iyLbPuTmkB_PfP?Vee~$j z!-o&gUAyj)n+wu&>J&%=KmU)%j{yP*q=CWA45Z=rFNTYkfO?!$Q_o+&{s0WlT)E;? zRQUhj|NkdWF!J+%fBF<4fS7B68jOwqzkLe|6QI@S&;S4b-#s()-1Y1C!Qjl5tA6F> zpisYc>&x@!00G2Y!@$5~Xb92(47=Z8{{bD%z~Ggi4>bPny?b}>+&OjWQc!g@0~6Et z-Maw-h`Ac5K~JB7o9jOp7XvpB0}lu>-nqlT$mpA&|LpDCZ{NOs`t<42?c44-IbZwx z0Rjj;B7x{N1H(%OhUW|nPgz+XA3Vr_1a9x%4G>@ep<^{rq?UTJ00000NkvXXu0mjf Doa;3l literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/tv.png b/interface/ispconfig/interface/themes/default/icons/flags/tv.png new file mode 100644 index 0000000000000000000000000000000000000000..28274c5fb40e5d3bacd7c05d9a1b8017eeaffa6c GIT binary patch literal 536 zcmV+z0_XjSP)mzpv3Mmw05Sgm{~xFtLc$sUu>nR##!sI<0R#{WMEdpj-yJ7j ze)|0V&%b{_!~X#7`1>EofS_N0|E)GoUH&SsFy}2m05O4F@}ffYb$qvjbfSUipMQUU zgY^9U_4m&&5D8KZ)HC5u^uad<48Q&W1P~L@hOIAb7eDp_T4W)^*Xg48{r4ZBJ-_}k z{QCPJq~Q-pPnz693xQJ%zkUG(5aZwHtqd&u|9`*u&+TyOvq{_Ghd=&6oB?#w{~Yv(xYPgr|NRH*haKioowt*& z{dC`3v>70P7=Ql!$;`|Q@(GT>fdHT^FqGcDeG3pkjNS|k>E&sEfzAeo{ckY&=g(gd z`CCrwmxA8!XLtTy-uM6CzrVnM%iVPzAb=R%ks=j>et^j`MFs;Wh8c4i)_^1XKP)u> a1Q-A&>r+tW$-Nl>0000<~s!0-E7R}a|Ns2?4|9|}gs%Dgx1=;`*KrBFO{{8#+``2Fv2B6@-@8AFY{`(K80jdYk13&NH4;SYnOGgJvc0I@K9VW@Vk1}Xmk4~YK$|NH0P z-@pI<0D+Rop8&DnA}oIvEc_iD{O9-Y-=|4+U?1uFgf@9*z_zyJRJ z%fS3QR^zuR^Y0tyerNXndi(YlP_?gzto2+5fB<3vIsj-gQ0X6_*?&Q*d^>boB3^zoi8Kq^tbl{qlR!{9jwQ|Nij< z=(=A?F~8j-MSe1{Hl8Yc@zaXo%Ljk}VgUvb(2HJbe?0kqy?_3vsPXrUmq2rWE6M!I zE@4*I;Mw}vw&7&iFGdC>zW)rr{s9CK3xfnhrsi*1wqMhx{@J=6sPgxpU%z6)f4fBr zzxpd#a3tyYE8}0lKnA+|-+zWbe*glA<)R0}-=}{Pnt#7~1q_Mb;=;f3i~oshNgsS> zIr~z~(_bRL|NZ|1LO_>;A_pLVSoBpHQd9nLa7ao@{lMMx#__lBLe9Cjx?EiU z71{s)`Oon8FXP|;z>s7BItd_v7-5mj(Adb}701wVj$!S*>kNN{fN~5FV)t0eYh-DxnQ(+0I@JIfmA>F`X8wD?>`2h#NWRRzyE`zA&Pzh5tt#% z!^rUCA3y+sZ1@LM1hf`pHc0ia|NsB|1uKPX0CRu;1-SztfLMSo`wOxir1}rsY$VlC z667idh7Sw?0mQ-}a!Q0#;n&}vAb0=!_Zy@WNd5!6=O2ju7s{65Vq=gx0uVrqe;+b1 z$mIY3|KLBvF9x7j{{!v#g_UGtQhI;<6hHv607H@yECdWlR7EJN!LomVp$!l~APvkQ z4p0cL2#YobhQA>6hXEjfKpL3-19eKmL_s!=;22W8vpXP)6RGKQPvx1q)UK1Q6rb{|u}Q zRsa7#{m<~1f#L7}|GzNK{&HxZVEKJ4>jAefr9{u_M=MTegAo-i2ynN}MJ5kZm z42KRel$J95{>|{~*Z<$Y8RdVo9Ap3pAeIsa2H!t_KmPs=bot-kKnMR0GBy2s>sC=w zQFmwO;@`jj{`v(%zkl=p`BTQg01!Yd{Xp;j{qx|@pI^U!0X_En_iwRd$6{h)tX8f( zaOhC?&!0e%U%!3phy1#1%V=eK#YHXK~n$!{#(ib5I~Gyfqpu4^P)1J@ZrOUii!$=0Ad7ci1(2A^!3kwFaT->5i7Ttz54h6XL$JkA3s3o z=g)t?e>01U3h&zo5I`(I-#Hr#t~u}$WXZu-Kyv1Rm&rE5wcB1YFI@@=0EYkn8G$4- z^Xb{M0Ro8S57@^*QJ}#<$Im$M^4iKw z00a=@`Sa(sw6y;I{R{T)e~6KA2AmBHF`#D(ii!XNh(#nN}rF)(}plRy9vU;su%e@J`J?dSji002ov JPDHLkV1n4Y8}|SJ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/us.png b/interface/ispconfig/interface/themes/default/icons/flags/us.png new file mode 100644 index 0000000000000000000000000000000000000000..10f451fe85c41c6c9a06d543a57114ae2f87ecc1 GIT binary patch literal 609 zcmV-n0-pVeP){qW|y?pud`Sa)3|NY&vWd%S0u>b>P!2!lUe;6EF*#G_c zFVXVt@6Q{uX@40W{p0iY2Aa+A^Cu7i8KT+YH}2j52q4BskM2rJ$^k9;2Xxc_|Np=M z&VaLlA*IO5FlECMfB<5VUNC{tBZO(|zW*;@GJN;|bTJ71`0*d;`d`2P!x=ymOA`2> z+y@9C##^^8%gd{MW@Y91_2d742B2~OQNf=-zkmD?Vqkdk_wPTUNeuu2#KPTG{_;O4 v7C%8E5*DLB7#Kb?Fnj}}-(W6879hX?8lYRg`Y`<~00000NkvXXu0mjfD6Jtx literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/uy.png b/interface/ispconfig/interface/themes/default/icons/flags/uy.png new file mode 100644 index 0000000000000000000000000000000000000000..31d948a067fe02d067a8c2e69f28cca446bc7c57 GIT binary patch literal 532 zcmV+v0_**WP)_vmzq~N}&z08z z0*LYY{pZr+B0$d}2MCnI@DC;m3N;oM#uMkR0R#{ugY)L9Y<*xj0QCR^`!^)W!R$Za z5CobHbl5+T3;%B|S`QFFjQ1Zt|MTw;G#Vi+hCg5i(ELAtfD|ak8UBG;ObiSF0R{lf Wla#5zB1?M!0000JMe1P}`Y1HZufM;3|NZsr4^XwNEI-g5fB<4iWtjhPj`qjL zFGT_P{{Q>;-(R370Ro7T!5$Ws$Po%5A+Zb!3j_cNFaSC{Z(fWD@s$7o002ovPDHLk FV1jsy^u+)G literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/va.png b/interface/ispconfig/interface/themes/default/icons/flags/va.png new file mode 100644 index 0000000000000000000000000000000000000000..b31eaf225d6fd770e0557c2baf8747c91ce88983 GIT binary patch literal 553 zcmV+^0@nSBP)|05Jg_ z#sD@3Z1&&(|Ni{{_Zx)%v%Gr!NnLzkb;C z@#QWhJ{xI9$+*)bNX$S?E90e{K^EMkYok78VXhR-hjM0*K`g z$j^Tmm_>oEVgxdn{xJOg$-v0L$jHRN$OsH@P9Y&+^ne@=1^@xXcy~X;zaPM$WdOPj ri2i^{AeYDB@IM9-1r;P))4B5XW#s0WPsWLbObPT z00IbN14#96puqp%TKvBf)PA*{`~CO-uM~~n%6z|m{re4Z55!3T0R+GV5`UO(`=kK4te?c|?1P~}#f$jmC10=!0@{8gBFK@Zu z-~WJALqveC|MTzfA7GIDVE_mqkOrW8BqZ2?K4D^#WMJTBVE7%b47BbKBg1c?EHl#| zW&XdQF#ikE01!Zo3=CVrargu%_x5NZPzVyc@Ms2-@*Gr#1lu5DU{kh6%sopXB}uDxAo`@Bt_a*7F+) z{Q{%kjEu5C8vp``Wse8Lf5q7h438n|z~nEOsZga5l7ZnjPy;{!05Jg0{{a91!FF~d z;^O)I`~dv>{`>s@o}L{E2?GEB|Mm6!N=n`P`~Ld+{`>p?A0G$7!M*~B3FM_eAU;q6 zNCH*w+4I@c^Ny?Q?QPpWZQiU1R1HBuWkA0H1P}`l|NYDG=gP=Ihyj(0CItil0R{kn^jdV2 S*Eqib00003_-&c2+@O*Bba;fM%rBo$$qwJnuekcf#0k*RG7MM`2+5Y7dK4k?R% z*@ue~6f;u_A~T0evP6qS=VxXnGS_mt>CSmS&gmG`kLSL)e_Vf_=c&!fKB7`4C;*C(7s2O*P zOs1$U0urzb3<=a`d9ABG4Q$eK<6~5Cg~V%B8`UqrfRSN8f&?QTVICs^VT=&p*?Eut zt4Ur&-BL_ON(Z|Xfgo93lf|gRkT$Mz-7^OQoD^XMF@}g>R?uoU0094KbXv)l?aF0E zh@GXQVr04m@05R(Rjxq*p|CCIRfv;QJmH1kf!hsqX*sha?_l;f%e5i5I~4YG#H4;6sPG2&U~bv( zNr`eMXGIX9?wP^zPQP(6+&$05Jg0{{;N}{t6CR|M}we`P%>f+X)5&j)Fc04NUj< zI`HZ2Woe@k6UF22`V|Qe2MTi(6bb?WF#yj00*Hv<{QLmnFd+P z9@fS%;@9^E|H1b5`Vk8^2@Yw;#}(}C_yUN9iGkt%y>Cxm>T2lO13mifZBc!n`jhHL z!MK>$6Z_d%|GfHMapIVnqod%T-`{|q1_&S~IR%b4Z+;63vi@iI?>jBz=eJjkjQ{>J z{QUQa@gMhBW_GSe5B=V~`@+h~@c%z3lmG&V@$K8U{QUg?|NjRX|KX9x@@rf{MxIY^ z?fG>3gQ&3ruaE-Yw>fW_PfAH~0~Or8dmA8tSRg?T(ZDLQOiOw%6RWM9%$i>kkAMHu z-oH0qLBYb*loP0ck&zJ?LI42-(g0BnBsn<*tTlsx%zxbLe*S!R<%*E3>|Z7(9Y#iG zpdch>0Ro8e`Sa&!arp;m4%k`<1H=Xjf<=G;Aix0Vb{`Xo7A9K&0000@|4`Xj5kLT%B_22*h{r-RE_y1qN|Ns8=|JN^|IHRmA&<212VgZ}|A4N4# z+WpUe-rxU^{Q|504bi~x`!`SnKmf4-F(Xhl(8fQ1fG+vp^85d{-~aW0|NsB{f9tRR zg1`PJA~XO^2M8drlm7gLxRT-bpa1p0|1bLmQVm3Azy5pw{{IQ;B%q-{(*XjA3FM@| zf53hMJK)W)|CK-uK=ku}!>|93eu7kk5yVLV0R(o^Z;+)RSAk6exg_KF|98LtFaPy_ z#c#OrKtum9FaQJ)NCPuC$bbfbRI>n`@$3IHusZAC|2cmD|MKhqAD{+Mr~sV<5I`Ue zOuzpyNJ@f@0s0=KlTj9AB*>SXe;D}wK*A7+fQkVEi190GMB<5K2mlB$03I1qT8uIj Q5C8xG07*qoM6N<$f}XY6qW}N^ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/vu.png b/interface/ispconfig/interface/themes/default/icons/flags/vu.png new file mode 100644 index 0000000000000000000000000000000000000000..b3397bc63d718b344e604266259134e653925c9d GIT binary patch literal 604 zcmV-i0;BzjP)7(YpZ_rO%ce~L0mQ<@*ghnz= zZvXM=_iyVze?clB=ogUu_5ar|Ae&KE_8$WSKmaiTHT?Vg|MaE5OE>+VAUAUr;?j4FCZIvLVX%uQ>mocOU*NTK^}%njy93_oP3+fBpUa=kKpye|`ZO zzyE?r`Mc+5Xcyo_v6>E-#|Nl{r(LkAS94bRQz)6 z1Oq?-fi&zp{`>yDUnV+0)eJF{zWfaN_0t9DjNiZhfxY|}ME?2z=O_CghC>Vh0R+AWw znBTkss=gWN$ME*Y`(NAt{QjkN;J}02MB(&;Kdc-80mKB<@b~YZKMV}g5wYSaSzrGC z<#lj=zkTD+H$ND}dANT6R9Lq3!_gzJFJEF25d}I4Ab>y`n3$OVE?Nk3?w(!me*OA# z|pNg&$Q z5()=&no#y6=Krof_F9Achf)A{nF9v;`|P8;$Q9J(&$2e@kA>cu?oN0tdr?p!r`I00M}SAs-l}3=F@( m=nn?tAB_7COfoP41Q-C;+8YpPdg;0V0000`!~0W%8&aG{{H+4 zRPp!M??1nPG5q=k)Wabw3seITKp+kO{xLwc{r>&$?_UrCGJgGL;^k4Qujka#`tk7L zjnovNAkb9+0R(gvNCCu>f4~1QF);xde}DY=^Xr#I=|`5hhp|NZyp>({@(egUPqbabS$v+tIbNu;L>xVSv%=>ggR z5I`*V_U`A@(fj`3!N1?XfHr^}17rYw{OcFcC69Z0BvMmfELgy8V88%&5l9HrLN(5b9xs8l&q^Gm-@&XkD1Q1BW|346ee?wJ+H2_`p`^l3V z+1Wtu|3AMO{`_T8Q2{Cj2q2bUARGR$NlJo(=nv2bFrDDw2U!bb{QV0-KNuJQ0*G-b s1H(6@xcrC2{sj~H2V-zBFaQJ?0G2^Lae{Q+uK)l507*qoM6N<$f;6K8u>b%7 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/ws.png b/interface/ispconfig/interface/themes/default/icons/flags/ws.png new file mode 100644 index 0000000000000000000000000000000000000000..c16950802ea95b40a4e024be6cce870b1991f40e GIT binary patch literal 476 zcmV<20VDp2P)>E69JA<-5ee*C|6>(%ey48MQ<`3*E1sOaY}WDP*a00a=wNxxYB{9yb2 zOU?HFZD2h;3gJl2w`NO~f5I`Ue%-|qnfGfh(_6MlpFT>xzKtBKk z5J&^l?>`KZl3-*0GW-GQWCR<@03m_s?_UT4Dh3E3#;>Rm$$$~H$WlN65MTgr(_Ikn S3@&c~00004%P)h=Z!r1m*T3JtfNUmdS)dI70mLHE z+xy?%p5eHez0mS(A>sL-rPOy{yGk_s3 zz{tq>=+Ps90Al&~?;k`pNCN|I|RMxbJV00L=%3E(v!XamT}{{RArWx|9$7Z{pWi2U{IKN}lRCnF;x&=P&!(V3Rv&T;|GP6K500a;d#1A^U zy8js%fB*jT=jRXRU*A|5K#2L*r(ZvQ{P_O!=da%umKG4l0|XG%NkAKznV4BvSbj4y zawHV~fBoj~uiyXJSQwZYIoR0QIXM3O{tc7`Dgy{0# literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/za.png b/interface/ispconfig/interface/themes/default/icons/flags/za.png new file mode 100644 index 0000000000000000000000000000000000000000..57c58e2119f402072640ca758657798b621f3fb1 GIT binary patch literal 642 zcmV-|0)737P)Cfuwe;F7c=r;qyPX>nX3=Cfx7(O#Fd}LsF&%p4OfdL?Z7#j~W z{9>KL@b8bfkaUokt?1q(EJu$q{Qdp^&mV?AfBydlG2rBvO`8A$h{fmzgIW0J+B07s zK74uV#pQB`MAdI!SdN|k|KJ`--LK#OfB*Xb>lcvCC@cGqfdL=@05Jg0{{a910Lj6A zAt&mC*9zzO1pWQ@b1`Tn1`iV6=KuBe|Nj2}{{8>`{{Q~|0SOB6tE&PCq@k>=Oh@B| zgDu0v2b@p;u)h2C^Y4EK4rY$O|Ni{`3qc?^$?%A8m^2X}fLMSU{`~p7aqHLD@0rW| zzIWc|c>Ry-$DePXKfn0(_xG>AzksTL{re5n#{Tyw!wUw000L?F`}dEV6O*(3zu6Di z9{gne@#pKG|NpqSh1vf81DXBz&mW+Me}8zmL>PD&00Ic4!QY)xLzl7RCikV!EWdtz zoorLj&BXoYF88-DfB*gk`{Eza7yo#;S!C4G00M|*elvr*8B6X-zBgb0FtGkEHc8mM zoOScs_b*;Q0~!ksq<=swfJjA!^Ww!_00G4E&x@hvA~zQkvxU59n3VsHd7Nj?ec|R~ zkmuqAx#JHo0{#K*`TG}00$uYDAb=PdGJ(Ek5Vx?d6PS=4{E7kSFNS|$^b5xL14ayB ck_{lh0N_F{UmK66LjV8(07*qoM6N<$f>aVd=Kufz literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/flags/zm.png b/interface/ispconfig/interface/themes/default/icons/flags/zm.png new file mode 100644 index 0000000000000000000000000000000000000000..c25b07beef894408ae11c3be294d6e0eeb28c0bb GIT binary patch literal 500 zcmVLz(k0+Rp#|Nr~{@4x^5fB>iy$Oe)U zA3pkg`SAPSuU~)vaR2(F*|!oPfLI`Azxw(Lr25~#KmY#x{rl(7|GyyW-|wp|{||Bf z=)Cuc_0O*fYWnY`7ytr@1!(pEfB(To0uBE22c#NA{{8#+_rKq)zyAFG`zKdY6euFW z2yzlY0I`6SGJqWbGV%`;{r&ytA5hcp-u`P`AAdOg`t|1D?}h2=^+y>10tjRS&?yMj zfBygt2HEouXg1LCzyJLD1w#LR1MLR}1V8|>0KE@nffPa916Bvu_V4#Epof105yNkw zzknJ50tl=DS->P)FK#X6%e&u3i|I74$@9uP0*YE!se={)r{r~?r68Z&3 zzZn^2KYiK`5I`&p3=IF7JHD>uaSofgtUAf*-w!6nU;qF7`S<(x|35&+uYZ4j|Njjl zS;T)|pU40ZKrEjoRWbQ1@P?oGFzcPCjLiCzcU8ZC{rmejNW<@6e}U*1kPT$~=Kk_~ z83O}A05QHjx|ikdd7h}_|NsB_wl9j+&d<}^`}fbEzkmP!1q4tEL@O#P9zA*#Ab?m{ zv`qe9Isj6Ah@Z*IdsTw}WYHgB8-D!*lmGvK*?)d>i2vThzyJ_HEdLn(@uk-N0|t-& z`$Yv&?#y3UfPVP*`ya#a|BS!>G5-DsFR)1c1&eHCHYDzO7ytqc0P0;>l>h9)WB>pF M07*qoM6N<$g71PE`~Uy| literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/accept.png b/interface/ispconfig/interface/themes/default/icons/x12/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..8ffc7273bb351f087cd08688dd32eb501f992406 GIT binary patch literal 3071 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≪iJsV%m859cDE2>LXU>WT3dV?z(J*E=JJJSj^jL#QvL#v0FLAIX`#?uZ}M{d zSU67M@HhZrPu<@rWT)O`)<&#iaa;(ImbPv8XrcD`q2XbD<3Qt8W)HKnhXMqB9tO{z zVraM{o?2O+H?3kq6+)ftO(yj9lE%aL+x#(WG;NptnoX^7$eV8kJ{LpuCKI|4>ZGbi zBcq;0l#%o8 z_$5paL^&7p@%np_pGK8@!%HyWi%10p$8~XCmvBIE?M#q?(?Rq$505_>JpHtbM<}@N z5ef=wsa!Q;{w7jYm|o1X{=1Cc=Hby=o+lp-nuiV@EfU?=pj56JYHr6^aIGyyFX|LZ zP3|scxwn*MZY@uxZsRx(H!gJIT3h6Hj0M$k-Pv?zHP^3Kn7-bFR25!)-J{vGi3Ppf zzS>Q{ULl=X%{i_+E2Wg1mQ}iyO0CTGB@^*WH&3utmH?a#*eLtkq*AL{%PNgaDK{m6 z5F%}wR{!$zmlLth@K{^GuK{e7tLERG|7-jk0MO#>o?FuJ3IG5A07*qoM6N<$f>uB| ASO5S3 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/accept_green.png b/interface/ispconfig/interface/themes/default/icons/x12/accept_green.png new file mode 100644 index 0000000000000000000000000000000000000000..27066192a8eeed27b2930bf169b929e7bfe66504 GIT binary patch literal 3144 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 LNkvXXu0mjfaQo|t literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/arrow_2_right_round.png b/interface/ispconfig/interface/themes/default/icons/x12/arrow_2_right_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d261b87a854886dad43b40b2a4f0075339e62a14 GIT binary patch literal 3289 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/arrow_right_blue_round.png b/interface/ispconfig/interface/themes/default/icons/x12/arrow_right_blue_round.png new file mode 100644 index 0000000000000000000000000000000000000000..bd0e72a9763aaf439364db3e161e4eb907273e30 GIT binary patch literal 3306 zcmVEWKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00067NklTj>k& zG*!C`fOx>_?o|89J+uB?=%v#1TgnxNFo6&Y^5#AI_^azjsE+0nA=9kgtb+N=wJ<51CqY2?(_G`(+ zd>}T=$8Se;&Rrf{8{qkLis`X1!t-cb4x8VP2*ifbl8JeLUpSP|tsv!^g{Ksjtr(33 zc{Y{g#T|{Yivda}XXsXtzHlfZefUty!?s;KKq-%Z9M{9P73a1>DGwh$WW9M-xf1GJ z>JLfunnh5+Ud7_=PKCl=gI337BpyNwb@V+`Ey&bri1(I#1s3^Wp0W zr)?WN#og;ElzE6=u59>SrB?IBZGCF6#iN-t)rQUQlQ!J~277}%o*7|MYmqN*>#kC( zQcAgRn)Qdd+}7GeHj}(<+cw@v%V;$+?N1Ch`eE#lbfGDFAb*R o3;p5lD8O#>%=lCOzsBDI0M~r-qpn@n)c^nh07*qoM6N<$f}!p)TL1t6 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/article.png b/interface/ispconfig/interface/themes/default/icons/x12/article.png new file mode 100644 index 0000000000000000000000000000000000000000..fe05910d4b445e9753f351574bcafff15745e292 GIT binary patch literal 3023 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 R?p^=@002ovPDHLkV1mNEn56&! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/article_text.png b/interface/ispconfig/interface/themes/default/icons/x12/article_text.png new file mode 100644 index 0000000000000000000000000000000000000000..fd89c6416a01a7954ff37a9f6301866dd74f8c29 GIT binary patch literal 2962 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/cancel_round.png b/interface/ispconfig/interface/themes/default/icons/x12/cancel_round.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6e6cdcfedcac7474820734bc9c8c79c17d67d9 GIT binary patch literal 3285 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/download.png b/interface/ispconfig/interface/themes/default/icons/x12/download.png new file mode 100644 index 0000000000000000000000000000000000000000..41f8c15b8664ee650a64e6d7040dc7bd8c166492 GIT binary patch literal 3145 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/envelope.png b/interface/ispconfig/interface/themes/default/icons/x12/envelope.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3f9a52de5072f4435e64371f20dc89a5c27e44 GIT binary patch literal 2942 zcmV-^3xV{BP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0001)NklKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0005UNklcNK9F6dcs9E`n5|Td0ICT?!ebZcZUhXexxnhb{T{eh#)p z(GSjcJ`TsOR;wfu30kcdCnqNn+qNGlrD7s7rGU1PajrU!6W-t7Cm0M83Wdn$^VDiJJkKMW&Ek1pwAbrh zvXjYVb2giOpP!$<(QdanIyxc{2r!vUroQh_c6WDmyWM7IXJ@O|>%CQ#N(CTjjAx9E$e=r!_b6vOF@AvNmTfl4Jhdw?1b2J(~T3A^4w7k4*HJi;Zz$;(^d<3R| z0NANi3IGxL23(FrB5@J98I48{78e&84u}4DJm!qE1(Z@ur_-l_K%lU?x_Z~P?R8@e zolXbO^UzxVEu8XIMBW@9A8&}rJ77DP%ON7?1&e=qAtDFB6CkLy#&MkU{7>irkAW3n eT}1dZzXkwP(Yy;MKghEH0000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0005VNkl6vpxY`*C&Dxtd~3Ws68<9D|UV z*|aI5c0rJ)v|;ZE!wnc6G60V(XNT0kcyUw%8Gj5}LeYsSwr1lN;Ul>2;zI-)1_~PA{N5ESRoCEUOG$zs`hx^mRLuAu^ zZ8I~oJxi6C0GE?TbM9wvd8$(NpQ?N=H!ZQJiJN_XVn4gOyD+kYY$nC~xp``_;?T$d z4tBWFXpX9EE`3&z?TTB*{%qt{~8tzK1o_}lmR_{|j8{qU+%^&kqv z2XP#g5{X0zw7z5!kFC&WQ|8AhO!JEB(SdJV0?}C%BF0*a5CTa{6r*lBgmFfGKYq}7 z44Qem#U=m}gT%BpYiyh00000NkvXXu0mjfmBJ3E literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/flag_green.png b/interface/ispconfig/interface/themes/default/icons/x12/flag_green.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e4e1956fa3215e0f72f58c6dfb282bb06add4a GIT binary patch literal 3242 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/flag_orange.png b/interface/ispconfig/interface/themes/default/icons/x12/flag_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..b771e850daf74416e67c2aad8af0e0c45eeb6e58 GIT binary patch literal 3235 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 VuBx(G-su1U002ovPDHLkV1kAD2FL&a literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/flag_red.png b/interface/ispconfig/interface/themes/default/icons/x12/flag_red.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1c7c1f3cf39600d27116c4b5e1772fa232fcba GIT binary patch literal 3260 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 vT3fiTLTiQVs{aO?zZl* literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/folder.png b/interface/ispconfig/interface/themes/default/icons/x12/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..f198233736c23c2f4ab423e1231daf07ce2a2e8f GIT binary patch literal 3049 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/link.png b/interface/ispconfig/interface/themes/default/icons/x12/link.png new file mode 100644 index 0000000000000000000000000000000000000000..873905db8cba4933c15c79a673a747596d7dd029 GIT binary patch literal 2956 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 z008P>0026e000+nl3&F}0001|NklK literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/lock.png b/interface/ispconfig/interface/themes/default/icons/x12/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..b923a8f930e41e60c6973b91423ca86a51a0d71d GIT binary patch literal 3000 zcmV;p3rF;cP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0002fNklYlm8Jl26 u*Si6l(-DAm3eD-#S=<8WpID3@{Wk!AQ%$3bT)V>n0000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0005HNkl3dB6x{0S?xLF!GK(nUC_1|eRXet{Bv)vQ6&$pcO1;Z{$>sjNpF=f7@PTLi z@xVi!P6y09&t>`GM5D2&wMH^Z^L}{vRw@0Ei1siM#mpBS$9d=bmu6b63s6oKW-!3& z+WOK~Z{sqoT?Enhzd)2_`N;SEnT3Tbn6A~px{71<2CiPehO@JC^F>kIn_Lj}M*W7@ znnMb}WI&PuheIIBfz#(aRI1arEwdg2tt%kyU{nBk38WUt85rgOO9x8pnuQf(FdPh$ zpT9yd0T~~myaWmW{U}5>N&+I0kAaEf7n>XF7^Vy;pcDXCfViJx|8oyqq&*=7k6%(s zb#}KmXOk?ub?VG{$m(&#aflzgTUcFr52f@{v)NpeQoga)LV@T2uy?+02Y0`H*}17J z&dDNAcRnmHAAJ0@a^Lg3nh@fZ>$*Zp`C1(fkKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00013NklJg3m-NFb4yCnf4j` b!4LNUcyJ}$u|znr00000NkvXXu0mjf%05!S literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/minus_round.png b/interface/ispconfig/interface/themes/default/icons/x12/minus_round.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5d7beaa77228b2366b8d73a472a99255983cf7 GIT binary patch literal 3274 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 Y00iV6J)QtHZ~y=R07*qoM6N<$f~BiYl>h($ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/pencil.png b/interface/ispconfig/interface/themes/default/icons/x12/pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..c878aec61a1709c1d054d81409a02cb014aa38b3 GIT binary patch literal 3095 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/pictures.png b/interface/ispconfig/interface/themes/default/icons/x12/pictures.png new file mode 100644 index 0000000000000000000000000000000000000000..d72fcc456aef479d87574d807cae9df65cac43e4 GIT binary patch literal 3026 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 Am;e9( literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/question_blue.png b/interface/ispconfig/interface/themes/default/icons/x12/question_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..2e928844ca8f591ae210abcae8f72588321fc9cf GIT binary patch literal 3314 zcmVKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0006FNkl#H0Knnj-ThlA7AUQ~Qo$5R7#tkL z#E{rpA|$$4Lt=<=BTmBL;>0&F!PS+)gc#yNiqchMZjJQ-1YTndvDG@ zpW%@f7Z(ArZF^Wzl(~2;`mp;#APi7zoa=?+$!o`PUJ4<80|)@eaVEljeM{-o%^}~# z1f_N-09XC3F6%V^?Bl2H2S&L(t0>Brux)!J+!tEDm&wF;YY}$78u;Y~whOhkM{0DG zOeQjv&8{x%MmZ@IMV?QmlJRXl#Jg`A3sW&Vgap88!{)`NhBKy;P9@{nx9jsF9#dz0 zkpycWN|a5DS376q^%iPS@H{if<&eUg-6GfSB#6h<8M!AIPzy~zrD~IA+h%jG0-ne0 zjR;5OHpk@_C)Fl}rk|c*Kot@auIpi0E{^LWdlFA?#qfZI)k6;S79Bnr*Y%K)5S6-F zx)Nv&_68J=&MbnR3hUo>zWixWtXa68huY&K9%yk;H%oFsE3LT3A=6|1oVOi>9CIrg{EE2qE?jqw*-1%Pvi%l0)P72gp|yWEm1c2dc;9a-Z{tQJED&>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00036Nklf=9o2N$rLTR_av>vwa zgTCLAZdkjGPxT?$u7g!{foU-Q(%Q?*?zZIpK!`yjt=5K9{Y z%flUM>ExuvY`eD>?_1=gW9Kn5ymL^2#>15XoLyB~&y$B3ttaik@ozm0JKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00039NklBssg$f@9B;V8 z9**(kpI3zj)W>heFv=)l9baidrc%<1ZnR?%c_e`!ViM13K@J}&lOZglGxAG};YBzd zU_VH`k@sUW1bs1H?O%sV%Ka4^SinyZCjy(nT7n`jg4~FCY@-HqxDCNHni9-nAZ9-a za1<+e#}X=NLm@#H9k{{>PD3;m+dINz)Cx%)>IP@{#$p^Xhe8l{BlaXQPIbh5i0^~Y v6`L$a-jZMkpE$=u0OhDKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0005)NklX5frkbLpucFZs8^R7e;h3kPdbbOE1ah!Y(PKo{GE(rb8u^u}$~B3a$;F zcXqH#r|;!^{4}N0X#kW`Jwk}FjxK*fcX`?XYE`>(Sla*SIL=!sf)XxfdTXO*sv_(@@<2rO+?> z>F-I=9!~}`naqrBRic`viPTUuW}40fj)?^8J0ho3JodCyQZW@?&9X`SBg z(U7kSTa!?$LM{xse&~Gz;Ym=!=i`qnY8(kUzXMh6sX5q^u*G52Y#!|PAz?te5+H!6q4|7rXk03v9W6nlmGw# literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/security_green.png b/interface/ispconfig/interface/themes/default/icons/x12/security_green.png new file mode 100644 index 0000000000000000000000000000000000000000..aa89c0ec613b8eb701cc983cef01c49e30cd0a06 GIT binary patch literal 3049 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/star_blue.png b/interface/ispconfig/interface/themes/default/icons/x12/star_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..b22182a571d2a028003380243f0a84ce1b187f48 GIT binary patch literal 3316 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x12/world.png b/interface/ispconfig/interface/themes/default/icons/x12/world.png new file mode 100644 index 0000000000000000000000000000000000000000..e0453e219515f94519820709462ff00b96210ca0 GIT binary patch literal 3324 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/accept_green.png b/interface/ispconfig/interface/themes/default/icons/x16-list/accept_green.png new file mode 100644 index 0000000000000000000000000000000000000000..d201296df6ba6ae88d1af630c1c0dfd6a5cf4336 GIT binary patch literal 3264 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 FV1iL$O^W~k literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_right_blue_round.png b/interface/ispconfig/interface/themes/default/icons/x16-list/arrow_right_blue_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d0654414860b74084f780df8842195022fd96f3f GIT binary patch literal 3375 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 FV1m)yMyvn; literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/article.png b/interface/ispconfig/interface/themes/default/icons/x16-list/article.png new file mode 100644 index 0000000000000000000000000000000000000000..c06b834e859493e3ccbd701f9aacd6e55174c5b6 GIT binary patch literal 3094 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 k((AZ_5xBX!b%7 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/article_text.png b/interface/ispconfig/interface/themes/default/icons/x16-list/article_text.png new file mode 100644 index 0000000000000000000000000000000000000000..767389ace9b3d2bd24ecd69fd5a28472e62aaa8a GIT binary patch literal 3129 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 To+Oq%00000NkvXXu0mjf(l*Kq literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/bar_graph.png b/interface/ispconfig/interface/themes/default/icons/x16-list/bar_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ebbd5729989f6ca040d15dcdfd935bbe8e61cc GIT binary patch literal 2994 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 P00000NkvXXu0mjfKO4BM literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/cancel_round.png b/interface/ispconfig/interface/themes/default/icons/x16-list/cancel_round.png new file mode 100644 index 0000000000000000000000000000000000000000..f1682573c1579b6a08e36e9f5ad1082b7250734d GIT binary patch literal 3434 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 P00000NkvXXu0mjfdf_YU literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/comment_blue.png b/interface/ispconfig/interface/themes/default/icons/x16-list/comment_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..3741f39eb9a2f9da5fcdb3186faae02326dc2699 GIT binary patch literal 3193 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/dollar.png b/interface/ispconfig/interface/themes/default/icons/x16-list/dollar.png new file mode 100644 index 0000000000000000000000000000000000000000..21d69807d8ae4a85c0d8d3f35840c23cf691b774 GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/double_comment.png b/interface/ispconfig/interface/themes/default/icons/x16-list/double_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..6c9d44d526b96aad49176f18c84d43174f93eb17 GIT binary patch literal 3184 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 TJ)Te{00000NkvXXu0mjfu>7^Z literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_black.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_black.png new file mode 100644 index 0000000000000000000000000000000000000000..da546876f0375e78def1e16609532792035907a8 GIT binary patch literal 3411 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_blue.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..88a5e28c10134501fd2a3966f41912967be129d0 GIT binary patch literal 3443 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 V7I~?TrM3V7002ovPDHLkV1hHxYXATM literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_green.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_green.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2117659a341020d0dd4318526e02f2667d4f5b GIT binary patch literal 3451 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_orange.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..384c4c93641d3ac822ddf4026ba2b9e979ba3b98 GIT binary patch literal 3423 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/flag_yellow.png b/interface/ispconfig/interface/themes/default/icons/x16-list/flag_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..8450ca3e7874d57e6c7c949c68c66f977282a020 GIT binary patch literal 3338 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 UKD-_V3IG5A07*qoM6N<$f-Ledng9R* literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/folder.png b/interface/ispconfig/interface/themes/default/icons/x16-list/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..3648f25cb6432f2efc3602bf75685ff1d0aa5bcf GIT binary patch literal 3117 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/link.png b/interface/ispconfig/interface/themes/default/icons/x16-list/link.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6bce91a3a4c5c098bbb8b13709b2e590b527ed GIT binary patch literal 3060 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/minus.png b/interface/ispconfig/interface/themes/default/icons/x16-list/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..65942d74e47b95ce0df82cbc8eb302e748599624 GIT binary patch literal 2883 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 Dy9pIX literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/money.png b/interface/ispconfig/interface/themes/default/icons/x16-list/money.png new file mode 100644 index 0000000000000000000000000000000000000000..65f3b9e3ed43efec8f554d107f8af985bbed20d9 GIT binary patch literal 3228 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 VM4`ERwXXmG002ovPDHLkV1kXLg>(P_ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/pencil.png b/interface/ispconfig/interface/themes/default/icons/x16-list/pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..228f0eeda8e57a80b9f5c1a0f30fad3d60f169f0 GIT binary patch literal 2996 zcmV;l3rqBgP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0002bNklM&L8GU`9>5h)Do3es1(C>8nd~2H&3NTYKELKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0003iNklA$y0qH169o_r@-Gt&&1l`;f zM?_Isya~s zA6GV6CjgNjQLEQj-&{(w93XkOeDz5X0*U`-%C@P@GK&tgP5{K$clsU2aUM|Q eWXA8^{2c&U!*ejfv5NKp0000P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00024Nklz3qdFpI!PCGQ6!m)75^^G`yP2$WNm*&9zh(P-=!J7B}Mc@$UzE`lhZD&Uq1^^=AJ~p>V00IC2002ov JPDHLkV1jI6e4hXS literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/printer.png b/interface/ispconfig/interface/themes/default/icons/x16-list/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..a9d4ad10625da78f84ef97526c0b4514f7585497 GIT binary patch literal 3107 zcmV+;4BYdHP)5r00009a7bBm000XU z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0003#Nklu6_jv zSBHzOI7kLRf=eKTi}hs?oJ9ILI(1OE!8N0xPFgfcbB{yKnWP7y{^8-?{?G58d#Mo- zG6g~KH!vuQqHV`9dCd1G}20FckA1Aymwr3wf$MMxEpq=YCTe8sBZ$#M!ukW%9Gq>p8!0i1LEM;c&R zR;9T=KEUPfJ>GjgU@|EJ!Z54^oORFVzR?KlU_tg&#Py8HkD002ovPDHLkV1hEx#dH7w literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/question_blue.png b/interface/ispconfig/interface/themes/default/icons/x16-list/question_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..b5548f130908723bfb43c46cba4d32ec6b726ffa GIT binary patch literal 3402 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 A0RR91 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/rss.png b/interface/ispconfig/interface/themes/default/icons/x16-list/rss.png new file mode 100644 index 0000000000000000000000000000000000000000..4b18863148d27f2b4062761d3bebfb6b8b72b32b GIT binary patch literal 3072 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/security_orange.png b/interface/ispconfig/interface/themes/default/icons/x16-list/security_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..2b49f6d69d2c23c902480265e7c1a77f5b59f13a GIT binary patch literal 3041 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/security_red.png b/interface/ispconfig/interface/themes/default/icons/x16-list/security_red.png new file mode 100644 index 0000000000000000000000000000000000000000..47af1a1254ed5330cda3e853c9c4d7e821c71b2a GIT binary patch literal 3058 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 A;s5{u literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/star.png b/interface/ispconfig/interface/themes/default/icons/x16-list/star.png new file mode 100644 index 0000000000000000000000000000000000000000..0fac8f818f4c84a544131de272e099cba3e7c7a0 GIT binary patch literal 3323 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/stop.png b/interface/ispconfig/interface/themes/default/icons/x16-list/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..4fcba9096c81f60b94f527f1ca2b55a5782e55d0 GIT binary patch literal 3176 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 ThgGUw00000NkvXXu0mjfqMOb$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16-list/world.png b/interface/ispconfig/interface/themes/default/icons/x16-list/world.png new file mode 100644 index 0000000000000000000000000000000000000000..ad693127e1333778ffbb48cc2459087f923c19aa GIT binary patch literal 3435 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 a|1|*Z7)n0!rTh^90000enUef$pYq}8) zRSGWJ5Q4T;g)VGd*p;G-N~=3TyAy<}SVa&-SMGxg#f6e0f(Q~t5wxYPf}bb^Dh6wd zrD>Y9Cgk&eSeDb~~I72i#6)9Uhkp?xrRuj|ZBy-bQeX;%c0SD9+%)WnseaEh1{`;HCHy&e0 zh`i!Kb4$x-(cpo?SuJ#L^YNGH8n}e);!k{eb`$9z?~r(L3u|*TbgibmV)nq}^&awi zy>$h$BL!vn`}>1b&^a(FH!{gd=OZLK?=jhAIvBj|2v!3Ecf=G=&4`48!@ z3;m~9c53q!FJcO~{QP_r6a*nj(qFY3r~*Yr`NTDMxud40K~oSTP!t8CC?XsVgUBj{ zOlyqF)axkp5Ck(6%CJWFEG;Zx2LUT5B1%ZvQv$1_aw~IiaR%Rp+F_*qVHK~0LRj+o z)OZ3tJ1j~BiMxxCX+MG?cN5qSM!fIPIb;{tVR7QAreJSb*~PSsj8QFfjDQe=jfhAO zm*ZXcO(dmfqwx4G6rH$@kFQ!`PPNh!CCEgDG&R+dnx0-vu}#1f5F%?$Wb>TTIt+F- zX=_E<^s_iCf%Ra;?^h_cOJE9!Orjg3V|2~>!p1IAjcKa|5zjhSmzR|tJy7Ir1)hO6 zIFH@H_fM}k$B917ki)2`F2#e#W3!Gk50h1WGW0r~juD)9I-OaCnPCJ10p#wl$L#2H zEO_3aeaVH+&k5-FTj2fj6(K_!j#k=JM@GDMaE3)b{za-#5bzFb3hY&lTEI7*hl8$c zc!GdH0QSt@`hlw216e(7gI8h%26kO4g8pST!-v7`bP zhYcO~-E*8NrJ1Kc%0gqwjDX`f?Xkq$rKG{F`Q^zftmoM9@?Pr?**nl19_o0;8o<8r z9STRi6?6ak$HTd2b9_m8TyTD}Ssv@`p{}351sDKOAy9@SyE`@j0000$xRn-a@GdXs&E)>oy&v2y|VCEX#<+Vo)`MKqEOO zZCV)uD@0L%P8gQRo`v~&{6Rp|NyrM;71g7la&KCBCGZ_z-`s(X+z-t-6pdoR?>90D ztn{#~sBq-h!c*3QHv@g3J1BAao=z0jbs#Wy-*m90sp)ifPR>VDIYpqVD&h&59B#(j z!HaN8h1hxM5^4`$#^;fnNN67rwT*z!_CcAL=+Ba*I)XI<>OfUB^AhQJQ$q({-t9Bz z1{6e=z1Y0F7k1Y&!mD9~f_=n$fyS2Yu@h33m`=g0NCP^Sf4nyxl(qJl z3$v3~khQTGvmq~@Jnq3l!VAXcKvSu&y0dYDNfB`LxeNj;V<0l)MR@8R3~mXIf&dsh z2b;Qtefw`Byh`dqadj7@*MSvT1m5UX7eT@3A{+EG2`P%Q=;xxuEGpW9p%=ro zSvYlb8Jqk5PVf2rHnkr-@Nmv~&wHNtdEfIMgCGc?(MxE!d4l<{`S?OOGn79L#ux4jtj}UL!)md>Znc(CX|uszQ2{Hht#t0~?hdbK6BI?!2u6ZIoc3ikVKf<54 zzwYAEY5X8ODk(6!-EMfj%aA1LzuL{DKxObp&V~J+&dy#9Qa1 zMlNEDvmX08E}`YvWkg@xfX(5e6eTD!gA|Je9ZqK}VU2(*kYzn9eLRTV!vT6eBW8xKLz&INXf(o5 zknp5#Z!i&!CaK6zh4mfDD8kQg?==OD?S0xoCO(eT>^Qm(b!_Y^x4Z6EDC8>s3Nor{b|Vpsr5wOVfqqmC5p3lI+<`aCpTiw! zF1PaV)zQfTMHyu-*Mb<2-!qV%f8jxb=cEg%&Hi#)#PsttuF$eb`2Jgf0RZ0wQK!qQ RYgqsQ002ovPDHLkV1k`SQhfjb literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/address_book__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/address_book__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..45e8d1eaf1d0e57320029dccadb6cf32bdb0809f GIT binary patch literal 799 zcmV+)1K|9LP)a3{%5=2%#cH3nRtyF$^^_2z@DfsFxm6w9=y5?4dsdCP|=%nHV{Qk# zKb*6v8@u!F-g`RdHg!_bfgk7G@B8lW`+eW}j*8q9`J` zDqv4~0p8oMAZ}|aOb5>>&f)H>$UfOjOAJ9034EQMts_N6V^quqb)*7Ol$0j2b4pGH z1|Kyk-?IGM&iuzRlDG((w92nli->ffe=fxSgmeeS#s=@)2sjr5R z8=HC{OB)I%2JT~D$z@E9_bIz;`~g$Tmih}gw zdd1;!J;VI09filL(0#W9D*sNzCug%5Rpd2l*>w>Ljf%iOJ%T0IFzrDAByJLiPgLVc zdm9qBnDLD#${YlFo|F83sOgJJq=;bzYPDJ!7K1(tG0_Ivv_%{}I{%d3Y3M2 z1pxyQ8$t@C)kut~3t1S6#y~)KzF3=p3L0Gc7aA8<6Xl_Cp&J$;F={|mh(*Mdqzbk{ zXt{-=l-|c&XD%(^`y^jx=FFMzeCNyzCkO(lwNjMcKCRW@|MrgJ(#_SA&@>G~%30do z-`{338euk>U^SaJkZG~NnvnrBotx=?RdaLiRyILZRh^*E>&1ndnC@IlLHtAdE7qYV zmYv!h#gnuGgTvuKRn-b)S^lebBUL~&c>I@pJ(Z1(t-69V0U-pEBq5PVKv6XcmDZS& z$#WDutX2yMWmu*$(fN7&M!?ERN;0x{yJ4?9x{-M$@)^P5yD-uIu!>`=tB5WvXj=(* zc36@XWbUd(e#H?C_jZCsFyeiO&!WiHf{6d2uAr>0?qY6U-k6>_O`s?W){+uE?7>Li zHDuX}P~C7HwI{kTF>ni(96K#hhN@_gr>49)Hk*rLlYl8u6jg5`n-}kI!HfHy`kIh+ zKig*|upYz~7YW5?2~2^aDyhKKm|C;Gu<-`($3%Gy?(udki6Z%_1eTSkn+gKYeQ+M{ zz?b)f>!ZIP0d57Jh9-1RKA6ea!;h2p2zZX;7{Pg`(^*)ZpFlhwN6CRRm>GMF`M@)* z#b(hFz5{P^1RU*ZcDWrEkcUh8TQ_>92ki9CPXG zs1n6?cP#FsR}~ z=wk?0@>ZZfs(=z~V+1UKJ(geXDk}8x-1j#SRS|R3p|G(huS*IBdzgZq6rX%PUzRd} v(7*n%ANo9;Ghx4*>=M3At8103Bgy00000NkvXXu0mjf#W_`Q literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/address_book_blue.png b/interface/ispconfig/interface/themes/default/icons/x16/address_book_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..e446b1b05830238ff93e2bd645ab436b651250a9 GIT binary patch literal 708 zcmV;#0z3VQP)cWvY=Kz zcD$aLxbJj0;Bq?Qak*;ny4~NHjf<5dOrU@!hpCI_6S%3ldy@rj+{S%$D>obds4wO$1U=P zJ;-is2*O?q95hX%mMG`So_*OR7E%Fwu(i1<_IbbwRRwRp{lT5c8GK(@mh+eRGT1d? zn9_shmX=wo&I47-vuyZEi9>w>q*k+d{%#IG7c+SEK7skvHUwQOx4<5FHLXX}w3>p- zi?lGm^pB*QxZT$&12f4@%%yg~PeQgp3fKe6x7D}c;On9ifK9=|N)GYVmONxv6#0;N z!#M_BHG5Dj6jU>pgG#T>PXx^zRPA>8SQ-sG#Xo(XoeErjF>dAaSv{Hbu#7IkBSHxN qTT2K2%zAnenUBwCRU-WTFTenwNngC(iiVN^0000$Fi2k`Mk*^{QEB{5HED!=- zuczf69!gZobBz1`UnDvODr7As^Oz(EG+bAp-R8JgzQCTpTdziiw-N%nh26h)^>;&Po^YK`b$CDo^Uh>fXc@isyjuFJ2FWP173bLa*@( z<3`$8C~IG!X74?NJt<807*qoM6N<$f;*NBQ2+n{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_000_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_000_small.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f455af3e99f0b7fa714efb7efeff5233dc859b GIT binary patch literal 341 zcmV-b0jmCqP)ni3 zF+_Rc|G$4T|Ni}Z=GV`kXD**U&2Z?%J%$KB1>^5uz7zoEFbrWtk4C$tkDhtk$VuM% z%)s#F4?TV znm{lRfzC|-`{xhCzrTMOn1EjSs-VQMr*8#VGZzof5`qT6z~}exfu{XGd$WHIC^jar nb8|1jrjBtmDN}9$K!5=Ns>*MI2FJt%00000NkvXXu0mjf--D3% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_045.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_045.png new file mode 100644 index 0000000000000000000000000000000000000000..8ebda3e6665027c9cdda94c84edaa4c74c29be7f GIT binary patch literal 585 zcmV-P0=E5$P)q$gGRCwB?QqM~pQ4pTp&5t#Srlcf7 zuuXF8sfA~cT17%Z@KB^kAs&Q6uY2pik!!JdsEgu7J%kn%Y}H&!d>09LG4&FRMMHbZ zW`AY3GixH*n$klCzBl`3-h4aXyeGJ>3&WTQLt22AnYEvH0YMNxpkx23<6l=&@9qd3 z$LUWVqb#z+w83b%2NO`SW$4QERF3iUU!VnL52@@p z>>bs3Vj>AGF^C-uAh`Xrp-jGf#>x!~nvpRN@yFwEuy@LhwtjqcQ048>G3-G1&w!?m zraWDqXNT7ojymoobMXLt-}=IF9z`h_R6CYcsFupgy_aYq0isy>xWkjl82px_5Pukh zvroI6;%1|&w)iHHr#*uA>-M~qdIF&r?+f9@wUhL|>yoEE#ruu+1gawl-XaJg%w-Xy zB6~Xn>B%?H;OoxG>Sv6RKBMai76I$Ld+iZO`27G8rlz{+&@1nHyX$)~$44-X{SjaQ X<7)UwU2vy(00000NkvXXu0mjfBY+B& literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_045_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_045_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1bb5ad2f7a46f523163483f5ba21f77165c51d GIT binary patch literal 336 zcmV-W0k8gvP)?);emZHlDck?D6~OKmRc>eEs-|xIp~+>637@3&PVl#jdJteXS&Gi6^wE&qnSXf!p*|@mA{s9Io6AKH&r^OM3 i4H$t*nPLL~0t^6Z8ELlB4epu%0000>7EV<9|f(+3!EzCx?j!?pS$$@V{in8R4QSt;knrDJk!t&1p12HI?TxO(o0WPd&a zViv*FAm`@gq_g;c3Irt`_->y^SWD-TN7 z-NN*A4X@sO*|E3v(=d!VT9yU?6nrbovZ54F=imOy3@A}XNJ%nnMC)k^?5Ay-yXT;g zEKLz^Z|l8p+VHIm6~l%KLv5=}PQome_6`zD62}Or=0aRCfzAXCR9PUV3|M%r)@pj_ zb^&yjpCRb^uufhXI64H-t=N=$zl1`%&u=4XH-Y>45Wrnt=-=@99qhAr^xiAk_(@FA zRD+Uq~BWO2Z^2GiwAnTc3Q397;)nnM002ovPDHLk FV1o179K-+s literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_090_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_090_small.png new file mode 100644 index 0000000000000000000000000000000000000000..4d77317804f13e67cbd2dce2370d82a8b91ddb0f GIT binary patch literal 337 zcmV-X0j~auP)}7cS_8o(hf}-)h&1cS@IChVLk%{RnQ3m|~_b>hT&tD9jtgL6=0=)pF z8Gw8fR(3YxV&U7T&p=mv1+#zsX8^N7m=hQ?L>ch$?ORxAp1rvDtQ5od?`MJ0$?)sP j53B|-j^+ghfB*vkupfB^KjayX00000NkvXXu0mjf<@K1R literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_135.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_135.png new file mode 100644 index 0000000000000000000000000000000000000000..7a3b9638d4a7ccde5abe3d39b22ee14ce80694d4 GIT binary patch literal 592 zcmV-W0~9xXeb=dBt60Lx;iK^43Ft%;AHS3^HacJvd74E!wvm;;)_j~fcLIwq z*X60RIaEYX1i7tnVQkp;y@MiqGEfl5GI%||Drvs5yzoH|oIZ}9=}ZK<8$)hvbzU_k87vuM)Qj-tYdS8VhTlSlA z%(I%G$!ffiI3dZ8Zx2$j%eSv%=+aH>tj*QsgLkyXJ=`X4X}>`158@rbdmP843UM8) e+wc5afB^uJU=)eQ2NG`p0000Zh@ zX1MV1%NIdW9-b|0Pcppy^#A!!7Ve@yzkUH_6$ppH*H0fA-g5HroZNbnfzQsI;TI3j zXP{Wx=MNvai3-H8A3re&vN13`d;I?Ssf{OYiCF2VF>@R*SRY`6J@~vfB(||{rLkjfZ@;2pJ(6SzCZK*#5tdVF;j!h i0LIazOt}F70R{k)V`?rt4TPZp0000!15?s}VN)|e4 z>dd^Eyz##2WD-o`rWZ~w+}v|N=f2URD8fOEsh^ogpOMLCVVGtNW*A_MS@hRDH7IwI ze>WN_Q8iv$I=f$BfLUP}+PwjHcXwc--WQ1?D+~hr)|KO&JQV&ko3S6dLN7TG!oGjw zG|lgl?}dA+`eeBOu)kgX0PQhtqGnWbdkw;$Z*e0|+X5+oKb zoaE|AO0dqcls60wuRm;dCs5>v_s;W;4JYmJ%ki-D-G%FU5JIGD=(>*L_!tDmQxOBt zds=zEQk$B}!IcrVT0ZK2faakL{QMZ&6XR%477?M^@=R@J^wp1rp( z-nq=bd<$?Qr{n9J<=QauG)=4hD`J&I#PW-`_VnU)zOx4iDmubgiIV&8ukXJAO$nqD zjAOGf&s_rwr!0!uM;9&r<7HKKDMj^ngC;<0^;Ne($3`Y+pif`5wBnigC59g#mtHq)$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_180_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_180_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ad9984967225d1e7bf3b1dd1ff362945755d9d08 GIT binary patch literal 345 zcmV-f0jBECuOB}OqCCWnfwb}W z&!36+!vBB&V!nU*QV<)UV0`GrJ%-DtPc!`b`ST3W_A@}ands^n(W6nN>d2YYbQ|My z?-630%nS^o>{xO3w~`VA6ENU@|NLq4_s<^_pj+}k~OlSVOU zAQozqPME?fU?7SHEMlSoxzbv$@IUYm@DMBnt=v)}m4y*3QYkJXN&JCIINT8K4v#ar z?Ck8$?f7OAk2{kha0B1Wym|B9eDBSBmQo7Ci~@!nww^9M`U$JB=PMHeS(>8gI4HWV zfoZ+bGq(QtcZr%$#NQx&Y@AjYf*O=?QaB+w>fyNn)^g{Q{%-Diq&Cz0O}b z$2K=Pl0+JKUID?r4^@d> zFz^d$!i^whjwp(;c;h0g)wa>$F;V9jJLMsG@guY>t6FqR!GR?U|E6A zQ~c&WcG)`uMh#YD2jg>B8R@1dFXc|VJz(5(5HCM46}VeEj(o&N zmmmqL@8cIr@b27VvhRxzlyctuI-YHy=vUtP)w+Gynbldj`m~`}6zvOd%cy z(?}0-<6l31v=HTm?_a(c#|0=DGktlxf`j9~si~Q`+WH;$Zhiaw`36y5`1yChJo@8g>{#KpqTuV2re=$r%R-vMGqM#i&1 k0;>Uxqe+=^0{{XH00X^eZEf3>a{vGU07*qoM6N<$f?n*KL;wH) literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_270.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_270.png new file mode 100644 index 0000000000000000000000000000000000000000..16c2c20ed734df6d90fdd1e9eb084c719c098118 GIT binary patch literal 621 zcmV-z0+RiSP)5CjsAW9}Qz0sK}AWyi?{IF|$vqyUJ8$i+HA zK>f@B5c)pih{JZO{Ujk2qDazcKt|C(S>QwPD6c>_z01ya8wX0|9zen;Fk==(4-oBj zphk{k4o`HDhr2Kg6D>N{=4KnkVihsxP)Z_6lKt<1o@gG)?`KnqB9Ovf!XQiw9ED85 zTDFMtJsRc)uOP$sV%hUjhsOnfMxQA}V#W00000NkvXX Hu0mjfVJQ}= literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_270_small.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_270_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1382f7233cfc993020637251caea9f2efbde3868 GIT binary patch literal 342 zcmV-c0jd6pP)f)`d+&Ic{4Da(m`SelO+hd;LC>(48MQE5 zx!~L9&kVnR{$yZbV`F&ooq^%U*RKqJfChjJAu0_1|NA!+sQApSD_0oqePv(((I7rZ zoG2H3|N6x^D#O|M&^5fgL3ER7up5|H9wH^3omeP<_4>~QK~XF zbc9{`DZwA}zEqIx?!vIFlBQ`>g;J4iv=hMmdyEfg2&u95ZDn~?oUUr<&TZC+O^9p; zi3D|EObAR%b!KPzevbk<=LpC7*7{B4&ZF_@sk3kU?NmP|+Z$(SRoCQeB)L+_U>C*# m-jMt$A;tdG`hCv71sDKxu_2LM3@Q$KYA^P`VmSVmf#K_?kHm$+=MNvg{`vK57W<#CPEYoIXZUVv&hYx~`!8QV zej?6*k8j?9s6M%<2+8YT7#RNDfBi*NPL${CCn62_`RyA6!~g$h&-cuMi#-HlV9cDw jW&q=8Ql{JhfB*vk|7363MNvhy00000NkvXXu0mjf#@?lG literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..728c405dccee0af0fe7b8df233c18f4c02fd3823 GIT binary patch literal 799 zcmV+)1K|9LP)oA}qHWMZh_arZ6yK6ac02t;v*Lt70&K$o>{6Gsys63ZjMwtWM$-$#g; z$rr(ODk&8Lif%Pwtbm;3`(q@T6g;%NX8U_rRe|NWF#;lB=o&B#3pB%o6~~K^Sd0so zThR5dsl2YLGz(SHU=&Hi#as?@vJ6>C0#nmT1;fNgVn{6E{62+uiSKf@z*azWS4$K2 zdkgy>M!P>Me~&ieBQYeFaLNLv`7*JzF1z6%e1lMBeCR|^;~{<&NA-z-?1_!|NDPT3 z9Kxl@zYrODM#eSBhC_E_7ti->YX-Oc$s?()Q>D=mS~-4!6y zs6o`ye0Ku~XHP;+M-R|k>B_p+8e~?!z}o9sS6WD+C5@1gYwrn=vk2{i{l_2dAQXg( dT=$m%0|4kawA)ALc#Z%7002ovPDHLkV1mSpa<2dY literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_135.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_135.png new file mode 100644 index 0000000000000000000000000000000000000000..b171a82e2f326f2d57b02c26927de9385ec6e517 GIT binary patch literal 848 zcmV-W1F!svP)2du&1U>K$gL*0mW zL@8nk@gAEE5lxG#stT&2z~`II!0jXSaIAi{xuN8EgR7*?UdnkeX3yl+wsl_YTwcpx zmo(_dSa46lUa79vnvKwPvD;OXNo#gZ*3D^I+09xHR#>b@n@a10W3jtgrD(fI!l5KU z$tD)GwhLWudps&YPEg7Bja($QE%MYtO}WL<>bAMXJZI_Ya2;b9dfA@lsO!rsp`O5w9wa5X9Ft(Rz(!OMS?;;PiJs@FgWGkf5zCE`n-|Z zP6C4;9x+H5$m3B^<$n|a_|NwQ`~^(VRbFO-;PX!*BpxG#&>4ZzWa@2bbUIQB1NoFF z$fCGdBv5vkcuep)9U7e$7=&SYCyLpKPX+56Ax(`KyT`5_E z8LFx+Fqu@qcj>G@Ju&6@vA8}?b9IMYj=B?G_p)rV*h(1)&#xvlSsnV@0@x3jVdUXp z$b0RIKc?dGoD4MkPPZ3xDM^P(i9m^ofwdRI(`sJm$9Y6)j$xfXFm&D;-riE1yn$O a2`~VOMTP)3T6rfGs{7{3XQtV!18%yhML;r6IE6yO*RC;(A5PjCNF$1+*@j%L9$ z#x4G_gW7VONuL{LC&r=!70CiicVJI94!qonkeBN}>2F_5=4U0NcI?GN0>`#vG-c0R z9*PY7$SY8(nrb>%;qzrxApVx1x2ZeU&{mZh@5E?y;N`pQjA7f$c%&Rn0!&?>>WF&6 zySxO&lB|AM;lJ?(aTq6(?aB5&yW zV`NVdpCU3S2M^ z!$XzOjcbi49!QKEmPHy`BOI(ef3>X3GO3=cynRsDKzeZt=xEq@~Ql>KsL;5r>Bu{D=tU3pPWf&kqeTmeNHV zqG#_yb5HMIV^~~E*-MY^A0=>;e;(mOQ2&@>G7Kh>@0S1r0EJ_waRYNdFaQ7m07*qo IM6N<$f>FY8$p8QV literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_315.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_315.png new file mode 100644 index 0000000000000000000000000000000000000000..58d588012d709d671f30b78061c92c504844eb35 GIT binary patch literal 830 zcmV-E1Ht@>P)^Q{8Vt=0!%QJP zg6OK{35Z2pY+l#(U4y|8!tb$nxA+`2P?8XC`7Wa=UxfRyvG7tLKgE?P|M}IfKo0GH#v;X z{agvYM>BC$e}IO~Nuo$&A;j6+A%8%`c%#bqNd?-NGq_PH*rdQu}O#@9+!DP13@y<{omG;aqfx#1P4abh! z$%{8DTlE%X`Nv*fE=nv14u_=?lc$xE4B2E7a_KbeBQWQb-EO*wIsWZbp{Y_X8xIBW zV=20w&WfA~JUy*m^x!UTd%70GF331?*F8Nx59YA3os5Efp)Q~(^U<}RY29XlIBPfe zj}QBKA0Ngkd_=tGeNA`zuMG7ixCTOVV#0O-Ycf?Ys6md<6WVu>vsq`Ilj8#=m4MC2 zg5wBNJ&2-0;!;JASU6@Q^X%m(tt2m?(FyVK&EEp(D6o7Fu-#XKtal)6?Cx?i?d?wD zbkUqqlQwXJW&i*H07*qo IM6N<$g4nZrC;$Ke literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_double.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_circle_double.png new file mode 100644 index 0000000000000000000000000000000000000000..5f841381e3b14f12bc316c1dd1c16fb8ecc5ba8e GIT binary patch literal 832 zcmV-G1Hb%k7RCwB?Q^`*gQ5gTGo$1gHOABo+ z#VC}DzyTxGSV`O>=|PQA5|`-NgNc8F2XCHC^yo!A6c1uF#)x9{V44sTQw@zklrAh5 zSvo9jr=5AT`8|q=(Zqw3{N~M@Z~c7>W11%X&%@H!iTalgaEtSu%8(K=JpV5iInD z-lFJrcwlHY&LAbJpn@XnKqINdU<#6X zB&ezaAc~5{1P0$`3ZvtT)lyjru8MMNtH4=7^4U*r)+fl%9raww^{!WW*HSM;|_$ zsN{%FEEeV?GV>*-a@`&N+MVtiRzaO(D1A|(Aj@r53**pC15%mgHC@wgVD!6)c)3`F z!s;5$awwfy=252!bpvQ~5V4hkRMw2Vs+k+#MhU5KTon5eMGCaVF)5#qT3J?*G_#fi zgX#%eZ6vb%VYwjJ>I}vk}wS+cbw|C+F>^E^z z1TO7rX~J5Oqc}9(GG>A@IN8?|!ZYmdY;8pyn9GVQcpss%iUUGo(_dy1RZbz9wF>D# zZ`fY5!xh0=gfLY|l^ED}p*NH)Tfh+PkQ|>*qRmq}jT;V-=bBtBJ&q3!e{$5>Q}cXX z(mWI{HeNnggT;e&D-UA@E4b<%Fcy6tCz3>?&lg|cs??w`a0M*h_O!D1Z29wpQm3;m zAV5pAP4W9oI!p!*h23Jpf&tKR{c0$2ub-MtYKs$5hHfLnF!Tqls)w<=8o<*oK((J^ zNZtT%*EML^)Aq-jiBprt$eo+p9oP^KgdM^BV~gp=X|#Ml1Q-CtgsnbqEDVHL8GF<5TyiBDFi4MXc_U@E^jRQInjEClyQW4!kg{#okP`k?$UsvF=*ClPlvnVX*1vEv`$C65y z)e>Dv0_6#L^Eo_@q8~Uxc%|aOKrnkZ5L|1%+EytoFT}xOHG-PW<^|;Z#9}WH402YX z-{)hCsNPQqjHs!U9$gor`FcmKl!#?OH0Z7w$iD^j8_>UEHu4cw)mDRZ(S$~|k-Rky zL{aqWrGD^a%(p$;D4JUf>10x0+cVpQgcM%~{tM@>Wh^6X#J0AQS z0f5wgu}Mm0@|i6uHo~*VLp~J#h;`4AMT4PXcbWZcG(!_qPA@CjY&a*NY*hVfUjc#lJN*4L!NoGIWg62Lz-zo{u|bh`yGT1@ciUXQQxMyE6{GvK90kNcS3 z$*_@8StvwVz*WeBujl24l1%%t<#R;BIS&Hga%*@iZ+*mQJmEN8yI=HF*@@j=pbN0* zT0owj@yGnrW6Hv}UOM?AKvyO}uZ}l_^d^^9Mk>@!sBi7W*Z5W0DCd#r5rfF(>tXAtgk-bdnlTyl4 zNrEJfHDnaQ8peF#`*5q((i8<)yg@&67yx2w}_ zw^KZwxhWDU{~$4`_GLnYHD3(a8fls~m>>)l4i5v&Kb+7cc|l^)NAY~_u6XtKbHCna zkEcWsDDZ%K$l?1EQIz7~AiYPe`Xs zQ#xwdcyMn*eAw7sv}72B*PhZ=qNwm&+_LTHI^NPWPZ%yWbG`o7v{d4qZ+1pbCVX0i!~&2~Key owxQgdgdhnqpN-2t=U)O0010$4I&6yZ<^TWy07*qoM6N<$f;Q+Gh5!Hn literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_090.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_090.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc873008f1e29957c7d421115b100dfe5d7f20e GIT binary patch literal 619 zcmV-x0+juUP)bht= zp9P7G(NYxwwY7z5gDlO@*f$ao1wVOEG1_epkC!UvLh=C4t0Ki(b$P~UHZ53|i&o3R z+R}_c>*PNhK*8dqrw^|g`}-zr+e`J}z{I1)s|NZ1hsbekeDbrEo5taxgQ+P7T~`o> z9EF06$w>{Jj)T?38&M`a15xP{c-}m9V`J-EJ#j4GyJeWB2}#nh^W}Fvd#WT!^TKSW z01><%hT-rg9AOabb-O+EdVj&#MR=lZvZBn1z&LIB7b zOfeptn8*VFCdj~pL%h;`wQ02 z%gnRkr;A83Xg8o2Z#ULQ{tO9e2rCP{qOH8$oBqUk=>zANK5|ZTS{Hhm znvukjW;0NRfbpR7v)OyIapL*YYKm`#x=Rfj+DQHhFaYL!2K#q|A_V{d002ovPDHLk FV1i1i9r6GG literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_180.png b/interface/ispconfig/interface/themes/default/icons/x16/arrow_skip_180.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd0aab5b7f98bc38281d25987b2ea6474a0ead7 GIT binary patch literal 619 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 RmQnx!002ovPDHLkV1hK=>}JDI6pm6x zq|@?3=b3J2KTh8fH*@ZVhmZ4e-sgMX=Y2maUk;qk0<bvLhY5&GZ*#NN!f`)gHk%L#1i>)*2nM$JFC(8g(n@7gfe-;w5fb2Yxu$$_ zStdU}zX+W!4{Eg=R_U2n?>R180aRC?G)_;?sjOBDCSSO@8!MEs6+vy zA!+92eUk@!``#Uk>-oU!W)PiATkyPI0+dG&7xTRMC?Z71g25nKB!=rb@GkbX zh|*c7hW%LPz9;XxP&&{@4ezWx5TABYqs}H=EG|rOyi|@>n*v^=e3!6-pp4)YfuZ{@ z)g$tp_@slHymkqVBu9n}Y55h>#!F8@a){Y~fJwynu-@vR2FZ5!y4>Ov`Ht=76aR?+ a1Q-BiRwwkV(5e{#0000v;ZWFyZ6*lmEh009#R$;3k@ zI>;~p$6`&ehYHsguS5n2Xd0xW&5dG8gGf{W>jb+Vsb>&Ks*svaH;A#=7gX)r>md;- zlR-3Bh-ujHuK?MMwzT*~MfnP!uM+Y2JOsgs`S{Po%f6=yU8OqfKurO;SWqE%bi9&z zEF{^rm%;j*ZQF{r++xnM{IZSxin&!{Kt+ zCcaI0$)(YkUbbu#;Hv=Ye84e3aIgw+6$9>4M1HHl)Kns&s$@wXgw0lng_LGlX{?q8 z_}pI`dYCfA*)7jt{{{LwR+Ia!40^&73?)hq4tG&Sd=ipWHA zRhFAX4(Erlom&*x)9e-BKYS}M?J+&F9Xu`^$wSn`qm?MHkwe&NloHAar35FT1lKGB z!f<7VPD8+0L57cM=#9}vEj_?2^kt-1ee3wHM#pc)beI@J^ZFZCvZ=eW7G!5c~mKdMcz|&F$JAmD3u~0-Lr$W4ZJ<6xkUl2TgEI>`f zViBqBjhLwY-v%Tz)!HiXvOI-Q=m->L8Ge5imX+U`;TJDu8YR4`K+OZ&nN=Zmb&W_S z&XO4){|KM25-yhu4!6rmN{Qx_RZ)1 zLIGj&Br!BJDF*`8c-+}9<#i-zTXN0t@E*D_7QjlUP*)?O9)~Xwem$J-ci9o2|4C5+ zpU4yb-Pl)90tr%-q`k)f)(A%SD_Mx)<}-oRt3lc8LEP{nb_!Tj0C^g5Wd(5BfCE*3 ziw&4IiYaO_b}bg{d)hZfh9~w_0Cww^FT&B%F;{cz4QR&5uMEUncW&?xA9PDbF`b;G zks8R07TR-&=qJ*p$1?Fd@dNQ0G0j}@Aa(ElO}_nZr?f!kOsGg&=rLVAi09`oo#QrM0zJw+6w2+a90+yI={J n7|EfXS(o=eplgKe9{~mcj1~57=%dzB00000NkvXXu0mjfs^m#S literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f23f5d0f7c43d3519cd4b4afc6ea1b2dcc0b91 GIT binary patch literal 670 zcmV;P0%84$P)mJQOd`Emh!Ov0i55@pSub7U5uz?O==wM{`$(`#Gql50wU^k(%3xES>Mx(Y|EaqOM zUwxdp@u;?3xR3sGjslFh-rW^By6x2MF|XPk2BU#FH77DEbFK0CdiqDkde#o?i$6`B z@Knp6uHn^}W(`aZd*eqgCB2<$7#bA-h5?xV7p$OOH4u&;x{wqcM}f(p*S{eVgGSZK zYO)H{^c>Xn0vP5`V60|Uow`8@1Y?5Z1TYv#%`BXu8V#zod8iwC;N1M(F6y#Z40OF@ zaaJk#oPRf)4Q=cj)K=aA<2uOH^Ut;sY*QgSmlYgm4sbIyd*|ZxVqre7$SSxb-+!@E zs^l}1_ofBMQGh*NSSsaiKDc_`jP2OJC6d@4^{ReVk|d?sBik|$?>>3^c5B&Lk51Im%>)i*gHeSl~iMbD{ympx6~1ld?CzG9@AFl(FyW zrD%`q`xE^1gA-8!QDi(MdcP!ynne-IK?sx>;}*;~aDC+I+=!6E5;(sB&o z_iRiRsT+I&2k?PK5X3d0)E7RhD2UL+8IYGA6c9oJvfva((Tx{8zG>iv1z=3vjEhr* zR}=z)pMX5sRtIwnQ~kF1eHkY2`UFrG067=EeQX%hqRnbU-rQD!&ifqambzYmQ)#eqN`Tv35Y~Q5+WY4 z8xaw75O&OD2TMiX>m8W9|BPW&H44HS|K~RT5nuqH9VpAMqAFkj0000WdP)uJ)7$i30)PBna4n(=tRh z!j!I)5sQcb8vcNumsAzNb4yt((4)%2<{vBBe|B#{ou?+lo|{LICK^BkO_h^zArhJU z*gZZyc>hgY2tUXAFFMJT-hsl5?2@MX^N(6=&OA5BN$k10ZWDmcw6aCzds>QIRR^oz z-D|eS`0sb{SCCXt0db)EL}!D|?sP*^1W-{xmHt6W)aJ}_S0BIJpmPidifS||<%;Vn zAsJiis;DBwr8!7QVUU#-P}O*PuQI@#lUs?rQbRya2~c_$KHLS%i-SNj#b9w%fTk(y z$3@cVOa)1b0`e&1yY2unJ3sk4APB?Y+S&}O;sj6x4Q9%|0knyQrRf>J&iPZIf82M; zPtjb`VzGmb#np&EfTq|D_!SjHW4+G?bdIrv@*~DM1eJuSvD`MTsr4~DxLybIfmd1< zx0}FNTgKSSCqt8O`-ckjOaF;mTjfcU5brIi$>g(uM z&R`x!2nfm8gJnUB4-NSJnEO+vuKe}dC=&R_LlAoU;{UJlw*UhGTM;Heu7v;Y00000 LNkvXXu0mjfyA5vM literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..2794ede1ce41948752d01c058570a855f9341631 GIT binary patch literal 706 zcmV;z0zLhSP)2!ab6R|ZjVR-;KJw%>htqm{Y3T1h6`sp4RQ*XzQk~L)|Z8 zC!Ll2*BkihyP%>1;$ZjD%Y81lHvqLV07C&LuYn=z^7;bZ{pb5Mj_yEZdXlz{+d`dC ztE^;ISsAMGA}q@pP}JYRSk*i$J6L@FPUN-e0*WCZ>RC8LHxg8;bFi$WfpfK9F2QQ< z7|3!CkSDHou#o;Vm2Bx~?~#^ffpHnA;QV*luuPfcOcHquy09jIcrtbG(pVugm$pzZ zSVhl&v6L&Pr$_IPX&l}9F{~<0K~WORnfc_T$W_ADZP;wLIo4Y#b%-Kb7X_P+_sr*5>HwH`4OKO0w+KXT& o&{_ncHHCzeER#mZ`Huht06z-<+LGU5O8@`>07*qoM6N<$f~N6E&Hw-a literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1eea1f8697c4d4a3c789dbd0e216c470f3f924 GIT binary patch literal 780 zcmV+n1M~ceP)OWyZO<(<9?6x3GSZ}MN0Vwk~K#2>HN9}RXRT21fc-t^lg<1px&W1r0gxIN=eK< zn)9mbtk&!P+KHhbTo@gY;+&IBZmaQoSgUf(Ag=8pJfP8m+oU#YmDhL}kSaLaGdd?52`KRDZ%NVE>`Y39p z0aoW1?4ssxgTblZ>mw`9Ifu{VfDbbQ6xO#x_qq*IFIhmXFhto{796%`k4Hp}bOahX z!ou3};=S>Q4GFq5?Xj}bYQCf8A}u~q$R%g)j^2xH=+VUN%fZ*1!rFa~z=C9;O`~AU zAb<}wJYCUxfb7D0P2wZS{|6kRggoEDdGd?agE3 zR@U140&FNXVJrq`70%wn`?!IEOmYUr2XMWDxDg+8UWThom}PB^WcXSwl;B4VqC4!;u7g5u5^j0InyxP zW~*&_=G-~w`+CpWydVXEFFbsg_j{iAIp2Fe!We_q1P7}O^5R@VgTsLU2!y~kToxnJ z5q$ETjQE8ZL&KlYbBI!a`kTt)0X51}%vlEt_nz64Q&C@TOtWSZjyC`>U{sFBB7wkE zU(4t5uDji_i2pgBA5=+v@&4isko_*jn37PpI$FXK~$tHkdO{zI>L$xz6yR6Rs z{?5r%G5GB^roM9uDj;g@N17a_G$9}2vj7wYsI&qJQIlZFw;#OhP&t|dg=$5LG72h6 zATBOeRp>0lq$!w}{2(hcKxr&_S4PlVtR=`R(gfs$fKIEzD7uM)82bYAvJV(jmfFP` zk~0dD^b?S$Tkc@eH}b)oWh*X^&J6)&67XE=-`j?5@_Prp$eUa)(B9B<@j}?2D^&>v z`Wv=G|Ll7t@Wbb6d-fW6?V5mdw*aLx^2E5A=uTAc(|5jlEY4Z?M@>S8pwsE}Y8w~A z)A8i(@SFCY`PuM2j=+Q_fcfU3G`{{7*mGZJj{j({0tClO1akRjpR6zx8V9WB8b4h?V1^& zE``9AweFm+n;DKDF=0ZiOTGsyA{((Dk%P!e=JW{%YS^*nbi8-!>Im)-H|*j?cqjkY cYy2a?0K4xO@PjymE&u=k07*qoM6N<$g29kr3;+NC literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon_left.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon_left.png new file mode 100644 index 0000000000000000000000000000000000000000..1bfe0de052775475755a60a8809594743f42e791 GIT binary patch literal 670 zcmV;P0%84$P)@A_x_{h=g3~C8dbQi?(95jnPyz zW@Gvl^Re08nek0F*@mL0JoxR*&dmG0-@NyRaL%C}lb}tri%;yj4J4!@05Tykj!OfG zp5{K9f!IQPMZxb-^A2MGllQ50K-fs9CvdU<-0Yb{W0RxKZl9k>b_W0l&J0a0=JVP2 zu@9NWM@wo^d4cCwEd|JU*xA#6<;1n8({9-x1Vh7^6^j{_Il5e)zQNPeeFsM-!f&Ei zUFFU14{_^fJqMJ-`S8^3h`U=3f>r`xNWk=cFiG8VZ!mo6Rz&z%3Mhl4-Xmin(8^X+ z%1WT>S*Ym>81xS?rkYuooY2wh3ke^Kz+hmjN8t?BRG_S;pl0NNbGlb9$m3E&< z1UBl5L@Qq&mtZ(RV9*C%Ea{z@yYZRmjYzabIVK1c#78XYV){31#+EsJ`o&BFaW7#* zegd;+rFk*`R)Bk%0#6cxnQgK7%HG=%zRgY)8I`}}xwojofu(gmpIBp6(VdOxHH6kO zYK?W)R3MV+M06oKt;=J6>vc2V0^J9Oz9vCC_E&%b0Qry(C7_xFApigX07*qoM6N<$ Eg2QS!@c;k- literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon_small.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0db4cb8a84896d6c943831596363fdeff375d5a0 GIT binary patch literal 426 zcmV;b0agBqP)-2gGlH_~hSz3|D+6|HW+p5a@D=Ys48R%nIcek&|I$WMcmR z|KH!QuOB=)yD)wA=jS&U0o7c_>4iW47;KEh>#U zuGccZ|9*fdVCDppj11r2ynF?c#~TZO{xTdnIIm#Gx3{04aj=U2<75+O;9wPF`1$U~ zvok9f?f}W-bpbF*oq6}{G1Jzb(tALzBoH$v^sUcY(U-J=k&$5`3p2wRyas>``Ok3b z9}t7R^pDYPdR`FF4~(45j0~rK|09qN&;ih(T_3(Na02OMTxuAHeqNy10Du4k0If!a U-b<{907*qoM6N<$f-R`P#sB~S literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloon_small_left.png b/interface/ispconfig/interface/themes/default/icons/x16/balloon_small_left.png new file mode 100644 index 0000000000000000000000000000000000000000..d362b9a2adb34e8c71fbf1f67bd8cf9367cd3c19 GIT binary patch literal 433 zcmV;i0Z#sjP)-2gGlH_~hSz3|D+6|HW+p5a@D=Ys48R%nIcek&|I$WMcmR z|KH!QuOB=)yD)wA=jS&U0o7c_>4iW47;KEh>#U zuGccZ|9*fdVCDppj11r2ynF?c#~TZO{xTdnIIm#Gx3{04ak5J>aI%Rrurmw)`}yw2 zvok9f?f}W-bpbF*oq6}{G1Jzb(q9Sv8?zP^`cDH2gM$4zBO}9J7G{Ps=msz%r^K0Y zEDZmEk@ojL!#uF_7#UWuGX38LWizk>t&5wBCmLUVf-^;c8s-XcG3+9gkQj%4UZB_j bfB*vkMJ$BoFBhp300000NkvXXu0mjfSq{IK literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloons.png b/interface/ispconfig/interface/themes/default/icons/x16/balloons.png new file mode 100644 index 0000000000000000000000000000000000000000..671d72d6e58337c27a0836d01ae60de495bc448e GIT binary patch literal 711 zcmV;&0yzDNP)-1!5rj}QiGoQODIuXag@wh;*|2hD zt=5+A?C1P^ecy3Ao#{m#c+NSzKhOD|=RGf>lp=Uug!LkTn-Fxc*LsE>meenX53FU1 z0_#0DHAp3S2mw8BCo27#)VDQK!~>260h1yxHy z&MhIYCZK58Am$VBH=lR$#1kZe8*xe#OWRPG5R(P<=gDnltG zh+32{@SBZ!Sm6L%c6J&KOVR1!uuclF2^Fx5mF1AC@M-R4nAe#nC|+(!Ku4tuzWHZE zSvlFe?C&~JM|H(8hC3~%eU-=t+zRTBAes1LI=_9xOXL(QfwtB8qi0W>U)k)u(I{*@g(AU!JI}!D@ityA zVRY`vtwuTBulhTC_y5cJ>(417Un#EeKc6pCUyFc7AMrHQ;M$qN;JJGjdTv|Bn_!ra ze#hA2H=2GL{_7y`H3$eHd>uVQr^FjPG5ZmZA53W>E}su+6Z8^TuU;~R6I3N-R8KC_ thvN%6UlcD_$H4UzEKrItHt3H40{|eVPMLl8Og`OnZw-ff1p|hQsvtW#uc8pV4q#XZ zczlcCXKcW-ZhQ$5i0N2R=V%LYPIkBi8W-(n!UiH>g2?N)fG1$Zg1Oxat>?PWp5}%6coqF zK|TAv)$6fWFKf!LrSV))07FQ7od4`r)6mbkul++T2Lt=B0MXp3LhvA-f z@Aihp=2$oX4g}c|>@z`8@DZ2g3>#p#X!1M@o*fqq8r$G>$#t3PSV7A2*c&S*KmIxK zPVa1L6KIwmLD27q&?_7uzrHaKXG*oeE6iZG{SnB2NPphE7+=|po6j(r)Y$EDx%Ld$ zgXAl3>B4YA-Wp6wl%Y+5{5pcVM+|2YZ zpDINKbyXSK4&$tz=Qu#b>16{QPm2%fPn6b{Xv(V3N0Qf#oa2k~)6s$pH~)UGK#Clo zuk+iaU{I4s!ErT;%~HX`21Ebt4*iv9p@VN_cMGj_Zk!J(ww-P-t0~oLlTKy8X#2n< zq9}u4fDj_zF}AgiZXrn%EAXyslr@p^$s>gnbHg~CdQ+FT()Q{*_t$JdTh^{nBN2lH zy9W}77x>qMa~%07N`eQA)Ds}`uKbvpZ*c>^X@1I#JTa2Q{{jpEnwn@67kR_X00000 LNkvXXu0mjfbh?M- literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloons_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/balloons_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..78f9200b82b8b91491607ab6a27533f534c32015 GIT binary patch literal 851 zcmV-Z1FZasP)2-iS4n_bWYuUG^mRY#*U21A+$xB?Z6yRde)YcYH@;(-XIWSlfkTDO4AH+GM}kxSVNd%P@7vaPO-I{O7qHTKju)Lh?yC@p86EDs(a@-G zf|CXm>v~O%21uVQqmju9CI}eYO6RGDNO%Ts9^FCl?i0z*?4rzp&eLO=#b+g7&pDet zOO+SP<`%lJYU;(v!#mMk=*w&S%nN#dGtE+ModvLFz-@rV9w%~ls zhv4ix%&B9jJ#z{fxf@xB1cdzkSnbFob@flMX6^PoT_cAy6#_$o;J?nx;cFFT|p7evv)V25b3Ve;<>CCQqu|C#on^~EJj z%3hf4>A9+kV~PS2H?gIUPUpE|jnUSJX`A=f?YMWb=C%<}a=?{Qnp$ql6xWGd5H+<8 z82VCTjG7~mWGS8vg|`u78VMoBI9i)d@{LB~`=4lj(4~3Yw@5=#N%nr5Ly8ZS#c>$n zsg}6=fvNDg_tWp^i$9Vd>K6bPA!{G<>rcQCH4O}_ z0YhWu+1o9}N6*zG83Q&V=_QBF?kPFm-Yna*oS%KS7I~@1G|*{Ag7U(u=32xe(2WSR zjakHX6^60Sn^0hr-6*K2uH}2m(-CAII!-LS<81F{4Qnj3BK=|AgoLgHtmf`UVY({_RshCV5G=d&Ycspb#g9eUD;)mxF2~ zH2ouyG(K^kaY@2k9xIwQ;BJ}ZnE`EW6$9N5aqz_Xto;2oMGK=Z=Q;VY@H%=Z|Dy7f z=U-+>ox*?QL(5-qsG%CnHI1;klqSEMvt+#tEW}`>IxvauAbwhxzf6m^>XnV&V>`*u4NcnH z8oVxE+_xojJniZN5tpf@Nul^J1@xh#KQPDym~fb_(gniNIOJRs^?1mNWvgDtRZjsD|<08L&Zh$h;&>cPr{<) fmgo?l{s}Mu&F4-XQsE*i00000NkvXXu0mjfV3Abe literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/balloons_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/balloons_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..8856391c85ffb478edc782b9056f7eb1f0a1cce5 GIT binary patch literal 840 zcmV-O1GoH%P)PbXFRCwBaQ(Z`tQ5b%{ecLykTTW$) zAfZfSIZ4G@c%g+zlUXJfmStoT)I~&eWgwYeh<9pTBqZXEcZy^vmevxjOq2YnRHhcC zBF&$vbN}CWI^SGl5_I4>ob$fteK_y)zAr-vLGN7_p^E{O41;WX)KWx+xV9)3X~+ix z*hPa>+^8WmI+B$~RHPX1pGi1=@q}C%qX7}9oq>CI-MT#9Ic^zfO7*$-+Ci}GC*VT~ z2=dd49u+5^yl@&`C*ZOLU2++x(dJf|ST0;K)mgnvOML|kf?fyU^9DX=tYw=YN_h0n`4-4-}JOEf*7s0pNOxZf!d2fQ9D zZCE_Nd8mi=gf}_9Tv0xePm=qWfWD*rPR(%lCX#AXbJt@AU*k=hWrBs4!wE}T7 zJThNN;|eUHkZcDU+0E;&8k)O#rKmy6>v~_3Cn55I_n{26d3Mo zb?&TLthSZeUmh?2j`DocOlfwG&HQd#1DgFQ@B;F6RC#Ug4U=3Z)yNng4*M?NbUZ_9 zPHA}2gYLt*<+Wao3S+OFC7<6ak_<^THN{q-_HPybQGR7@9vOLAAj(;6T37wbGf^mT ze0Rh*n9X%Yt+ug@kp6uF{$J(K-ntSLM^t{pIus_vkW*c)={NOy{X?6}^}H0AmIMg? ztGsJ>1K-BmcM2|5rL?s)nDvRPBRtPf2g^uP=$q(%GB9U;IV=y01INWsM1zw>VS9bi z_2py7R<7~7y6tJhh}}-=1p#Ka+l?Nv^TlB*&XnLt921!mi-yXk-rH^W3S0aQCdZ-3 zqr^~HR+UVHhwXc$Zs0uz2S-C&e}9t1ag1)h%(jcTmdzH@du-z!)DinUd0fp5m7hZq zwS`e|fex005{Sm+nj-c^o=$R=p3^DxqPx<>^yOqQB_bh(nj#|b-cRsHfB^ts&r#*8 SP(k(p0000?7_$p5}G(w18eicOzoaIo>}bF(If`Nzkw<@#50(&Hj2uUPl#i*=`0-1xtz^ zneU(X1pMx%Wm8>iE|J0t7@4%+`^&vFY5TbFX2>Q=c=_)X5KmskYK#-sTi_TyMyB}-{{W>`=X4qQ9~OGfL_`Kj?KDsy3LF*F@qE}yWp+lcg-7jdDyvTDEUs>;GSxJl*iF8|c2{$tvBH2|&Gu|0V$fWs zLSZJ8T#$j=?cGC{A9gm}k6GuscQB!RZV$Jg{#P`$mYP32owaY*jU6OXNpd-+^_*w> zWL>nd4fH#MYVUS6?x9M=O~Z87*TaN9?aC#r)kZIpV&L{8ebhl7k1R-Xp%`U6RB}Ec pMbrG;+L{B{z_b!I%;T>B0|4S%N@pYmjsO4v002ovPDHLkV1ieYcIW^A literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid.png new file mode 100644 index 0000000000000000000000000000000000000000..dafa64832ca340eb14f1b45c86ec5f931b45b4ea GIT binary patch literal 778 zcmV+l1NHogP)G)P*KoJ4?SmP8eTFqyPyz=Sw3WtnxP04T}ZHKMI$f*NvJJNl3uFS zyq25cw(9C$zHg@4n}})s;V{F@`JFj)&WwO1syHme)F{J29Uuq*fqxX>vjjdrz!($^ zuu_KC6!<9*!bkN2GTaO#1}iC1wN_hTEWKGIFbeDE{*MEumQBvt-%avI`-#uPd(tXO zSFO<=+jF6@3{EHa6QE1Y%%Y4D^Ml$ia{OBv%JArHV_AJEouBu?UQtQH`jl-M{2CkN z|ACM1Jy%yE1zHAW?{9C6f8zsFPXw*Gk5RhTw9!z*Emb+V)2jFmI&W=-+#ox!q zkdT@RDvC%p7%;(u5q`3%y0B%&Hq|UrSlp7o)j=5)n#f#ZVNKBpPdibs2X(t4c|7>g z-Hn*II6S+0=FW`mR})XOF9;ElXT__j4^cl)YU@R%jy58&6l|xdPQz@_XuZI`o>&NJ&dWSL5aT4*PT?5%4|;nuZxn z-x%cl^dq}YlxI7awMwN@!H}7W_8XTTI_$Pv9De6rZ|7h;2NyGt7*wK11QYzAw^iOC z3LfC;^^2`@c3Xp-z}zvy&@s&ZYPp=(;K$_Pr?2ZaZrSW>6ITeoLR)S56AstC9A|G| zjM7zKo6PRQbhKkQK1>}RrjFEx%LtL$>MJ{I-%QuETIis~&O*7L(i=BWGZ_{?sQ(M8 zw`+-hU#xIQqeQG*gw!+19={r=b9_$>n46m?V8OX}UHT)y0CjpKU}!n9#sB~S07*qo IM6N<$f-fv;WB>pF literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..130dc4b0225df2b57354fde20c0f3c1fe6709e35 GIT binary patch literal 877 zcmV-z1CsoSP){S-3UI#ZeQvik&-1vxoRb$A2t*J< z@fS0z!lO52?QN`r$HVdnw5Ie7fl{ukt@f={;2)N%44YY$S=CS}xZM(2G$9bctmH+h zOh%miKje+e_taMerpO$}{R&c<3;_W=Hyx8ow{_j zd>mMj9kw0)`@>7TNzI_uPCmr^!fafoS(Z63JSs; zy&jbhWP`W#711x_3iA5wcBn#C+WhQzZFi4DM+Lzx4^XIhKMzWN%u`&IxNn6@h3lvG zT^(A}XY*A4umx>n{3d>3E++;8kLgP`fB0=;xw~kV*@L?4}DLrCL9%q`=Cg zTK+6+tCriox$irjZ?%Z9dg0}q^PTs3-uHPv4u_wyb)f=t41k#j@^lm&2N3pMUOA+4 z4%@G#6g&lj5=FlRd{Cwd3XMRKk%DlTDV*9&d$VW%>D?Ta5Pac(I@oiuI3D?YPPw6g zgPa^k@s}vkn(bSv4xc@Uc%0R7a4aaRkSHa-%ifnMf`3G*+LTr6IoPpZibhjlIV4d; z&itjNOh&HqKj6Am2hQvhe}V}izb>gl0Z~Gd%!H&Vux(pK(}{iWM@AqB0w{A&lBCoM zjRv>c_grEo_L3REOVmbN{j$bmdxN8+aF&!H7z`p7i~Rtr)#zz!Iv)v7dRh7KpAs0@ zT3_DKx_c}TKv8Kaq+}8F6FU;vqpZy*}eC!N`*u@$V&X6CI;ih!K52QJ=dIqccdwo_nk%R1Fer^DgEBcBh> z!np{%>m12;Rq8j@U4w1big}XA)rd(bS%R?cH7mEa)W#V&?XsL&trqUGGCa6_tj}EF zN)QrNcXf3k_HDw%XUr{T-K(Z$0+H1w*)9!Clc?CQx^e2rRdrz~VR4pZjfEeg_vRsd z6o#O(u0azSCb}DF$vw?mg^)h>@((CO;C(ldGZnKs!t+A8G&9e zSXCPRVn$M-_#z;bHT5Q6XE5muR=Y_-h}hlH+Uva+YOmf**B8vsDL3fiI-VrZdbAM` z2Ei*5P$~)kVLYN!_K(v~Q899E&1C0WqZ+dlNr(dz^vcK=8olp_A{2i8o(&g}2jp;q my>m$HMNs+t@(qOV0t^5tnNwDb2_bp_0000KZE{jW*UBEXqI6Sgjp78WU^3%(hL$RT2O>WAnk{ewvzf`nObVO zEa$iTxc8jSoilP+J@9f4?|Gm1>p2{J$VgBiG6)D(0ujq8I1b>MUp_f_Et1{$Q3@pm z?1bVa0lo_h3G^BuRztyaSPD_f57 zf5?aSoTx68d}N;Ie?L-%0uq79FU6!@a@gV2oJ)m6eSL7bT%c@wgb?qEz(72$D7ej* z_=I1Ayj7(M%iNK5;kbQx7*PfT>~=fm=H}+fDithcIdxNx(MlHH>z{y;Lo>G@IbZN~ za1fF4@gSmz7^4xxEE&%#Tgvn5Cmo}8B0;ZPnwNS3Mx`b+%am7<|CzNNrPqVF-H<#U zyl!j5x`+rox_Io?q~k{|YqLu+4g?G^*+teB+onDsC?tDVPI<0#W(HcV7Tq?Rm)vEw zVncK^T5HZUF!D`C>{P#@P}>NEehOKI7^NoUr0Hl`w#&C|6`ND1)1kAY191rnXf>a^ zTM*qKq9?(~yNtyaUBl7h!or|)vspV7-4)GYg@#S8BeB-V}S z5ka|mqAZo1M9C67yjs#cJ>jTPIcQCKT3WKdVhxRr5ZDgBjeL6daZPN}7OzYU0c?c( zm8B0Dxw_>&X*aP-mszks1i6Ez9{QXrEy+m|Rp>Su^gORXbJf{r*V@Of^i9xy78lY2 zl=!-rjr?&^`Ev&)YkB?NaBjawg>bhB$vQ&sy%-|X>`nBUo0-RF3wPNs{SsgR0mLsu T>uPR?00000NkvXXu0mjfp($+} literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..0aedc8787b755d3e5d6ff0d6e047f92a2e9e0239 GIT binary patch literal 851 zcmV-Z1FZasP)Q5eVnGwbfU$*$(= zQr>m7EYq^Ad?+<63||s@=_&7(mkiA;3=}hMp;jrwQpA)B3N-RTgS1RsE5W?>pk1u+ zlAE;@d6{*0=5%ILk+AyU-`E8H5g~F%*Z7FsiX35X&IXGi@I2OS z+#W*P@UZ(2oDg;TS~kB3vn;zjNhA{R0<7$6B(cFRN#SXivd2e9VK$pVsC$AS*hbjf zqeYihM@?*ISAn<5RW8Z9Q!kz}PE5cjI2cBw5%cr&zhSu?O~q-|>fUL6z!UQBPXP+6 zlXs;QWlfHa!8x$l>qSrU=b78>;VjTWV;Wz7a*-%7akIog_^ zar9JkHs>Wj%rLpme)MusIyxxT8b=As@(mS5&H5K6-Ikq*Og=N5aHH%<=gWRlURIBe z(Q!zyd_irO70MkNRvYck98}5SzF-A!m?HO{jtet%ZYU|1c{DPC+O7f8Mc*wn7Zyh= dP5zev0|4&wU(^+%Nxc97002ovPDHLkV1kPbj2-|0 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bandaid_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bandaid_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2b59d871479fff8c8fc68ac6c8ea092778805fad GIT binary patch literal 845 zcmV-T1G4;yP){KyFB z$I`TA&E4(Zb2|5`5n}bg%Q^SH@AI7VejE<-IJi-Tm{4Ga23WtGg5v<5{g+n`ip8*f zHl@%|z)dLL5a5e?LBOa7OnM5Q!%~RVg+~`z%Pt?`D1p1r(fy(I#wOp)w?_5ecn-30 z9K~N?)~$%%zoWud4xf+3aWEvMXA(;J&Zhc)Mc^Mu(T1%&U@gB|M!a5yEQ3fARwr&v zVQH*W|A(BDb^J=HG*9Mv{sp{@pvonM`?WLTrQ-r zlRr2dNJvaX+qF}-Ypj9z-nGkunWij|kDo*twginnqQaVAQy{Qv%Xw;9o(6*fU7ekX zGaB*IR(-ci>#_AltAq2hb1Vo@3xv73QL|p|*?zFjt znh+ZV0*~Z@yfSpLirdu^g-#5Jpxhi$Zj~&eVFE1|Dj)ptOgA{gLmPJP&a%k3P^~S3Wp) zgQh93zu*@K_^M z*r?x((XU=2s=3;_g00yh>pMMOYMp^xhf4+WY`1|7rgN%W#_3wWS@&v;Gs9EptKZbC- zvRQRvii!+x-n?P>`}Z#c&>IZD{$aY92~D#i(B>$O=(=h)4i2!*;wmZ(Z{NRXSW+B1 z1?Yk$cn$dTpCQJvXiB-DpdiD8Teleg{QAZ4{@F8z?Y)IFe*I-w1hn7|-dOnkmx1-q z@84i23kwS~Ji2p-;lP~cx&Qw&E?{B$f0|%A0Q&Leqe~|)Ff%hVu&}W)?3mfS?AsrP zdBEs9i7ToYk(2UNI~LKO{}|$d;h+Na4ht|a``DQou5kh*kBu290JJW7-(TDY49&bi du>k-91^|xti)4_vYT*C?002ovPDHLkV1n;O#{K{R literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bank.png b/interface/ispconfig/interface/themes/default/icons/x16/bank.png new file mode 100644 index 0000000000000000000000000000000000000000..d54c9de6a90d5397a683d45f673005d920a364e2 GIT binary patch literal 664 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bank_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bank_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..31f34931ade96509c980f6fd52ed195bf987e4e3 GIT binary patch literal 799 zcmV+)1K|9LP)VbDu0QlXdOQ~DD0Diu9M&?*$69_%3!DjN1uPLKlGbeIIT zvP|8EIrgXh>D(VIq%6AdanC)R^WAg4bFZMgyBiXT1R{}$--SY91xEn%5N3%gf6K zkH^y`l}Z(4ONeN*R4RQZ@YS%rLcj?Gf)g5zrf+a?aJas{{$wZ=;u47jR##U!hr`j* z*4Ac?#bR7Koh}m5IuVq40t#l8_}bgsy?(!cIGIcumX?;#+}sSC%?7z#j%YNBs;a7k zZnwL0dwW|HkH-~65FsK6^?Ln~&*!_~a=H39HZ~+g0E5B63!2Sld2y?&t3ioOIEmeE zcc|6sLyL=xGP-y{l*wdj$mwK(MxzlHiv=>73}Ueu)E3_-Q`}@SA(zYXVDZ6VaHel- z3j&=^cb>{I2LgdH{O1afkKYgM?ARrRLV$^KFO^D(sRh*5)*=##;9s^*#|}71*g?&&k{kt5=i61@3unp0a|4kPG=XUre>fy@NI?O&(T}0 zt>8#i)7;$L&H4FxzC5edioN!`@B}hj57FP>i;2l6$cs-QIQix>%VX0K(cJkr-q_g4 z&zzz1p?;*}__{j_r{@f&r$aEe3`3>u;741@6HtjmlysOL4o8A92uU=Kd|Z!hz4ON1 z*B#f!j(vI=R)pVwl&{gvCAzspKXHwSZVQM+LQu1hwa>^u`#plEiCx@z{HpwRkH17n d5^_HU7yukaOWVvs=ZOFS002ovPDHLkV1mCIeft0a literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bank_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bank_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..e727a1d2237e52a8aff61110a74a90d3d29f5ff5 GIT binary patch literal 762 zcmVazUW|7{o~Eri`2yU5FPEU4`E6DhvYkwySQUZo>QrvS4hw+9+et zl$cI)?$`ID_k6IROzgnJdC$vxp7XxX`yQdczaO$JLy{z87e%pw;{Yxa7FAXKOaMo% zR)eA_zjubc%dG2q*yr=zo}8S#&v$<2{(roO6*qQ_CfW=~g$z%eRWz@+P@9gYEwOTd6<7a1QU-Q%j zm&Io%_uYkG)PneNX-gYo5OCmV?R4x%HY!FLFhiwg<%V{VKXGB z(>apQ=WC5XY8U>t=ad&nxjwh-!t{a1503nR{$*R?kDZO!~teNsNJJrn2=nc(0b s>%aks$x~4E5F}v!x%0ssI2 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell.png b/interface/ispconfig/interface/themes/default/icons/x16/bell.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c9440e3983b25a0722464f6997f55530e83d58 GIT binary patch literal 741 zcmV1#%MX89OE)?5ByHF^iAmZ0=aN|}4w+i(KR6*(wu&%oi7lPnMstC4e18I{^ zGc)hKdA)B;OV3NMP zn=d%@GyjAQC~wWEp7g1eK>#VVR%q|%3bHB^xfnb1WfGz3WW1QNE~j9Ju) zfbLX8!Wt#1td+t74gw^40*r|ml!}^D9mxwEL=`MY2j5+R5iHBiK=A6b!jH7tqL(VQ#f&h*uhu9S$5~?4-_}IxaLky?IIm09hxC21B ztVm&av^MJbFdk4)1DX(^Si$qfdD}g9wCI$o6a^TPY3Ro-gj9eZMqpW~8oC(vI%0~l z#1OHv>vhP?{Jn?Q)KrS-mIax79xdmgDvc$+>H58_;ff;Nc$ZwVF8m4(NIW1Nd*`ECn1p>rT&2&Awe)-9hTJSfI5l>Mx%! zel>H2rlMskkr1)7SFfLrt*orTyEm)f<-IBjUI_K-yRDtystR?PL*(CBwTQOSh9bT@ zh(s+G>CjF0v{|Qqs+oE(h4P^ zc2im1-C1Yn&dlxJ*~O2SF8rC9JLmtq=bn2HB80%uB@VU^sQ`h)j$moU7)x$|Th~d; zuU%K*YvsToLMTE#QB_ffGpQ8pbmj(|>$Zt-)#v2aC|{s@*7)akA2l85ZSzOyv!6ox zSg>F^(3aaEa9r|Ko{n^#KWK0Tfe)W{TfQX<^<-K(`eW)<>~+w9p3YF@;o~p;#4vII zUEcv{-gl%YA|QLk>dIf3wX{KVXFWfk0?DI+glWv%Re)nB8zN(m-t?OQP1^zR_=43w zoRZCN_uLD3IWq;EAd>l|#Bym%tFN>n1jBcqe?%M?H36cqxd%S25J42J1sHOG%e50w z;pM>>EQj!|I*_YFFn(v$G~0`chD`w8${=8qN-T&#o=CQ(hEYgZOumZ_#&i&(*22Q! z%_3@AE|6BctSnURBD5%mq0`#vCPFu;umS_M6Q3vMxa;4wx@mzILDZ}{05NilU>(Aq zK!sOVRnx5N*qqmN0ywLH(_QSZBJV>XaemtTkrljRMwQ$$O_bFG4NEt#N}2dAS>jMJ5W_#;_(JC1!&ZaRmI$biU}yH0SKiyl6q~rw*UUD5!&Z zGD^OP%WH6^=i<2z(dG;+EW{v{ltHHVAd^hc;%|V(Vn8A74X1+xkJ}z-?`rCJGBUZ& zb8y21B-12*@8-~~wqWH)Ix z>85FG)mF5EABfOe#8yzTEwl%PS`g~D|9}U*coIa9f`W>8k*XCcsJGrL2o?pk7p+ok z8;wo#y~%!zvzt`y#ep9?%*^}j`#v)-p_Jn8MGpUtke@)22^P}MRIZGOZPUKPV`Q9d z4KiLa9LbvVDiJF~zC3?3wHW{%k2#lJ5WvxStC)(rGalDLdvH~&G49Ci1a&i*o!m=vK z8@ntU2h24ANg!+RY(tPFpTAZRg-Mqn$2Maz^9HY8UP8Ju2eDD_WIsA?njoHlt5io1 zgrXv$@LZ{yDF^``R9t|>r7<{k6S9y;Fj$F-{@_j~(p@isdYC3nYKitRWkxuTjnv94 z;zlUV~axFMAN2hllDaP4J}bEmN1!sWtlLm2D8!ig2JdeP!wNMjWo99(zHACj-a?i zY63le zH|~B2sf`&<2sAmAdYRq1ceP`BdK%9j&wM5|(`?5qrV6?2BF`h`wg7RvF`*D)Igcni zqcOZk)E>d^9ZeW>=kHUP_?p4ndb?EJr1cQe49gQB#CuS39RdFztYc7Ql-%C?Ex-WG WgGSsl_byWa0000VCv1e6GYl?`{H)&$jY*qKBZfy8J0 zxyXD!2hkbXe%v-0mf?OnCTt?Vgm{CtEC2GBya=*qa2Z^PYJFEn3pbCuLP#H}{t=g^ z-`bVpw{uRNK0ue+t}kl&;1M`Z2f@i>XQxIb66vjMl%f3VD^$L(%7y$TnOCn4+AIT)g_M{w%yFr+g* zF!y-om0N~;KNegsWq7wK)b^o=qsahaK>R9wX_N#bN-(H{mMaJy9mf)w2TEC1%jDt= zo8r0-_Qvrj92Y@Nh$qvkX~98B1IXqDh>nmp0dw0x1p}Jin{q763w9jpWw9M3ZqIHa@`MB^&RT?&YDfaEWp9&earg2yz>olRWdglki`Z%oMHn7+Kc2HQ0Q z4BUf8t%}WWLLlJ60lbZvB7mkw^n77#;^q9}mMFlqM^LM?(vwHCU!t)@Rgl8nE@Pgu znWqm2ip3(lezCa3=PC#|5Ned_wXIcAgc3gi!mlx-5NT~2lIVj2f)EeRsW39s4VU@% zrxMKntis2g(OX=!9)%5r?GX?{c*e*MB>4a1m&4bz!Po1r00RKHvNFu+&*|L&0000< KMNUMnLSTXx8*H!u literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bell__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..d93d5a27730dcd051f91626f6aaf4a6ee2590aff GIT binary patch literal 862 zcmV-k1EKthP)Q5eVnXJ&TR-JHF- z>e!}fijhlRu)v7uLf{n?D#|Fj&<%XA=pm^m?Ioh9sOa|41-j5nNEk~{1R+I6OAnPr zlx|w9yYB4l&gFDwbS+;x@Ppx;^Zmd7_s#hTr4*MAark#hc?2Fe!M6$XVImE`VbFDf ze1cFl!Od5j&=QTVS|5!b9s|zIkDOW7UYAS6u_7-w$@B%r1GcxrI%5f|h9zlZMQ?A{ zIB-I+Bgo%qlcH4$mhEip+`rP~^5lm2C~s!d$)TqYBonbRMNtxck;uvB%F5H-ln&Sq z3}YUv>o#m_6o|VtIWgh*`Sk<0fd2H>uW4v7M7rz#mAbRxaQOI;s$OT;pV$JrK968g zNqG@9%{f;IWfbF+QGe@}qt#b0_C>1c9x~4G!9nr@< znEdq>1s;xN(@<6ss(2AWjZ*|~{k*v*Y6eA0rK|k%;zb3)!V--M=(+|itAeugtVW?` zO?W)c5OYzMO4BCIDw$yms2RwqG->bJd!U(jI*EhXb@_bEvJZv9LP$P8#C#8U(Lvfa zuW46Q(qY9Y>TC()li0oO;Jyyg<&{T9#*j>;kV>YYB;qi&G#m~S3)pOUSt&ukTW;%Y z>bQIRK%5g?#U`b;vkRAds|E)LaqrH{Pga*W4u+|vV$+GK zA3TqkH3Gz%#u5(^#*!#tcY+N25taMVP+N@c*7tA>x4*>kdiJeY4`5uDFu~Am0YZqC o(LIZR|1YciDTZRr-X8%50QrJl&+P1!sQ>@~07*qoM6N<$f?YhFh5!Hn literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bell__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..3ecc8607503ac048261c205d90cf0ddd8c544f9f GIT binary patch literal 826 zcmV-A1I7G_P)}S81jhR33l|CHokOPv)1W+!5_f|=E`w~b z9gZ`>Si_}s|CK|IQl)p~7S)@JZ|#ZP+)00tEv>V4pybHV_u!av1sK~QaOB{L^JxzW z)URfjvApmd->i(*a`u=etIOJ19PjCtW#G-&>#_se-XRc+CmQ2)!}xdCh5)|4oaPI; z)fN3hd;IgWk5ldgsW{L)|7uV-P43Y&Ulqlcz`bM(;)y*-j6KF0TLX%s1TX1?;JE^H z%Yp6>)_4g=MUii_MoH_2H~(&UW=RmIBpFHH-xA7!qT9)2b7O>yrZ^50y+Hd!+o|#K zaXf!AIV=CGqKF?tjm&0#{gAcV+_feJkM|B;&`$Fv~F>yH2f0KlY92B9#@4FCWD07*qoM6N<$ Ef_w9Vd;kCd literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bell_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/bell_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..ede39d19f8e1f52d0ce02cca9b70097f194b32cc GIT binary patch literal 591 zcmV-V0wGW5n>3+p8%=s{ZZW+Si2*b5KD%1=+LoM1SF0j88AE>JLkBL^`NQLD;IwT8te61qKogUfZ)UPycn+QerPtEkL7atw_zA} z1i$HHOy$NM>~=d<^aKgN@OBlS58nfL?~d0S3T!r;xFeX6N~Nf{SBdm(w_5{qVb}hF z09uQyCzDAJbMTG@=!3Y2E>7^fda(nLPK(7Nt2-RcQMXPuo88&AeTqS@4u;5GAfWyh zCL@9U5gf+IdFICgj^hx5L#owkw$gzLhcR-B|!00CX*5Mdfj@VdI-kIA@_ON zB08!$4D!6&?cQJx_P+!eBZpk(sJn2{>2&OTJ};-!>3f_w6IBu*y^8jBpGYJmPN-Y0 zR%N^0zMo7c7YKbbqLX+#8jb4X@%RlUECAjIZ8#iW<7M}Hy~}8q0$?BAksqOtH>^}D z=~$DA)0Q_)^EF5&s--KHN|mJfe13zjHsGRJcePk7R_SzFE|<$76wrBp|I9;Z|7UE$ dM{e*WzyQgUJ7>2|nN5AFIz~uH1(r@MpdwgdV`3;{5J-{201_}T1O-x}0Kue5 z^W)g(JDa-{BbS7MCw)5k-hJPF&+i^Am&<^MWmy**jmC1b*#x$2^Q{O&Di{og6h)!2 zSjvG`dk%7lN@8_WDbb5ju4vL`{ zudP#;HkDpfcDmQ^_VZURDhGyz|FHa=IR_$y!bT2_mXZP{a;4Li-YrEc%GHv}d)9=WM^AB+TbUFtdTFjvCNmIy;T_giW*j_mE- z&v|VnG%cS?wM}eemX=SHu&9lMy4KFswZV;hP4&U8-220cH5nQNFKXjL0mpIax)$y~ zyq)`aWZ0&O9c~>i6zFt1Ad|_=i?Dhp78y~;g?=&*jE~Lex(-maS_Q>o5y-OazIwi& z9}b70;W)rB4AATK*7>uQBnhyA0`Yhp=&=~+_xmD0SFhIre_fGUt)^(27AzDBU@#cW z{w^U7yJ5`ix=bJp*fat*i8GN(rGi?mR+cx7TT3#mu<_hWP)~@$3_wz3WeYoY64wH`)613>wd;!t@c=b%Nb!olvTt_ z3X+J505qugIo#7PC$E)6G$9237v&mSxBkyW8Y9|drR_vf1&M%CikEA!@lj$qD2!=` zm1ajLn#w8KOpy1YP%v>*su{w&MbckMy8Zhnc-j2)4?PYBn4!nF3IAmxnxat+P% z{2yYQnX*j16RVDQGij$oO$}Y$Xght3nJ#3mSfsuF{S8L(JhrNmWpQVPh#IuCm7f=*soamRh?JE#P6Nk^$XHsjtX>6$R z!>N#Wh5%WbTNjyw2Yj|gM@!dt_x_V{X3zG0psJd(le2ByxYYb@^u;n4T@h`X-h~VC zIJ|NZ2=(sbZr}SjsHrN@$z&4ze*e}Y`g!vr$<9(%wyUSf9L)l_gDqf8$(uC5q2AWL zkM2YUk&zq>2EpNQoayW98{gdA)E%f$C=?)_PQ&Y5BdlvKz!-xlNl?+*3AL?F@b=cz zX@v2Z(OvdPB*JhUXAT4ckjZ3R0000ln z1`-t=DVl)*OlS*xgI_+(PSzl-X&U^moD8-~Kky(X5T+RH(R4#nG|+2tCqvkanw=sE z0(%+E-G8c{5-LP&1Y!Y2TYwl?YExl@G0LYMAvP?b(bL9T}u@yMn^o`%VUn zqWBl=rb*ZP&vN8SADj1ijqKRNLVV~lyC%rW9_3{ARX`#{ba&!%V~9}7lA+%j4t&k? zN=3;&kNK5X6p)uxCqvlTYPQA8n%EFVne>LtjZSQI6IMc@EY=ma=0nHg*L`APp3&7J zRb%#jLbWUsxyB!@a-jfLM<-U|rw@NrulBZ>9>zuc1IU)h`r`RhXNUxh`Oow)@$c^TM9 zu)%7^q%|@K&&|z2PfrhcySYu+eCgP9zdgEEcP`t7!)8tiFY#F&f;&764^HB|ipy{zbLI zNK2sOM~=T?O&EkMH(TS`XPRccWw31t4G+S(Bdrjr5@_!MBnhgAF?UxsVDYyA0{}T9 VWrbDl{V4zd002ovPDHLkV1kq2Z6E*u literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bin__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bin__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d58d6fdb4e9cf25169283a4ba2c76b7b9d9688 GIT binary patch literal 739 zcmV<90v!E`P)ww6!{=kwr#5OS$lEDn@PB`{6XUFu=%4F-cD zQ53CMEJhNEgf2;v9*suJJkP&#H{pqi2{^>Sne!K?zWr?PrNvOVKN(K_Xz1I-w2@|5 z$e=a?a9}tkBvwBx&UqqCDTV)qUxQic|J;ZV0>}RfD7PnMl9I5=8t_paBxUo^J^d~t((QWJgWc+izWwdu| z+)!VN+x@!&&UN$XqD83ImqL}&4w0s3cg8qo*ixL{^)G6|avaO6z++bnow9font5K9 zl5uQK&u(Vq!H|}}(7U4>roqyJr;%4yjz30fIb`PMaO2+7lJw%i=*C`~w3{k5{HHL! zxCpUo^>_o@cB~OOvj6ho=+^_))T_5APm%StsGCzl0i501yc^WC8xFuKu2d?JPN%y~ zSifyT70Y%|ePb~`>Kejae4P=IVU3xXgxAD0#~&1MsdwhgMPLcLxe zaj$J85raodOTh6wupt7aQrQj=Qe!u36&+5UD9dtwd3pI+qtWR6T}o}J)mp4y2g2b9 zuxSJ~i4c#+A(tDwRW6s`xQFH%BpC;pbIx&`G$XiVK%EEb1b=jsHOsOJELMLDFaTfZ VS$kN6%N76t002ovPDHLkV1hdnSsMTV literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bin__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bin__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..98b1c11e3acf31f9163a6792c256346c51b1d523 GIT binary patch literal 837 zcmV-L1G@Z)P)aLr+|NnIFXfe?q`oWKn@0{~H-*?XWJ|qwbfCi4^&WFR{(nur%f*@!nlS+qP zuQw0`Ar%%DayFZdB}tOCSS&G}PWMU+!u)p_R-3oo|Xha@4gbU-Pa+8p1~Mtw_-wP-*T>W&$f z06cRswQuO^>MHO&pXHt;YP}gwOfy?SA|1WsYV!H)PoKS^JST2!?XZUztE#FXR8$05 zFc^gT`g$;%&C18g(b`lh1z}kRnx_kLShLzc`(Aqu*LxXMLI&vLco@TIGt8C|zk>(ypdbkTV2>@>))sAv zZLL+)G-;AeHoH4ByUqq9(bR(v9<%$+yti+5zCnpZ0vs5Iab#&}DV9to0b}fxe2igH z6y1^}(T0WwBNzU`KQhzVQ6Rwejyg`Jv{Pxvy_cWZcj_d6Zw(TzZlp; zWs@S4SO~y|_J}_?^Y-~fRU{BX;D1r85m@wpE)+NoI};*n5mP^F;jdfk^X<{}f1)wZ?oM38)l+jqdyk-`i`C5%o zE|>ohdqv*;X4+^z)+c2Gek*n9=62V~L1|4h%-^b7O zrf8N@X|Am)!lnLBz&UPJIw%^X+!R3@$#p{>9bfO}m|;=1!?TN8klHq_CaAJ*3zb+r za*y3!l|zjJ9vxrlQd-^R#6Wm`Y~|waHT+Sgd$bd=LSzzKc;{mz)HcS>wC670O3HVx zb+e0_eYp9kebxIFs6}@+uq>PIRlM7GuXirzHLPD*xX`hn&IO#g zJk7Inw1A3qnl}4(@Z_%beC^x zYD!WRMU2Pekjv#Nf0qyo(&-}WHXGue0bsWg&V4uyS(*i+Vg%!b0q4-11R=&&c0K!S z+m14VLxxH^gepU2wEFo&C<@JxhI#u1KF`YEehM%Ed5vjk&Y8q!00000NkvXXu0mjf D_GM&S literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bin_full.png b/interface/ispconfig/interface/themes/default/icons/x16/bin_full.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c9aabad510fa07b618f799eceae0d03f1e0726 GIT binary patch literal 850 zcmV-Y1FigtP)Ns=^m6!;(45d!WI6y-|J&o^8f8tR>k#V$MT_5vC%BFg_r zA>Nt>V`F2Mfe;=TnOxh<7B%&N8}1IBR#dH^=|Ux&veHF$wIT8LcfYI^i?iw=10`t1jsLQ9hi zPDFwQmi2hPClYF{=9nALvXEmrxb$URd^p+SzWZ#$IsK$#w+yvv73$jT$IoIl-=`?k{ zzdPXJIP&btM#s$3O4=}xcxgov>IIc&d5A?;KGssPSPb;{_XCDujMC1p^Y0ShfUfK2 z3GeOg1=ilr0;kh?=742^+wBG-&x2epM;41ku)Mr%J|;RIkF(9q&2`~$807PLv(6Ce zKon(k+YDsj0z4ApmxxWG(I}NlrSOfFZRq1eG@|D@h?W~b01OJ7`LUTzZHp&GP19ny c@_z*w06A8etJ7?Pr~m)}07*qoM6N<$f+`x6OaK4? literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/binocular.png b/interface/ispconfig/interface/themes/default/icons/x16/binocular.png new file mode 100644 index 0000000000000000000000000000000000000000..21da6d674524315ecb92b339a5afabb43d11f15d GIT binary patch literal 516 zcmV+f0{i`mP){pTO9U>cYwg^aEJS29*#97DR@!0SPFm3Dl16XcPreOICb-=XcMJ z6Yyv6l}g1l3zMm0l}eObQH;30*=(TEXy}Mju1ke7Cum}l z(F@1p5i*$!lO&0uWMGVe=Xorb%RxS$2Tjx1d_ITCWYP>1B=Hg)4hJ9wuIqyD`@wg+ z-3Bq?>-8E^sZ@{`>O~7ubfTmrE)JO#CP>B+sH#emFA*feEl9E~Lpq%XMNwe4+X43J z;v7^Wp%`bRX0zFVlw2qf1PdI>{c^bkEQ0-hPr1+ObSnOLAMuw6zKBY)+U@qK)9KKn zSTT}ganXB=)X)pF*-R*Fg^DlY34XygP4h-8MW--dC%2Q-s2PE2>`L+tSx zU-;%d(k714A2`7n@uvtrq*_v-aY;(tK3p&#{RiFq6<`3lZPc`>?Ps?D0000u8O~wg`f>$Pl@2h9<~m9S^6J3MnSiTqGI>Zf)IG<&>=c>>UXSAhZRD?i;lao zpshb~+;pb*6{m(U?7?H+d!O(7d_UhekAgq86$k`Uf*?S<-G+QV{{m~*r(v{)AmR0T zg=jP?1cO0=PpXfzVZ|01BZPhfO99T*G-(ChWk?REj*Dd8N9goMO6Bjcfe73wx8P)9GZ zgQHT|W`G9;63c=ELHS&`*?s)Fw#o{Hk-!pxBJ0ra_hB}hMV{wHvJ6oap(u*za5&&}I$<)I z#C$%FOeV85DWIW4=ytnc4mzC6_w`FAG-7A)IjdNbLLAfhtg-p`0uhi`0!ryWM8k`)oEFdvu2rc6Yf=um6no z+V$snc;5%h{?~L41scuRdW<@j>~=c>fdHFuiD7S_aafQMy>R~YSEH_lR4N5dsX&qr z{CxA2yUTc0Ai~@*2f18Mbr#v%qw@-`nr#c7&7BW;xpos<-3;ufB%xZvGUHW&SBXSo zJ|2%F5{V$0OwKcmiqGnemLT}jVV!0Rml6+P6dE{UQ#6&T@e1Qvr(?7}lkIclpgfuZ zyNO>4CESY2bMih-8PN98+Fn6(`^E3SYw@76@u_`-qu4aEtew6OPwwG1ZQYX_;*e+nM}#HZ43qjRIAl<@_pEZDH6d!GMTjV`MjOYW^I1| zC$>88=sr@wBY*w(Mod<4LHCxVvVH5nH)4X|G?7TOa=Bb|I2vC_vx5UoQn@}jU!fTz*6+xd_LD-k9 luiJ-b&Vnup!2FK@0{}~U+i}AmrPKfb002ovPDHLkV1lKD4}<^! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/binocular_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/binocular_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..65ad17c0659166df81106f7b28f1216f07b589f6 GIT binary patch literal 690 zcmV;j0!{siP)*4(Td{~xcsMqU|PN%mqc5ND_8!K?e z<#Ne>zhCxxy)vEu6C15_XdEwa+ST(^Y@9&~ErV3a!Am{uU+bUF`wKA)}8Xn@D# zv0?1J+wG><0r`mAYPA{!0s$N16iZN|UM;YIL5W@%3im96*<|s)NMWXyqF?#<}Jbt7Mu&!w!==FLq8jWBu7@*l~0{*ju zI*3$+eAGxhVN;-7Gr_%`9q`Z0C`+7gXa&BYD09VP5iki_tro>z<#IW#-zi;hKV%Vp z!fO0FU}xY{yZyEgushDW6p2K5G#aHrDN(>X2k_zvgWbn0w7$gJ?QggEW=!UeSypB! zU}Ws?L24;6$mjD~dxL8iaqKvR%0FN;w!9+V-nb8`*CzN_-)+0~`K@iQSNRuIsd1iX)INBa+a26SSS2dtX+|PVq zH}Axo3r~yMkJ*AVOB+!nJlIVo<>fC4np~NrNRN-=ED) z;=OUEjuMFv9`C+$-aGfa`>qYY$CGF@npRa6tyT-!Z1xRdw`Xy7i@@bjD5NHnNi`OW zsl5MB?rf~n9Mgd@uf~2RXLYbgbDykoyl?Dha;Cs;Fc>^eBof|syNyUB;w9``I2>l| zm}BC-jYb2hRLV;{W4nA&Gz3-%R5-(EG=kghRs=y%$TAc~fu?DS-|t5t5P-|&QVN9v za=F}!RlrV%Fc=KL4*LB*bX}jU&1Q2FGheUQ;cz%6xar<}g79}m*~zrnG6buDeVTwQ z%WU~y0(R>Y1W^>>bUGnP5;~m@=$(D4gUlivQ;p>!wxEyis@_>UW(c&>>GZtW2c=R8nM|fl_yR7{Q?ELP=b|3bNndzjYYFA&-%+hqM;Ks- zGcD2lO17_&gC9l>xDyXJ3yL~W?0s1b&Rr?rsA+;;m3p-f@Tl{F_y_F3WmuM`^}`?I puHzx}@iIi)XKbI|BSiZtzyOMG_A_kCuJix^002ovPDHLkV1j5SC@}y4 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog.png b/interface/ispconfig/interface/themes/default/icons/x16/blog.png new file mode 100644 index 0000000000000000000000000000000000000000..89b94eacff3eab2bb405b1cba91da01f7b09909c GIT binary patch literal 539 zcmV+$0_6RPP)Sc7%;(3 zP8AUf;viiGp$MHzo$S=5(BILYP>N&4twWa%{($P(%~A0|L_v#>Jbd)tTM`m$#RE6@ z^1}QmOQO47ysa-aEduTCLm!Wkuyy zLMU_!LS)GD3DX9{urQw+SS$?Oz1r|%B-^%q1fnP)9G0PJ3KWHKg6VVyU7x@-Enefr zNS0-}FPqJV-_-=o4B{n$+J|2BFUd&#C`qLFuHHt_ijLBq%Xq5amv;370vmXw@ zXf&eRIYpz<>X2kIi9jI0yMD-6O}pJjtJPw%X99gF^qdhwE<{lz$NY^{#f;h) db^AX83;=b!3P+BgS=Rsn002ovPDHLkV1mDn_6-04 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/blog__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6d06fb737ff1b8b6191425f5d05dbaee3ee6b2f3 GIT binary patch literal 661 zcmV;G0&4wQqlZY+EEK(P4N+A*~NL`4bi@0)A(7)lP*o{!zxJpA-6%nLJ7J^wwpsN%_5v6G! z%r2?Z%p))F9ch?pYw3Z*J#+5)zWd#C?l7fN3Dg*dStQFeE@tiVc>I9|+;BKNPEKdD z+4YN{i^bxzPd-MYk+I%gd56ROuZEJoa1+>hZmBV2&Lk+m zypKS@1Gn3SPDh5vBmAF0(=^NGMH?MXZxm*s_ zYLzJQARdpyjIk)7Bh6$oMl6b=u_h7;qwC>tcv5q&f<~hOhr>Ze$U{*S<5UWw`A>%- zNHrD8RC12w-V6xQDFQ0-q|tmJ5Wuhc81oBPP^ib|bsN8|$a3Kn0eNK;`I01|E-v6e zwm~DEumAoIjtu0{(yh?jt=fw*skixjKG^Mcde3A!onG|&{l;n3BasNU|9CNX?*`Q1 zRZPvqF(OwwP=GtLVz5^I8RE+2GE%7&nYr6g&}=p>J@BMq=|aba5AVTqXtgYgI-KLdGM?;F`hJDjB*r-9D4AP9V;5NPXB)_(m~@iO%8^iJC35U_T0q{fIDOOU*O z7A}_^Hk%cdN)2{9`9FcGsw2rOPpe}W=QY$AF`S|(BLvZC6n?)S#bR+suTlw-NCX=n z@50J`hI`>MjF^!Q`jQ5NK|K~lQTINdk1nkayETjb-W5pMHS{zW-|9?`?;xMg!)!KF z2?aEpO*+3FweoxL<{4P1tY$I;(YE2u%Lm63c)i}y;d>f>W!_@n;xa;!mw5JY8FP*o z$B)dfb2Quehk#z$uzg9AaOTt$1fB(>$w(v;cyz~!scEOXqe`dgNxb87xg3?uH6#cG z0z<;3rNgKd@4*<><_OeOgC&Xp{qM8?X@j_k!#l&8awFYCWIViS(X_0clBZ;v@qA5|NE%u@1pU1w~^gM c`i}qu0L4!lpi##LdjJ3c07*qoM6N<$g39wj&j0`b literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/blog__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5bd7b61b5a461fc797ae1aa13b444c99187fff GIT binary patch literal 596 zcmV-a0;~OrP) zeEHEguQ;7aZ1KXId*8kHoH@Mv9@l6z;2Otquc_O_dNy1v7N>3?%x1G?a2rl4tWlIdl%^OV^$J0tFNFaQOI%x zqtOJ>DET*mWm$pZn-Ala2bc2o_%VWMngN1Zt%hti3r*Ah%xgGArBXqs)1gYDNTpKn zV*(1?k(Np&7OSetd?u4&r=Cb8yq^Cm==b{whr@J)A`HV|e|162d^{fa6g+FU9}~C| zADWw26vc~OOy=YSWH5M4KyR5RU)OaMi$&a2tGGEkWA&esgxuBD`whd`UjW~QUauEm zFBA$MVLF{=@`o1}*v;ksO4`}kqTj7g$Hx$w%_efRD9bV<7*JUc&w$(B#>ew>hUIx4 z+U4bS$g+M3Q~^hG5?v&jOzyT?tt0<6U1gzA2>E>epxf;*RC+oaM is&qo_2Mx8~0t^6JIt@C)q2j>+0000j_x^ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/blog__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..24ccdb697129a988b7a18543c59c808c5e42fe7f GIT binary patch literal 708 zcmV;#0z3VQP)U~VmGybGrRDHmFyC=-g04r!h`}K0sT4RxQCbK> zp%8pNA9A_eKfiW&F*P-XwY4>(#0EhS(6h18*ON*`_kfoz3RFu+M@MPxbUJDFdcAb& zE|-h0RpO*93)6wX`0tq+dz*r6HVdQCNGvp=TrSgFRbsl&Cb2D95m;ClzvXtnm}oSX z+Xz&N|A)GN+Pn=pJ%_QOs~8!1{&7oD-rfb)+X%=j)8tE%1i#;pZYF_T;uS>kI+m8c z;gZLg1p3!A1j}VI8Dg13BM?PVBlLJYDCd7dmgXsVaq%n8Uw(?{m-q3$KH&TQKDbyc zhQYx>;<=R)?Ck7lGbqSgU`lT=JUoOC1nj=>5RS9gAj`Alb>^|Ux(be5WF`eaFfagv z!9b_pjLqx>@*ccJiI!dHy2Hvb=tHg+gI=;-=x( qX6DrAKYLvX-K>fv)>T*k3NQecBQePRz;?m_0000^brP literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blog__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/blog__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..28fa213c51c38881fa5c208a3e94a896c740cd94 GIT binary patch literal 644 zcmV-~0(WKA3rL-uHbz-w*G-VM?VEOk)`4B5_MNoV5+ZcxeWluItm}QZARf ze;9PJSiC-sx$$^BJ0PqmT;py}E?fhlpXnR&n8kMBRWkh*XV#a~ZDKb>_-JV!vbY$m_c=^&HIV6DB5 z4?Caexu}aU6dn44{t*T?xO%-#*{1~Qbb3Y@i^b?IpLf0@m_9*s-EkLZFQt}Axcu(f zTX5xa8Odal%-ll>n$6~14^H!^@a6U9?zUzYu=RMerYve*vZNav$+;?(iV%rJ;BYu- z*Z11p>47y|#n#QmOQGNO!eby|I01wOTm|hKiHB z7s#>Tv_h|y?-P$=|20MT+M z-)_%$B(n!|+2J(SC3G#U-gB$Z0R-Q!_EBP|w-+$Ryq zGMNllJ&{N_HG3I!Ivx1^em+9WviM)A$&N=N5if&X0HU~S6em$_e=h*rGKW6RzECLe zeHadhypeJqfOfm>LC@#&PBNWNbNcky8n_u4h5@NwuOpYs@tISy+wK0+z}^oVU@#c) z?bI|45{t>qQIp9eL{a3b?=z}twOVL4n?!peuoo@-F}plx>>j9x+(yP?!t8^&`nLcB Y0B%MKJITWazW@LL07*qoM6N<$f(`5INdN!< literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs.png new file mode 100644 index 0000000000000000000000000000000000000000..ce125b03cc05c53da78aff680efd2128a088b74c GIT binary patch literal 609 zcmV-n0-pVeP)A`~ZP>A$il3Ond=8!|qA=g~`2h?lHrI*H{m-dhrj~3d31;IlhCyf>%B8XA4 zx~@MvZ#J{+*4BY>p7Y*({Op@mDijKkB#F=EatRtNK4422n@4B0T3yN39fHheGYZ3* zOy*+K>3lwaLhBkpmSv2`V=y{m=bzy5c=)8;Xf(obIK=hqLrkYrSOEv@Kv+PWPUn83 z(ZDl5aJ(NvN1b5;CqDjmb2vS!uImP1KA-n3`Lu zRN(XZ5R1jwzGeUfiKsNbzIln=-2k?>9Hu_y2oQ-x%pdzF;MK+5+I2mB$kC&=+ikd9 zF8KX^-b@Y2_Dl*w_{Z%gI=%4n->a& zSc6pqAV@?Nif*?XilW$*>6YU0IIpEvcPTRIQDpgCfr5a+kGQ?VHFmtNX!V z5S3f47B3{tVzG!|Fvts1sgzBbnf&Va`=9^nu_l+xWp6T>~J_dOYH!F=XsRNWiUD%cV0rL(@B;3N~IDCg#uRYUPQfKM?YYi zO)$$4rBdlmrBXO%1a7$ZB3o>r3MH1-G!mSaTC3H%fM&D#U**u;STCM`{+T^@NpY*y zLbY1$0%R3Ze(K|yu9nrEP$(2A7As7-gqg(}W)2Fl+ih&5Z970#AuXD8YW_8fVqAL9 ze0qpVr6$F+x$$@$27>_(hl72ubOADns8rtHy8w%26eA;wo<8*vz-qPje)dnmmEiAz z<2tg{M@tn&5o)y>Mx#;MObH;9XizK`>t;wci$EZNL?Y2sCWE)-{SY^lxU6jr0!Yj0 zbV@O`bUOXYWRTpb-Cc?iG*Rdj~Q+j4_v>* ojgF78`?8?YYD4OgCjJUA0CJB#IjaOpcK`qY07*qoM6N<$f=Pls$^ZZW literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..a56a0732750f702f3f0ea64cde7a7be036641f69 GIT binary patch literal 728 zcmV;}0w?{6P)?Y1PVM}YY1K-X&J2TI`^L-;MFE2w71Rl+16V#ZVW}O?Sw_>Z+dM_RS zLy$(JLDD@pHy1f=_tMhRUFtgkk|d#0sesWDc(e+;-OhvNR8>W}T*lYOH&L(GaU3ws zHn>fQ#bTM*+}y-9CvazC2t}oV8Z3Cb)yLs=`ra!ox|$LI60>>4QVtikOKV)ph5BG0a%upLLOS`~Fegh(U`a*)sG zvAes=vafIejSqHGEFXZ_IzTKIgQjjVXa#cb=Rh)I7WXi9;|Z+N zAqE}w{*mEc`N2J5RAP(e@$qr~2123Gi3-@HPZ)CP=o5bdmL}Bwhfwxc`JC53;JNx+ znGu-w$+CQ%0c?MlFnsH9*6%UAq(uQnPfzo(TY_fJvokmT2rvM~R!K&H^gdw#0000< KMNUMnLSTaH081hO literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2cdda205ca4f2d91fa983a13166709eea8fbd6 GIT binary patch literal 640 zcmV-`0)PF9P)4#G;uBzA9gSiwDX*mLYHx$)*r?HGsZ_F**&q-ISbG-$tQCz$Ma(0=ompizXfzrk zd7)5<60BjPT!w6tm})AzTrMbzVm<#lI)Zj~hLPJX_Litt?p$0vav8?WIRLB9CXVmQ zt$cot-FSRHIa^!m@ySVCu2!pJBWvdKc?5$&v7SgIEM;kP6HiZ1f7o^X_bfwZ85+H@ zSnNI}Ff*;ng~s1UGMPM}q`uh$E?1}XSGe@4t6r}+PDP|F`})Z6PqW$lLg6=pV08-k aE5HEhTqUqD;AqtV0000YRw zg)_vtt-C*W|8BqYTX$?q{@~o-`TaTH`#I$aDwT>`rBVS6=G)n1z`-Lf%km4M zeuqSg#Uiv0ARRv0=(tnX3-#Ah8C!Ty{-=o|w zm&?fK^Hl)_g^(W(3k>%Nv%^rU)eyxTL(X9Ik%ZAxtuUFo*v+m+0R@GyDCpe8ONg-$ zUvJLOAeWQ4PsI&|LeS}SFq_S6KL>L#2tiRIRT}T_TtH{%F*G%)Yxs0V0!E{euX76v zxHLU|UE0}+GzeUF@9t~Y>3?UGYAhD3RzDKK`SEd!-|2J;grW!p0)graiO1n^IIy_5 zSVJZPZA%PaeiYys8^cg{_gmJwshR-gX|Y(iPcwB#LFP5cgs~N$gTvkjm&=7@N5`k{ zviw?2eI+9TLfqcoX4MzDfU-{f4x+I83^rRI{Qe*Y`%faBPXBT9A?N1YT>2m;TYP6w1&9A$+Iqf@2Z?Y)eF?2r3xj|to8ZzQ zdcA(GSS%uF2d>SXK&7Uj2|b?e7&)AlD$8;Y&~CT?tNiH3R6kyN{F=Rw^H^0?G@H#H zKvN;*)tJb1$5}Q(r_-TUYcS z7FoZk7}Rq^08$;?I9e;EkGr36YTmpZ)w~bL;T#=f!L`YYhYf{0_uov7r<2`Fy+#ia`{X zH}B-5h3k9j9?|^Qga%8Sej%)Gy;CrXUI*SYCwd82$(_04Q)W Ufr-NHCjbBd07*qoM6N<$f||EIxc~qF literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/blogs_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/blogs_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..0654617df19c2b6b154d0604c2a82e0c6ba924c0 GIT binary patch literal 603 zcmV-h0;K(kP){O;1hsoI+i08XS_Y9VS`95Ch%ww%R13pJ(Dz1yT(~iWKuOTYIO_BH z**(X1AKo#%aJgUa{(kq|d!DOUEW+h-VX;`Ow$}k{V{>VVZ{K=O&JtuYnQZI2{&dss zLZNV*+LHh_3&@pvy^gQX?!f0e1;76^FIv_FL*p;>N8d!>f&%!TdH2DGHS^1RS23T@ zF&d2&fMUM?=BF_GgxPPKEwqnKyvp6cY&PTS0H)I^wTiiLcX!Ra|Kv5BFW!2{0Mj&= z02vD{KG(h2+Bz%h8MxhU^!p}`jt1C&F>=h!W)tyv9K+#o36Mu20BzdKy+{AgcOExC z9|)7h{oLMp2GBE8I~WX908LW)`1l%jcEZp!w{!eeGo4rg$XICd=0RsI_DlAfGL<}ZHVor}0?;%KF%hLiU}_t`naua+Z-;X?5$_+wtt( zo+X69-fqYz>T-UHetRLm<3O~)NxWL!x{d?Sb>VxS_M_1V{%{D7Vvq9CYBT14@f*=Th zvg{_HBrMCqbUHmKPSX^-J<2u_4C?bBw{06)mK_i8dG zcC=|+$$u(PJqp-N3N)^ykwE-ifw=|ID5$E+s6gXQ3)>9@gM2tVWX&8fR>uZ{8khM1 zUmvJm<641Fi7~CmoD_7|{Ajw2XQA3=F4pl0YhVK2%^z>e<#LQCx#@k(`RDt-M*ave Y03;N`WEV$*zyJUM07*qoM6N<$f-Z`=G`P)Cnxe#LntF!hzt~>047FV5?7Ft``%2`+_C@RW82m!Z;!6c$JRS#2CQ+?c zU6Z|}U@QG!uoW~Dn5GF$(~!&MTnS>a7+{+21hff35D<+wvMgJH*!cn92f{d`riArA@DV$_0fvSX{W~k^3C0ie$KgZPm;)ZG`MmCvJeH2K z^%5S+2z^dMNvK$#+dURU@fTMhQ$m2&AWve{YyN2()}#1re?N1NyN@dV%q*9zo6Oq% z!R$7_x}Bg9W(f%>qXoAyX6mO1T7$BA@h@#=S0^cS`6$2uR-4%n9BwC500000NkvXX Hu0mjfXqo^g literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/book__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..39fb2ad2da4658af6ba968ec68b12c85424f5043 GIT binary patch literal 631 zcmV--0*L*IP)Ou5ikHr`iA_~Pr zir^-s-OO%$lelY|COGi%9y9a4_q{i76wW#Ru6u;Eb8YiH{=YsEHl)LcHq%e5)%Ad; zK@S9A>bj4RVZaOqp_8xEd7)Ig>jiPgaeRWE?QLLrja-}1nw#=jU!O| z{U9*LU|H5F0=Yl9GhTrzga9NUjW`j!q`$z$#2Z-ZO;Vuv3fQOu30Z>Y_cOX3#I!vW zSMFdMA7HQ!heHVnY*c|5Qs5!R-Xk@aK=iDEWPA>n7x$xK-iE~39?0d*2Wi0qe~V12 zh|=vHJbtu{;)UJ#gR9SEtQc0n$0>-adq~XC6e>+rDix~c8#41|L^xRKijzIyUd_E; zuWwyKQr$&zVG0MoKH}BObu^DZWBy#oB<@=@Zwix_y&;otEFt%#oo4%pMVc^zUl3qT zT)*)UCbtluX=$1sE)dBjslcRwSwchx$+woDCO{u5tyQs<>QL8zBCNI1KD^(zVXcK& z;!Nh)#+qz|PM9S$%H?txuf=!2tE;ue-;G1_UzJ+}sazaQg{*_d4~Rbk3;-v#_w>f( R!Fm7y002ovPDHLkV1ha#9pnH2 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/book__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..41d37c03e8327d69b11c3ce9da98d7e83e498687 GIT binary patch literal 514 zcmV+d0{#7oP)`=Xkn@T0Sl{OEtZ0cXtWW;A0R2LEG)FJ&=?Vd78VBzdV=Ayd*@6{ zj!V2F1CJeM=e>Kgx2p*u(2O-gTFvc@qI*0L3Y>^QF@1V*u^x}bV8-J}nWm4PWD==F z0w(1q?dKO4S6d{Zl=216_V$2@6-ph#cl76LGqbepcRJ8>xg113k9xfxNsf_&^Q&jg zcMueCT^Ekypj<9T3S_fcz;&YqXcL;IA(P4cBUdUF{Pie3Ou%TI2SL|$*tY#ofa`xf z;SLNbCBOhLGIWGSy_*9bA@Fzn@aszY4)jh3GT@*Sz5}Ir7A#at;SM;$9Qbu5^}_uT zGN08p0TFcu<7ZnKczuNDc`ytE+m@eEeG5fbf6P?d3rKvq@OTxd~yQ8 z&3rg~$y)b-YmK}aZzE&ayu60TbJDN;vMhVB_VFZ|4pKzurL~Vqf*SbI1mk^aqwOjm zY#-j?d3T;43=44g5TRNu7JE^WuU#LrW4$yv@>hTX0CyhSO@GNE&Hw-a07*qoM6N<$ Eg4==DH~;_u literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/book__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..616565273c8ea639e7f430786d181b06a570d552 GIT binary patch literal 635 zcmV->0)+jEP)y$MZ`@NHxZ#le6&Bnb#UjZiqJ)TP(^Et2#RioAn3xS3RWXq+T7o|8IpI(6{C$31iIIp6*6oO2~11pe44A=ErD5yb!P6(Pxva0Elsx_(Ag z6!=vY0l&YE6`F=XM+f}m`)NOxNSwBdM6=m!6WmUvfE}mEH3(Jj<7<2O(Q?VHK#oSE z5V08Q^}1)VLJICY$xCeoP6E?3VHgH7nT#hvBoYBk)0==cAxRR#;qbEJY&MI?-B&5>;Gw zD`4;yY~Klv*A|Lc>HE4am`o1M180R>0URf}tyh^v>7#~wk0!(W2L{e3EKC2V0yg*Q z-FSvAz8R#(-eJSwk=)Z-?HXmKoeG4Pf?n|gL30YjhvT?7`4C-wo68@5?3{g|{aVrm zVRyl@thN%C9l|XP55+NlS;zdUlgO7om9aXA`_%$uPPT`Pd(7Y%uUfr;P0|!b4pH$H z9q+|ad{?%UJi~{Dx3FH{Xtgmw1wDjLF5+JEqfzNWt^N5JV+|vBiT*pCyW!eq5oK+eW}kk2M@;Ae|uTnI#($7{hchMn8TO!InMYkzyM2B V8G3?G?5_X-002ovPDHLkV1h1!A8Y^s literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/book__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..07b494654a84c318d73486e9c931916f47d229c6 GIT binary patch literal 537 zcmV+!0_OdRP)tAvO#w;jgcc2C$80qaOc_OsaypVte;=R;6YZ1e;I z2>Sg{C{}1)O(s{`P0TP1o8Tao0usv<)(KVj?LVhy$fbWOkmK<Q?gX?5NsP0EFX?M`+~#QXr1dF&*3Nyutsc;A$X^vgZYu@{Hkim^y0C3WPZ+DEc3< zFgtLJ2YCX)%_l)t#X<3u%#`(hAp{I=D@ bzXcco7-Q4Y>PM>n00000NkvXXu0mjf@Py$r literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book_brown.png b/interface/ispconfig/interface/themes/default/icons/x16/book_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..a403042c874bc0f620f19417e0b9cec8c973b909 GIT binary patch literal 416 zcmV;R0bl-!P)fIOA`%iH841O{v)Kv02ppeG!$_;Wo4p;+ z$$LH1G^xfV$N2h0oKiPpjteZzALRIUKEJXpiyYe~*KxM7KNyhP?~}u8hwGE+^hP!H z7;1eNhT+-y!DHv=UluVO95)>pK@ia7a70B>Xqzo|aQ_f*_rCP-PCmgds0e57=}SvmhA|DM_ovbfDnQZfXYp5&d3f2xB_w$ivNEH zK$`=_7a9Tc&klq}Ksl(Ys?~wwm4oFcH-W6j*-~==4!KPL{F(>#c}+B1eLHZuFyuT! z5&s&GMhDd2c|>Nfbi~^a2;ej}Pf-*NS2iuX9@ASzi@HaA2`~U0OT{K0f`vu^0000< KMNUMnLSTZiW2jC5 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book_small.png b/interface/ispconfig/interface/themes/default/icons/x16/book_small.png new file mode 100644 index 0000000000000000000000000000000000000000..438b6359b9c273350fef7245961857bd0faaba22 GIT binary patch literal 314 zcmV-A0mc4_P)3>aYIWlva<|03cAWsj10lF%M+;{rfkv!3?#NS2GfH0Z8qiKYtkh z{P@9e>((u}pqiQ*1H<1xOa#LK7%S``n?aa~iHSi)MFmWQUGoRi0BkN`|Mlw^0|O8< zGBPr}d-o1ZgT?;*W+uh}4wwNT@C%v#{hP20fL?$b07_)PkZ6WKzld@HFUY?vKusJR z91uk;EMP+zetu^m#syCnE?ju;|31c7n8}Xm2D%XA(9a7L8vqbs0Mfi~^p8_)?*IS* M07*qoM6N<$g4}0({r~^~ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/book_small_brown.png b/interface/ispconfig/interface/themes/default/icons/x16/book_small_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..d53f3c1470eaba8aff80dea733a31c9ff79569dd GIT binary patch literal 301 zcmV+|0n+}7P)d$8H|DTT603cAWsj10#6@A3;`}c2TgBiB3m`B(JAhmz~{9*X< z;|Ig7TeskXYHDf>Kw-jR0E`uOkj)^>#Kgp)qM`z(LHu8ThzmsaU%!4afG{H?Bg4CQ z@4z%z>^E@+aKH=z0c85;Z{oZFHvp8#kZEiNU<*WEkbgm%I5;>Uida~{{IB1MFaW6V z$-;#T@4e&t{~leAnTg>nx)|fo&kGbA01#jRo}+ZzQ}}+T00000NkvXXu0mjfWQTwn literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..621a067478a0fd49db2361995280c8df0eac2336 GIT binary patch literal 634 zcmV-=0)_pFP)@ zi$H=FK|#BMX;O-UDABepN(dSmtceCEd<+Z>j0{dWB@-cT+_jL33j0f18MFw3hJ+%E zYOP33hC1(Ezaw|z@k~4Laqd0u{LVS=-uD#zw(Zoai+4t|ETCqA5aCa$)IB~MWX{X=3LLBeiJi%0`{L{@U|_qk z5!31PeZp4-hB>1(FcT8H5{VOk2x~L;Cc>pm<^jjPqJbCHaitD1D@KmAjgm8}Vgd`7BHw{=d zHKEi~e_(%C*WsGFI!qRe&j|Muem=_hNC5n6gB4$>^#gW)7)>RmZ^&Iq9tEUq*nwO0IN&b UW|bnwg8%>k07*qoM6N<$f)r~c?*IS* literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..422961ec76ff4e5e4a07a7cc61c21254a11da4e7 GIT binary patch literal 749 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 FV1l#vlj{Hg literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book.png new file mode 100644 index 0000000000000000000000000000000000000000..51e91a76a976b888e422b9bfcae7ed36bdea2dc7 GIT binary patch literal 564 zcmV-40?Yl0P)yR-sS=;sXS6=?jPu2o}XbvM`h`($FTkAD(k_ zGqyUW9yr{Ox${52bI!eiloH;K$P@kQ%~RZOL-N-=k+(LJ{$Oytdv=C6O(DV%LI{M_ zD#XbNwu(hWQG}>aK(pOGT>m7s)|tTDP6w@>7dUwN3|KA!I^3N|eCU0?8~&!XM??2d zg0RtO02daR&tb2x5tK@R5vbSe*`Wf7zWaC{WCXVbj4`n6O2Lqa{s|ZwBS2LYYAe4(($Ox<_;Qh6^ z`6dFZDFuqo6qX2hz3x;H1fD=`A}|oX+C1hG=-&k4Uj&u}C{jl~awD&Ke@)>Ds2D7y z?hr_)ZY}l~yGY9kK25%&X)kjK@>6iP@-#|NE|>9Sdm9tFNT=g5sy@0U@fCqj;VOmX zO)d_n%{^{DZ(=r^xqioSj7p`l>b)0mbF~nd{eb<_cLZDXA*S&mf0Wc~el-6wz6Edc9tZ_bR>jF)x08_y4G00t^85K_GaX45B&!0000?SR`O#FA_`svp(4F`E%qP;)T0N5-g@#{^xz={OBI74qBkibB9e=TR-|Mh#UF^! zODU8j+cYNop7Yktnrf{Me7rZa^S=3JhGm>{_;!O}xl{L(__x`FId$PZLF>u#^6f;i z2%}nsu4&M99a<^{eRdYna2SzD1d&h(x#{Wa-ACMY-GJa}p@2#AG_GA31KMqXk{32P zUN5cfEx$W?k&cDm6=>OP7TA(Ns|DF?g7x_&GDZgH?|ExfR^=9Vo zuR!m36+?jn=_^q2u6g%^6iAm^pz2D6Bn8UvZi+GHE9e}gKtT7WtoMj;mKr9$qZ2-BjwB>dUwH`F#HD2ki{v@i=0!7;3c|YE}kQ z=Pj($A{xJDiP0$VVyU#kB~|oELTbmkQ#m+})>kbHc*o zdoNd*rrlL7M2Wxo%2jXx0000dJ*n*MjLP2t{aI`M{tqT!=0dTvVb_A(BE- zOi)Zinr0rJJ59%?E$D@hGv{*dcfRu&fiZ^RxkiYa7jDnu-={{n!9Uo(%lN%&bt$&G z3a#0MB#MwE31TV*X?Yo{*9%2apvW?E#p2@LBW9YWOR!cdp%6Tcg?s`S3;+sV`N8nK zygr(KyKtV&%0UHUHk$?7Hqh_G?)4z}e1Ih(lgYS2GLhbY`9*LQ>?g1+3pR&gz#@nQ z?$>HHHz=J>6RGuo1j3LYMSb9>Uay14z%s?72qfMQ%OX(yCPAPHalg~)>}H_GIz2Ow zRv;NpM%h(h4;AqHr1Ah~LeJ2VE|UVmRUjTzV4G9|W#=lmx{g*fgLk1{h=eDx`ST4PKUzYo{}I6xV=Cpk!UrYVlyPs#_>6P8 z95hXH<{g{ZKq_Lu=lu+i*uuq2x1h2P0#jSEtY|qRIm;EOL^4en=a2ZT`A_5Vco3JX zNJe|q^>5JRF1qdOj@9HX=%HhY{tg!S9w>xqLZe(RYj|oj-L4is#C|v0>fb8w>`GrqS@|ZVY00000NkvXXu0mjfuJJu5 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4f7c0acb6909a43a630f65cf94cbad22008ee5 GIT binary patch literal 626 zcmV-&0*(ENP)_P#~{5-}+M&PNk}OZfS0uzX3kIH&h$m#@DQNjrH;Ux z`sZ}|y_sudmi}a5m&;|KtAYJ}=)nNi=qR8ZluD%}C_|vH-fvq8gJA%r6f|oXLXp~} z>^GauB&b*{5~%t=04oA0P#;)Ytrj>2O4>&OINT4VNU45FYSDz)@AZ1WGf-nq&*aez zoX}*?8lR`EGuFVCJgMq87MeWx7o%FViv|q$+h6d z&UzZaFwg`*nQGw~W7+5Pm_@|EUf6t!x!t#^5`;n58n+K7;b(K$=zK**e@9{E5l;DA z^h=xVTnvJ%6NBzY+L%u%07h@PIb^e0oEslUhZd>PZlmhI#;xfq!^?P*bm~Q;0l}!; z94?z@T)A99zu!0W_B;>yd>-x1OL+M112or3qx=yBz0-T&zKDpy7=d_XPw*u{0sLr& zrF-*1YL%ZYKHtFhlk4REWB`snOS)69*FCI<{;`kwAlQxWguetB0CA2aQ+TFiegFUf M07*qoM6N<$g7}RgQ~&?~ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..c49f600ad7f787280ac6e0df3d004627392b1d97 GIT binary patch literal 723 zcmV;^0xbQBP)8&S=z=v6(g`z}I6u}rmkv&$B!d^BqmWH^T zi@BV-d%vA?n-{mDzVPAP@44rE&gYzSucB!hisuHwtDhe7;QuE^7~ltOo6|cHiQH@+ zAIFYl5<*oWgn;VzL-hBfvZ4YGhXW3q4S`VT`c{&r>$*koBpgOp(_vie^Z}cj00j@H zG)#@omX^bRXMx;;QB@|1+b^^mNAQ^=M z41!AFdn^{Sf?8Tyh}5tM)PE7kB7vXgz)%zg90NmF3Ahq}RiZ%fJPdkaQ2#nXp$+jp zo6Y{NK!Y`BrW?xS$00PQ6D0~np;)n80s9$z*dEKoYmTN9&xk6hmMf4t5m0qj!Itmr zXK)MoA4}LNmg_tN1Kla$mi9LVqBw1~TMGCz*k+KPcjEc$kpriEzB?f)BY!H8L_n3o zg*wyno&DALfc;_;;l4TS?KmHQpU;m{3(@TgG_#VFxV+Jfq}z*6sm}<=71U6&#~4S? zxghS1Ou^N-FZ1>1k(rmy^^z@^U*%(m7jCy34K5c_^dU{JzQqZQp{F~D!TS-Uc3njx zy^z6f4_>S$p-HO9!{N4h$ALou7uT}s6002ovPDHLk FV1kz#Pmllr literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_book_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..be9c183134aaf73b4c1840358b79486de2e316b6 GIT binary patch literal 651 zcmV;60(AX}P)3H}L!hXfCy5CjoV9*Pu2C|=YTB{E}-pugk`@VT^S2GL)QQRP;1_OYK%MAm| zm3Nc!Kj+U;D*x_4&*$^Nx&r!rsI4t%@i-6&f&2%s3gkAR>P zc<;LIs3@Dw5^3;%1X@Ipp+0cbYBg{T0;%stAh;hvK%npXBUbb@P0TcP17O={$36Oh^X6~#~r-hU&e;;fV1KR zzS(qR6Z#(x6cLb8$v+ro-t#%5rGLbw^QWN>d`+rTFQJ@Q6Ap|}Nhw_2o`Gklu-f

    Q1&4HVu^5U|RknSyQGIGjwPK_AlM+8UaJWjL3Qg+)!j ziMgUPP0PZIC(mIhQsn0Fvw6nONe8`NFPyh!SxBeTX!prYwN8S-(JL0-KlswY^p6kF zb{r&##G<^9FBvpz{%OYJ3~q(_Y4;{tvIT6?6z*eK@`W|?#{(TxPS)E zBv)HR<-jHR2Vw##?y3|arG=1M5bTb_KS1p6uoiMfs)Uq5s}zceoK_(ukc*n)0=K*1 z?d=c0-(@Ddr;P(|-oDxQKJ(t28LQdt3WsG`nSQpl)q;8;`S|{}+ie;niXw?2X_{uX zDmXSE3xjI4{%B{%mGM}lRFYo1{Tb_h?Q;Yu_wX%GnY ztn0c@H#Rz}OG_R2JVDI;Nq|l%OH0G36Rkt6d!8r0@5`(0?Kb>Yix4%2gB}+9kf64d zFe9*S+m^v#Any(j<>B01`_1m|bNIi`01<07089puKr9WPavVV=k|c?g%Vqg=aq&CP zAP0yIL=2}?mt+%!^%*piBh-Gy7!`)$Lth=YCx{|L42g0&%H9 z@=_TG?nv#hb~KHRQ)pm`O~e{~8N*lxO+zZb&d!Fj%gZn2KSmM+L&mV@e*_o+m&Y@; T7n9MD00000NkvXXu0mjfV0t46 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f11fd0d888638f27bb04ecdf4fcdb64550536989 GIT binary patch literal 721 zcmV;?0xtcDP)DmiEvDw@;bKX2DBQ6w_WC9!`?!L3J%Y%w{KS zr&6gvCrK$yUv&h=NeAF;6#zj9or0t_l3);>H_&DB(yTaVj;d)|%?P@q1Jjc4R@Is!l%rHT zZ~|zvJFo#2@?G@BhNyHOWhda@4k}cU6Y8mLmo<{G9@*3<9Y1&eVA~x$sq4mrGW}*z zqRo;b_@&XW=TMS!6?_ z$Uj*HKiu`@Wyrb`E???tdp!LmAqlQ-E-j%c5HJB;`AlY#9}ZVz%YWcjb`hUfclZE%#UhN3 z4){auc=IUtK@s9E=QomC+GDXB(y?fEQ)QB->#{^TbNhu1&Plm{G_%%tZu~muatF;M zzo)C~wD5SE@SmmmE(}U{Ye3n2`@Hn->3urd_$$Bw!bfpH=O`~R00000NkvXXu0mjf DBY{Sq literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..3de5313f34da9ba955d3024bcd79010a1e128e46 GIT binary patch literal 748 zcmV9Mga3k~F5*;EQ|{61>}|?_=n|NGR-b@=d;*&wc;rD*1Wf|lwh@cP zu(GkSUsF&c03!;Ek{oX&#);@WM3>1;_wwp%Bwg1Jj9}F%a6QEhl7#)zGnhLsV6|NZ z)d>HZ8bsj19l=-N6POe;M~78jLPzEXs>)ls`Et;&V_bm;SAj_#Me;$CEqWvEDX$QY zB@t=}AR28(M|dS8*$OyVm3HkxVEms(tK)?q*Vg_L(4&?Xa5!-k!z0fj%SohT@4H9R z(-PsJ0zQ*U?{8LD5$Ws0Yx3HWZAc>E7$wZj&Efa2A` z=j0?#jE|$^-d*e+D;I3xx@6SHD1Ri8s^rT&HCSY@u7ZK3CA3p_ zP8K;MqxDjjHuD)lwvEdJ(+Eo{67pUoa46bMBxm{9;SYsE%g@bC$^R;OG570VpCB&p zBE+^34OCFsx#Rk1KtnPW@2u*$#k)2V+9R3Fc@~Kz>OYjxbH!`Nn<^>%XQJSk4Wglb eU&rzv0R{l0GkH^FlIny20000r_-V8(GfkIoh`pTICzQpodCe$UL^ny3E)8$0Y0f|gigrwJc`HT^r_t* zgbYFeQUT#2$QLcC421g_hRI@yxM+@US=Lw!ZiGQ#;ZN!MSP|qXA%iFY4#_|QIPf*R zNDv+Ku%iI~GH_6l6DC1h6D_G?$rwb#JS2nr^*ZT8d}|4y@}}X_apITDOEOZa5df-U zf}@IfLynTIR%xcy8fU;q5B_npNw*6HsvjN(56!JD`rT;!ZS=|c`F6}SpJJI$^j{Yj zbSs%0F~DON0FO!~np;_+SSCZCi$$_dPbt5+7_MJBJ&$w#-TwZlY9^njcp~xQiYT$V?AO2CNyy`mwV+$1ic4pLoL_!htPrJ_ybsu zfin&8>)ZVCB3P*Q@0X!Ikk|1>$T2`jc7h`O$WgOsc9b#x57TUsRS z?SZK(xIZLG((OQCxUIf^m^jxc=k$I7vn8V~Q;hq9>2tI$%Q6&2!J}|EO1w6^h%-+F z(*(W`1)7a$0zojvOC1i-Bq$UL zaJgKV-Pp+Tb$>ig9TWv1l7vnqW{xCsAzD8`o5?L_@_0^oXb2_gG{jsk2NT8!x~&7l zQ(WeBqKrg%C%nkX`FU@3Iz6TXSHwIen=nSOIj-^U5xRjA5{Ak${1 zCMJvy%L!H9K;SO38O_d;iHD3S%WUj<8~eIE#j={lvbxSVm*?)&0#{FR1FSy0kPyufP5aFaTX3lmd4o4aooi002ovPDHLk FV1m)4SsnlY literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_document_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d509c3c215fe604f54e6327fcd07b250ebee0a GIT binary patch literal 706 zcmV;z0zLhSP)+CvVB2YV>>=0PZ)N>LOaX8V?GJow=ICi8aY^JdG(2Bg!bo3V`su>L48_kn0E2sV0W`S)izEqnr_TrK1eRsN z@AqS+Ts~}7&;mdvgh@fRXh~)et#{F3^3X+`H%HNRy{!e)Q-Nd2Kc*;cn^2C_s=y1N z$*sTz807otiwjZcJepp>zZDp?BPVoH**?*dEFRgTFG&=tMQEq?Z}lGxJTnX(a)a(# zNRs)b(baL{da2X`(5?*m_~#QM(Tmvj{SM_%E~DUo+g<@rHS*sSi#U@=;Pv97^I`h^ z1ANd56kuc5+@%L*!BWf>a#xkDjSch!gARaqsS@BqDuvTyW9SNpkxwR(-^!!sYQF>9 zF?MkI#-$Mb483}pJK8lIkHa4bOfS#R&+^0JzX@CCO_1*9X0TStA6?-!;M(^b07*qoM6N<$f*iL?<^TWy literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..d9fa74496a628ab7d199cefc8d662faad00bfe8b GIT binary patch literal 636 zcmV-?0)zdDP)ekYuUvHlPNdnjHA{ZRR{xg#kqt_Q6 zm(noA#^R;Be`#cGd8D8-7-Qj#ffXo$=V?+l1u~UrRB2#b-+&@x4V=~`$hlt{C9h#d;%j-I_K78s5sCdEDf}&80fx%Enb1#6cZ>3 zFzxnaPkJ2&B=|&WnV^85AY*7119B_j@-t;=hRyaD92&oNUJPa!AA?4L(8;&goKN0! zpQO!7Zh0pp`k(EuINTUP^TOhk^f#%iP7qoDi`ol6t-tq`+{gqxGopw>g;?$g`>Fdk z18I&Ejnxk;I68eAtM69)0r!2tIw9CKXq#1g~i8CfSwKpti12k^BWjCJLWGBE4lTb(jrY$U$?e)d_Q%(5cNB+%<%Sa z9N;CXMYTP_vp9}@onJoq`pp`aL|5mZcu3HgyBN-%9Ki|v$7*k)(^@u9!+0000Q50SG&K(CQLop2< zX;29%Q6dxuB$5dHNQjc?qv)dtA^j+Q_!AL5s6L&f7d_}>B7$W4u?#XuB8n)(VhB+u z>7f*UID_Mzx#!W|$0;Z1qXUb5_dRRvyUyO{S`$$lye!KE1bg&p3XNDZw#Se#r z->zGh)uOfT&$(_alTO1aAnqrGWevL4b)Rj5=K+2{zFa%`k>0yZSmn-i?%Exxc@Q5v zlhtMXD(2|CT5Hrc9EqR%`Sb#i%|b6N!747s)jb1E$zbF>bJ8=PG5V?!ojW(z-M;&w zS1SdF@O#-19;8&zQbG}I!lzB`h-_=ZL>dUSw1Rx$|7= z{6Y1zI7Yrs8$!l)AsSi{YOY5t`sl4?+x?C#aKHkgv=J(TMd)ZdDQ80gjw2z7sUA*~w|F2~{Dy<7ON2!>lWG;3)G&VT9v}Q4=|r z26mlXFN$hvXG{{QgUT0RY>ys2U)g06+i$002ovPDHLkV1fpUSPlRH literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..273ea99351759c3b31a78e62c18154131bb020c3 GIT binary patch literal 783 zcmV+q1MvKbP)u&*h zpN)P*b!z|tHjj|8f|bl=#UbM-;`Px4Rd7>BSBmAE(=ertQ#RehkfR-u{t-)qZu7re$Q5mjz8yhr_cn}< zjVOcsT@BbSbJjG~%+w-Hq$@+z9d02)bB^1_07)p;(Mu7%~6= N002ovPDHLkV1hk7U%dbT literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..2c50a30f86f49ce75318af1c6a70ea151acf5dc2 GIT binary patch literal 693 zcmV;m0!safP)oNQYnZ~2t|7n?9HQ6K@lw;EPC)FQbe)mTvV`^2E~)~R4ix?>d8YJ6)mV~BNfts z6x&6cpPe7yo2=cncyQqDw{PZsZ@>9wR(#Go;30$sq(;pxf*wR;emyV7uxXU8XedH2 zHg|?1qxRy|zLDF#2m&CHz_$lCKhS(*6Mu=~F~4{woG}L3gBPame19Iz&eY zwjSy4t-bBM`(v(*KT>~I%2oRMRpQQiT5oi9AOk3+VU&WVa40xmn*D;IzJcibhjVFq zrY8#pc*;Z#n549Vk#ZwAPxfUo`R;WnKw$OjVzs`CWseo8m;xq9Z7fk!h%i4fel{v1 zUp^LwCyMvYn7?2UZ{TW01l3lcC>+_&wF)Bnjv!TV2QLYHdQK)v6>A`)20GjV=iJP4 zT^Fr-gXXB#AekK$O-GV~Fsy=rO^h|*T$8zcOhGF^t-OHkJ;TSS!3f*OMk5T@(Ai7Y zM@DU-y)tsH`A*PrEteOuBi)V6$%!1*XP6gP;A#6sX^HRWUs>c_kpf;*#PD1PKHU+n zXWri)P_f^XD88A&uH%PLd^uwmc-|T;+ql+f`(S-3Rlo^{XUJ`z###db$gHii)lrwk)q| znm__73>`w4u!Mj~U@QH24BrBin3=qf-E}|Eu|NOmSTuTD0FO0crH-JoNSGuvj1<@p z1$}roGl;61MtBDYaHu{w=X5xx+%W|jZIDX90>iYV&?G2?#mq%~dNY8kEln7H)Q?To z2eA0e_pz-Z#;u3S2@uMMk*dJPyCxIx z_p~vCoo7bz@J=%-SnMuCd?`vC;#zP}<728pSrU*H=-jkKf~{9aak-@iCB;o}yEa0P z>j=!g$J+AN21?Mu?Nez(Bw(}X?hUSwrfLPvfYIKLUEyqO$jO!0^m+CJGF(~6+k3N~ z_<5}RvjUBG)u{?jFy(t8E&GD5mt%qynoUKRW`z01Up*jlIA&nvr5EeAmto|&R|fdM zY_PFx7oy93kXJY12RjVS5<0?k4A=2($UaglE&C=_z%e0*OUFrnrsT6u?Y?Vb+^-;N zC=Qd(Uw`8moYnbq64|nE%E>elkH@7Ag(8yAI(~}jXYYyi3qP@1r8C<#`#-_4a5yY& z*U*{=!xQKuT{=HvC&AUZ&vvRf3kCR(H5-86GbFCj=lm}L1^}Vzsl@}?KivQT002ov JPDHLkV1nqpX(s>x literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/bookmark_folder_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..fd23ab2be87c4d70369c7401c9e8b58114d04b63 GIT binary patch literal 740 zcmVS7~{cEL; zCI%KM)7(V`#9+6XP$L_{P7?Ien#Xj2dcDJ_O(kwxu-Mk8VtqD>U| zgE}xnqciW_pU$~6I1{w!!pC{%-S0c^yXT%K#s?kn62b;V`ppdrZ78qg;-I+B4_j+% z9#ZHeBw)-1f2YQWLWeK*_T`#>;=Uk|Q*qxX3x)D~3lk;7*jhGI{u)4C{f zO-XGGnzx-B9+-Q38z>ZDmX;vGVXWxrZXeiLe=CvxfkxtGR0dTA6@qX+!yw^mz3jk& z^r4i7Q3{&i5I9dvPh!o!7E79!^JwkeA8iGq?}y&ORi<2kMM^6eDVM={$I3<|;^UU& z9axXKmtUr4A*Lb7fvRx80;!D^YJw=`_d1VR!mihMkXC7kycSii)8)AWl?4J?kw6t4 zD1sx4xmLa z&jel9^u%}6MC;IW=y4D6n^;%rz}5DP(h9#OKibH-A_u&uNZ|$?WNAj2&$_>RK;&#e zV&qdC8~1L<$cMPy;PzpgkG)7Ybc_~7g&fD|oG^)Fr?Id#KT-&SE@I24Pg@r}SXC42Fk*m+urc4g2 z9XfN+4gM3nm(6Bvyc}Em>dhF2Nf+UtxS9~{?+sjPslyih$C{WyYA~km)8o`10R{j- WqofM(`7Vn900007o zaB-6&g~q~5kxm5h1;htXJ4LXt@(sjB2v*TbLF@w-7J^y{7RC@nj9O@81SPJ!v+K;5 zS@xpjz+o<&`SzR3DufXH5z8!fI=eH3|Ko<`W?;25u?qEan|Jkta(O)wiy@UvqC1uH zvWtzAi3IWs3roB(0C4*Z(D4=Ed`mwp7J;!vHv7f$E&BPd=^57S62CIbA@pZ}skOAQUPeE{A3Pd zB9lR_R)cNZ?7*n%H&AoA9LVShEX#^4=E_(1r)V@9P*wF8VA}ye2REUniE6bP0dQr9 zEs}82(h#6Ug`y}h48vP2l{rAv04)P603Z^;6}hSmsqENR&>*x0A}0L>zTjhN;JU6f z==jsXQ}jja)Wu=);M;VYpBn1N9zbhn@O=01zISnP>rH;Y*75PEdjM(RDaz;Vjh$;e z?azlUs7Y8s59@UDYa~o99*;+^Q7D_={7pB*uZ$a{S=LLXQV&j?$A5obt_<{s0Y3r^ Y0PrI9^S}L#g8%>k07*qoM6N<$f<^W3P5=M^ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/books__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..778e3165c7d699cbd89a4add3a71ece6afbf0c40 GIT binary patch literal 651 zcmV;60(AX}P)cNk?Di0Ljs>b4zG}008T{Nd zn@TgYvsa_xFygTodg5_cNxF_jqZpZ-oMMSS18a{0a_kcDwk$oWRDh!w=+idU&tUuZ z=qWnf5xvM%L+Hx^C$1b{h-JX7X|PPwPDuCdLTN;{=b=ytk6$%7FF_Y_DS$kFy@Faz zx06*>1qj(TAcWWk|3m(wWl+rJ&}cMZ7zW)i!g~q$d_E8H$YJQZ9w=tW??1gjv)KgC z^V-B&ELpEuVV{VV6%b?>5j^m&xid*a;GXpyZ=n&{W1JN;Hhz!*U z2iY`qd=+}3rPAQcw)+XZW5BSyh}~;O(Au(aW;~14wt#)IJdjoo1PNTkPOOjwKCc-_ zsRewf)$sD2h|?1?R+d+@;hxl4#~@^P^KO!}IfH{3JDI`K2GF9u?9H2XVB&l!`Q+~N zYp#JqU|E)rpgF&Y`_)CP|M=DVV;CO`qs8I=f`kXzl3Mynd;`Ic9ZtH$F5_Rie5tuW8mEKjz90#wx>I)K@E7T_}RqtqZ#l7oy!MLXoaqx)8*T5Ofo8;Uj_@MG9Ig2t`B`7foXp zN?HnP)5Nr~8RzA_Q)ikq6)*hExijbd=R0#aLI~D5!&EW##O)~leWs|cwNz_;m%+ci z#lqNwv9S@C!vRqc;1NYjZh9A7F7yr!U1W(Z2KuH1)cu!$$(yl;O@gjzM#2`q7X!UJcwH505s9%w@z9L*q~ zmyP69Dg~(Oih-)ChQa@kXQc@Gl1UVcMJS3wf0)WQ6Y%MD8f4c_$g7nu!{Kopao@#fWeVy1bqHYD=ft7Q9rYY&Pq|3vH%(|F)yk(c0ItXdv2@hTn6&`6pHRCwBAWMN@pzydOWSn03lR7D2d z;2IFuqv-x;UckU~asr5{v|{JZQVupY1};uc23{^MIOYNJIXO5O45OmbK?+d}_%Ec& z@YgJ#f#GY7z@)9M&A?)y&+z;AZw$>KC!fE6fZ@Z3 z4-8C9Ob`S9{6R5*8RU|`KYudZym=GD0Faaa0X4x42h)Gi41k)-z{tqRpsK10*9>zq z$N;b!1_r1Lexn$`0y6;QM37Tq0OsU>e}1F70O|!Mm;oR`WCiGam<#^@{||EkbI9ZU zm@a@j5edl6sb$E&bee(h1Q(bO@}|~{mll#g-_3*>zzVhv*@?*D!8L{)UkCKC<(ac+ zkrmtkmO4 zhB+UWo@KZ;F)#|4%4DJ9jL=x%2jWKy7Az28*z@l(&dmGk)gvG&xD03j&=3ZgApije Y0AO(U;I2Z2W&i*H07*qoM6N<$f*C0Q0RR91 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/books__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..7b787a72d3fd16d36a4997d174dba509aaa66207 GIT binary patch literal 681 zcmV;a0#^NrP)H*QHWlu(1T(Rrb?|)u}YTI1c|9r-^uV|BV(bKW2&gE2_2N zS+K9ebjsh4#rhm|b#OVIXmGhKtt7G2;Xt6H;}lJ-FwmRVL2c^=UR~oKL?Xb}Zn9b+ z`cZp)Vb5Ojxy6+u6ScrC06Wj^n00!=EJ)Bb%}DUL8_^zUHRd*(4Z{;DrktP(xxEJY zz=a4B3E4>Y`Fwz?E*Yq*Y8d{2AKaGBkY%~1m?BSq z9ET{1U|Dv_KvCF}pPpIH3k$}BSoh9>i1I^n!efQ6+eVn(}22CF$@EN zpqipFUDrzcC@doXErp}K$2~bKJ?g7MI!u-QE+9+F2U{C-s=VshcoW$<6F`PIOLio-o z)(3bL)q3gCue8-f+j0aRTO3|_7@b`QadGhW&ylyA<`Z8hL=>|b{GQ`21G5LZu3IP9 zYhNHZhtPR=7y7S67xUR%SK`gsWZCWhaHOD#=F;EDk&fH#c5Bz2A45;iU0e+x!$^Ev zdUpKr^XgYd2^xtq(P*>@&$PM9=XWnS^WsT@WtlX3bHMo3vE}3d$hr&R`?_I&Zx<$p59)C&7Q^f-hXf5;lqVv}#TzB8ta!RP zpU(rF?*KUG8t^~mAMOA~b2&JU1ICyd6C6RdFk5=)M_@yE9 z?YpR^zMzjDlD!8sfEs|(3M#hFl|fZFI9r^=I{Tyy+A#7uYS2^+)Km8sHpZ8bVm7w< zwj>IOsYhez`Tf8EVtTjWAqDDJqkmOn?OT& z5Ezt*^U9!0X0=={cjKA=eb1k_v9XGG?%L0_&kPn>lmYtU_$$Bw&D#r9&f2k)00000 LNkvXXu0mjfBsLv} literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books_brown.png b/interface/ispconfig/interface/themes/default/icons/x16/books_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..c74cec614ba051d4ac374a56a8a12d32b278a5d7 GIT binary patch literal 537 zcmV+!0_OdRP)({ zsMI1wMNlVka1bXK>(X6xadg$sATGtJqk^kK9hHs+!J*a`1qVecv?_hcoAJ4)K55by zJUH$yx%)rA@1f%P)9}(3I;JA3OPQ; z>Y%D(A)P*@M#)XUPDJ@r!tot0QmNF|cI0X3@zuuy5iBZhWaew}u#KZ-OhwvxXjL7y zZS#ikWE4|#OFZ}c{m4BOcrFAy$jbwe4|mp~7mK_(kx0O_I)jR3@hoUk8P_Ne^%Q6>m2>yC}M51XLN~Kbt z07o`$N1S3Wfsd;)mm~@Cc-$H8BHKKYQPd5ufFcA4kx+$ok-Y?Z4}rq5Tn%pPAa@98 zt(?FdLLd;`Mzv+h{AKd5k3HsB1Guhr1^oXJyuE)n^O@VCxK^|A_^Ki12nYg!C`{Bp zK;^QH&7K9d6xJ}ol2KYCp#=hgzBSVIMiYe9qQl+yh#<`TC7aDoR8_nU`*{eNg-EZ! buK)u81+4t!O(LB$00000NkvXXu0mjfYb@(o literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/books_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/books_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..057ee1e8858f3b74505a56ca87d9fdd43745dfca GIT binary patch literal 495 zcmVcSu2RA8&&MK{>sI?9*MI4%%r19S7vq>X* z;Dmebx#xM$xk)%e2qxG*b;aB|TSdG*P(LOyN#(LyJra{i$dZIg`eM^gxQvDY1)UG*J{IuP~robUu>4n`bq%6w)o1%k#Lk lI3;;tf_?~7{zncI6002ovPDHLkV1hAT*kAwv literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box.png b/interface/ispconfig/interface/themes/default/icons/x16/box.png new file mode 100644 index 0000000000000000000000000000000000000000..78578c0e5c61a58a6406cfd7afdd2803f3503f7b GIT binary patch literal 524 zcmV+n0`vWeP)? z7|}|Llbb`OvqL|DtB9K)!^z1_bm*iXpo=((gW&2Qv{bDQ9clxuh7cj|#k&_1QlV(+ z!R6lNe!shW$2-aQeV9emo4tgv62Ly%)iBU{=PPkwc|q>R+-EF%hSpPm8ZdL_#&&t< zV3#u{e(0SJq|<3}c3l_DQc0X;MS<4U>BaE%@fzJHnQ;K_!+LhHWD+@4BE>Zx6IkRB zS4IVf&ivZulB}wrrcy#3#~IV`KVb+<9O9~si#t@T{)ahizrkQI0L!w#Fbqg0lcH@( zaM@@;KA#6&*Fn=X6L}Q~5(tc<6^k%eD1c#_;A5N3W^-)X^?Ds7Sq2Gbki<^99F!nI zFhs=}jYOqMV%v6f&SWxlZIM9sume<;(SSIQl%!UxMK&HIEOCe{KB5yA1VX7+tHKX$ zTnI}E1knqIsBq4r%6|!Akr&Ls3z8?O%I`{(L|lPE@Pv1RCwB?Q%!3VQ4~G%kq^?wPEDd| zXgb=arWHj6i zY)n&|dCzy>bi!1uEPAfp1D5wX|1sLZh~{>E%VwS319 z;@O)bHucp7%noz=f$Wj9MdmoN5TBVrI2@LFqtSqw$;e#QG*lkmxVP}}&6GI4R~-g0 zj{ayWW0Ke-iTw26$zGu$tttpd95(jt?pAdjdMG4Wuh-Ymt5Xm4l7_Up!{j#%*k8Y! z3)8chpPz?q+eoL=2nK_4Z5l99D#0)e#N%mJq)iiCtXVFX z*SK9M6riXo6yZToY+^BJ?f}>Rk()T~g@;@&C(m9aOt7PvlD<@NBcVc^j5UAX_? zCwjV0_0@Pp3~+}B=oSA49!iS`VKoyn|75*JU{eCaBSV<{d}8ohu=}Kb`3c9leTZtp z-H>qicUbLvuzz?PrWb)w6Icb<&BYAkVEw!^3udd&==d8DvsNNyCSupi4MvHe|?0C#M#rCmlDgw82p< qFD*Z>T)DNPD9Y6U$6c!b5?}xf$r1^J^?(8Z0000I}|HuIkMy`(k?y7I!wo%`NB_nmiUqHxafKcPRr;E`DYE>ccyZp0Y0BkJ~tW-SYu=IS=BVmJ-K~%`QwMDR2Ed1 z0gPi;aCpoT)&SX~nejM6kq8o&1x_;a z`Fxk#*=!byszMsGJ@7aLj;(b4@ld;UJ6Ba^7JS-9XH!Bv}dD8VC6`x_j5hBrJ21uMwq za%il7gVN`RXAr}}KlSPhj+(=R8oBEwcYCp+ll&12i$CAs(ZegKII~cre(1wI`HXQz zpSStwyRx#lI(73^uk(Q+1a}{eBw@q?Mze~O*&8UlKL7+3_=mQ6R@c@}(SHd21o6>p zy#uDME4R{_)UoJ**92z>n5R**AIQBQOEvrL%-6@l$!Z&2appK+XuLf0vM|53dabL6 ezN_kQ0R{j@dOw~hLVbw<00009nYdn};1L4_k seB}c3r2Ny%|9ptNZ|L0jIsXx00DO!2tB19xqyPW_07*qoM6N<$f>cBWr~m)} literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/box__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..eba0e524bf6e4a1d854bbf8163660146749f5118 GIT binary patch literal 677 zcmV;W0$TlvP)PilT>J^&}$xAQcauq&=i4dZ}J=k({KUN5zU_O4Zob z2u-#m=^E2CJLAlx32C%=@WIFX{oZ@?mL-fa{Euia<2I=YFwFJNMk1Y~y{(1eZAzxa z{ldqNab45a7SLV#o+IIb3+Jh2$$)Qm7EY&A+LcNLdMG4qMOBf0@$gCE+s71lKPwgm zD8ufqKu8zl1_Y@UtvOlCIfAQjz~auiVl?WIHuJ21{|6t z4n%1aLZZ=VQ#a!Il>#@&**v+9wneiA1E|&_Y&_#fSOL7`i=y zkwbw``x(2*8^|}Plv>Tnf0HUFFRi}C(4|4#9XX5b{&I#`B&F1Na}JxBvJrmK1sK&g zI2s$oWa1HyALu}L=c#WOZ~r&!M5`&?SMf7A-If;|7x~BE$}XNHlP)(N7$%z00000 LNkvXXu0mjf1y?p7 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/box__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9cea3b84d270db03efe69f7bd95325b793d14925 GIT binary patch literal 634 zcmV-=0)_pFP)ZR)~7{sHitD{sR@n|Dg!dlL`edxu^#bJywt&TC7y9QV*%Su`xeL zV|KO~hH$uv5z)kW;{lwZ2emGcI+|M=w%g=P| zL-GS-D8Ncs$1fCTZ(rlCt2WZ>>xf39D(>}qunGkgGhN5p^ZCcyUsqq!@)L78zy*#? zcA!Lbux;gTF6pWUb^#uHkZZhiPZ)m$m)z z8*JN#<2cCY^9YB-O15n9WMKiOX(F9YBb7>7#G8iKK-K7}Y!;KrB=VL8K{9K#+Ss(K z)haZ`pwSG%q-29b_ZoOZ)Vs~5I%zL!x7(vQ7K_Pis|IX93J8WP2gLaZ(khk8$Om(> zR&pd)eUuW{OZZkUm(|+$((Z+pu%b0k;#pj#215mcx(S{0aRs|!#dUE0;uS3S>x#2D zMK3e(nup{mK?Om(uf4-68bBXtx=o0_i@TM{OZ6C=Hy*qZxN{a0I!!l1)7{NJbQ;KB zJ*i@QU?Vd-gA8ESpS?OwzW@&1I-|`UF;U#>1r}$bh0TN>mvQELDZcgSedjkr@8@^% zLhdC92MD=;VlKX%`*K1^Kjb9jTka4#gw|hi&S)ViO0BmJG58X6?I||-&L05=0CkZu U!L!VVI{*Lx07*qoM6N<$f~D~tNdN!< literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/box_label.png b/interface/ispconfig/interface/themes/default/icons/x16/box_label.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd8dfb47255ef97ff4353f352717062a1dfdca9 GIT binary patch literal 576 zcmV-G0>Axk7RCwB?Q#)%LK@k4#C8<#?Sr3ef ze8N%C;VNAU`3JbrFGw4VE9Ykf0;$rOxKJ7gQlwF1r!p=A0i(i2z(%o^5L`GqIKOl! zMZ1@oJt>@|%4lHNo!R-motfRy!Z5@SUTFW77A)s3weQV8Y9x7$diQfeOr0qjae?RCSz>Hf~1_w)M~GJoho0y4zY^m4^! z@K_lX*Z7%=B@APAQV22@pFDf4np&Ej5UQ+H8}3ojqRQNLbuz6 z>$)hFN=PIUDs3kC*k~Y=$snK4BbUqBgmVxPs2C%+w1h|5EK0VGkkV{6n-krx*Xz)9 z9UAo@L78+UjEEp=qS3p)RyR${r_Eyw1_Hamkb3bKeP7_<{tcHM5e%aYOu-G3a)#i; zTAWl@dh^)_;mj!l2{C#?mRhX_&-38>K3c673Wb6?FPF>87b8$L7*ft=z|Y5JIgaz+ z$2R*3H!2~z)MEB{1}yvvzZ=^#WfhA>5H9+{ua82!dXBU~-Az(=f^9&h|w!&-Te z7`cfQ(ITgzfd+{$K+9HDThmUSY3KRT>Z;5rgXYN*+uK!9JS$-=bque>G zy-hha_9=U2*#;ywd5XI?1WYtgO5uMXp~<_cfG8G=`c}%Xt1JAzzSefnb@8xNN|D@D z5GG7tTCG$-ujk|Sr&DyhT{I8h!t-+JDoh1IqCBluF&d5L1dfm9hdr%tZ&cuw<^*}! z%C{fAbOl^Z9MAjNs5m0!TW7#nlc$c)fS2W2|8(33S$R=^R literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/briefcase_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..612ceadc9cca9f83bc1787f4bef48019f3407365 GIT binary patch literal 674 zcmV;T0$u%yP)H8P zNJ_G{G0kRolXc!EYqH|OelYCJ+nMjpe6!0kCjrJ_!!!ZI0K8tvf`A-`K<||0`N|E( zm~2_rU0u_bwi^w2hLb!Lbvl5qBgYH6UCb2sFOa1aenv&|mGg0#o@pYv%4>wb2`md} zHi2Le#nDlqIHly6$0L`brw*;Hu6}$u-o@pMN%`U9wX{Vyu>J_VU73^A>p(1(ldJcY zVk82rTzfY?J3Hl!1AM4MRxCm9ltp@H!m9`KxJbC->X$j#9|naMserI z3_di&FlZ)jf#YW}aX5)mCc9l5*{29*r^ncCx2g3eLViCEBog*ngG9O>d_nW{a#CN< zpt(1R^=uYLDo?Aez@89rkm|9!tsFwFr0FLWRXt_8Wk37xt>9dHC`cl=gvwarb` zx3=taiT1fW6mpR`b%N1ndR8d75>!>grNtGL%Vp#rq#;RucNb0vdfz!ZIf+)QH6Rc* z9K;TwTKH7Zag!75BI5&ku`}>_wci2^0Q=$qM0>LXRR91007*qo IM6N<$f_tVai2wiq literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/briefcase_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..6466d09a2600455583051b84b3b003efc467c9ea GIT binary patch literal 713 zcmV;)0yh1LP)- z(WImrq1JA_5y6Xy9#VvQmY&oKLaTVnp$SF2MARHw z+lDkDcGoqV-E7yHO}9^96NKQvNAW8f9$+wzMcXmH^)dz$o1UH46v2`6At;(XENQJ z9`Cqx`6arPlj&-KOoL#G1(GKtZi3wTiAfq{VQqaKtK~A{-QCz9jiMPS!Abl^Dm{vD z&wZ>FuA%fLhfg#4uiCQH$2aYkghr!5rR$JI5q-&|Ytu9hrtlrf-eIiP7BKtfHY$w; za8U`;K`8MtLO9m67H!%*bDQ;g9cuFj9LWX|mmzQ!j9++!4qk&CrWeJfAZ_#@XVG9r zrob=^m+WR$RZ$n0urC!rkSjs<>(Hxr+*S7fLh^7pKr6n&v)OwkupW5e=|j*PJaQjP zZF73&e%Z6pb+sWzVDOf`b1c!>IdnFR)r}3*zJ;kZ4290KOP1Rwj>5b51?4EN^VXJv zx7qA2hg!|R#fPs@EEX|8brXsr?m8zluDnQ3o`$Mq^6nQ5> zFc`$*Qms|0r$7({cM=|A5rHyk6 z;qJvRcKDI#C!KQd-re`UyK}UsR{%|e#CQxu5s=Tr6#_M6KzCKUjpoXiG!~PIY*H>q z!B`p>SLxj3xOD)xTSCq3<05{;9|Y4WFdPEKBAQD}vv~0{?&=;kM1V$|$*0t&BH$NY zcDRMJ_iL{AtlChCT@xF3Zr-v~j>3zb9cWK3OTTe#`?ecV_4iH(-#iaz*4J@*ZB1Uj z-+c$~paWg#5HuW~S^vl3v387IF-|lEK|s=nuuT)^D-{_V3(*Uu8QyIzqSKmvM*odCImINahNngz0s?zL3!C z`MB|T53N=U`_J#eam+;(NT&6ibh}Gzbbo zE94NOEeR!!OOj1?H|xx1$0XvxKKS69?{D5WZ@8yZ0LQ_ErU9x7*ldt^9!Ye8vagbUeh^jtQ3XBT+V*Im>{PPz^>n@G}zRtpo{=X z{~lnFqG}azyOHsF+i_V&hQ@{_F;#n2JF&F6xi}MvJi2TcAJ_m&SE3GGA#^h-6<6Y0 zY%qR6azggS_P_e8|Pzjyj)&^OCCnu&`>&50_)?|E(VICSUamk zHVykIU_OyX>i#4=wGdnoiRLgbVtqW-o(-Ul3_SS=*B%#;FQ36^|51nnX|_b?$j4!Q ze;81>iFQP1)AlMAJiBt-j0=VXcDub>@eTvkn)EK6?kOmj6~va-kjv$;@%#pSK4(v! zV+@*>b2=DAyZ~#6}XMoG)!l!(>mw_M%=F2k-4hY0V{0p>}_3>|h z0MlZ7f13Co(D&GvfsemTQ4o#_c;Mr33_rb02sFW UzcU8DO#lD@07*qoM6N<$f=!eqvj6}9 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/briefcase_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/briefcase_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..609d59a75be48d373d593d237478aece543de575 GIT binary patch literal 648 zcmV;30(bq1P)=S zt&NBx4T31^#fv{+5xh(B<{w?~qCNCrj~S2o4_%qw!D}|$4V*rAO4Po7 z@(Rk`6QZVecIL9?Q1{yUI=(fV*j+4QSD_#-7tFVK?;1!X7)CA}K=9}@jE?bpEgO5t zTrd2JWmzvp?hzlpNgFWGNkcm{HP5A#dER$fkx=*$}scof*Al!QEU zVjlaX<|JvFQ546&cg{a;I=42Q zuIXI!Pv&sb0}W) zDos|Vh%Tot-T&MD<$MY$@CP5x;rzSjcka1_Qi_dy{MLFNxDs3)4nkHPoIHJ(V!wgF zQnc!eFnmsmI6lnb2$};yH1Yo9kW!X+hlA-mSt0YX56xxOhYY_~(9Hiwa+cLj3tDbn zImxwPz0oLTN$Ez@E<@Y>4tprPeg|R}e}>7uV`JktJKrV3KQn`x`ilpXv}EeZ<5%{{ zSu{l==;AtvWh66Xj5L;5oFEhzXX?uIBXtF8o6U-O12U)aj}?oe1$}lijdcjJn=FfzH}fbrv!Cp zFFz{Ru$!TnSi6O;LM>UDa}S@-E!9?!4LiZ7JY*DP!8_*x^@Sl;$#Fd217ky7JBx2+ zzyF3?nHa)0X2A<+6vX8irS8GEAM#4db&4(9Gco0KA>!3Som09e!W4}@7jrDRtG8!>ZQmvL3SL-82-bZ9 zDk;HkHOxoyG1PheFui?h2R*9Cd(&2!KtKC;p0{9Awl0GfXq9hY7(jsO4v M07*qoM6N<$f&ouvi~s-t literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/broom_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/broom_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..87f964d6d1f92f2ca94be229b45fc88f644d498f GIT binary patch literal 869 zcmV-r1DgDaP)Y2FZu$Fh%&*_i#E*)Oe~9RX@%Ny zex**$kLfng+?+eTCxsx8f?oLXyu8o*|DT8FJTJv@9R6nsZ`OK&x8QwvC~7Cc$Ft2G zj;kq@WbEWTgw0V7A|bTf9yGYNQ0MgzA2~#HO*~|uPmHweCK_^zPO3K?Xb}EI9HTRE zDUElo)bJ(fZd?o`qVO!uVRhU6c7uC+?+OCQ{c|K9GnvM3cfAwCxwwep+WHfcWXk-c zwbwAaggTE0&-e1zL1f%jOc=W>-*@MWbEU0ga{v`fe5lQRC2* zRhM)>zPnBgUU?Cx7xs0FGd`<0FEm=6y1B+FCf|+A`8g-+Loyu1=T z9S((c+6uQDUIYlVsnm48fm`eE8AuRwP%{1uLSj`Ah`cdBGyz$(0&cq#2>~oxUJfBH zE*s_NFF(qSCVz&*q(GZSVa5zodNO5X*?D@JsnDFf9O6Yrw=31#gN}5>JhNpD>1bSkVE8!+}0U4cg5q z=(Hzo3{Nc0i^P(^LQRx%z%U!Zc|0uj=Kw?mQizgr+F%+D)n`tr8>RI)lAnxkHo)%w zeQ!SvbliJw5Rg4TOkzSXA#9yY8mY)ZdN?;XG7>hm>?i6OSp8xAFgY{aH@N7-&~he3 zhR$31k8ami#e+n=F4ADWj-S{i|00000NkvXXu0mjfn`DM% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/broom_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/broom_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb58635d5709cde599a925e8721c1c365cc5559 GIT binary patch literal 870 zcmV-s1DX7ZP)R$8y7AV#Q}8X?55EcL9Gi1BpO8% z)HJPatwWPGY3B4L*ZW!rT!?}fKF;Occm8|sIX^=P!T&7ol#7KRA?OG&%*=rhcb+F$ zV`1QIoH@%=(tZLl2YW7$uIv;Jvj1?&Qkr*8fbLgNA$u~7u4RsPOCp6X?k~ynyFJ8w z;>@w_LJ8d`52$HUMYFZVa_!Ph51;#U1uFXgE*jecf&SBXo+yy{@&&71N7m0WF{3vw z_jyLfa4?@ok5GY#qNHdjTAJ8YC|5Pjty@H%a70GTAJ3k*1=iytv$;nTln(*hm5K77&*tG2`&Kz&y zWaObKpC`iQd_mwdFc<-XV+=$L0u8my`=Q`leLg9!PNh;XmQ|P1U07l_9uf$7ZeQ{dKeuhGnKq9< literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/broom_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/broom_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..acce4b1dcc8368e720e0998d1547d8ca04835d22 GIT binary patch literal 799 zcmV+)1K|9LP)FQ546&zxmVIrgO`s z&NP)d|I~2maH3-2Ry18wMC42OU_L0+L-Y`c6oe1G6!?%7RFFXhnh|ZNRA^Bq*u);x z#F>qTp*fv%&dvSY?OvVHOBDEn59e~vJ?Ea^Ip50>La>{U?`RZ(rC@m&9JlRY_QHLF z6M7Do;%#4;5||{2;bGnkqirLER?&Z4QbyzMG3fd*O=R{5&{kf3TEDiAHvS*M*;YF# zXuo^oJS)L^yCsnZr5lV#^j)1jc471H70BuNi_{)-IA-qj4#y!lKaZNmYp3G1+}yLL zZ|$z1Xbp$a$0~@XBv6zT6%8zjmC8#pb>)TQbp=^An-wOL8NK~MRAo%#__@oq8^TQ+ z4Gyrr@U$^kW2K4`u~a6J#3#y>>6&Cka+)%>DZq6Z|f33)~`>JNEfXsYX` z=R2fsypLO=6>wBBD?UJ-$~ng-h9Y-K$eV%9p8o&4b5lt)5GKNeR27l&(=$+Tl1$_9(HzaRlvl=oH9y0 zWe?jcOhr*%BAS@~_szh)cO5ErDGdm7*nU1#K%ZCwMhrz9fsgF5L*WRU6d_`F*z$3^ dea^oG7yurLA&TzVG?f4V002ovPDHLkV1jc%aWwz{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/broom_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/broom_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2cf23c5b1b1c435f1ccbbae5a3b3cdf7317001 GIT binary patch literal 892 zcmV-?1B3jDP)J&*f1=aNQ3jPrrL7OnQUS*vZ@vF0{-8F&e7J4TUX zAjnPxCr_;%?otFRRpTYtz@-TfFvvbY~lrGK6GyE7wsmKG=woFWX)ai7?c5A`u`&Bjf zW{IZ*>lx9eRvLHeLRley2h-VN2@8ryPG4@QxLVoj_TZo}vyd8V0JAVVk@zXXJad)7 z9 zn?HNVN&y=ljC~uPR41=WlPV4Iey-3U;fR#nynF@Rrdo7Avto7PC`_gbq@`t}+AhUt z-zeN}2pAA@@uaV@m5wx8nl-a2Wa2qu$ki%%T!FZCsSLYMbfGXu4^6NW*B`b+rCNf5 zeI++im8>!pZ$-XRnf0+`e8^!tpiYU+>ale~LL2y(!w&+HXysLok zv~#SiR>Bk^Aq3yX0HuudwZEc{=Eu)9OH$)ya_vG4cJ{$NIfbAFp&0HOL`BuL215i+ zwDgm@$hp9a0f7AK7R5Y*C^1E9ELp+crFgL_CBw@UWr7+*EZA&$(B$#ruwxvxCi`^h z|K6ri5(1+FT)qx1HD}h-@|{U^V*;L~F9H`H_@_UA0s({Xy&wkfGLv6RkU<|K!7ly- zy>{SK`v+L~|HGJMO!;&V@g?zR1o#m7*7!4eeXx#)+c*DW+D86)m;aQX0t^6D3`;6nP)zQQ+j}~%t{Wi=df~@&-gD0Xe;%Im9EK2r|M}Q^RRZu9yblk<>@4u{!efG? z8V0(Ioi&c)93}8&q4jX6+uTBp;2#djp}I#rbX-7ljm1Xe#Qo;40dOrYqO|Jz@xT;j{>{se z2GbI1I1Vj*20oM^N(d!_3N!u1(#%+OZrX5pYFty39z{i3G`G5NIA$D2DlV68x^Fj8 zv6HV0OAB+&Uo6Y?6H7#*K)EC&Dj`f3rVQCy-(=TKW|U-!(5Qcl!a^OITJ0!`n?T{Q zN?q&gC#%$;Q$U?Q*j6pBq^#2X2$e?dw36_tFQcq&$pVp5hLw>ylx3_zuWvwpz7Fq) zBd|8J2Dcjm3WQoUGt+G#*6xm;(fR5~2+ip|0}$NzL51Xra=0BInMF@-&P5 zqA0vE%sUsny?!I0Uomx%pf(9bEh-ynGDwTI+n?m{6Dau7-brARI@ph-G!$p&rJD33R;GjHFFt_Z`B za0wwEm~6UyeI1X-Hw1AUlg137n0BC!3H7ZDkTxekDrd?yzwSHowxzzNU>Pl z?DcxSCj)^13WdVG;WfToE_?Aj&-2G#PxsGL+By`V*1g!2@5{^y`u)BO+qMtmX0wTS zJPz`Tm?I8`1awgp-9wgTxnSvd914XX2m-5>?k8aEJl*lNF3?Z=t}y{)L?D~ZdU1;u z2!>(!i%#6qr!G zUPn5eMy*zJ`O!NK#<&Q*-NwQG9s&~tcdkj7UX+wIhYF9e{<0THZ<)*Ga+jmgD7xJ) zBuR3)9!y{^n}9tX!^w*Y^d~2=M;kSp3P+R=>NKyaDq^u1g25oqtp4qw^YJ}ie?E=2 zu49Z|bRwBVBq?Eg{p}~hagW(68mE{Dhr_FtO64JQW11!t{D)UcyXY)l$L?0?o2@BN zxL-e>Gl40J2z?}1IF37W)Q@DPmKU5;@hMyTx?z8L`HU{@{}x~XP@GW{OCT3V00000 LNkvXXu0mjfhg}*$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calculator_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/calculator_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..593a61b88283aa40cabc5d0cfec76c3a72a81ce0 GIT binary patch literal 641 zcmV-{0)G98P)8v?3_I|^T%uur5@bJ9f$Gp$`eDA!&a=9GDVvJoOis9h(V=|dMcQ%|hc0jyXEEXS+ z$K#oqvMeK?&);>Q@p8HB#2L={f#vD_4AGOR09kk9y<{ONoWQay8>VSa<3^(aP1C?i zY|rDsB`}P|Vs?^Y7&gRp91ev-P!vVk;9CLdbFK5y$SxdkaYsi?#Hm!ucH!kd*5W%@ zJ$(}=TZQ#(;%iVeeVVinCMs1b75u})8sIwwRSDqu%Ep{&A#0d`faeP0b0w2WcsT)U z_!`UFS=_kw4Dr>CIm={MO#__ZabSy8t5vx9UF|7UH3(*QQ7V;Sj<$n-b>$RQzc3a8 z{eItb1yR|}C*s?P96gNhy|;Mz;vTxAPmqr+tW(N$8V@Eln@#k3J<%{OEQ`tx8~O(f z1}!lD1%9cEOP3!&<+})nM^QN#K0_i2i5jW4+wFOB5|AVbnM?+OK)~kl&MT~G9E#LI zSRP>T^S;et`8O7pA{sfkBgQaFSfnAzlE5+dklemDy12Y#&AZQhJ{U^S`bGcUA3w*N bzXA*Z_Rdlh9yn@k00000NkvXXu0mjfljJ5$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calculator_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/calculator_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b8c6b71eb402015828a9e7152dd48ad081d713 GIT binary patch literal 543 zcmV+)0^t3LP)#~kHk-{EhOu&{%jJShCUa^Z zV}(M2$4SQ6+T}4niFCIRKt#Q*>XGlFVvoR{s8Pjth z0a}Sp!p^U`931h}ip7HXC%}C^4@^~62!%r6cDor_{LjH=Bm&o^lI38is_!1t99Z_z z0o@`GV#DwEpB0P6OL`Bwu9M&&rgBrM)YWJ-y2UwPdw6?EU<(nzOR_JD;`X}7gf2g@ hv?mPT5TD-y3;>7NSWOTy>wN$K002ovPDHLkV1fsT@gM*I literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calculator_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/calculator_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0afd45e5356ac0bae6bc4d6e3f60f65c67935b GIT binary patch literal 647 zcmV;20(kw2P)^@RCwBiQ%h(QQ4~EhosguV3n@0H ztCnoUtQ10NBHDBmS4t~!<4SR37VccQvM3bXXxvD&-4vml2BO$q6_S9E7E~nBLNHFr zNKH$lNx9a5xNp1VOk+Cp0&FB3i67a;3qTo2p|uoJY~Z3C@VYd_BC z^YD7T5aL3;%Yj8;*W>XRi<-@*0dB`+m&*mG)5&|aYc9A!#jFDQ>XX%;)}8cjt#7e_ z&f`ULHNpa+P{_b^rBdj{T6K*Djz35y?_Zdki~j6%X1iM8 z;|c@<_#cm*>__$60+yfqFZ+DHyYK4t1!`fXs|6NHr_=bC_p}fA^6??goIQ=lkD_0F zBj4ZBw=8e0SgX~#THuOS9y{fNw!Mhy=}U;mUt{f)J5|*NlYFgTu|T0vK&4XQoY+NCge=Rj+wBI|Hq*Fz z{Uw%`R&c_98%NxJa319!<8{VgOc*2#(*tkO*AXt_a zOd=F?I-S+YGo2)lP5RAd6T6|hr;JgKij4ehHY-*956899Kb`m?`Ys|i_-4@9G-9mP zY6!wRpYNe{dF5u`_+IK8-_SqybvgxVmuZ>^!ViB|uy}Fd5FCCSBfc$LNh6|qy^eoz zY3)8PEMEfO@G$TOz{m$&zAVxxX_-t$_E@Z2<#KsR_EY3c6<4_U?i!Nwhj(=4Mdf*$ z^?E&|QYnPPVMbCLjRp+EkS{Ad8b5+pk2{FPVqj-y@b<~;_T~hlO@Gmhu>J9P{Cc%o zy-o9A+cpvIz=fArFgQQL+M|zeaQF8~oY^-df>~inA@#Jb>j!rmq|qsN-ao)+{a?I= gszX!x^REB{08W-vWmDM8r2qf`07*qoM6N<$f(`f&{{R30 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..5eaf86914530d89c1822099e0eb13ed98332ab02 GIT binary patch literal 488 zcmVP)Lg0n+mXhL#@`6|1zy9Phj5*8|(+^N1Aa|$KcCpoR8oAuVnGnwi#S*Ng zfT|n^_~A~ic3P;{(Qda{tvFIvCPEno7+CxQ+369PoW`?XLsu1$n6`e9h!w4s)dnE-*ZLicjh~5s5@V zJOg0?m&l&yX$dfMCV-H@#C5d<%wVwQ9LNa?j5Gyc80GaA1sDLu;@G)s*IqXO0000&$GPXso%inG6JuB>%n>L?2{*(j)}Qy$juRT8WsL`r zA|m*h^V3mHQ?tR~%2mcb!V+ybjRQ%!+T_m#QmHGE`FZ4WIYh!?^<*@vS`8xE>|ZV( zR}0Bxm)MspP2O(o>|kSi8*e8k(c|->zO`l5w{RktboPcpnR78Jdbx~?v$GgpUd9o- z9h+V+y3=XX;A|*_0lyzEj|U=`bV_Rlv{_6fpg5hV(Z(*V9lgD#fjCCD+YJ~7MD9Ta z7;54+r!YE%2%!;LnKxe`>GUZExpxvan+>FsU^S?dSl9KA4204&fW@Fzum4wg@8upo z{LnEm>^$%>E0Aksuy=@oRxDwB+=~ZGMc89gs?J&KCsf-Q++F;M{6?)YUte1Tx~e!o z7QmZV6Bi^;-*vNsIvrxQ%^9ph!B}hn?|)O$$WY^oUu*)GZ^lkMN-rhkUHTUsbf=Om z!=Whu82CzG@HCTe%uAID*x(@gLjh!_)8BCP_>5fSyx-4Q_j60vStBg4-%od5yTC8S zk-wh-UzvONReQ1^8cgkD>>9Pzsl%@C*T}8WYR{QtuEMibsj#s4o%4r(1Q-BEqz=zZ SX;?e}0000fcH_1!VBsN-0 zX_7`-7bT@d38f+yl1&$W;G&4QGHX{waN#D4Y+d;SgrbXr5w!TR2tuT|3$BD1h!nvl z#U`<7K5gF18}B4-O=1KuoLpwkoOAC??!$M+utRu3pjaZ@m07NHM;OLQjnuNv4-g|F zuqnj3a5^1K1_GaMGWHEUF@#GCAj(@^{=#%Db|aKXAe+r1w7eYjgu}sJgHSU0hg(?* zZbzdQxzB%fdDW=ZP^?t&B@)5t)D-k`xmVxE$+M(WI|dCQWVW>%4P4&Xz+5T?v#O%x z^}@NneqyjNKaUx|A0sXomkMNH zF%@y``XktR6*kKcc>E(1)Zita7h=-SnDax=)Ex)MGXxe$V4~478>p8aqE>p@;bvw> z-Cr~Hdvd^n%5bQHT6?CAd>sEdOxI=a+ds!nw%zEBH_LXpyHo8)?~(VA$5 z_`%5~=iKj?b5AaA8N(gL9tCNFVnMF*{r)rR)ucyy*~bG&Q6aJ~L~ksc)zgtkW|pyQ zI8>*W6+n_#?D|+=Dm4>5JVY*+Lv(6N?~28ACm@^Tl`y%pgTdotG^i?`ySve{xmg2@3=g9}97c06 z2)UPhn!5u^=2uprH8r71i88(W+uCXXImSRB09Y2}-meZYV8^N;Ssp`5dZd>N`vZze zN3n?RMLwSovoz?(+^6h(Hxr+*%y@(17| zkwEe6%r%1quoMJ3YaJLg#L6Et$e*5KZgkY092)A_+TPZAna<;_< z$Yj3n1bMDbP99o;49^SE8D^~I$Z_j_i2&^sPOUF5AKVDBCda9_Gd54xst5nj8*uw5 d#O}KQ0|2Wo=P~6hm!|*#002ovPDHLkV1nLe>CXTF literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..86dc221f5b62b02b01d29e44f4dc858b9c16b43f GIT binary patch literal 661 zcmV;G0&4we>p1!;`DP7bq zVr`0UN96u5=+-tG^(+(?yB_*IJZf~Nt&93Pv1 zPlP4F`G7kfw}&j2595seL_@UU;vDcvT8%$-!tcN23I>r#B;ay7?Z@11d!vCX6#B<` zJoco|cSM{^+cjRUaMEl>XIB?QF6or!4(KrD^+M_BK#>l%Xs_?-*)tH=XfPOnN(Caf z-T?+{xXmdl2ZRWrxkEod;P#cG%{$1Y zUmwA7dIT?DEx>H^qIbX{idM&$w&+*TZOS@Hf?iQt+D>5g`%G0Fcpb*z*}FJuc0%NG z#$@q^q!i~SGh@a#4X>^qx%514+?vMI>2WBX7m-*}3D2q=^=cGa@xbi8j9sQ@b-dL; v<^1ZEb4*Pp@onV~(v92>(P_?~{}o^Wvg%QW9KJZ100000NkvXXu0mjf?x-=H literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/calendar__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/calendar__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a859502d11721c28f949da72df4145d18f880ad0 GIT binary patch literal 612 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 T&_s+Z00000NkvXXu0mjf`y^I& literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/camera__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..07b81df9e14c15f016f87cdf1bbb164c5fb82ced GIT binary patch literal 748 zcmVRZ;MHjUqXo+hVg27EoH})qOx^P!YG`O-0kqV(81Vl?}X|2{^ zlq8+DnNB{N%#81it+=qI;Dz&ey!Xzz=iYZY(=_ovK}JSK4)%d?IE=o&zEE>>^YH~J z+!Q^5K;S6_LZJ|MOs+=pjvF2xzBM^H`N-vRb^oiJ!%E!T+>B36O+6uzNaR5xk?3ZJ zUauFyU=Y!06n?)Sl}ZJws-j#jTO>)6(Ad}rQ54~DIJ$LRZy+4UeWOGlAp}cHODL5} z=D!Ir&FM=K!}JJ zk(bbjjQ)X}n461GR|aCS_cVd}N5HnXw+99mxm=EB`GI(R1%_eb?P46$(;@T@1+f@g zK|{kyWHK4*rfLbWU$C+4%o2-qTA?cko)@VD31>Pl;eyX+-Nm8M`Xva0WZlyq@jUIa z#Ik?5vW}HIDLk`1hs{<;GdYmYmvG~n54mg#IW>jB>piroyKp*Nr~t79m;+G|1Zd6z zM#o06Fuwq)t_~d?XR)#I9kSd7uk5lM?(FPfb#)DHw+!~XzXk5ryJPYi?H-`&DmWc@ zs6B=(b|G-?K5gbtEH8hyO0e7Q=$FSX{4QbhJ z0W}0k6XjwWdT9(dyLl2U^V8@77N_Q6tZ~!fyfH0Fj_ptD)6up;D<}I-SDvJWM7N zxzI2Sq*5seA>cU97C{*<;b*B-+R$|!?RFdE@fg)=6@$S5!{HExLIIX#NrEs8(d+e) zPN!ov8WRZL_hFi*Od5?w();~Ba=APBdiV{m-+e}P*Fovw1LX7f(CKtgEEeS%s`N=j zQ3Upw;Pmt_j*eVt#P5X(92~sGll_+nXGv1CinFtGD$T!AkYL$yJA+^%PH8Grcjfnn3OV+_Zyb21n^7c;EiyqiH+$AID2uV2h~4FCc`5b^Tm8wP24 z9R^)vW3b>AhBrXN*%^NP_<`R5pr3d+Ik^~ES-BW&Ec6+kzI(|43Q1=>a|R|Rc7~rn zf8sYlS66pUQ&X4mpFjT@goIcaR27(kHiHaiVEFg%Kg0L$-_c#nz=)ibB_t#q|Ni~! vge%c7Gc)gd@#4jPoCXZdyg;!5009O7cZ8ZpZ!^D^00000NkvXXu0mjfh-|7Y literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/camera_small_black.png b/interface/ispconfig/interface/themes/default/icons/x16/camera_small_black.png new file mode 100644 index 0000000000000000000000000000000000000000..2fee054ccbec318c336a094f03ac2b80b2a3ea77 GIT binary patch literal 351 zcmV-l0igbgP)jzkY#Tf$T~a78Zua z#ztmz1DMdfV>f;JbcUBNUoxCIbB@73p^0I}%sC8a&z@&^|NcEl2`iyMeEj|UcZQE2 zKQg>}|Bs=wa~6X`Km)_`w|^KOJ$j7Q0CX=1f{3qQe=^7@=rR}^Lwxb;(_Mz&Uv7h# zY=jKpVPRoqU}EB6U}yft@cc1Y6PW#jiJh=g&Wezdt@QJh{FLF2~Bs x2{sFFIsk%vAbyAk=cA_s#-X1VC^i5fzyPhef^C2|T;c!#002ovPDHLkV1gNtkre;{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card.png b/interface/ispconfig/interface/themes/default/icons/x16/card.png new file mode 100644 index 0000000000000000000000000000000000000000..be7001f216c8165ebc3e0e240daf9256b0fa3927 GIT binary patch literal 371 zcmV-(0gV2MP)KoCWDX4er$2&E(l z`2e)^xd9hIIY6!uDMgB$AXPd#3VKpfM4ZG0b{QdxWxZZ!J~UR8X6=>6qw)BC|DCm| zX&TjMvFf?Z+jhH@{LqmvjQ4)}zFK{Dp)SmT^iwZL@UR9?g_{H7vM97p5|s{z>SMkBnk^PDyZ!!vx*fQO9-cuB1}u%| z^CupSrm%G?%RJ=yH)q-7crwY_mjCO8^Z7`U?gf9GET1_0JDuF<}2 Rx<~*3002ovPDHLkV1g>@p;G_= literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/card__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..acaea0fddda5c027c997f7cb65a3ba66a5c8da2a GIT binary patch literal 558 zcmV+}0@3}6P) z))@Ds0gP$-m=L&-sM z&_EEZCS}~6-R*o)WGM;82XAM-@0<7b8)k;RD-^&OLnl-&9-{JR0D;gWTDK-?dY<>e z;ynLYJ%)lVA)4oqA~QWVXv*=eG|5n2lYAzFNGD;v*_&}3CkDsCarqZY5f`tX8|KGP zKeD_}9o2*o(QG=s+R0#kyN1+67{4!p5s`!~b6?MZnHS07z5JKgny_u=dLD@F5O37+ zdA-t_|K%LQFc2L#@N@GBLwdcaS(XJyiXGQ&Ymi+SyPeOzKR`2XpuVw>H%~|Lyw{y~vwq;<;z!C!Y0aMj$ z1J1cZTj-_(KQyT!Eg3M;00Zug04F6|VHhZOrsIjYebib+FS7D^;CN`HTp+PbLKs&2JfQev^`P&gd(x7@Dg wHX0}N40|LW+`NnXfR62)c^$5BxA-T(0Cl_)MTCy8*Z=?k07*qoM6N<$f}ukAlmGw# literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/card__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..551092044b92b61d1f740250c584f883b4ba52b7 GIT binary patch literal 590 zcmV-U0qSLk z{J|AsAt`LGk$?xO69tRI#==7IFR%y}Rsm5fZG{Vg6vrLd0b>lqY{tDo%PoUxgSx@|((ekABmu`? z*cVlD7_+7>PCmOrEBSjd%iyX}Iz3E4Xz!9UcD?90xl>2Rt`&vvJvN;8Ce*~e#l<_x z5YswJzP`Jibl0CIrBW$rHy@@x?Gu+rN-=F}iL~yE&9#@NM;cnLp<1nCr~MsDb+EPm z3dH47O2h*NVgxHS*j^T^TW?Wcx{H?hgxKCj@S_GL1+#>dEES03L$!BX%aFo17YNwA zjp><3`1Y}2I@d$H6XLjz&s!o4S!`}oeFT1fF5~2hO}M-ZWHh!nX3^Vtp2k=%##y~G znF=T)AfxDzz>cu-fqIRjyE_eo(e#gVj#fuSRv3nyO6Zrth06~Hj@ETuEX>W-NPtBH zN*HDt!yzuG&)yihWx+AZv>u$u!5DE;fuPwO8OdbeX0v!wF26WeD9qLyjW^`)2klXe z&X7+W;s5ct~nU-Nvvm>VC@?@zg3O!s=L^bBo-W4rI-UyR1~i_w$( cANwP~0Bu`Qk99;18UO$Q07*qoM6N<$f>S6BIsgCw literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/card__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..9eaa682c7459de2feb3f82fa7336477f869c5ba2 GIT binary patch literal 419 zcmV;U0bKrxP)QoFdW+o3^Cxxj~`4R zFOcd27N8!GUXTHdf5`9xD^L$eFB6CWMIp!#CKeV34o*%m4dNqXbh&>J7certc>bK3 znU$4+lZ%UC(){_`WQ>g~x9;0_1jI+iATf{}NDYV&(gV`V$fu7cUS->P)K=GLN|kvp+3WQpk`gG3I=IqJFp&*UY4J~eldbLfByc((ER1y9fmvSyBJK23>da; zKhB_KQN|#lU=L9Xj5&~Ark_84FoJCV4HQJjH%~8TuyL5cuw~mZ26eL%263Qfm>ftC zNG}VB_zmRz`tt|F1rGkL43k^0F<7`&GKk1oqNrhHW`-E>v;fe2VMGO@5QaBy;hY4oT>m-`2C0VC6k=g*m$Sy>r4 zxwsf6&7Z$b#@M)W>%M(QKzw8j5(CMB)PVRPJs`b|d|FyDOgubNAZLAg@#4|HM~@CM z$;sLANl3^cI~kkYzb{{&fwCbR5DS39g~WUXijohEz+}!q2>=K%07TYP5LU6yV*mgE M07*qoM6N<$f^qc*o&W#< literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/card__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1278042cba6c6150a992233e9de4860aea1239 GIT binary patch literal 518 zcmV+h0{Q)kP)+$oH);7T&N*-7AFcLNe5aVIXZ z5+o+$VT|whABe(Clh~XCT00E;hv4b-#fj+{hn@=pxNAWc&P$Y1umqXec3WE?Ps8=> z8GvC!*(y8!HhB(Hy>r`2jZ)$WSk}KA8B?Rccb*{@jyj7XSE(5WvBWB-3xV{^>Tir3 zGDbgde+c3X-BgpQ<{(^(0zr zcD(~46$=Gf_IN<`dSNY-IU3aUrNdnA3iD>eF|6Sn%#nj!;)_I5lBNZ*t*>G+Z|C!u zQYbX)3j{*VE&o-stJM#@P(8x@jd#%v@Yp^H?{J0P;75P~00(~ifL)Hf6#xJL07*qo IM6N<$f_wkkcK`qY literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card_address.png b/interface/ispconfig/interface/themes/default/icons/x16/card_address.png new file mode 100644 index 0000000000000000000000000000000000000000..440878184d4d78d50df8719b435a207f32a9297f GIT binary patch literal 578 zcmV-I0=@l-P)KK&%w7g+NCeFg5oMxo;mZ zzwjObKVS(rkw`>Z)-+A#-p)>$iID*t#M55P4u~?KqqjTs< zND&ONB*17``TP!Q2N_x1-ORvkAHwu-3aMnWY5H_6T7JQpPY&d3T>m%<_0u*~zaN%u zOD81USgNWv)x1Xsj91EKpHCFp0|BgVY~+X1>6NX$y#no@2R)-2ouNH3#4>$k3~P0lX_oY^ttuF)x28m7bABfx@a!{`6W9dZdj|o^Me2b04Wv%%uZth QPyhe`07*qoM6N<$f+{TiVgLXD literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/card_small.png b/interface/ispconfig/interface/themes/default/icons/x16/card_small.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc08a10f9ea6a078b582c3f8d119136d9ba4388 GIT binary patch literal 298 zcmV+_0oDGAP)Q}DxWn^TO#HAP*Ue6oD!#CqJ;OEbu(j9Se)3F6C&|rp&MT;`=y5QT_uZ+L`{bTt1 z_b-M4%*@PSdAtUE`SOM7Cs6aRU%xO6U}Iwg%i|5i&!0Xq{RKMpKhU<{KyQ2l8U&(2 ze2_Ru9k literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards.png b/interface/ispconfig/interface/themes/default/icons/x16/cards.png new file mode 100644 index 0000000000000000000000000000000000000000..2d91605b5408626ba42666715dcf72b8a4f10384 GIT binary patch literal 478 zcmV<40U`d0P)q0tffs8D#Zh!Ey1Dxy{b* ze*67)Mnq8r|M}F-VDK{$LbPZor#Szn`0x9^PE>9?o%=&P35x4}zpLn0P)dQlT5aC?KT-*Kvf>ldNfiWm&?f!$A-v3LwR1C(xpYEF&VArg`}~9`6;%XR~lxDuF@H zH|w=fp68|FejW~?QYerGWC5v|BMrCXdEnBcqhWx}4wxeicSP3tcAqX?+qRI*!2+zB z6uj@Q*L!rs&_b%*d^SVH93Cw=zrC=>0zwXPbk=CR6pO_mST5g{9dnR)p14IO^BImt z49L&R9C-wRjkK9x`;(5(2b2&I~ zHor?-sMR`{&sV0?DU!7(S*RC+>;ASoGt)aYS*&nw%lx8C%yz20AO17 UXfSSw6#xJL07*qoM6N<$f{0z!GXMYp literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/cards__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a79b509b8e3c4bf483bd0b92b468e3c0fdc03af5 GIT binary patch literal 643 zcmV-}0(||6P)S}y6rSv_polC+gh9k6NEf%X zW*r=znVrA=-mBTRmC1haWgfrx-gkbV_kK?rotlC$BuNsAirKA!J2>AH1i{!*`NM-| zrU7eMGlY|eA{}h~)Wvh{>B;Gp8x@)yM1yC-z;)eliE^`0xE<8(x&C|&K7BLA*jxVs z^F<05&a|hCZ=}l~f0z>EB{Rmr*x3;jUJ!uq`!$1Qn?mo&EPU1hT8?GG!Q7$>aJWAU zGxyg9MFoTqNXRm1nkKop+4H=bL0aE{*AG|3*sv_{G8s^EZLs`w0S?B>vn=GMl!7eF z1MgN>|1vn=6Gt5o<7;`NBLd(})+(n-A|X&T$-| zJ$bW8?(01)33aLB9J&;VCXT*eyFNytrWlT5;MPx9z%)&sJ9;f1zwPu0lzu$}t$H5( z0|5w!&rKZz@tF!>tkqXhY2+dqi@}A?fEtMzF9^GIq;A&OwZhe z&mT?z&>ED=8tite2Pv=HM(e%t<>MU~87hEGDtHw()YSyk)TiyuAq&Q(Pf^P2?zYXN zse52!gFOv)=HxY$>RuS|dfmR|N?wa<&1SoCJ6E|K$4=e)a~>oK&Mq#l-d$ckGpH!R z8w(3hm;frT`5giB~PsL8BA8g_zBUL2L zMnf>MiA-Jc`P@~z5^JV$~IKrp7-1)MmhkTy&s@0X~ zC&umsR3$NZ`ipwm8@n*s;0+MO8(i3}n~| zFzY(Qb7!SeWnx)<4xQ_DyIdfL4nMT-S@=N$Ctl7QyQ$QDAP_Lk;qX-`a|+hR12^5+ zc()pj%Qv6_SC1hF@?dreT7>%q?!&Qp|LojgKbvjg7=w)&av%?KZ6}k*xZ_YcHt%=1 znb%A9(&^9E`s48&_xZw|PKSfE8y1bGk<8|aF&JFU&&DR$7Pk2pvt)ClbjR@_ ZzyS9o{aIwE1wh4k@`AViK3K}Dkz~MyV>{sB1Ty=la zG|lxZ0Vs2GbzgkGU8g%bPL1^THdz3grrGxmSHj_&<}$^z-(KVG`_%|_cjI194^o|- zFJz`H%QEu0oTWlHO&Er;v^ez!VV(I{!!#hQ54~HxlmLTL8D?- z*Z=Sz)35O9!&Njl`|5 zgt}|gw2;pe0HIie`~8%QmMOoCW!%+4#nD*o$=zu5pi`FDWM*b01`t&OQ2qk2#Hh1d zl9F2kfw;%x(e?THl$>8+Q2Gx5$>D%dQ}feECLeqUc(e1{zP^kO?*ZKWnskXKuolZ+c z?YZdnhFG6XyE;y~r?hOgZ}A6{uOeT|8~yJomUT0AJMc?@0RVCmL@ZcQZ`A+*002ov JPDHLkV1jFhJ+A-& literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/cards__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7d54afdeef77b045c6d00a0bcd07b73be33254d2 GIT binary patch literal 621 zcmV-z0+RiSP)n-}TDgXgMkPl6!kAc!D^Qi=sD2yINgnM)5I zB52d3rrAyQvoo)*P2<)&@aH{-d9(lDd$a6eJ`X`K#+3Gp34eSBmy4*v1bceN_kEBZ zHP13GaMO-tNpsO4&6gX)&A?7<|3&TXQ2=dm=f3)^Q{QC3ErbAF*GCF#YkxHuON^rcZY|t| zx@*AkW)FNAdk^;}Ctpe1wnMqY;_~VxSbV+&=`-iSMyE~F*@5sUR#Diwj& z=6NcWA-=$NXCArBPQCu}&mW9Bgrec*|1nF7o2&t5F4UtGB7&J665Hyfw z8CItwiEwe43UpnU9M8kX>PKvT`v6t;V4oaCw68DNq|qSTb%S?>qTOvUNk$GTio#Pa zykA*C!)QRKMxNdPuYWe1J?Z_i7>-k%PNmQ`O-b0cy^lLLJp5Pgm&?mIkx0O%0n|Vi z%)#6b7kzwLDC1PFfGcBvwvkagwhfECP*fELD_{=h{`~4WzAik&QO$>)xr{eUONhtg zXt&$Qb`>$VPo{%#9U5vHh9olwH#nlYL2<`&f(a>Nj7FnKkX&AKaNWJx*?G(JbcGCU zHX4dx4(1uZSj6l3N0_)&M90}erBdlh|K3$Hk;x#cDAhB$+*@kwy4%}7gwa(nGd%^< zH1Tw13g_-z!+1Kq&jYTLG;PbPR-bGT4W*ibIhg11{p(QG8?f0V%j#{?G>!6Vkmow$ zZ=Ej`*58%OyT&pH^Dx&?HhYtwe5k_Mn-95V@@6!j-~F`5(&?fSizVyzx literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cards_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/cards_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..83f17cca9b22067ba8f56d4a830c23f68b9ab035 GIT binary patch literal 470 zcmV;{0V)28P)Wk$yiAdMYT~{i#b#rmd%X(!&p(eWlQGxPg(F{ZJ|6xBvhE literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette.png new file mode 100644 index 0000000000000000000000000000000000000000..91ea01594fac0b80f0411c7d76ed2855a9a50cc7 GIT binary patch literal 447 zcmV;w0YLtVP)A512@Gw~8IJI?*Fg=t0yZKBRxSlmD&C&#UXY?~BEP27|#(tT>LzG);0GM}dHHI2>p=98!`b zHwhqjx7%?GARzKQr`c?Fm9W`tN`!=U+m&dICQ zimSr!FBz+TsNwxTFFHX4mM29NPsKq%!7FuC1s zDT*TYr9i*m=U5nq9D}b2sA^SUI-OqB-)uH{+rIC!0gXoEQUHn9fL;7XRp1Ft%Cd~R zErgJ>DjT{Dpby9a3BKFya?`<8PbXFRCwB?Q{PKkVHkcq-%%uMn=!(K zfyj|ISBVe=1qF=+uZGo4hrA4L`v<%j-t2B8=q^Io7zkp7?8=K#XmnM`NZ14~HbcBn zFOp6Nf1JMeBZo2EqF#8;>-WCj^PJ~>51I_az+*zfBg4ew9nY^H$Um3)V=5Mlh4T44 zyk76UScO6XKA#WKXjCErN!NAw{eINz^?M1>T}{)(3P^x;Ivu1^seyz_rP3qx=0+qE zp`VNdHn&8FBk zV~kg20owNE#2Q*pUI>BTXJR8sE@FA% zC4OFVCw%M{uN~Kb`SmxPb1`n>=Y5XZLH3_6Z9S8pE94Yc*BYi*SIo{SH;&%#w6yOB z->5#sF~;HiA4b$q`N>1WpgbJf-Xtz5U)|!L!Ct+EuIVQ~KJ2#mZa$g~e5U%100RKx WC&5C7rq&Sv00004vh#EL?Rg++D#eXh4mP zk@gPpXb8RJ{N6{;8m&<5gLm(H?|Z-By+3?5(=>4q5pY1UF}cTV{6F!l68oGk6bf^V zMgy@}Y+tBmvx!6^fqXtM5P>il44^0qR8`#<0p<4leLeyr5QoDdDwWDV0o`ub0$6<` zm&?&nBm&7W3^*JPWHK4FS}jDQQPgTRp4@J?K|jc5v(PjRKA#VzQVE11ENwv~$K`S% zolc`#t#TU*g}9DJBYt;%egetRb8gAsArJ+t0t)teJ=E)UZY_dHBm%G3iSDPDxOw|2 zx8z$DNWT*li^aeCce~w4DI#Qd5b_}>vxlL?)Ug&g0VVFGUXP4a(!iOsv$%HS1x_VW zxHu!SxorQcz)nNbb)8RJ6h#)5xYD$bO=$=Q{cuS?P%fA8sNhE+;60zy0{x)+-{AnR=+7KM9^Zusysm8@@Do#Oa4Qg2z7x zeRF}|sT=y{yOl4C1lrosF`2&tI7IW?+c#?;cBA*lpRxe`rvL*00R6+IUNqox00000 LNkvXXu0mjfs+15Z literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..c75833300aeef1331c7887762f4bc1c6d5909e76 GIT binary patch literal 467 zcmV;^0WAKBP)gijH1zmY!OH) zqKzSlRUjWA*l8=+1^fz&;E#x%Af~Xib!)MR7J^L#W1}DoBKXLhOBO_9BJsf8yK^6B z?wpNDwTY%*F!RyJgckU?<18;pymm&cP)Mm3mv)Me^Fqure2JhS`l}db7B+%>i8i7Cn*=!cW;Sh;L0-a7r zibtanxIwX4#C$%7ZQH2V>tGLi`4tow!C(-XOa`r1OMEmM729sNk}DJnlB4JPn?PCK z1Po56Q#g(z-Xn;|)@TjLnTL_l$kPw20kZk(U zpaB!q>Hq#r0dBYZ zMXF-42#?2uXf&!L16{M(gxBjutyX)H0dX6R244Xgi0yV8$z<|bLA6@#3c7P65{b~Q zNCr}?)q-BHhu`l2x?23bA^7%ZkT?41n$+1i(!?A2Oi~f-j z%&x3p8JLzH8pyKzXnvE)#M@3J68QT^#`*OavIhrPotwiEP`NiC;&VY=j18Y-dg2n{ z@FxTU0gO*h;&6Zeh79^>Nvf*yZHsI^Ns@Tdwkd3u8f@khCf>mA?hn{TXYj^oB&bhf z|H1%uP^nbla5(rV55qEe2B-A`Yik?W+moTFA8=e&*`aHJw8TlVJbfyyZ=rnN5^fu( zJKApk78IlqwtSYt8LB;iJ@V9zf!f| fKYu+Y+zBuMud>DS3prFm00000NkvXXu0mjfeW47n literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb3cf8c5a0f2cc52622b0c4fb85a9f8f8bcca0f GIT binary patch literal 558 zcmV+}0@3}6P)2iofD4) z-E&AL8fu~reD}Neo^!r??s@k)Y}>|r%!zlJL)xz7xi{vYDRNlIWHPIjN(JF?_*Gfe zY88=41nG3zNdnHnV1Q^eigvsGDglb^_xs!e5)h-&2)eF6o6u}F#|h(mBb7?gRFHsT znkL+CH{$U)YPA|dp%6-?5(n4objweh99KY_tyT-=a+!H75DW&{S1cCUNBl@YQ639qv)O;{uc|7S zozLg7XM9C}W(e=93ugC;00lm0R0Y|u*&`&@*KqJnhk5f?z(q|m41>EZgpj)mgSt(2 zzI=t-kAGkrHoBuOth*uf`9ok!4Jz_qn4}6CjRpdN0AJ;)ooW|Y+FarJwRw%jjU}Fc zZxuh#5eE`0FTR{L?-V}qo5B3{XV=gDlOgXntTNGr#I%I(zt~YLzRNkA_#tOP$br;; wOY~mE7o`Wyj`n`s00Zk7!jY2|4DSUP0N!%Rh`S2TQ2+n{07*qoM6N<$f?fdp-~a#s literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cassette_small.png b/interface/ispconfig/interface/themes/default/icons/x16/cassette_small.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6fe7a904b3e0b503ee846af0b34a7dcca5315f GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X_ItWGhE&{2`t$$4J+o>4=eV6 zdw+kw)f_g4#<<|%$^Ylu*Bj&}B_^&|y*gR(3F|ih`F4gMK7Tf@`Teao@#CYT2~tPc zJDZ;v`mnhw^B5Z$y|b+R^rYU=@!)@jC{NFq_D1q5{cGe}3}ZGVALnaZ?A~wGkRjmk zIC)2dprs-s^T&{^tW__8HX6p90s@2TZ*MLia4N97u9MfZ=lm#K0x@>({TdEI@{-h=_! z09^&dq9ErpeE9I5;q~h`V1s~a3V~`Hf`daUKzcz2{JDSs$@BR5RI^EwdW$}P{`_(4 z)@@h=4CvjDyu7?cAhjSpAia!00Vi2m`QW0WNp4QDE zjX*hHEOMJ3KYqBD5hyRj%*^ZxbgDL%kiH3x1$8WPSAhY#8)N_%5c7bdl*AN97u9MfZ=lm#K0x@>({TdEI@{-h=_! z09^&dq9ErpeE9I5;q~h`V1s~a3V~`Hf`daUKzcz2{JDSs$@BR5RI^EwdW$}P{`_(4 z)@@h=4CvjDyu7?cAhjSpAia!00Vi2m`QW0WNp4QDE zjX*hHklgOilFYZ?|7KABbN|!Yj*KObA3t2n2$UCMW@dH;I#nA>NZ*9Uf;vb}xBg&U zMv|5I%=yQkzdgHU!^8D$H7p>7z>wV!qz_|rwo>w}er`o$4G{a*ty?b-osbZZi?fuR z%fMl+z$X>Nh%b>yMNMK*_VRz`Z6han>oWtxmp=$OIW7i<^$U)i#c2Sqc?<)uSqv!P zX8!;8&ln{3`Ri8(9VcUBDP1Lo<8!v1Wn^NSz(Odg0yU@q{qu+6-`~Fsz*KbRtAY~4 zp1u`e&0IV@OIV0a^PhnU3Fw@&H~Z&+0(AmAH}?{dI6!~_0IxFg2}pNUNB{r;07*qo IM6N<$f~2-22LJ#7 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..a3bb6764c50d72b779077cf2489a3b29f1cfe308 GIT binary patch literal 707 zcmV;!0zCbRP)N97u9MfZ=lm#K0x@>({TdEI@{-h=_! z09^&dq9ErpeE9I5;r+A44D-7G`Dv-V?+DJB|1mf?qynUu8K~LR(9ldrOiYsf!iBTq zKY#xGD=I4Lbn)UvhU3SNGaNg1jN#&iGYs5}I~bgNYB^3H-=ie2kuA)@$ha@;Ygs;j{(Rx)&Fi8W8S!tig!D}gb_S+5kFHzt+c)z@Cahwg)UNUC z^~1I&4<9fb`TFhe1&~56AQl5+DQviV6F^UQK{`Zyey@z@XaOaHhFAzS^i9e1V pxO*4KybBR&N6kn~3_kz@3;?)w1O>FqBgOy#002ovPDHLkV1gqOUq%1` literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..1710504cc0a7147e471941b23afa37cfd48f236a GIT binary patch literal 490 zcmVN97u9MfZ=lm#K0x@>({TdEI@{-h=_! z09^&dq9ErpeE9I5;q~h`V1s~a3V~`Hf`daUKzcz2{JDSs$@BR5RI^EwdW$}P{`_(4 z)@@h=4CvjDyu7?cAhjSpAia!00Vi2m`QW0WNp4QDE zjX*hHEOMJ3KYqBD5hyRj%*^ZxbgDL%kiH3x1$8WPSAhY#8)N_%5c7bd6jxkVGcfdP zFfeE!i-9!WU|={4()10Av4TP%mStd24vCA?Lzi2)Xwh#*e5uR@ivKV$%miX%j8q78 g0poz@Mt}eV0Qh9QcH4Diga7~l07*qoM6N<$f)W$l*Z=?k literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..928e14ae7f5d214cc8a6037a11c4ba4c7a468bc9 GIT binary patch literal 624 zcmV-$0+0QPP)N97u9MfZ=lm#K0x@>({TdEI@{-h=_! z09^&dq9ErpeE9I5;q~h`V1t0_3(roOGAsJ<5etncPYgf?{JDSs$@BR5RI^EwdW$}P z{`_(4)@@h=4CvjD!otEWCUy??DjI4`rfqHRjJ&+OPO`G{!9_)tei|A&k^%xk%wNBL z`Fr*1h37pzt(!p_fpWeeIbQbr%!g0D`JbE|%^0AieVO^m=t7wXuZs zO=v8rTN*N`2D|?=PtPh>R5Y4@;KPRx8-D!wu^1%J1;k=NEQJm0Ycfg|B{PPtoXEKM z`?Jdb{gsSI-K?1dpnAAifW$W_MgiIi3=AO-3=Gyz4EEo?GQ_+4S2)d^(Xs#6&;M;e zXYYY0By53IpTNMNCC|X{?>~bYP;(hjvlmG7moNX@{{2H}#%e%82m^zp5HQ|9Gcf%6 z!x)uYcEf90mj+hNSPhu41|{O^uRYXQ!!N)vSwN8C5H{BW1Q-AV9OPiNEXTS40000< KMNUMnLSTY%v?wM3 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/chain_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/chain_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..77ece1334d2ca1a8058a70bd287902eb94a699af GIT binary patch literal 591 zcmV-V0N97u9MfZ=lm#K0x@>({TdEI@{-h=_! z09^&dq9ErpeE9I5;q~h`V1s~a3V~`Hf`daUKzcz2{JDSs$@BR5RI^EwdW$}P{`_(4 z)@@h=4CvjDyu7?cAhjSpAia!00Vi2m`QW0WNp4QDE zjX*hHklfVYvzgC-yucv+NBsBmx|_2fKYqBD5hyRj%*^ZxbgDL%kiH3x1$B_zpB}!r zl(=N^IZNg~XD<9$2n^8OEFgtI#(p4u7-wXc@cJ>Rv1kB2@$%!}kKzm*|6l)|&R4~7 z`>#7A!IVg;p$rxQ~|GIr=@f+aI4#EE!W&$zT0G%*><14E!o(0P@GMr^0 zD!u+^NN4y1%(cJ&pLzH99RtJne+&$)j3x{$j0`M9C;FGa7=VVHeb#jgm;o5if;2No dvoin$7y$VR;P9WY1t*!4Bx!H zyy-S7W9LKG~PZV+PI zU-vg@U-kEwkColeP4k;^p*-BDXS=jZ^ACl>2{u&{21@EGjEsy=*T?T)=Dc%$V}-5& yJF}s_N5kyd)z8}b<=;IrNib36o50Ax$i^UT*Y`e0tyl%?MsxqiS~cfsgXBSnSua1*+Am!D_WSb=>U@**KpOca#0qu0AIOXXc0zGs(9eD=|?DJGQ{Yf=7b!P&V z-dbCG^#gtQfK0Efyo=iHXSn(KhwHn$!pB;zmQyN~;B-2{Y&HXV#bBR+i5sZq8p0vp zk>|)gfdO?d`#AGr7zLG5aU;*V(Q+z%j z*le~#vmuIN0gJ36llb9KZ#Hnx^b3$QlGv@@pAFncg2CWZ46h;=Q>oOGVzHP@CX@1P zu=wt>M32VHY>VZ=c42V%d)Z` zw9}d5l&5=&{=kbOlu9Mg>-99k-m$TXQJd|wW_vp`gt;qZ4}qqS&&=E(H=FI+jg7aT znWH9>%QyqqhlgF^#l>egEf&jJqtUETtF<6W4X9Mgt^NJt-onD8H#<8&UsC}>)BO{< zE?Sg&31we6;Sc?W-fi^?P%HEzsxHbdCoKv2`%i!Y08u?Ry5rA2g#Z8m07*qoM6N<$ Ef_u+erT_o{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae81726678625a57becc69fee9d7e0eeeefba6b GIT binary patch literal 505 zcmVx(vHk%>x-=0(QaQe+Vb2WzA(+Qs2mM_s~uTetv!iUS3`XR#sMqFJHeheERs2 z;gfU#LvU6V!}b;P;Cfj8{zVu7GAk}Fh5;V{sX^9*;(~ww{xQhP%i}iys0LXNiVOY% zgZ9tAe|QZ5MHh+-{`^BT09h8BekLXcWIZf@kko^0|4qmMW@d&zC@%Pe>Hx(vHk%>x-=0(QaQe+Vb2WzA(+Qs2mM_s~uTetv!iUS3`XR#sMqFJHeheERs2 z;gfU#LvU6V!}b;P;Cfj8{zVu7GAk}Fh5;V{sX^9*;(~ww{xQhP%i}iys0LXNiVOY% zgZ9tAe|QZ5MHh+-{`^BT09h8BekLXcWIZf@kko^0|4qmMW@d&zC@%Pe>H>TQ%sKyu z;lanB3{0BQ!rwSV8UFnIiRyyC1YB_A`8Ni8ds&8+m*T~~3aZ3>|MF!C%WndKIQ_^+ zhP!WmgV|3WJYZmC|IOf+;L0^`>E(j|K(#CnzcMgLbKnld+YFoxmafVSw>~p4u$pKv zfQ&l!mVv=7NY{A%f+GbiYo9VO_=__zNU#9|1eoeLxw%mcko|g(VaL)tVD`5kKNuKQ zR2Zaml^B*x+;$ciBNIS*kPC=;LIoJMrKCC;|Ni|OXBbp{2xa(}n9K0CujkvxkIyT= z9q5|_GC&B3rOa3vsstGs)bK^&b^RpyPyF&+Joon=d2;tqF;M6kK!5=NSEb=t5}#$O P00000NkvXXu0mjf!f+Yu literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..155d7c21f287ec5b9b289ef0b97d435143806ebe GIT binary patch literal 684 zcmV;d0#p5oP)jQyLR2JrsFZ?-oLUeo6eNNmRVpa-;7!n?h-Yu=#X|!^57H=7tY`~f)Pqn3A(Rw~ z#-eFVNodvWMiw z*N3+fm70%XY=4emZIroVFBbdP72Rd=gXlAK?3k zIf$YNkH-U+Wl@x66!Li#{3Ez9K7qH-qxBd@(;5UO*XZbFv@+Aj9@C^i*L8FU0<8&% zk3FVIfksNJ>Uv88^SPQ7sQL~9`>D+~(^HVM?;v&#!ydz^Hh(j_vI~Ksmm#lz#KB+$ z>Es*?8nmX=2-Ic;yAhOf@8RTq;2aD%z60&Ol(4qE-AS~mpa!j~pb2UPh0H7@ZvdCB zPD2oU@ExP1!P^u=09qk|HPnh|hy3>w91Q7mWeu@d4FB>!(ALwdr z?v-`6-!Jwivc>D>5PJy@^s|^~qY$)LzkdWhUO!wrUxo0M_6qo&{Dp=80t^7=FBjym S<`Y2x0000k}@P)x(vHk%>x-=0(QaQe+Vb2WzA(+Qs2mM_s~uTetv!iUS3`XR#sMqFJHeheERs2 z;gfU#LvU6V!}b;P;Cfj8{zVu7GAk}Fh5;V{sX^9*;(~ww{xQhP%i}iys0LXNiVOY% zgZ9tAe|QZ5MHh+-{`^BT09h8BekLXcWIZf@kko^0|4qmMW@d&zC@%Pe>H{pnZ~-e&4M>mrBL)V}uRsHS6A_3Hii;V(Uc3lqGXcXu{T_oR=TC++z|?$} z_~OC^h9Cn2gn+It7bw{;T(pRRW$jZ227hq|1_?HxbAYLilbajE0CqDo zhPh|YLSvDU;o0SL-&lV$TxS8f04T<_@g)OKr~m`Qg&I$W-@kuj7{CF{5(@T^d;v<@ z2ktRkU;Tl>3&{NfG63WOF`!p&^-bKzKn!^QpWzlr4=CmV0t^7{pTxR?GqMB#0000< KMNUMnLSTaC8Sr5M literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4b5ff7308e2efc7b2ec7c99c4b3bdace5e9f55 GIT binary patch literal 683 zcmV;c0#yBpP)wLR#eLBWHFQbIs&Ko9=3q7kL3 z7D9`ylC*K#BuzGE&2Dy`S(8m7viQMcXJ_Ag-<#PP-FP>Y(&?bqSJR%FCG*}RWLQ_6 zT5HOF4m9WH^CgZf|9LWH8SW6c>A(@6XWDxYIz0myw$t~wzFRBN;G-+3g;?Z%AULly z9_v;OLcJ#k+~IH-4QD4{G}gdww1!qx}gup2QT621D~p43Wc%(_3H0G4XvV_N=;P)Ns_R$ zu~FNAa7vn{sIEFefo!cPNty=qcTr7GL zz6#P^AO>29#$t#Ww^^IL-aZx>W<;?%fuNBfyFP=Dvpj~T7wQkSw2YjR}!0V8^O`ecR03h$4ZFj?-EIn5&mNnbBP(m=f`nizZ-!k({MQwnH;xymURI7VZU;y@-- RH{$>R002ovPDHLkV1fa0F&F>< literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clipboard__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/clipboard__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d12b7db72daa1c6e3ef80472c459852a424c2bad GIT binary patch literal 608 zcmV-m0-ybfP)x(vHk%>x-=0(QaQe+Vb2WzA(+Qs2mM_s~uTetv!iUS3`XR#sMqFJHeheERs2 z;gfU#LvU6V!}b;P;Cfj8{zVu7GAk}Fh5;V{sX^9*;(~ww{xQhP%i}iys0LXNiVOY% zgZ9tAe|QZ5MHh+-{`^BT09h8BekLXcWIZf@kko^0|4qmMW@d&zC@%Pe>H>TQlwYf5 zxcvDV!+$Scd8ucA7{0Qix!^AW7hHIIiNW03jA6sIb6nSySQ&l;Q!mSJA_B4IVjaWf zk5|C#kAFWh{Qm{Ch>`gW!+(aeEDygjFi3OY55&u_E-{EYibFERpEnG8an4+zWWRsi zJ_eSxPZ=2efpQXTK<5Bc9Va(8h5<&xh71>Work0YM<#}6)6aiF0foPS3;=mR4Cs|xeG~WL ujlysCEb^ajzT^7)hT#H84=CmV0t^7AG1^ih4YK+G0000KVCSY}PpBT3J!H0=%fyd-#DxS?|5!pI{rl|;p#`#9M z{0qY{QM%kgEEdCE`hp59a|JEilVF-A^7%YU`x{VIl_L-cpxJElJ%X<55IIV#i?a4n&Sm0i8-DS(f`>q^O`N1SB{x zfJ`$la+J3!FsFF~F0;Yu%NG!-aL z3#+l$=D&-P~xbzySfe33QcYJn_VeH#MjyTlKp8x{@b@?P)x(vHk%>x-=0(QaQe+Vb2WzA(+Qs2mM_s~uTetv!iUS3`XR#sMqFJHeheERs2 z;gfU#LvU6V!}b;P;Cfj8{zVu7GAk}Fh5;V{sX^9*;(~ww{xQhP%i}iys0LXNiVOY% zgZA*ni(s~(pdirSKNt*DR8UO-Mi+_;{`^BVKpx2je0;!QM^+8e&&0%ltcT?flKdZ_ z^KRX`1-AYD`}bh6TTnTei%hh&8UCQS;18+`WMyT+Y#tsS4F7|~Kx&Znpt#^K&;_?| z--h#HE&VA*(^w!}9Pe1A{aNLJ~dD&;djZg#Gjf z(15j185sP<85ktkfE-||pK4i literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock.png b/interface/ispconfig/interface/themes/default/icons/x16/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..edcf756c25ca5b232d532f2678c5d7a2a5d120e5 GIT binary patch literal 712 zcmV;(0yq7MP)mq)veQ)C~TYBiB1HYNsH}m_wx9`1ShQlHGpTXgjOeP7-vc% zaV@pCcQ6(RD1NWkRJ^EEY<08+;A|TlK$L69u?66tp2p(wgec1j@9_|pVN6n|)3F86 z=7lpsl9Z*Dl>~BZfquU~GaHT0;r>R~$=6oPM6Fh{_Xs>QplZ)zu{q?}Ie?FVB+GX! zZ_~k`xoVnb@6CIV`TF%W!Mn(D3NTnk1NQevgy-w)B#}svovke*ilPZY5J+@+nJfa3 z;}p30rK(L{lI~gFGTAKIPNm43Ova7?TTbnEiLPl)WdP)vH=}Sd#$bpVk|tbijC%2a2Sh@H!Jn9> zN&*qBDM&0^n?k#-Z&z!!2dLcbb&wsXqpC{P6rf4aflOW zwjuc9xg=s8oqa+`vMfVBpWhca(2f~RrjBN>x1+hG#UoTz3B(vrB;tz;3z5aSxmhWh zoJCXguLx9fMP+4waCCIcCI~h&%fg4{WoU3Z!Cq72;JdpW$DPjB(Bveah{waK2u(T+ z%VglV&fv(%Sh>YwGnJJoifp12}cvi<#LV&x4VhVx6^4@+uT$TjYhRO0olvrtGPU$Cc;7N z-2qN4yxDwM^=7wPl~Ix;ZLXX{kKeYofSe^9?GkZ8k!K_iQ(GkTbajE>?}wp*0pK`J zfzfCLcY8auA_(W8z;-H`Ot3tEMD-S$nSsGz5T-*RErO|!6ueC9AstKqA{^}%vf1qF z()|281`A0p76@;#C}c9KSWD^PtXG7mG5L_(c-gUYv}Z2@ywT-n;qdErpRZBoIDw&Q zP2|q2pYVBOS6P2uT?HuFg$q6P{M1&azfcV;6!{A-my4uvy4G&LbZdNkSiq)6GCKPk z&Nu~#NdT$be$~~o08bvyEhz$6`@mx584L!uD2joh;o-K6y}c)^MbUaAyrPSI*_4w~ zII$0xF($x*#080wg$s8k#*J%M8e0$l2mdn|^6+}SK+`m6G#a2N%7i$N zVFAGw{u2@FxY<{Pl*wcuo6Q~zoEXj`v$?g=<7sVdYI564O6(*Ujzq!>^Yg)lKww4^ z#Tg8R{&Ap?ZNd z5Gv2Y_WD$ma8w7fEdN@Zn_FhEkurq_VL2{OX06yusQ~aLHQ>874!o@b;%iT3fWzO& zQ>(BvH90wZC`n;OKoLo92Y_KH$jK3yn3#Z+^b;6*pT0l1YA#QDMzI`w{ z`b><)!kR)putOle@e1^2BmCJ3!kekP5IqP1SHYQ1G3jnJKvCo}Vef+hJI`n|);k;y zZ(o0Z^Of%ITBCN2kFGw}at;|XX%T8_7h&bgB^0J${oD8X@~ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/clock__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8d593a73cea0d85c75b4585e67cebca3a384b6 GIT binary patch literal 731 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/clock_small.png b/interface/ispconfig/interface/themes/default/icons/x16/clock_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2d40c7b9dc2545bf20569683c4d541ca1398c4c1 GIT binary patch literal 387 zcmV-}0et?6P)xJLHe_Of*1cWPVYC3IPvxfK0*RQ-PT3Sw?K|$dlIf7pJ z_3M|6iiU=;W<;LsB*Eg zGTYeL=z+wJ9X)z!#-vGGKyv8n8PSunmX;R7$B!Syf&O&^auuP%_u1IkcJcG`zr1$s h8h!&tU|s+SFaVT%eDI;I8sh)}002ovPDHLkV1fbhr(pm9 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color.png b/interface/ispconfig/interface/themes/default/icons/x16/color.png new file mode 100644 index 0000000000000000000000000000000000000000..febc33126b574db29801406bacb2c2e2c92d4abd GIT binary patch literal 791 zcmV+y1L*vTP) zVxeftnSTfX1}3Fr%nK)65(iu# zDm2g(pi?+3sG~|MdUr-qq%pp$CK6GE)sQ3AY-6ah zrq4Dj{1VN4{#OL;)&f5mUrY?mNkU0y*gpa)1Sm%!SR$^*hIwV~j<)wQzt}8sxPbTo zH-t&nC#MqEpGrc##L$ca0g@O3x+8$u4^(>~oT@DGBq43B6jPRAu97w51MD8mbMbph zAVw?83Ly0X;a&pB1n35g7!V>LQ^DzB7MNm6`CVb2tj~PFk%(kd9pny}4MmPZ7O#Mp z2@=u>5cOAYv2GY<5S1G6Gp=$46q21S?AVB%ia}NbLmeWbd>GNFijXt_7S>>L5-N2% z5{c9WoCzY^fgS4rat^SMpMDxts;g~jf&fmEP^Na}57jL4z`4xAmW{(NjgyEZs}!h7 z5ECBWpoju(*dg)D=hPFxTP^SxTbEz;_FGVjumr#z`ZGjm4G{rGGl zJG0GM&Ht1*jF6~M@WIv}BB3Vle249%QMj2YI^f3dZCebRz zFd(dOek^isB*?K{vt$@m<2tHG1hh=$a0qeOb^$ws!=T!z1RN($DvH$1S0qIuipXYU z+xkqVF7YCfT6GAOME`C8AAx2{hTmf{TIWgtO-RU3q?h`p|QUgV(EgNTjGF5~%{%5JWZy-DQ+(5TsQYTg7WoX8fnVNRDwl`|3*k+xygV`h8gJ50-)eWIEL}p3*T~c$Rb4C zC~<#MHuK~QF<^miElQz6dK%|0I1#K%BHyD%jBab`8iN@5?40RUJT1+H`+1GWt z_R3{*=)tJQOxzudUAa*P6l&otsp4Nxx8nT$;XGrVFt+aLFRtArlkrP{0RS9l1I!68 R*Bk%<002ovPDHLkV1lZjd-wnV literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/color_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1c8a24ff8d143bba0fa552f8a187dfbf5843b3 GIT binary patch literal 854 zcmV-c1F8IpP)F(Cn(Ml@ ztM0lV?z%fW17J`@Hio(=_ovLhM;Myz^so#h=g}2I5e6`)O7>Y0iwt*M{q7I0fgi>#vpmtwy`^Pp0j1Z3# zhy^fhXl7+fzpuJW7Ly?c!wGOC$p#dW)l4}MFNV11V!j(bd1WNnucb1t51=ntfLt+p z_=-y^=cUYw3dm)E-9rF{07XE`3)l$AT;L;i#G| zp-3eV6oS~?1aMl}4_OgXnF7QTK(@lgZ(_4urvq4kwH&;AQUObVAqfdi!49X>1)E$6 zW_KgQ%LpAjL!xjB8FU~K?_z7ndG(VTtkN!ktaS}8n&ZcEiz0YgMwC9=$9pthzJ)J| zY50vhScQ&Lz)B9`#q_R2R$OE>Ly!#U)JTydj@Gm`gOXAYm4}DJ=SEnX#4<|4c|bmn zzz(M01iu?=(BLO-n7F^l%?8CbVBjD*iL$CHbauZ$RedSs$}wyS@tIBXW&zAq41fK( z91kWna~C2)1PD-eKPeiUh23UCFvA!hABU;0p}ID1jy~!6@piQH2tc3(ZBHBgFgJVP zPo&MDm7QT7CRpGlJZ>3Vd!I4&st>!_B{Z}gnyMq(mCJ!U`V$|MnlO~Uwu6t`6a5wE zvT9YMLpY}e;n3D0aakB#939smVRf;Uu9k60NvTgI_HVO%H!{XVLNr*a6YJ6DyFzJN z`kaer?zZw=wTC*^JcLqw6Z??~D`zaSuP@C9znuW`PTa>TJZX=o5Acwdw!iz0F{(TV glVcV!Z07*qoM6N<$f{bi`xBvhE literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/color_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..40cedce31d90f683d2a8b258a5c83abe14756979 GIT binary patch literal 798 zcmV+(1L6FMP)Lf_o9H|xQ!tc;Qa--XdGtMs1ozvzNaYCHNL$f5>bRvm%ZggeL!0+ zOxYSgPcs+(aL|fo`To#ccwkx*as`I;KA;hx=!Ia2xEze|%Jf)Z=k@NKo#Sv0aR3cB zMp%~|3->*ggldk#_5&`G=mvabRqqDM9S}+?3qJ@;o6DJ)QPbZZ!-_iqvja0+Xk2jx zDYL8qQWxOqB!El+A5aSdZUQnDT*1R!qf9A&*_+W}J#zs2A|`FMpUW~6itL9hUIH%@ z#2p}j-^qT;e5mPd&?>-5NagmhH)+uZ96-uMuq3vz3K*&o;paW@`&GE59xzV;IwwJ^ z(ve7{cHl@5Sqf&*IzNLXMQNNk*Pzn3+)_Xgz)2E{6l=e!V$d2`xBzUL$bYXNdL>yU zqdGx!(5_J|NAW#<0}7#v~TM1`<cO&fwI0154q?& zvT(Cp;yaOj%)yGD6;cs#qh!o~T>CJ0YkW{Le4KNjVyng?@pU}CbK~!4Aii8$nm7Zz zAPr%me*XZU_TR)p*H4t*t6pAFdciCUdSnQ(cb{RGYve*RrAFOsRpAetr zh%ktW@LfblN6|LefhyHP(kx&j`3Zru4^~9(y@Xs{#mi2ZhM%5f?^*O-`s;Q!oWU=vw~7&g192}Q4pU5-{LlqP0Dn2 zdyuXRCN~X`5k53Hs5@$7z%)vfXW=W z?t)PSmIY;>d>*3CUThBV@heSE#p5qO6OT{j;N1@X8$+G|Q|PWFx~GgsFQe&64c}CI zO%jgG8OB?E=g#e0g$vrhs4mWi2F&r!C!aS>-yzLY*2R)eqZ%|yiE7`U`Cs1HmvJvn zUb%AYWPksSG25R0M?mAOwm&-2+xMo=n=2^NE3hsC_YAxZ9rvM{wlR`6J{cQ5_R_$q z-*49IAG``NN5J+oq$0ub-iKfJc`G@^b|-WQbU*AdD7Mx}xW4DHu~A~5U*(;^*n=uN zu~fst5omUC#uYtoc63YTpb5SR1RfB9AVvQj66H$_pMIK4UtD8&{X=TuBmQ|ZXX;pQ zJ4Ia4Ik6qu?^;$i>%mT}$X@7)Pzgbz6%+DPT>R>14r=e?<~g>aAy)=YOcfVJ#%O4Vi9m}HZQlt_0Bb>nEo}Kc+HFshPMr`a5V9t@C({em!Tvgt8Q^ptJulxol=X!G$OFm z%J-OW6dRM*W`3;wQLfrq$-X3Hc@hqm1R2?x+AP~QXJ=|wb7N9`&2zsG_)Ktw^VO59 z{Iv4jc=Yg=*>lj)OtS}NS(FMTGS?TZZ0xs^mA@tAi{~NkP*wXiDy6*gKj7eix1W*T zQ3j44#ogaUB`m3%1?Ez>Se&^^J=Hd~u#5VAfwq(IE z8{+R`J-Il4n`RFG;h@|K^7XzUe?zY%ti~83Ye1X;n@$K>5&J!jyxe<24L?~N%B^zP zg_HmV8`_xHG3c+mA_=KghMXI)kVG5cBCC2ekf?;Pr7-_RzcfF(Jebw=S3h9RmHxFsxgo3w!vV8MWAORQi?Fr*;D&D-I2E3ip5 zV0INcCn27qBaui}U|SH`0t}D2dj=tDMUW|7gFw zvB)iiwJ8{sGLcIlli5b${`Eds%m6F?1$L7r9!Jn7dxws7T$QR_N0}21be#3{5>-5X zc^Yk9>R&%sM`;y%_X0XXM%gPF|L4!Auh@AHc_llQ1+5hpu@s z`)oR0TF3BV#{pvkbps_e3Qg$rpF*I$9TiQLMF$8OG0cR%;PUucUte9t%7d_uN4kOm zo4yMuI#J8A{`2n+Scj1>bb@E^aW{LOM$DfA3;^^J{k1onuOk2e002ovPDHLkV1j<@ BXfOZ( literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/color_small.png b/interface/ispconfig/interface/themes/default/icons/x16/color_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0538fd9c020776f871d9e42772f4354bccdf74d3 GIT binary patch literal 477 zcmV<30V4j1P)~SxHtgZ&JS1 zA0Xs|O7?@>J5+VA2b_kNbc`|9ytLzQXYDw?uqR^7z5uRDiLu}&4UVqqc>E2O;c}_& z;Hs{7KP~!lZX|^FuGXi7!X;6?U_b5G7~5`U3B0KGK_06A`?SW zFgfnWxMvQnu7dhA@alAsESNSBaKXB@uvKM#MRA9~p*m!|i!-U%K(TJIbeq)%uJOK# z)KM|rD8Y%mU|$R0ttfFf0-WTEjXZCr26g}g$=uC-+_E!tIlK^3!yavUi6eEt~U zHuwbIf^WXqah#QbKM+k)k|ZsiPHTxo;y{*VwNNPVBaB+D)~Zx0cXeHVfvsn25qKjR z4u|h+n)V1LahlqEJ}3QtpZ>SKzrVkoN~IFza`{@X*CW0O>xB|Q3R)(Uc?e;AI-Qc) zZ03T)U8vDyGEs85-0e^(^Z>H!fq`XNd&y+-j&0k!hG7tD;6tPEF-?tI=P z>|hAXa$ccb!kF&<8G+l9>2wD1#GP}Tu&OdIZuH)97&n-}0J#o(y`OE3zcWp%Nl#oyS_6BH zX0vex+3Uan?HhNyowJjZ=g)NAXz{#E{sw9^t5!eMQS7IXeGO_*DwRkq7OR6-_4?;g zHhWJyIyydxMx!d;g*YA$=gsETxY4LLEX#ZX$*ErthPDcus8I~;;6_Gpm3Q!{6s&Iz z27|{~|KjER#w*@;@B>=gH=wD6JotaS;04fu0j={(fB^uLnk{nwaRhPz0000?WJIO}aK) zlr$eysoU64JV>k366*FKvC!5_4bq6!gHSD=aWk7xf}2NFi!0LTOs? zrW8_zq)qd=o6W{IYc~m2PY(Qd9&hLU=DnFWq+YMX{|pQL#N%k)incvy$_-&Qb`_?jPqUnCn2%$dW|s5ya}MCh^S8NNGG;(Cq60x z{YUop_U@zqJL-@h26r0U}lu9Kw z%T&!Eg@v0fP$rkt=^SRk#$W-|FXHh8y_Zp|)%A6giH9u9o%A|PJT?Smp68uZ398i^ zGMOxx7~6+(xk7(%7&)H8z|mc-d}&2=-EN~rce4f7EA0c7T*S^!no6xuCNl&<)M=3f z_GCu9j}5`!z0oiWSo*z%)rEz(Z%U=|_x;(ut}MJ>4_eGQ z%+Ah&t0mCebFlXGKH~FF_5|qoek2m{`I(uA4>TpDjyJ-lp<8%=1za^5S~S@}gm{dz1_fo=2VM2p+|s0t^6Ku|EnM9^Hxn O0000}lm68%hBnbpT2yh&?g5eNC$z(DcIF}J$ z5$_OZa|F&nHBniX^>{q4MWDHIBqYqc6UBs_f>V*xBdPbQPkF)`Hd_hB#?*ucYW z5K*VoQPS!3eXrO16w|Iw2@JzniAJLjOw$badOaWl2c*Kma5$t{K{dB9Ej29xPYP+8 zwnoX$paiTJDwQg(4H%D^9Tx;16h*m?%QeJnhd|+ZUPC2dnqz3S+CXIFgJFzt2M0Va zOpLbS$7Og{0r`NE2bkQk*McBkxa^YV?w&Eu7BeNlT3fYRqdXk48-hT+@O!f;y5|Vc zi{7L+E=)v%)8pfl&ypm=JluakmOW6dmgye9Jeeus8E&^tB(Uf+4OS~=L;dwFSVYiCzcf}v@rx$x9>6Sg-WIU!OV zK-_+_zdz#0Y3zMaRh1B3S_)r01we7au zm0X#FGRG2MdT=0!;#DZ0@U&v&U(sRRoP3!v3%fngY+X&M?D8lV~@ zBO_2B!^6XHRg${;B{SI`R?Mj6Q>5U~*<==;!RL`G^26 z+F6zr9S(i?X6DUI*}%1&YO@0X-0VdV20)qBWb% z)>QH1&}521lU{<+v2l&t?Kw1^PT6*Lve7Aug0fqxsSZF#;C_ zKTJ%F!~FaU2*x_-My^A^v_XB_9F ztwUJ347t*|+8iO5Q{_r;)C9ISHl*(i!@_ZNM_}1Th(;rEO!L+R@CefC>gN?y4%L6@ zKkN~3uN(>mw=iwFCVkUdg-Re&7jRE3lN(E2z;G6=be;y(cf07?8kwdb)o QUH||907*qoM6N<$g8C9}CjbBd literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..be9b36e3f273533e9b1b79d20f3bae26858a7ec3 GIT binary patch literal 735 zcmV<50wDc~P)7ou;qN$QLF*evvS4ga`lyuj`s7>k~bn8#hMMF$A?hOCHq}`ZQ#m1;m6L&Vmf+-Xz zUo#AY_f0!Ug06hYnRoN%-Sf`5?>?&6>%spFmV8pF6mT2|JkJBeFb;~Mrg7Pe5aaRq z63z#RPlz{&Uqb}uKsA!ZVv&QvpzQbiXRTJNCz(vLH5|EIE}zL{t~VNu=eTw2Zv>Lv zZoehV@C#`R5FULe4-S;7_O1qoq;_OcI)WbX|9#1vwIltYf0L)oMYz z-8O)S8z4mWdR>ggVpj!0xQ}UP`vj`0PD_%ssA-z7*=zzKFhNw9P!xsCBC5H7Y0pL+VG@WmO?yxYXj&Jl)fx~oQU_J- z;0_9CnmH}B0Xv4iK?S4^D7lTvbt7gN?xe~rKXmuHP8nkQ1n9L|DjgjtiayCOq!<2d z<~VCV{(fyAj?XkfDDqv{HhSZvh)9snX7@huyak3~?W68$!kv}dP#HZYX&+&Eq;Fww zXXowq)YSPaHk-pYD3{|b@b%I+s5)yvX#mx36;!3I^fsIi@c0=+0bbv6u~^vJ+}wED zXf*RIYlT77Y&E#N5;kzC9m2w@>{z_9a1j(eOp!`s?}OXzCXgm3d~!5;Q=Xq+nsvEc zokL)E-G(`!m&j{JqpLY#;6zrM=#EKg+h8^j^RvyDgCF1%>rBZo>>-&c1 z$F}A1yOZaBzWnh8UbVxpCTJ!Bu_By;{pZ_VBAss>@R*+WOABPs|lG>`wxHF@UcA#XzIcV6eAG4_Nv^9WG%!&gb)6AVw&0Fc?hH z>-DCfLY8HPbGh7e*uDU5V<|8mk7KD+Ds9_##57IP@AsFWc`h&<4ykQ8nM|s1`f!;7 zyk3t+qxY!i)dEqmX0wI04Wc{U=Qx%qigF9f81QBxu)*`ZOha~@G12uN4VR`yY8coJq+=EZZphX^eqw<^$Uwc0;z+r7qdBFMju z1;KMpz%(rlQ+ruNGYFLRecZ(218+7UtHy`b#zp3*6Yb`}CO74IDUKVI;dHUhA~b$^@RCwBA{Qv(y10{fofkH6w2C$$D zEMB~rfrW)dh>3~G6v&l`jEr;y(l>y3DG)#Y_wOHm1OEQ~E5yOU5n^Fs5hgA!ZdO!O z#CGrAy(hbN?b7-7?OPR4$s@d8`1 zAn1k9pFd0R@bH+vdGnUx)2B}ij~_o_`19vCgP@?GG*DWPpaDQzff~OsynFYN0hC6V znc2Yj_wWCVKxsCDvGC!;hZnbR-#^X8#m@l20u0>T0t~NTzkLIgzE049_wV1IUcY|z zs(bhD?`2`({LI3_{^!Mu=dW+xyaLiZ6J0$cdQ$fH_h)$U;DHb@EWput|Ni|VAbkpm lyMXvMx_ZXZyubhuU;v1{dHl(NT6zEg002ovPDHLkV1j+3yAuEa literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/contrast_small_low.png b/interface/ispconfig/interface/themes/default/icons/x16/contrast_small_low.png new file mode 100644 index 0000000000000000000000000000000000000000..c791b0e8db132d9cd3408008e8f877f800f53a16 GIT binary patch literal 392 zcmV;30eAk1P)gedm zeEs_M8_Sk0Q~&ho(?p<>=XkvUw80`UFfdF=NXY5ct5>{Fo;=|KvW@)x{XKxvz68DS z>(?(?adB~zSFc_(0BvM={P+pOpFh7D1Ox=sfUeUZXuyvjKbYRX|H$y}-A9mj7?_#a z!1&j%e~dtBR)Vqc^XJbOSFT*Y$i>Ca0Kozb+}r{Tj~+dF01Zt11^``fc-^{Hn{M8` zb&QFL;|miL+t0f|aQyh8Q$QE3Mpw^>o|Lt;v=}~q{3r$t3s)dl{_Weh7C`zE5YGWd m?SsF6|Kc}b1m*>R00RICJb+lkYN4qB0000ZK) literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cross.png b/interface/ispconfig/interface/themes/default/icons/x16/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..62c181d4b03e00c588482ae24f7c57479282cd59 GIT binary patch literal 540 zcmV+%0^|LOP)qSTIvr%QSzI<6Z3Z?91=;WSkxr*^dv(>O>N=&HN5mZo1fdHhvRy37?!$v3xUP$* zUJtX$B;3bGMW&uK`N}bYVfZ>qWHFPG&yJ&P8is*4$5CWzW^&WPB(Fuhk!@9`iK- literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cross_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/cross_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..d4507c0712c2f902a8f6ef0b12d42b45cd0aac7c GIT binary patch literal 721 zcmV;?0xtcDP)S)cT*XRVR3G5 z=gIbV%HlXt)pbz2-SM1fA(irkW3gcI;9#de8n;atCm_NKLUwg)E7g@{aUq|FUavPL z8tbd7_$ZS}F*7q+Vy+Ez+;cRYPFzZoc)w7v9UtuPgCt3|s7)WuNs1!Q$KwfoRHxAv zu(RO{hXbun2i_(U@TyXQ!C(N`Txv81R;vYqVL;b*&D#k`gCOvZ*!5Wa(Rq@!fgPWNLx4yI`;e^j+X%(a1u z*RyXJxi8IT$!}T8kM(u9i{qjrY9Ar&N4VJQm1NV*5kstt9urlWf*#{-yvH!v6wfD; zJRk70tUy7RhA}8>TBoFGl{18kcng2wxXn5SbQ(ca2(Q=eG{ELOz(dx#ZTN6%4S??_ zxC>mijzdjU3t4?^z&Hi=+;|`V`sg9{Q8KdTUjYUHZipLZT2%uX00000NkvXXu0mjf D^O!__w;L$@ba9f)9H9u z7MGTnm)9DN#wWhn+1SnQZfvx)z|q$Sm(>cDN)=mt@9r&%RJ2$u9$LRb_(iQ&%c0~~ zR8$y?ii#fC8yXNaF@Z$dHA$^TTy!*4PAB%p$FVUzgDhihwkV2zGTCAi8Rc>=F)^{A zq@>trZK#KOZx7i+LpV4%fWzUCaJ${OIx>Qo?QMK(Y(!yUp)o!_zJRqd$}_X7s;Xvn zbQIxh>qzbGmGZvS)rFm%9SMHtk!~_UX|rSN?HJ0+%4%3E^ZWgA2?-Z6oRgCX4Gl$4 zN{Y1Dy;GUDTXmy;tMlb7njYYz`SV6B|OU=#QV_wFv->+4X_8B?L4P$&=-6eRJtA;hC2 zcxbJpAuZRyC5mz=GBV&LgAkfX9UJ>k%zbckaS2t9| z;i^xGKU3JBva=-v#z1v&Q)D6646xbk3#?^>xz5gx{^S+){1-~$Z5@N{vredC$c+F>vh2?T70Lv%&e`#B3Hm)d>fjFkCFDM4xOEC z19T<&sJVuzM|=XA%ZOm5QW-`4UZmAtHq_NUE7R-ql22VUOizEXHa9m7EiQijxWB*u z#_RR|%5hyT$#scp9?Wb5(q@h*KI5DsGZmjD9*9J7mT T*SlU-00000NkvXXu0mjfmocRf literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/cross_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/cross_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..25ea793a144793ab74c677f52423a342cb20474b GIT binary patch literal 768 zcmV+b1ONPqP)9j!61gUL+ zq-xsQhLB)`wJ0kU5`F-%@E5Rm>(Ui*>B1NnCMIl%gy4oqG^8;EqK5c^wV_0UpN@k25P)O&qvqB#|Ifarn!qI{;xBESA;pj6~Ykh_B0%i5BtMmpDz^hMMg(sH1~|x znmuz(4xDK0=)F5LGn-sm8iybVgNcN{KOFAM=kwqr_C=!uf+RUpo0~64$ht8(8CqXn z-fjuh$+_h5c*drtVoV6k&*S67M9XHSQo%?v>F=JN_Vcj4KpXiJ*?vDfYzr{PC>w`i=w)3mGpF6b@0w+;>=cU! zKk4%^`5Tc3XpONEiP-kvQNa6^$^qG5VNNRpvk~OuZCSo43W7VGNc3N(N$K0j>AH~kd54ih*i4ZV#-R+LDzz1Fbo&jEFf!75)GMo|=;+kgy?1*>s5;~Z4 yj)d+2_vz{iZ|FA46mZiu3mg)D5x4$FfB^tin=^=e@!h}x0000x*)WjJhjkZM$Lhu(XV~-K|5vEuVs=jC7rWkM;HFT=yz7BAvvb0Rg$qB4iKG&&B_Wi3c4FcxE-4*-e@Hmw!>CVtB`yx8u)s0W&k64N^Akf!Yg1v{y~Zbpe;+pfB{&8B^DS* flQQK700bBSWJGl&B*+e|00000NkvXXu0mjfaY7T*5+Gpt82J*QWyHMhHQ|wcz+&-}`73gTq5dC=L-W6Rw;N1Om02XsHbbC&GQ^ zZ2p^1&g9Y=9BOYzn*6{e|54&k_6`U8>%YRLz?}$mRmH&AgLAn=0=wOgK*OT0000e?(CRYrTqwb`Egc*!iharg zXwqOTElBNr_PJh(M8N-?j{OU&55vRoP!lCdia`(r`2BuN>he)|NQVh8Z5>q`rsQ`{ zp!js2{^ir5dcJcAFz!b30fPY&l`Y9KqRJlk96Z7_K7AR2x#J^PYEB?1Le?I^j=XGi zwY?r?SoSVMf>}qiaV;egIg}*Qss>al1UYI2Rn5`4B1=%HDDKU!*5k<+>eX}Y_Z(jP zL<<*mwM7Mz2=Qx|YCVfPdA~&gqenn!4-Yi;5Hz50@O;m`-{(B%oJ%OB_@5#4-w_Hk1T-ls9;$KrbA5s* zo6#nzVl*Sa=!1Bsf-I09HVj_X< zTgjM7Pr$A9R(reK#X<|Ck#VE3z03LC<3W9M(;=33Fs?GL)wo=)jho1AOzQ9UoKIG3 z=zMlM8Vq4yQ4xYH)?H~RXZneA&5ak*PvMWj{ShdU2$TOI;) zb2xd)Q9U*L4xu-*|27yI7)V7q97eiEk$|}5gSEIF)3IR?9{gVhr61ZLZuoe@Gme5M zRTvwefrAZV;DcxO?6sCM`mtewcQa z;o{{N$TaQ;*+vU8_9g@dxLH4icb=++c02TX{knnPphJ;8A6k7BT4NsTLxkJyhRj;g zWZ6t=9OcR4!lXC#FKE6F4kE%fQB~Cxp->2tB*AQ*L9YEceBoid?YoJ<@-Q-TE!oo4 z^w~rLpMoDRDZXvSq9BI4GNmEX>328-YwC;I&?4sEepR)rCnqDb^5htg9)(u9IQ7->OFN2Lr+ zWwF0^o4dQayQgnMw`D;>=kPlp=l7lSJKy=v`55OM|I?(Y+tT4(5_(k)kF_lSUT}zP zN4%h9_`s?D7Xvw~>A)6t%8Rz+Y-w(K(j+iUMU&hcPXY1<5Q^i#)XRz5q=HwG1m@^O zFzS*B<45O*nzwKAt+{mvt5|UV z9=1?rWDvIQX1g`+Ak$B95^gw$9$4qSUfBD3kI{UXaFuZFoWtQLO`=dbvEOxd=1%Lm zGjcv23gf8Rj1bxGD?KNOKXb9qd1?DA6b0_jLX~B74?ejNUt2?UeH~2W8Pqq_A-KMd zPJ7o`HIV>&YWlmttlOQpN+g2qT&``zR@ z6h+^22pM`F0{`amKv&g*Gpi_=aJ@k)DHl2N`+Q~4H0biEj>J11(vJX#&Y_*QSfE6s zNT<{J#m0(qm@V~?kiqh!FUa^~peKYNiij*{FS7)!R0Olq;%dGY44-CZAX5@GlFuO= z4pYcUh_peU52LHiR=ju%YG|w(9UFu6`~%Q&1pAt-R%jHqmd%3eI^^h2$l+CpT)}6r zj1kXk&~F8!VP!EGk`(wQihw9Iv>n3D>IyUp0u=hHDT4uNk-W54BtOqmjwmRRa(RCwB?Q)@_5VHkeS*|fZrQ$HU9_ocH#<=Y1JM2>wT;eb=SiBc-SoL_8GzL%sq-lc5@t~mnSeL35z^R$+dP3RkajV6j!Pm?&j*WT2$6lAE5U}ii;GNPHQxpuutS5`4b>0mA5*| zg4xtJT8kZK4!hISVWzs`g8DG!Pn@Z#Di7PrpOIAo?u+N!912>{ZC0s

    @32ac=+813&5Y2ISNYAz^ln?0ll1_v>2mn*h4 zHy1AeH>F{Nthe>xrl(g*`l_9P>PaE=x-XDLEpcY65$-A#H0AFO7N}GY&Jxng`snYW zAm4_E5fFrxjDDU+XGbqQuBFT_!Hh|R4*3O2R2FUhIKuO7^a*dIzf1%H0`Yi826(F# zUavRg5EC1X^b7^0@PQXO*c_9{&OeXdm#xT7TbS`W*M0KybS{3(hIS!hd}s)E+C)(l zL*O_LE|&{Yv2H|foX5#h4cgmUp-kS7h1nkCu0$R)!O?#D0Vv#o#LV1Wh_r0c?*|D4 zV7Jc0IP;lK7~dZM!!!O_^!CI_YlCUKkk&IAL*Q3U(U{$pEb)kRDX=R`~Q ldouPHPuB=^Yhe2=zyRDNU+c8hfw}+y002ovPDHLkV1m!zbRhr$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/crown__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/crown__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9d467cc0d14e20928b2c300ea8ec954f03f378e4 GIT binary patch literal 758 zcmVueNlz(?5cH5`1rZ41w5ZMOLsW8N zY;(KY-R|!0-M_P?OUwtMbNO-p=l4IHbM86k&oRdEKOzp_6!#cKG^!dNXgd3zyb!oe z@w^gcZO2=lw#Bs;16HwFUZ_6I%}l%=H1iyWeKK&wJIvBz24DT99CI9*<~wyN!)K&7U$lc z!A)hEIPk0gR(+$-MyiF-Kxl2~xNCJf9H?tAtWAS*Hr3G#&!`Ha3QsswN}rih_au7YNHzlKT*rP;|5kPJ>|S z$xOi$g7|ZZA;zGU7ZyVC`4EXj63(XdG!zu(Qi)OAl4me22O-e1_;o)tCB{@EKMn@F z_+ugQ77UZ4qmZbHnx-Y-^?D)8G6X?@-Qq+3`6G$IZq1DYRizd>THX%5f%y16P`MY| z4qB}gS%IeOV6hk^-!Dks1qe*RJGY9D&&I)1gVc(A%=b=uBojYNi)j~KewH`uM(EPX z%P+}6p;ZkV42THSUaDB2Ow33d&qL5-uOalP)M~;KZY3BJ zyQQ}7-?THkGjlt$xtnf*K?gn#=lkw_oO9<~#yQ9T1bf}UYReeEl;iA{$q_CHBEzbD z^OzMDbck)@fHcd&EsX z?34i)p+aVz89`{58Sg$AG(*CMGAp#jVMautl?aiEk9Z z_iqx-=z7r#*@RG-?Z8mrD5cAUi-arwI|B_9!5}USbnT+Lk8s}Be7$YQmS3WLro`&oSDsGYN|Yc-dtK>X)yy>)OllF z9kh5Hx~}I1r?Ubc?{-KmS2S27=TN;dhOiE;(7N$UaJCw2>zkT>eQdMzz%t1N=Y8`rN9B`AZE-yYSY*A>Df{kdJ3YsR=iV6$< zT7S3x-0gdtXpJqT&<7tg^Ua%Y-pqW%D2f9A6O7O2yJ0jM*SpBv1zqh)1^{LO`_0hwP!Y)?FG;CIouUYCKFgJ z7SL!k8Oq0gNEL9q-QsXKgj_Cn8^<-oH-vLA7~DBJ`o1j)x8Q>Rf><#a3?4xchAhjf z$6}{vi^XCAZ0;fi#JzO->(gX13E}XkZ5%&DP{|K=ci+97zeIL^Ac`W1tP~1`SJ(%S z#{=bZ84eCUK1P0RfB(bt#aEaKq*5uUR;!TBW&@|EXW(=?pS0li)iXkXP##Uc-tN`+$>=3F43&jY&cn%C=v zPN$=mDa#6${sZr101U&a0%#yr#B4UB_#-{#s-FpQ6K#7R+w1r6H-GjRj>cE+hVbBe<6of(s{S1ozByB#P7b`{(EOhFH_u<`p z&b{Z5NX=%GL_|?^-S79^;c!UX?N&S)SSPBgYMk@Lw(Y1=sf6WnIkYV6O;MBwQN-vw zT+j3Fm&+xs*K3O7geH>(?kSZ@Isrr=A;)p3-M+p10u>1WifKNd(`+`&3C81h3d4*z zw|8u_E7Kto46wo#UgO-ZDOl+(~~6W)5OteMEJgGv)N?(nusQeEX#Q<^L?MH z)hcP4#`e{X28x(+Fc{<>7|_LC*EJYpxla6n`2>tvKO~r@iMJz~PN#Yh1ZTi5By7i6 z=en+6!iQ7gNtR`zk;p-+BsLNwA002ovPDHLk FV1n$+&shKf literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/database_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..402e0f3b1828f0067c2c81cda3ebb715e442f1a5 GIT binary patch literal 630 zcmV-+0*U>JP)l-IPM+GG$EwZX>XHXv0AMrXijkptyT+~_Lb~3$<`Kjc7EWac?4(A9mR*HEE;O6 z+Y=L2#)qE?W6Wz7dV$^z7*kMCcl+SR$`|O#X}r3*)U?|5<^Jnik9{O? zfJPz|3Y{hnhd2}0b@}0Z&qu*O#J~^d__eGXOCI)ZzIi^ZtuE4j>$d;{03p5|QGAri QYXATM07*qoM6N<$f)`31*8l(j literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/database_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..771a917beca0581792c4f242b0ba058429b8c1d2 GIT binary patch literal 665 zcmV;K0%rY*P)wMwNDu2!oUjYjN~Oc@dc!L2CD z*yr;Zfj~g_`~AAt>#cDdx6X=q{Ecv-P?sjQ!K@=rW6G#NAs$zBZ z=GsBiv;Z}kXt&#FwOY2o&Q1rqK7pcmF&>XWe}%^*Pq)B{BgT;hrY*eBX0!Q3B9XEz z3;llow-u8Zh-5>t{S)XnR9iYs;Cv>NN&OFEGO1o6h%c$WI1@x}xDKvUf-t@@I|B!X z5bzPv#BCV+8<5VDn%%n&+6O5YB}uwW9Of9437KQl zyLZdFx^!}K{LeTYzlKV0$`svJ`XP)h=K{sBP?J0S#w7%fC490Y`5iX0Jw`MO*# z=j^E@fco#PQeH>`FQfi!99hiN~zL|OR|Lr_oEEa=mk|dqT<#L{UK95ePqkgiGZ#EbV zMvmjUcDr42xm+!$)7i4wYz2m4X4N1TKh2X$r6%k3I-1QUWVs7LsL^{5CX*SI1S$fD z!-27}(epo&))t^78P#ePl}be`u)6vct(F3gv!UDVf=-3iYFV2CJvL|?F0fX@i$o$Z z9}EVgyXB1_D2?PS# zrrKgAlkw8(S0$86B@~PANX~nbRYs@&2=eDCoIcKB@4@k#e6@OOsM&nXs>D^J^{)^u zED!0^Lxe&R+@E`b{d=s9%$u#5tlJH?SS*6(8|`*m`4dD%dIbsd2#1egW@ZtA1DEjO z&ed#xzaEPe%cj$5`2BtujmF=2=sGJf$g>EaJc{Y*B)07yhueFI4!FpuUGhAy{YDE7 z2j}s4EG)}v!$LPu>!8Bl#pt;y+@3s(?SmKK-7y4~?Sm+aW@5C3a%(zzY$ErX&E~_z z!L2e;6h&)*BwZc}>0iGr=${qJ?6OX$Q^?hQfjW3VF{N(;3;=MWLLinHj^+RW002ov JPDHLkV1ioFGvNRL literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/database_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..77bc6ab51fbb2154d0a76c7b0b70e548fc8a6ef5 GIT binary patch literal 607 zcmV-l0-*hgP)hzK5n+lIG13{^ zW=NPeZJICd3yNJ>L}ufKoA-FR=iGM=_X)LH4Lm&0yV`EI^-iY)-}m`ZhH^2TPD_fS zgqo&#`Fwto%jG7js(ukg@hLB2_#Jw)*?cq_jW8aM5d7P#-RyjC2Thujpvn0WhIIt zxUTzCN>P$=Bvp2Ts?8w)%s t_y?&}3jT$t8W}i&e*BSR_~`r)U;rN4A&bKQOOyZr002ovPDHLkV1oAh4rKrU literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/database_small.png b/interface/ispconfig/interface/themes/default/icons/x16/database_small.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4c5a9638b33ade1193d5a33224edcadc27b692 GIT binary patch literal 371 zcmV-(0gV2MP)lAW zk|XGXPoF-WD=seHYHx4vjqHV0t7h!{{P{CsFT8vA&U(X!4c_Qph>n(YcXv14MbHaC zjl8(L05qJ3pbNfy`SMy`UcMWeN0=BH85x+Em_YbHGc)rmboGowKQjRY7yzgkos`ch RlBWOw002ovPDHLkV1jDgqgwy~ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/databases.png b/interface/ispconfig/interface/themes/default/icons/x16/databases.png new file mode 100644 index 0000000000000000000000000000000000000000..37bc6229415e16b31bbd1d464919dbb48957b4f6 GIT binary patch literal 595 zcmV-Z0<8UsP)%(X?g6q1tx%r9lc!6j%22InT>l%)a-@fA; z#UP;9>un%B7K;T2g8@374!T{QUG)2Xa428%!&gw?U4KKEX`1`BS`F*<8YCTzDTu{% zsH%p$;RCixJ~??$+s33QiPO`o3o5K2;8yZ*I3%eYu-tSEg+kcbNg$nmMkc@701pqf z*W|$`I%bOa%W#|@4|-si%jNS-CUd|Sxta6%9Fa(5Bl+^uLo%7V7wiLGRw|W)Z63I8 z@74oqWUW@K|M%eN=*^iZiYEJ44}2hvB?5qXo`>afX_rc+^K3SIuLrg*VR!c_T}4Mc z9;bJ~I6&cw*<>=oY&LsQtyUlOU~ljFmsYD~Q`a@`Opk0vd((_2ApX3pF;m?bLAb@8;@-_YD hpK0w|5b#TY0RRD+LCj5p*~_YP)+$|MR}*d7tz9pTqe5el(j+B$G+FTrN%Hk+j_PwJ#f zrPAp2`i>}yvdLunVKf?39LH_)7*jMFg~#KemzH=u{=8nVLzZQfN_%KDy3lHM5Cj3D zC}4T{_5-?+9XBWx3PTgBZnuj{rGi{8hkTw^9_4Zw)ReA`G)my3r~WqKW3kwcP$-1K zU;q*wJgfV#K#TxBUh_c5|tYCh9@c%3QSDs zVYNC4@y$-#rysK@fehBH}R#d#4WdW;o~FUCd;zNV;~iqn43F=jn7py z&U&wWo0mHgir=rdKk z{gi@~+09kkC^@dXE=)SCcop7C4qEkRyd+5mi^Zbld45Qoj!vmONbuP9YYMZocb;%9-=6gEiWw< z(5ik#EqM=fVStw3{7ayFa&mI;Ukqf)ijVWp(B6Fy{!h>GayGC?8~IA5((f@IHnvpc z9nN&PC=)xJ?Y+2t<6=MkY+dXF9)W?5Tw(zYP3Lgs+AGv3Dw5$hNG2j?*1+U+I#DPT z;P?Aa@I3Dfhr`(1T&K_2q7w-ruX$j%hM?9*C6n_fVqU- z=tF4H*JU!No9w50lbV~O`$j$DD3Diu}|niri; zr%RHgv8HK;-|z1$igG9j!XCjwS z*4EwoY$Lx2XfzrYgvDesLA%{XtyV+5&a#eHs|5ySYj)TQ)>+p%gcJ&eTiI+Dv)K$( zItaM{k4J-|s5lum;7rM>)C0P$M-|D)2XE-H0+0WUqoePqdhjWkOuh|=!)t7jnK>Gb;BvVv$@}|b$g=;hU>mTK zPN&z-^1v_}#~#o|`gA%yzXzL}xA%CSKfecbEL=V~02hzPF&qw8g2CW+Bog_<16h_K zz0Se$wF;5F34zdeA)xxXSoNCbJJRp>8Q@wblli9yU!J|hoz)w^OS-xoe7>`Dos`RE zh@wbN^I&@E3btSE*2M9+dEy3iQYw|?Kp@~Igjn5}Y*GBB!0YuQ_UH*7e*Ey5{)-p) zfN!BWfSX^Vk9IXep-{>+O&iX090!)v=^0J-FNSnp*`)vqfera7zyPSnK{Lat>|+1` N002ovPDHLkV1gGt9cTam literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/databases_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/databases_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..dafa7f5e3a735604c223f8929be6f79fdd7dc449 GIT binary patch literal 733 zcmV<30wVp1P)-qMINlY-X(JrVB5Ez`RkU7$g)~EJWOCgB(ar zwz)0Yf%&n`t$nz!-m_Ya60`>%IM4e&@BjTjKi(s;SS-lpa`5?l=;`T!7_>IiS|5!@ z#gfoGB9qA!YPGt^aa_K=y*;bZXo4)uz9wi0m&=9z{(kXO@9}sh)9Ezw`8>9^ejt-6 zL8(+htJQ+zv=|w=eoJg*8U^C#_rIz40Y6o+1cP*T6h`-{#Z^Xlhmpx zP_EtB)YOF5RyDf1PEg2wHNl}F?Ip^h=@{Rs8v%(#3@a-hG&i?VM;v9Lf+FBY_tS}E$78W?^$||nY_=;0G05lR2n3|a zx!sWmqoXICR;%^@7<8-QUzgza^mONCqjBL{wfcx0mI3y@AhEHEVe@%79M2FWgkRL@ z-mwOQ0mWhwUaz-C=?2(>~{OU z3|eFX>+Cw6i5-qjF&WChyWMZ)1Qq*5u_k3p+Ei!7eQWIBTn-5 zp>p@Lud)mj>x1RU+S*#1UawaYLTbbn3I!GXgrlfBtIj_jj P00000NkvXXu0mjfQi5Bx literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/databases_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/databases_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d389d1b050b06aec44fdb76b2db86215ba5c7b67 GIT binary patch literal 684 zcmV;d0#p5oP)cd3J8Tlph4;lQhRE(8Z9}Jhs|cQ z#o=%$f*{ClxBHvRBAren91hb@Pd1x<*zflt%QD*SuNVweSgkhjJP$$O zvAKEmHr>e11DegI4xyo{DmtAG>h(Gr4Vn!|k^~B+YqOXs*q~j1K)6gMb0w8ZLDMu4 z>EO5}*lYq^E*`(e46smgB5{Xo8xTcKh+_FQDYEl`eaYQ!mq?|6iQds@G-7$#0l)t= zG5L}Xj7Ir2;=xPuTZY9yMz8nfKo4^9c>Gl`7+j}|)XedC42#90OWxjA;B>nG2%Z5} zlgZ@zA`fJ_x$gmKl$}neKgYOeY}A9D)hg~E5g|pfMlRbqdIA5-gF?4}3l~Gkck&c& z*bP)+2m}I96a~3l&daiFpw()jS}l`fd?FKRU~jLEyVVrl@fnynBbmEbAN#P< zJ1QS%B9RD2qtPu<6d(P~gB!)`5HA02;@hWhid>~qfyrdz4!Q>?O(*dD@w2*OR@7FPairs((I-}(dlft+E(juG#8kKQ!LLyGLev0R(y+|Ige*Y zmS3UWm%k#&wKG=p$=eS)@4JXfZ2Jc)MEMA?dLDFoT}A7a%M~pbE?ycM8Z!C){wcIy zqa=oQ7*i95-(? zwpptEHVq6wq%tUJt_J<-!xY34aZn;r)D5858En@&uD87$d$EK^@3IkSnpR#{?`YZ~ z7|q!*6y36b_s8m*)9HLh;r+a{W;7Z>jcX8(sL)t{zKL@35^!P85NoMFSPAP}HIUL- zV0d_V3bnc@=$yWif_aH6NzmzpQp(9ozy%>p0c1!KXlc4m1Kz0G?e?q$I!7Cb#AG1! zPEN>jjyl*^6lGhdH67u1khD8XIh0Fih_qM)K>&ln&|tM%yL<2TwzhY4 zIK*P{gql=A-VBA_%)R!F&rG}x1f`j1H0s5iL6)0yKyy)oIL>jLiRbxB{8*(&KNE($ zg}OI#$qOOE$kqNhpi+b!xPSa$)CEz5g530P0R{k7#%9gPt@T;}00003tQ#2%)7#6b7;7Vgyxl~}IKw^xFpN$3*qcJgJVu)Y}@-qZA zey}JAq+mZYQ)Z_1y~@vpD_?Tn_ug~wdG9_HjYi>r8bi9Osw$u;3TT=JgpdIv3vXL7 z_+`6a7*jadI7UEKRft3)YXs|>-Du!luEGN)Sq?`*oS93ZH8d=R!_#A9?*@8a^zvn^wGkUs~brJw+`oEk>``+l}of zh!aIRoL0Pv*SjyAJl0^Gm#xgA3>pC+s6ZqEP0>K%QE$*&8yn9z@I3D(K14<=1FXq$ zq%^-IDZ^`3KnG|#6%qoptGo ze|Gg1M!LEl^}5|9PP5r$A$x)-f?o(iTfYe2c^pYG!S~58@Jjy~j+W){H+@hYO@>d1 zM99m_BQkc{Y_{Xg&CPWtvneGci4YP)aB<84d!1JJ5C8}&YgM;}1L(TdI~XG%#lmqM z=ybYVi^Wn|bE2l$?eREx6Tk7w^I3Xy(ys=Bk~lT*3uTrbOtEBdg}xh42N6ZJt`HC@ z2^fhC!x%LhO*;Nq$?HE8mN~;zUb|#FbILy1ad#9^^i?jNzq3L>>VaDZ^RKVFp|b6A o6d@-l;a2&{+1q$4@>_rb0N5~8Jt>Ug9{>OV07*qoM6N<$f>>R4EdT%j literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/disc_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..3b269126708c26f837f47f7d1771da097f6a840d GIT binary patch literal 882 zcmV-&1C9KNP)CxsEHRbG43niRu|M* zrHG|a7}~;2XZ&9Qm$NVV=FMBa@890f48y?x43U3YT3R3o0!$_o7-QLl3flG&ob&hM zgl}Z*4Ph#sPD9uAKLUS^a#yx95LmmZuEOuHwYa54CbJ2%Gc%EwFJC?ByVch>9*fSoa5#LG?uR%@ z;2(0!k>ix>kMG^x?ux2DaYBVTK?iB@kYEx_5NMXOWnVCOq}}Os)^iRIBjW+ZV<)-OqTSXR;b<&C|JOI6Kp=32qyPDfkSxnkQyNl=ij^x?)o>003j%I~c|GADrT8$i1Zisl zy1KfqQmpM9{69W&9%DoMq5Ql6t5x!F4i^yT1sD@7Fqi|H&euA~qFP>Fo(Uma7IkIp z4oa(9@p149#Mx~b&hIMFVlt6Pj9P8>B9Y!gDwRT8TU&E?cel#VcQxjzr9Rl)(BDb^z=ZT9D&3{cA{-S zJ{5dACqVU#Mz>y2^$iXFEa6jra`dd(Q$k^Bag3lzS^xk507*qo IM6N<$f{k0B=Kufz literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/disc_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..87c8851d87a7d98972627327b0f7364cae866080 GIT binary patch literal 829 zcmV-D1H$}?P)^f!~YB(KZApVz_KiG90v@;lv6a)Z3l%| zv`bK|)5}&Uc2re`TrT$~z`o%$m5UxvM^|^F%hgt9(N%H+2iZ&}ytK5u;D7D+Z^vS9 zsNLtk7!=1*yXDa3yM4F33}GC}9Rg_~1)Np@jaF0JdG<_gNBhZBe9whu5!qO;O_D;{*hW9;kqlfMYpe>EBRpaQJ-py`m`gpbyF@Frb=T7caDS z+v7Ku!^8Z9d^f9||Z1u;dwgMR2nYzHBsrsP6rjt0d99$Wj(G8eIkYU;w@tfMM7&$TLPza=6X`y^%Pb&VmG-qj73C1`OWG z>k2-5RiKNcBuQHut-hM4y&%gnjEs!*Pft%1JRcq&?hh#ou-xzrjEP1NV@+G=vloC6 z^8MZ0`9NR)KsC!Um{h2#t!Wt@9c{r*RU;B)X5(NxZh)Uh=3&_%3ZT#FPzV?_aJ${2 z)oQ&xG4bS%#bUN&&=u5*a!fTud8sStG(240!0<#`P7tJV1Uh{)9FC3*SFa1_JN^m zL!CXny)Mx#9wb=;bG`@i#=?huI61^SntAggW}LD)v7n znwJf#`&%)2k;4Gdn>7EW0N4+@BKUv2V5$q!6v!g?OMn3Ye9KwgIh{Ni00000NkvXX Hu0mjffOLV= literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/disc_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..9430adfcf18be26260ae9d06a3576816990001e6 GIT binary patch literal 888 zcmV-;1Bd*HP)(_7kx*m0PO$P#x zsowBE4B~6ODJ5;s5l5Yq$izJJOGZc&1TSi!6}4GbTS->YmaW@bT3V95UT-JWA7Vxv z+bFH1rA9;f@q>Gv$&<2K_#s0hQGo&$5_paWN56(dgSoNssMBaPmNOd`#ykTWlcj2B zL0RfruQ>`mh(80%Hm`-aY9R&T*$AXy2rO(-t2b9x>?pf(wS9n!dgd8KqtVQbd6vRy zLfPa@B57AD+@A-B>~{Nk26z9!kilSp9ElE7|x82z>m ziZ&Ikt*xCjRwn~Hvnok6FA-@Dns-B{6Foi0N?oD|{?W+X}at`+qe0_}xJB!c?-`f8WUB{O+#ZEdwL z+J{l&8F&WQpyB9QzA7i@{$5o*H}61}J{jxjCP8sxl#A z>RvZQyhTH09`@BahQ~y)t=D9Fz{RWZvZLeX)36luB`gtW=>RDlhHr8lo{t|e_U<

    D7rZQo{z6}4stsX#D!Z=)c*J#ZE%Dr7=_qx0R{lqn{6F@nDO`k O0000t-FGiv>@@pi8^10?D^fuWj1n}Q1{__D$wpgOS9hn$WO6ebMk5gc<>aV4 zS6Y*v@3AQ`fOxZ!R+bNa*6$QVq7uaLCKzqK&R{!Jd$#7;^QTi(^fnQJq9{2>iyh7Y zq0t=iA*DVY(<}1}E|=>G!}Q0g1*6djSyCW{Wt0{lb21wW>^QKf#G2vxo`gpD}92rE8oVL7L7TB%A z%+S!_8@Id0X|beQ*_{}PAS8w%hQfHb*o!aX5(HvKFcw585DrgV4?a?%en=#d)-&k! zdPlmtZua~AelHb3jw$q>H3INCvIt9k7A$qy@F_l2T&T*bK7YCd(YTYa5LvSbf&hcT zP-3-On_4fmR=R6z9i~*%0eMTtow57Ugl|d>i0hk&uM}m@y_lIyWS3xa#{r{~MzNpg zd9zll&7&VHWAA68G}okV?q25AT>EPO*H0Lboahjg9S4kxunqp7f45`b1H@G)cruR1 fTkVYfF98Ms$`fC?@2#@^00000NkvXXu0mjfgO`kq literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disc_small.png b/interface/ispconfig/interface/themes/default/icons/x16/disc_small.png new file mode 100644 index 0000000000000000000000000000000000000000..eef6e5e513026d7ae549c99a24e86442699e5477 GIT binary patch literal 477 zcmV<30V4j1P){ZK+eQiP4It*?=(vG2dzpBOmK zh%?N*w(Jl{9X{s6?6czAe@2?+^(KY#u_ZUcs9UZB_jfB*vkgS@AS Tb8AFV00000NkvXXu0mjfdII5p literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/discs.png b/interface/ispconfig/interface/themes/default/icons/x16/discs.png new file mode 100644 index 0000000000000000000000000000000000000000..dda4049262ecc7e88b5b4ee101ab5eb3bdbb396c GIT binary patch literal 868 zcmV-q1DpJbP)c6-6IZFx1$CK@UQZ1qJn1(1Shn7(_lq4?P4y(H{$Y2>cVhD5Ro=I>a>m zvzgdNF56sgce|T+yX#zWB9$HZa=DlD`~J@P+;a?FU0pzuBU3`uU__#@jMSoScOVkRgIo^)IdbFBE0ix(&?Q4nKwSe z!ETg=(b3TftnQ}%#4aHmieR-wP9l-WqW%SpGO_u9T?PHW0DFbDwzfv6)7jh6(NVXZ zScVPLIOIjDgV=7ALU5v(B{+J!u3Tqirab76gG{NA$#YOtVuhq?(V28Q9F9&pNkD9D z37~cnrq?z~>ojK^UM+l59x3wWPo*C8svwhjk1V7B@eBneq+_ zf-vv*`@?uJe6SaB5=#xb-LCAGmSzbPL|KV~FR%?EZ{ROrG)*hAEbmY2;nMkhJ~|SK z#3m;vcR8LT^9#(pkzrXS9t(b0`ZRav@q@Q(?)7oE+l{Hd_|e097*JM}z_P5!Fw9Au uxT5sx;*5A=v6v2Q>!9p!f3ECr0R{kjpM-`!TlVV!0000t4HB(yf+#2`;sy!|{sCga0XrL)h04A(?04kKmS%L7&mfhc5#noVYUaD$OP%3x_-i_y zj{Y(zm`qJg879lNZCO#_hzuEsp-VEuB$P5d2GTaUg^bn z+0%XwzNZ=J?(Xiv)g3UtxJyV*rf{`HNiLVOQhx(R*_auCyGl%a1KcZkJf0>=k`A@D zwk{dV4MNQJ6v|Q!3EXa)!r%nKYVjTNZ{LR$G%qpn0~AUHGtWWQYzO4kSq2lY&*$^f zc>=P*2tea2=o@}FfLr)LilX>mV2GkISQQ4NZ-7keU`y~oeV!LPeeUM1l#;nm{0rEX zOP6~Jz)Ed)-1nq*JyDk5nYJl=f&~H|g+if|fk0rO z08H0(t@G%yp5W^*W9@Bo`HZ-x0j=8YR}`h1tgNi8Z);z-oJMAjWf9=43deCXJ32ZR z38F3@?;D3(gL+<>y%r6RyqAl3bGdh|t2FY7vzsgHCQWX)+q-w~{(~(ot33!&K+zPK z@L1Gj7P3+Vc4<|xqR|P%NdP7Hd*;<$V%VRM4 zL7oN{8XZqvzaN?y3dcqxy)Qp9=AsJDF2KXH52c){o+9J%IGswRvc0{%-#MNmXO!D{ z7BNibM>g>!@;v>RO`U9FbpFggzE8& zt1A4u_>H{JX0vbcq(0+)5^cC}1fMnHm{SbLb#YcJ{1jjS7)pvYqTc-X00000NkvXX Hu0mjfa+2!KqolXZkhhZ4d zG_6n+HAt?#L=urf^ta;4PRGVBK@7-}OwSkQ zm*~ecyC$M2!ZgkPcq(~F3+s@x5nQ_b^^Hs>^U+sdUb-R6GB!06`;!L`xpj{lC`88z zkC%waMDg~6;OxAFji!K^nVFj;-8=4+ObP9gLDJFz%d&jzlYp^)p$BBD`g#LoR*a2} zWs1e(`SJ1b!)w+Zl>M^^8iRE*Zj&Y86vgMwo}WDTCa?4R>gz4&tO<`SAv&O#=%^wDUp(bwKUtT05tk5LJ@R?jD+aF!s=M`)u4yQ1Da0s#J07OoJw9A8F z(2r{6D%9i|P*w%%PpAL5^6BmC#GpX`AFwYzpT4;R%*Wm*-?bkeNrWBpXcw=&F?;Xs z@0UxZQq4`^Gwt3$xtfMaIJ%$;g~G@Ae135o*v2C?A6`Q^lCWN!`UX9{33ha-5^mI2 zcwN`~nZCZh11C;Cf0W~izsQ4h)g?*Voy+BhmADgMYFvQd(d=Nr&zwDX0dK#a<~n9g zi-sC^zQ2WEnMfoOBHI;DrILGTn!?_AJV|ID9|)`Q&X3Djb3Q@e?x#>U?oubSIdIY< zIMKr^d}Zt9Q`EOEgTnOmXV)8zTG=(w3?0j>EBI@vf|kC5fYxJDC{sMWj_h+E!ozAL zWviPLrTC398K=ALoDO8$(Gw3i`IWvA3y&i ZzyO(_Yf}$Cr78db002ovPDHLkV1iE%&}#qy literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/discs_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/discs_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..70af40e2b92969f87e07e17d1b48b86cee61b461 GIT binary patch literal 878 zcmV-!1CjiRP)R=S0j|>0(p@E!Nk}b)LIE^Q>nMskjN1Z~ z8WlnPkY#yRlB6K1XIffXc8mYAEILirap%!yr?srON|~j~mOu)8Ui5k%KYIK$5C}ZS z8lR%1q=eiAcoU#ApffqF%g)lCx^nXTC1WC|R**$rU`1NVvb@=BF0QGmwav`T{ESAU z-aiH@lXyH%OzO^_K6a+UDA!P-Ofb~hz-TsshSz|clpups>3KCzPrIkT(CIxB6O~E@ zq9_(xOKg>)yv{ThAGv zR>M}5gVE8^3GA+$d@&`2wjUzMHGBZ*Y*=u5V~K(SQ;|u|L54o=Kszt<8vMjOlaJ z?{bO6!0mGNy{M=t-=CM4X9-2Z5ZvAbc};*kAsb9@+I`O=57(~`3~-bzC(;dY20Wyb zOgwndVzD^7&UGEDt+O9smCCHGwczI4*V7;S9t@89{9j+LuC9J)2iP*D8D#v9LfX=B z9H(Ph_7F~-DfR2(jQC@*7y-6|`w;3ont&t&Xf^K|dqZFl`nSV&Y4d^zrT?)!VbAD$lus0s@U7nMvVAyouH0FL7vhGE6%btMvm z6hitYNz#xgioD!UTCLW_=D*ZxPL;9MvZ>ahE7F%LGL#w-MBn>~Nw@8x?UB#t>q0#q z!e}(gCjmMMkTW1>`Dad(q2AT9<3N)(k+nV|32cNCa0NxN`T6ay z8>CF)@wjYKxwm2So^@KO91EmFPNe~~`MIECRUjorNTZdREW_dsr{g2ObY|H^sZ@d> z2&;5PLrGwH5Ln9!=zMUmyP~4v?48@4-7L#OBp^VMVQq=rx72_`szN;Kkx8w4@Ml)9 zgMo!G4R*V|4^4Miexj5R@Q2W}cxEDzNGJaWj8xOvfKu_Z^MJB~$z-ZDQWh?`^d0I#cD`Y0M7K^1;k;Ea| z{RR}oQy`C@hmCWfB6K?4e}Pe?0)Z7^Y;qikumrI$arpGy&znojH36F~9sd`wTQ@uU zQouCo9F*HH3fSvN=V;f5oo7yQTP|PjaERgwTm~VCD>FUQg&-h~GAO6hdCq3D4X1!f zq9i`Ndu-@s&%vpaEtF2L*WY~3^Y_~T#z`53Ac(v&O`RQyM4_&(u8d(Atfr>MkOIcd zKy2HFnY8-GBL$Z(v<(#H;rE|-lLH8Tj6@NzCSk;xVZe1F-+z9c19_=(zE8e%|N7aSQ^XAbkGrg{hBUAGq||M@&yoD?*`Aw7&fB^v85tA!SA3eAL0000^X literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/discs_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/discs_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..df145aa41fe41334a430a6cbaa1d8f6ea847f047 GIT binary patch literal 917 zcmV;G18V$Q5eU+x$Ml=%(#x1 z6>T+Rjdg=AsH_;2hM`;gV9xv0~$?(ELw?96l~*pRRe{22~>=YPKc?|g#+T7JL(w+zF8%pwQ^a2)3`3|on| zMMw-%66u>|Sp%kN%62{3)YSC5c%HR{=dw41YJ(x~vZa-dY-g?srZhGx3gNc!14)t| zp_&L$US4kB1n4F}&VZcl!+dVGYxChvyY_q1dDW_=vnr+I4vJz+OG}pq0@c30zP|6N zR7(6~kTIE^owZF??`T=SZI#CgV2Lbnul9kbv=}&+1IsXB0qx9T85Zy9?HR}C_H3It zolekoy~JDYt4I_mz=jIp+WlLdH8nM-u3x>@$+9e{2_2UCR#ez^a}9W;I>ciOG6@QA zr}CcnFc44C(9zM+g}OUne^E+E%p_5_cuqQ<&LZanM!M*HK&j;EAAqt#eSLk6AP9#V z8yl-8(<2aZJ%_yHN*TpXkq8{mXK|rJO*{8d3RNag{{)59VIj*v@nR1cdZEoE7z%}g z4g&|Ra~Pm<2wr~pJcuGh39r}tUtkpJKwxzk5#IxmvcM&?Ku(lJ&Yiz?JE^Gc_`iT% zxpcWJ11#6&M!9Fqqv~0s3Tshn-))yh-+#O>ilT(uAat`RCld36jyT$&dV70Mhr{8) z3^2>I%#+7YbhV8=oZQg3k&PE7UD0TiP!y$vv_a^)DLWUq@>NxX=H})qhGDRVh6Y~- zSnJRmQ`|jOX42+V+=v&VaZ}*}e;q_)01E^H!M%I;AFQieS5HwSkPZ?s^elQp15Fr) z!O9!3^YN2}KUBf}J?l^JJ`o7F+bxfciP^QaYrP!D@rs&)m^2A9QRxq`i~V;#k3>eN zBSYg~SwC0QbMuw(X=r=`3`-zlv6v&7OlsZT-EoFxi2MRK>!fH}{i(^%hF|v`Ydv#! z=7oG-xhI{3HIA+1a=Iwd|6>BRSp_)OZg=ZJ;%J)YDT-Q-CayU1>!KO?qG{Sk^imUO rpMX8o5lCB=Kw<*YE?7jvF98Ms4$7B-H6Ks*00000NkvXXu0mjfgu1Gj literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk.png b/interface/ispconfig/interface/themes/default/icons/x16/disk.png new file mode 100644 index 0000000000000000000000000000000000000000..a039b9930eb7fc878809df3b58ec65a1ba04f439 GIT binary patch literal 507 zcmVJNRCwB?Q!z`!KoowtTqGTeZWf0i ztvb8ZMIpb!!NEZ~b#ZXg$%$TgODB;o+fF!2f$s~%8wJPhnbbB`8f3R zV^9>mH`rL*&uIq;0nb7y1zr$<9|S!GOd)`=#1o-_&M5*SDvD;a*;Bx>EMP40MAU)l zc^)X=hejU(BnONoo~Z=_^tFIbWOmR`K#&8*5-$`89q{IRMZwUh-BW-uTA=M9dW6!+ z<3PQS#bS{oz}FE9g#!F`u?)lLtXjYQ+a{CS($ANOWtcyrI z8Fe7pfs_(zwFcyK*P1w!O?E8vHy*Zahc)n90zP;;iJ4T8$klQ%_04_?F;54{xeR8Jlh?4j5qdawr-OcfNh2SuSERHKMsgGvo* zghC1F6P3`kN!Yx%>+U8EFR>OK7?|Ci|J&Kw@%52W06r))?#8f|Jzv~=-RJY|6he%3 z+@DF#?dt@spAATlOaHniffWy&IJ9+h@?S`!QmV(=S_h3j3BY!#FrwlsmDZB?!EpA zSbd4eqg$yn5}@z&b17uftJP`~pmWj2)ScSPO64-RX(F~Gjt3VfzgOBrV=EO9$8o@1 z7nK&k(7`Q@_{eYy%UyBIk3T_d#{Piy!6fCv)c{wDRRyg8ubCTz_%!(thoc5EnU7hu zM|r&h1z65Atc!&H3b=H77ntq9epPP-pfia-a0vQQTojR15M<3Jp-iLv z$;l>lY<};1^KSRtanu1@bS@wFa_;%g-#u45V{`-1KoWSc8UK=2?}>J~wMY!yI@*1w zpcPo1KxjN?@j_ZOuPATjheoZ}wRat|!_CBn) zs*%n=fzE73Ts5@8Gyzr;n`+ZlGG>sHqoo|AW;jfbXBqKt_pxz90$x1^pP54HcUbK{Gl|+A zMum*kp&CIMPzhswlO^3x=r$&hlc%yJ&7gz_x~^kxc4E=07Fp(ErG#iS3L#cM;16tmaf0 zB@Sq2B+pcn_)6SEOpM*^4);8Z&&(}wE|f7rhyseb)egAGSj45y1SBf!(cD~%-5o=$ z_w`yID&(9#Q1U-8^Z7mcFO!1`^)~V)@P9(h%l;K$05v#1XFeo@4*&oF07*qoM6N<$ Ef)FxBa{vGU literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/disk__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..244ee5f13925acdba38f0d94528df1f1ffe2db50 GIT binary patch literal 576 zcmV-G0>Axk7RCwB?Q_o8qK@|RWcTzV8v7QV) zETYwuLW)=@S^|Q%UVHFZa*%*X>B*k@ADCJMp%-avDd@E~Ptx|5kW&v*wYHK*#ikyt zrjwl+-<$kkC26sA;O+d__kHi%@69^K82rx=Y4MyUCqs{c;O(u?*8zQ-`94I`-n4qW zBI@tyXIz@RCWa7K?W6I1YYS6i)UJj(woeRN#eS2&ojR9SH7a zv#qt?)rGxW1xuON8@*<8PH3Ynfg&&~=tK}5ZY&1QC7kyIQxLkLfDeC_C2sWjey^qJ^fnWum=V4-gu&om@ z`tFY}b`b;tN~IDwmvADgK(GQK1kTQ?*joH#fp;?lEy?`OcER@>9;iBjLTHP)u4|Ld z&m|IxgiYqPy{E>zLcn*1a53AJ_vQ@_&CYW6>C4TNa^+M?W0N_IsYmlHN+8WeH)GkE zfa2yL#>e}SOmB(R51mX*g^wnq`%{#+3wZa833`~AJMoWyGMiVu6kq^D;ObNKT($84 O0000##=nynDI$U=e`*oESeq0n;6Ei zMqlhGV?$iPqBTj^br_Zf)3R12|M(g~>dhs1_jX|DL;}UUD={spPbCI1B#RSujzX#Q z7qXe>NX9P0)zyK~CogfhvmF~sP4hE0A1V%H!!V$mrXbYD()S5`es={2_POxraTL3I z&S80c58pH?3+om$!6BQRywX7~o5ZKLVL^T{5UVrbhEKsMWiET%6F@ z$NE-ucW*;y-d<1x9t)D O0000yjJc!k!QV?&p2Q3y4Jt-b49<(4>tb*8sf>JFNauS3JO4Z(sNf8CH zUep+CV@aXbIN6=?&7=t_S&Ke+?EHD(Z@zguMz1vjz<>(p!4|9+7v$+%^y#2X_8vcf z^7hz8u+_bO%4W(B>j5?v?Ssb-A8nktn`oeEn(`)-dP}yRz1KImwa13^5uTbEMDj-( z+cq>}$y-8GxFI?@d~Jw|+X*04jmbHOD+D|tY5=dkzD9UoM2~ZB4)xs;)FTpomU!Ah z0DYz@NXRLR#bOO$m%Rh&saZXC_Ztui51$ske8*;yEIY7V*9G@H6np@e_gvE7?ukQK zq$`9AHjWGrJe)o7e1Hk*X@Ey!<-iY6j_q}Acz6E|T7S2Jbk@$PE-9)FhwvSg3$1$C{SoM8T@;t8tFi?T6>l6fGXAr#>= zO%IF~02LU9LECLcv)NQ_u2#XJWPF1x%W8Vi0+i6 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disk_small.png b/interface/ispconfig/interface/themes/default/icons/x16/disk_small.png new file mode 100644 index 0000000000000000000000000000000000000000..911f8c70f2df51c49db8346985254f28d5bd12e9 GIT binary patch literal 380 zcmV-?0fYXDP)bK;j^IykYQ{;V&ylp{}==X z1%Uo$VgRvW1_0$b@Ot6*|DW~08GcR-5BKZ_3#^BTJN-?u0EYzw(_?f47>9mdpx6L_ a00RK6ZKoAsf~DsG0000| zP*t$)bqRR~=#DTZKorGbSxX4RsI+MZ_=U=RAK>o${yB~XXqtv|D?qjcm~;V5zRK9< w6xANvzQ{#5&f;aBu-^Cx_|Jb~FyJY`05*+@`FM5jQvd(}07*qoM6N<$f*O;G=Kufz literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks.png b/interface/ispconfig/interface/themes/default/icons/x16/disks.png new file mode 100644 index 0000000000000000000000000000000000000000..fc33338810a782f18ba35885df601edca3ee1a8f GIT binary patch literal 622 zcmV-!0+IcRP) z*l0+SsGvj}A;^VeoBo1=T-ZWgSh&%Zn_P$s-NXcK3RhYL3Au`_Fltk7Mi(xGltx9z zKqJRtp6|{3aXsgbGd$-ecrSCLp_ z@|&G)KncHGM8TG^xxvxa2T|ahOPdu%fekkYQ++ef)KW4&UWXFp8M18~Y|jI;P>_Q1 zRHweOfZl!u8pf{*Cm12ub>RdfXIWBEp6Wa(P!!Rj;b}ei++);moUs8kO$y3Wo%)D@ z0EQueg*$YpeQ4a=(lYSt)3y-ae|G@U+6c7VZY&=b4u{bz3ZM-c*!>D%H92@S@dl36 zKjNPvkw}1t0_tUf#cxHSd!!8*n$~q49LGTiuEv7EECf_JsF~{dyam~;i3l`^L?T57 z;At!ftSYWa0wrLsnJZTjnz#k<}>S1JDw z_V*Zppc7K5l=SL?z+$|9-Syn$7kHTrv{;NlkOP8qXZVJ&ON0J@zDNtpR97M7^r(+A z-~8Egho}UCKB$o(eVAB*!^7-G_7%@Ci#p}qx zzVp|HxOz}vg?~&RD}UcxpYyTFrJ)}pyHG4v06V}%5;zrL00&7^pA&a0lmGw#07*qo IM6N<$f(N7+RR910 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/disks__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..29baaa33ae6ad3849034394dea5cd12bfba26927 GIT binary patch literal 731 zcmV<10wn#3P)bX#fTuNO)!#3{d4fO$Imu)mBTbm+hLC55ZBYVc%u$0IFf?x~E zQ=R&Vfd!0(1x(r^!h6Ki@>NJ+?Af#>oP0Qsa<2=)_L{-%z8$Vo4xb2> z^@*Ii6i`3#1cDq8oLy%EmR%aOe|K#P*|s|D>8!(88lDEd!=tg<&`;n%*N)c5x3dxY z1?$HN4ncZ-=@WLIZm?`qu4Lp321X~4oJ%dt^ZCh^eW6hG)_U|`eH!B&j;K>Y89u+5 zl|72v=WVT!vJ)EIo6BGr4ycm`Lb8m5em|zJ47{3dRyMfycUFyFe-P6(Ey^zF=h)?; zAlKd&!1l!xOo;}9=qaJ7H*2EUnX7_4Iwvco}c@Uub)K%K@OtPsOi@ctlIi%bnlj6wPyH8B!Zil zT|%Izl!Cz}Xyw-LoCZA5$2AdIl+V3W~e2r7JWa zp1jXJ;RysaNbG~8(^-rU#gIy+jlIp0V9?gURn5S{r*PolHB^fk#zJ*TRwc;Z>Jnrq zn0~fob2QlNoO^2J>|6o%oeG1*Ls)+Zf5#f^HLFY@k4qO%0O~tfggkS|TfQx4Y#e)h zub1l#wjwm}Lb&^?lEJxNZ@<&CVxv7T7IX5p^pb^ri_JREBlb&x0RX>TSLJeJ&3^y@ N002ovPDHLkV1f?RO$aF@+_@*Zuh( z`sC!r4J1*i7fG=D?49FhdiKTO`+jJ%BuSWZi@0>?*40QYnH*{(iTaG%whi0!V3y0F z;5^s4uP&f&T!!|c6~YNc)OB6_r6^ifC^*k`KPXTYQPF;GB`UrrbHhU31{5U}oaZ|C zF#`dNLIBe?sYndOH_s?}e0=^z2+uy4LoA`AduwO?Fiq3QD+!Q|FtEK1z*>t)pTCPg zk)LACkxHfDkwD~sfhGH5*m-(AWHPO)Djdfl2d*LqfmsBoad0!&OC<~Q^ClrspzC^- z0X#(x0&7YtA%Pk&*QvlXD?)(p?~${zZ#Bydg6({I_mNv4W)SRv;cP#(M%d-S>xmoF!t$?~ zH#m5>KThd*@PONyjKfzD7w1NX^zzC(Y#UrBY}bI5SM}mT=4qh`g2g5MXwWS|VM*ZuyRkA4r(PuF7pp8x{@rp-yZ35+1*00000NkvXXu0mjf Dyv{N@ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/disks__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..3d18e9f3103fa71dcc5a08b3b8c78c7b79460501 GIT binary patch literal 713 zcmV;)0yh1LP)VHkeS*_LO;(urn^ z6&PA5{agg)5*l^UMcou66p|NFkP<;b=uJ`C7Xo57;go+lM z$=F77+L>;iv$M0)`<>++9t7WyhwnS@&-1?Db3X2j=?*kng~owvrfut%XPf+3!KO}y zt7!|E{}&KNHXkIys^9V1Y0vNd_=Ki))1hIT8Vms~eHkR5MFRgk`{DF@X75 zoaHeMbioL^VAfgzr6=t>CM{w7eDhl;j`YW1D_x7Kz0Q0ytJO-g5&?~26zs$@!HVbb zu;VHI@=^Vp!R>ZKB?5l6f>rFY;lQPBFw@W#$q;N0&Y=?Do#sNpBob)334);CH<^?m ziYX}k0^-~ZYL2^5^Y#92ezk&Slq}@L7-rQdn)^F&V`Lg$)CJ8<2t`rwYaq1JqtgY8 zMg{|u6GPm!uGY%>%}1uJV)+cU95XW^SO=faXLxmsg4G`q;5s^CZER_E^xXA$%eM2k zhCZnylp@gt84H_$iQ~FZsgKKyeGlIYVttt(qWTey7n>ZtJ)RF~S?lD0w~I~aFQ^uF zu+V*(NUu6ZF+DBn=OQ77V&_X7Jhl(r*L!30^IB&%yHu<<3Tj^ly4$36dk)v`Po+xi zc6$jFg{SM#lU_57hL$Jj>uSP}_jSQO{|jHPOkE-v)m{e^TzpU(N|xMwciyXepXY*f vohzTmy>T(HGZOlveIu8hFk3jmKLG{+=J{-dpRUVG00000NkvXXu0mjf`~pJJ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/disks__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8fe8de1052207b3a3c4ab9d687b620b13154a6 GIT binary patch literal 718 zcmV;<0x|uGP)Q5eVnvpdu7>_y!T z9W4o})h@^eUFkw12tm+WMLiUeK2-ElPeQar_~46C(L=Yl2w@9*38Kqt^pFOPAc+ra zt(CQFXy{&@ab|Wp-{>xjgU~sA9M1QB=YRg^#|(Ggc^f91m4gF!ku94x^sSq~D&yzr zWD{Ew{PF=NQ7jjkV5sX!=hdbYewe0dJIrw$CiEd$@4FiS6 zMO#pw>eN>jaBp*=AyQ{KVd2zu9Sbb7ied}OQ{Ai-SQ2rg;d(uaromG~CaD5~U<=Aq zo%)D@1&oCSOx*59@Km7XyO2cu^$$xp6`g@U=s{?2WBD>s6q#2hz--uo9bW;gI*W%l zpJLuIZS5&qTU%i;0muIWlfr%+zS0bynRdI~&@_!X&;`B{n8E<99Mnwpd|p91U0?_V zcs!mZ1~3G^64)9^unCla=~@xJnfr(znnXwm;o3q3i>Bh`2?W{s`s~+gADsnkI5zwx zb~IMkdA399d-Ocl({*Qb4yoTffuI{?S+;$3C16ACAMmMrpb;K(Ds7~td|*ED_CeH- zxGwSpf*cT>{g*ddc4^Rl=-#CD=5cild(Q0)uykNnpGDiTwlMV!_776x-+tvyzNR~N;iIMe zVu?YU(Q%-}g8`eth?+}I$93?W%mP^N!ao590Hva5K(fr0s{jB107*qoM6N<$f=Reb AQ2+n{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/disks_black.png b/interface/ispconfig/interface/themes/default/icons/x16/disks_black.png new file mode 100644 index 0000000000000000000000000000000000000000..31a1b00bb65b7710bfbc7587f6211560cea74c79 GIT binary patch literal 524 zcmV+n0`vWeP)r@S!IAI4K#We};K0NHF)5Um*7q)4bF?Ml zl7AZRJ%0D@my;w(f{<0g9F=>$0qj^6T|dLmClDYcZ?#&@bzIk7J5C_9Pj%{(Ik8wS ziw8tZ(*$$924l4fg!ZXUeI6j0N{Nt&ZQHQG{4JM(&_30-06vI94d3H2fT{*U`x}6w zaABAMhn(heNjZ^#*M6UY-@9GVGz~JDjCWWp7V`kd)oL|&S14Sd8&@WdM0!Vd-=l+U-X?Qh{hR3YKLNKvhIxOBCc^)XeG&6XtUR6{rx8$GHPl z-dC7yJ75?N1JM1~I2m5)fF@9Aoaa_+*P~;97>$O%x_;h6*riY!D|~|Ca0pzYC{PeK z!M-Mbn?lQy04hyDavF^XemC~JRJvg!Z-hAroA?hQ2P(6HjU=g9yn^X;9x9AawFN-p zQ>WAUn$2bll0*;2vgA-<7%gy33_Y(C%q@=nA{KqZJ}}pqAF=0OfB^skYb}zpRtS^; O0000O%0mbnur5r?21iRf%ZSXjb^`YCS)tW*|2yrjORbr7Y9F0cs z((m8WU6`L*#E7PoU@{Cr3ISrXfprjo@B6S?tA(QwL84?{ zsIf9Y<{)jsjK2`N1T_W#2c`k41;zlfmpOpg1P~$@0I7olh>d5ah6}?1*;8{+6U~R% zn8I|h2S^-{>==YvI1V5O_*6v@Qtkof!y%lz?!JQp2RCwBalh11tK@`WoJDd6=HHguQ zR*INni`5pQXhA#_rJ)xO1}ZK12Y8ZFdhj3!p1f&6A(wixm|l94AXo%1B53ho4h4&C z&`P723fXj%-JKoZTeCkfArIaR%*^||@4T6(-CtS)o2F^kX*!P1_C`v%?l=yVQr<$$ zbzOh6_wM9m&XN)~t=Tk7I^-WLl}dPBEZ*i^dgF%bY2%m;W^5CRBa zrUjxiz_Qu`5Gd#X(P=Ll6SE=;Se{o0ucEDxg-;H?{;^TnKQc-m>Z#LcKro=`K@I$3 z@^$=|VPD%eF?#VZcJ$QP&c2abKlL+h6wp)gVb0A;9%EW%gMs*X z=x#2THysBSy|XAgv`K8NR;zfqzJ80JMe$9D7^jKgFvqgsm?q4f9rSxWbh};Xy6)u% z3k!MLcY$;#1VHA(;gUF-(NhV9My5HOz?!Dv>FO#@r_=ezOG~%u%cETYo#@*kG4n9^ z2a?TZy>jC5I6l_vecyow)M)5YpFP zLyb)$5>_Zr;F$VpRvu{J@i$=TAPA8#fZkj|GIbbNuRTX1k-^F2=QB4>J(MZ-a4-hx z{eBCX`si9eQ79C!-QGkxnLcPcIB(GaS+i1sX&5|44txmEsudB5tN5|ChLsn0&@#Rt zkx5R_KyoxdiG3&*Q7@O#ZnxR+XYe7NU+<|=-|0?lAk130cxe$)Sw||-SCvTYEJ4n3 zQFNnJ$}}5|P~ea9>aTr$g8hjt>|+hYlpd9H&&x5Ti^=Kaal^z-eo&g<#OTb-98=X) xaQ@flHZLDJusuC~rc`-MWUyDCidS1)`hB3JSe+>=FdtQwTgL1)@|SfsndtyE{8Q&$i=k zt4R;c&d$v9|IL5iq?3FeC?rWrVYLjCvMezeK2E2zI%8m9pMf>Q zB#~IJ*Wtcg-lw^+JPVObG*Jk~3_-7My9p>9AZ6fC;qV69N_0UQS;`wK!#Ai(y`4J_j28g+n2<%c|FGVoa}iX=!? zt4Fh%wug7Ls5WagSO|xIJMcl?OC{KeMqL}5n-Tm*F0ZaYeZ0Me^<)y}Lm^qrKtEo{ zbUY3h!U4UDO67IB*K4ZifcoaJEUhFGhujkg;LNf(ULKAQi{m5X1JmSR*rr_4kQN~@ sLyeC{qaBFHkKrF-XnBM{n0R9#Otj}G~Pyhe`07*qoM6N<$g7W_GlmGw# literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/document__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..746f4cd39758c3e9763100998dc44d728993e474 GIT binary patch literal 684 zcmV;d0#p5oP)Gs$Aa2XAMXec#Xf&RfgrKR}BLiooTchR3r+E#Uj=+nY+9fWlo4BP7}#thNi(#Rj7)BgGK|gETdkp zTkDgFi8$2_lkThlxVW$t4vv=S>2^9hra7Fz)oK+l5(%95`QkHkbNA>?><@rCw(XEu zvM}g^gu`L$I$p0A?@OhFwgb)Xzy|miL~qTDG*;07IdW+o2kk4^<8KIWLK?@N*;yRQ zN-Au+{e_y!i{TzKO&8r@u6tkai0NsI;N% zIIubSRe6g-dKwo8FJO5kh5pDRRLoO(e<+04em|s*#YL3zdDLn(sb!-LX;kyr{_qq- zg9AvctRr;g0Zs<4TD4rmwLCnONBc%b?lW7Ml&QpH#^fwpdN$0qvujMzb=EXZ#%sBT zYk4Cd{}VmIU_|Qa>9tQ?-rStJb=|Y|seUZ^tY5U{100RJ4O+N4C S`f(iq0000Ri literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/document__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc52b734e11255d529a599fd8d932dfb0f22775 GIT binary patch literal 607 zcmV-l0-*hgP)T6J zd44{@g@8kS4%LDt`4e-w95xRQp6RuyeD_7Rrujv~gyTSP4qmO|`tlN$N(JR|+0?HW z77{e?G3g%q0H%drSQ>59_f{xWH?83WE|p67u(5%`uCB!D`uYnRd2<7x6>D}#Y#R)k zAn|zIY$qHJBV8z5*Bm%O2LV7Ui0kExG*%r@cTn3xFd89x5z+(zlrSG)wqV;p{bZUT zAr0WXB>*)CZ6F~U3u+h-IMDV?9!y4?AxmFgB6D$wVqfKH_tm|(uHX#-&w-Y;f@F%H zF*-hq_rH>{!rfy?x@^r3=%^YY&vzEFSIkgD;ar?U{S}Z*>{2t$PO@1;D`}&i! z>Ir2%t@}Et^!86rFRDNgKnW=oT^>abOVJ}!!|x_kG&`u+O5}&uXf319ZQVG{=P$w| tBg^gHa&;g-CwHzM;Ez1?0Pa5l1^{%S7(Pn&XP*E7002ovPDHLkV1j=71z-RG literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_horizontal.png b/interface/ispconfig/interface/themes/default/icons/x16/document_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..8568a9e686cbfa5a6f7512cbba56bfbc8d6df2f9 GIT binary patch literal 435 zcmV;k0ZjghP);xs-)&ifq{;YhI-OTl1ze1ylGs<|OXr}Zb)L7SW?2T$ ztJN({k?c(n1#1d)9B8dKCRc36fYBPhwp&n2K~WUmKg?!xin%1{xiAzY5J3pB_rEL* z0yqvsIFb@1?IW$_c@9s@C0vX~k1uI@C3nUkYvBZ2FUh~LG)d`qVA d(C7RuzyOMu&tU5^tr7qL002ovPDHLkV1oHtwf6u3 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_horizontal_text.png b/interface/ispconfig/interface/themes/default/icons/x16/document_horizontal_text.png new file mode 100644 index 0000000000000000000000000000000000000000..1d77d0c434e464a64b831581e4bc53a89676f6d5 GIT binary patch literal 535 zcmV+y0_gpTP)uGSK#v6?NUCUmjJW_e>@&j zxm+gA^!G|7B4*cYHl>|hE=O;Jfw6y#Q9!QMYI0C47R3Ste#GrLJ3GQe1TFF&1i3K) zFZ%tyB!B^u0OGo?u)rExC=|rb=W}W_8Zm$|MuS1MS{2k4gB1wYPC89aCLk(H&`g#G39l6S_*RQnW9Q@}WM4tBv`n#+S{>6s*0jsCB{m#Dv Z3;+%h8*A#re5U{a002ovPDHLkV1h!|?(6^n literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_music.png b/interface/ispconfig/interface/themes/default/icons/x16/document_music.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d5cb9b6cbaff6b33b0ee501f813f4acba54705 GIT binary patch literal 628 zcmV-)0*n2LP)BV<_kHudZ?occwF(X)#6v12TpXW_F^w<`5y!DTP*D`Q=FG~{ zQbiksfX)J{hKAf=v)RPQdi^QiMY-cZlG$7`nF#_It)WLF91n*W3!{21XD|T`kpry&E!Pf?RN2gdmD3wLS=1p^96NQPYLM8R1SfqrNKWW<#O4s zlh5bzZGZnb#RSw$l6({?iBt0O`xJU62PGvNZ9zQia55kTNv11glVknY6~xj{NqE-b zR6vF~4=jj=Fn%*=waBB1Hs0weJf4r?F@e@%yaExpOcfA`Q_yIHc>AD$jn4v;z7L;z zS&Y&d1uW0{V5v`)lxA|!(FixM=g1QSk9^S?1!oBo1-wB0FvgEVpm;Sz{g1?}yV~}6 zh4Tqm0lg|7d{*5->DD#0n=RabG>eGNqgdEAvjp;BcNhBPgfmsZ^@jHwUuqxlWL}-| zgp+3(!&vooYYVp*7jd~*l!*-MLG}3^@K+GI?;-Jo$$Pz?9CSMPS*zLEOY~#0t^6vmnCqS7FRw1 O0000D#hY$L2x|?9(ocF9!kMKpz1*oFBQQGFexg_$T_h$voHKq`!6;JPjXs`AMliaDMqXqwwiJYQYK#K1uL$>QQY%AXekj1ppj zoxQf$l~Z?i@4=jr!>zo9iP4fE;Y6j&lo+?*bp=ou&VUmIQSW?&0laEuap!CkQplib z8qzfiM~(@MT0305x$4WiEyM1o;7(yv3KURTWZb^O}j7ayaaeu{8Epm9m79ZVB0Nw sYwJBt>s%m9-pAX){~7;8)*k@|0LOG@6S{?1rvLx|07*qoM6N<$g05LEDF6Tf literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_shred.png b/interface/ispconfig/interface/themes/default/icons/x16/document_shred.png new file mode 100644 index 0000000000000000000000000000000000000000..d59f80ebfd477e2eb40a94ac39780e9515c485e2 GIT binary patch literal 634 zcmV-=0)_pFP)3MH#NJ{9Hj*orMd7t~0Tf1T-3r#KhX_DydNvB@K^X zFE1B7-=`tZ1sqY_Xcz|Vo}RwMIvm<0RR%GMQ5aId0MB*lPrpx&}S!vJ{(B%jZV zeP=Qm`q5|%rX2Va4g`e7#H-G70toj@(|}tCQsRK_fe-+`{|{g|ygdVcC{kRX0Rf!* zrvNelNuYA&IJy!$!FG}}aa~tWjR7|y07HI>L)=2!Gz|!?>uVk2E87;iYgtB0QAA&& zxdTAsv8Gj#o2GfGjDeQ`mTNUJ|6c&M@a^cR4kyRe>N$ibnsyH1_fn~j`dxtMQ5=K5 z>sr6tZ4ZL42L}f7{^6kkC(TaB8*m+ciADf+H#VrD>(uM@^iRd&7tS(P`ehh66smEC z6U=|!+e2MPKXl?60XZuc)9Hl;{q4oYwwg{al`569Rp9HN|U74SM*e{n);;V{Ae*I$j^Y0(Sg9i^7c3ilS z0Sqffp!98mUI5y{$OzQ<4`{%TZ{HZceEGuA8WS_)=g*(cKtoiCF@TAMk&%I&g@u8O zjg8^myLSvrw{2rEl9HN!~gKn;L96=*0(j-UbGzI$b>({i0000 zwaMRrWsOCHoQa#wCY@Yd(AvyQ;rR4)k57(%2)N@&4ufy*@1^W$G)lc*k5)1nNs`Ou zDY-y502kOi5cyEW0ptY18+VK)lM@P* zTy$Mz1!S5;!zYB%&exYDc(2t++@7D)>gFa*$Kxh8H}d%(58ynnk>$aV1jtsaWp?Uy zdc3@pXHz^$yuH3!+FiKbl-(@O2*KtFA;{v4T3~<`{0VU+>XphzIG^9Ae+<9d{Qw64 c=eGa@0P}xG-IiDqfdBvi07*qoM6N<$g4v4+L;wH) literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_text_image.png b/interface/ispconfig/interface/themes/default/icons/x16/document_text_image.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd9e9849c4af85bbda703572b4878798d9e6bac GIT binary patch literal 646 zcmV;10(t$3P)Q4s$2M@$hzl0s9B z6by+XtvQ7Bs-P(J;<3fT)^)2(Cv0%S(fBCD=Q_c zdq%kXioj&xXlYEX(;hL5v1leI;%2jnPvtTerl(8qH#T0;mv>hLbYmcgz+ZQFMRp>Q zK)>I|!(2{C3Wb84$6_&jKRK}j1#VaY5#$KKt#ENNnZ#5iGNFVQVYD&9Sb?-qsZ`|l zMx!AlMJmCpBVFeQev^`ol zz|S8y;6^&InhqXkG*qiqM59rOd$Y6G5D>-MTMPX5{E>N_l>+vFkrM>x)L$~44itRZ z+mn7!6#xJL literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/document_zipper.png b/interface/ispconfig/interface/themes/default/icons/x16/document_zipper.png new file mode 100644 index 0000000000000000000000000000000000000000..64c85052347be53ecef2cda5da30df177b76998b GIT binary patch literal 643 zcmV-}0(||6P)rNc+hUQ;oHFhyhc7>+O$ z0PO%(;B_X$d(~=nBv=!lMLCueaX|Js2mEnze9Yukyhwg@{Mg@zR=p10Zdd4A#|~;WcCcA0f&O>2IAMuHT&i*GXD{aFKB`DzaLTrA zRV)^jE2YAhOx=5)8u-23{=MC$(R?CIF->@7Sh|L(5y=koFt dzy5v@U;q_qDpVFk5I6t;002ovPDHLkV1mgW8$JL4 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents.png b/interface/ispconfig/interface/themes/default/icons/x16/documents.png new file mode 100644 index 0000000000000000000000000000000000000000..f6cc0418f2635d72ef3a8077395733f7380fc7dd GIT binary patch literal 600 zcmV-e0;m0nP)4 z^j7Fa=rz!T9&(o+h2RJ9D7}c6g7^VS4?;db3pq*;9(wR5QlvfPR;$L9nwB6bkzF?X zC!79$vl+9dB?E6}nVI)_pLw%uy=^wdvMe2GnhFP=*D+P(|KoU=Bo}d#$Y?YYmEW-e zNw9&jw7apW}-kJtd%jw70mgkc;@8buNXf%v{Jp6AJa zz23ln4X0l)#TcwZr!v+T$8lC$*VmGu`qJW}JS`UWpy`VpJr6RNF>RVPYV80-^HW!NI4^?d=n@oqFEA*X=%6zpt)jzEaV( zc?Et>(-14`{@4E5*@vkQE3m&E9xhPFyvDpIgSw0Ydce8Y@B2(ZbaL^BiSxJT=l2WM m>W<79RL1m-N%{4^0t^7)VH=1|!ORZ;0000_YP)9OHlD9YtrbtexCm)g|oy)JS!JzEnKmhwa9y_RBujBdRA`-!1 z=3zE_gQo7wCItOkzmkrv>rfkDcB8R$=vM6AKNHw8MqoB*+T&X zTngL}2J@+`RR1D*HjJ0=Dror5jM9ySOj3GRs8@oWatCrR_Zx*x4GqPEKec6ar(4cv_I?YPoJk&i^<-&IUSD0sfl$cK z%_Z=2azi4GP2^q_u~J^IY%6*#acTT?I1$CO^y|E(HXeze7ZwgyD;3$f##}GEOpRl| zGjj@W=92JN=hKpDS<0~}a_Q`+R!hB0kMSudj`(A-Nzvy!gaKwYo7=6x<%`1M*a=GX iz~lAK?~@Gt6JP+Dz(1na(HA-Z0000lCdRO^I6A0XH{)Q^*pM_vF=5b26GLRc7)c;Njhv*G zgFuh=^{#h*@4-QB2rv2a?(V(!`+o0x_mr7j4vM14a9tOo(eoH}-8j8{Y&g!U?Kto} z4_fmGBZxx-)Ox1J$FucD1DwJpuz(kfMa(ZPO^F;7D{{?$YyvP2j@Z&Dgan9vX};yBbJh;QO6D;|f=zoBpNKKR}jP=3^EHH88isT^;?H$aQY z!S+1j@m>T28baX&s^+It3507iMQq4E+1h3}Hmw*({)~BLrh-0q@^ELYXgP z-!TqGdY04NEL~(oixOMv}LfSsM;&aD>m3=!J(2iAM>>6jMI!Om zdpmh$^=^Ncl{&nsp3|<|yL1rz`1Ud^{u5vTmElBqy*RP900000NkvXXu0mjf;|)lZ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/documents_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..84a27e22e2c87ea65e971ae13e2f6692fdcd261b GIT binary patch literal 629 zcmV-*0*d{KP)%gxPhl%^EIV}Kd%I1YUn44!fh_;W zI$f+c5q*cZXaz0EsVVtnS=OV$=_w`1zPhqP*GnZCG#-!X{oWqkuU5Nn`~7G5^u`tl zS|s^wG@_f;s)RgfG$@3+a=A>O9Vd__u-rwGAJ^;j^ZcAVe7jaCP|3Dsufi}i;AF?x zG*J%e@S=UyS1p-sI2=;D*_<>ReTo2(J&2K!0ZcVb^b|@oBro~f@$obP$AuceG9&;G z4xl-R{=HnHPGDgSf?xuO6u`(Sn1`@rZnjRq$+QBK74VBJK|!qC$dDrDLMgD+sr7x| zxVOJgHl(N{q)L$3StVb$w#Y;9r%Gj7)|11-7nLBWPkW&6gEcMu3iA8lfLa?Hvo~UG z?bf^9-G}y{lM`C1)nslifv?j%q`1CLuX?>-h0DuPo`DX1;c@wHyZt;<~K#%AzLvE|@{{$ESLcA`**I?-9 P00000NkvXXu0mjfi(Dik literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/documents_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..e598c3b6aa4c285ab00107f42cbf22f3f27b0b1f GIT binary patch literal 724 zcmV;_0xSKAP)Va1_VCO|lj3L>)cY zd5{T$8@S=WX%8yvVW6(`;9)W^JIQuc7yUi2QAahp&i{A zvrXd=HLVr9gf>l@_l}OVn(}+^ec$K30L9n9=_rJ$%^M;#I@= ztQ!U_%Yx7x;Yh@w09nVCp`l2nT7^cglQ0vPBni{WqfG)F&%;)yf~u~= ztW;1bm7uCB6h*;};o%6y1C+gwl{f@J!tvGd!SnoyWHt+fx_7jJc-3{ z!0V0Ni$*WeQCKi3X*1-n`8;-ey|#$IuMZm0c|0Dxlccge0>j-5`DAxDzQ{6EI@{9H z0=FR8yV5kxMGiryq8d4&leY?g_v#=s6GaiBK%lm4+EaxDj>h98KpmL?Q{_0?DUmoL z&B)8?bfbYWH;2)1_@XJxDUM+<9QHc+x`>n5jLb%4v7a=~r&J2Z#>RSbz;%I88Y4Ia zSVzK;*|L?~TO>agF*q`Upx^)coMqh9=+gU5R@@n{u4Iy>Lb z^ZYbdE|)>hN^2uDjp01i+#BfM9^>$#Uc8u^LGW}B)=X2LTwO(jz_|~6gjUuD_bB@t$p6 zT?1TO+ke5|v$MC(pYbd#s=E@R-1=c{Y3U^$XPR^V2rvMOg0!a7mcO>-9Qb8^%rULGe}A?9(OzRns8Vslaz#1daoz-A1d` zf@N8FxUf*9^#Wy|;*ywPj&QOOJ~U06H8wZlQTMUYQ5@BEnbd4Hv9z*+$xNpBq*S^? zpB{^Vk_I7fnI?{BGE(GHJ`bDdlF1~>^?FBcfpG^RU(V(5eP;(P`gSCdfG&je%C>EV z0>Y)DE;*r742l1~#>hNswHmG#3SG0wCx-;22QGDF0ajI2@{~wok$&Va>+8J+oM*=Z zj3EW+!3j7Z68~P_V%$KZxzp)%1)NAg=_5EO!pLm)ZDSFYKL)1LQ$!%o0#qho9Jz%^ zMC+SbWQgARuY58MoI5{_%I{UQ+ihj-*hdILiH=aT1u46q*-FeM-bl!?GO^cL9Hw=kNj*jM0||7BZna4I1=Q+vnx+=^8Lj} z=!9X@Zvsx}BE%Ugxxt00t!i~|B%i;J0VA-iJ-}XTY*#%9h1?_Ntd4&I3;>)wH>09j RAe#UH002ovPDHLkV1nxvJkkIF literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/documents_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/documents_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..54eac65389d35627ddf757766f4d8e6188ea8fd3 GIT binary patch literal 592 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 LNkvXXu0mjf$?*mP literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/door_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/door_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..dd520baf66f05b09f1e2620d94e5ac072354b3e7 GIT binary patch literal 681 zcmV;a0#^NrP)Lk=RIyy?ZFAQTY_5=9Ss@E{1HC^^_e=*5#Dg&YJ0 z(PA57Vr;Vc*-g5;u%^W zF+H0~$g+%JFo-}P0KRt|2bN`_)oQ_YT`a$N(#NLIU2nD9ZDg}qkH9p|e{3?Dgg>4y z*`W&ox9in)eMigv{&)_>@iFptL!pqDz-T7FH4MY^`{O6qB_eS83HaQ+(sl?vM11nI z1lOPuY+@7;fxK!*SmudWC=_7Zw&&+@M>ZtvHG~EZ@D~n!PN}bQ{&x*y^Y>9S%w7it zJ$Bp%UeorpY}0QKRD~1pK$og>y9*4N>*t|L9e+cKXt{9s%z=f4nG$eIvA1a;)Mnid z_6_Sed~m`Ov8@zQR!1V~?8@!wsi~z)jJ@k4;0a;`aTa#>pb2xJg!IeQcsw4zS+T4) z7lB;g2%-bOh@Mab29(iXNY1A4@Xlf_KAC?{u{rN0t~G!$ZHEyknOjwFfDKh}Ztg0c zKX`<;?UiBDY8f8-u_h{~u*}3yJv?(x&kprDloM_}wP(<--;hX}duv{}EsS&|r2`-s>B_ P00000NkvXXu0mjfuGlgm literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/door_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/door_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f852976a9a0e43b9bb46d34e5d5084f9e7ebb7a3 GIT binary patch literal 607 zcmV-l0-*hgP) zEwmztn49Dz9$E=h5YdY$=)r?x{S!QT^df?IFbDqtJ@nLzLM(Wc23qix)`K2Ov?bDX zo6TEEY#v zire|5LRyG4ZlO@%0;M_Gw%u-XTppP~Xx|V3@up5k)$GI0XMn^)G>O!;zgWe~Yc`um zl7!>Qu^mX@uS)$pouSSa4>*@_6#%?v$u%fMpzN$^>AP3Je7UWGwl& z#yhxm@6iN$s*FfwOB^wQy+o2Xb3d`=hj3#T`*I(M7Ml;)KB@T#fl{f2d_E7?bq6#q^?H0zPn-?3WD5vV7teyrSn@gq;A@@!(Lv+I t%i2HhI9L?(zZ-g-12nkqW7PR0zyPz~ULYXz1*iZ3002ovPDHLkV1j$?6VU(w literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drawer.png b/interface/ispconfig/interface/themes/default/icons/x16/drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..0b76e56ad0d440c663ce1befde14af916936bff2 GIT binary patch literal 650 zcmV;50(Jd~P) zMOY}WJUTCzPnWVcmK?{WZWQRc4#O~@X)1ocU*aw3Fn$0FE zTfeZJdx}!2g!=3IIC1ol5Hp6c-k%+W55>(*7%G`ZqkaG2IwDYzN}8y#2SgkenshKl z!28tvJS@wSDX{yTpb{b9*~Bm9vf#Wu1ft7FpCmM>(vMmLXKp?h3AI;uas2RsUH1vY z*gXWpQ3tCV8!)LNgWlb{CR0gR25OxSY?_it{c8s!g3}8NNF)*>VR{OV+AoJ zFfx%r^?DuEdJAW7k79CPSq z;dER3-p<)s@B8MO=0zTOc^{tld4A95;cg!SI1bQo@Br{)bKj_1g|Au#_*I36D7*(w z47fMr{c8MCEs&49b&v^DeV&W%a#<$XaM0;=5JeG!z@tjS$g&LjCd*~0B$7@i!0)^J zp7?e174;7)7!0CNC_tmpz-TnWVzEH4*E0as=W;oAS1J`43pt_pD*Ju=a5|IJ}*9O^C%q9`>Y!-89#mT`V z7=Nh3);Zsp7wj8L*ds|Wo6W2Q+W9f-S$tNT*#gBvAxym4f!={$JdXd`nz2cqb%5H^ zBoYb45^3~Y_93(^;qZP5-!p(&0c2wPdIjjY&~JQl|D~7fYXX{em^ymQ<^B?jv6N{E zN?9c^1=HJy@I!F070(v(Xgc1HR+ogCkvsXEtz(Gy$I*J)2DU6+EiLS}TCHekXke>+ zraFs!ej1rf23Ja_kZYGPJ2HwbpZrUqnZR>0ZMgRe7`6jD|MwSu+kM`dwmFTCNMOk@ hKQZ}M#?9XX3;@JCZQ!M-B2xeW002ovPDHLkV1n|2RKWlM literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drawer_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/drawer_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..58f0b34ad52bd1a9311e8fd1c3e824a64f99ced9 GIT binary patch literal 756 zcmV9?>B@zxZZr!)+GSA$712^e68y$m z(oi&QLz~Z}^NH_0n>Lg#I&hiGeea%o&b{}MiL(G9fIyH0FpT|u51l%u>UBWe3M6S@ zxNqQc*M73!%sg!rnj(+RaOdM-@pwg&+vfGz~tV4~n9202VKo%lvQKHdIwbBX1jkUCgen(OwY9 z>+A3o3Q!~oA_X)o3l++uO3ic}Bq;C>fV~62tTPtl6_^Z*CbF2z<>J0!7?@vJ;IT%Y zXf-i#D0;0{L$O%I!tx5bho2yu&0_V%J;YlMaA0Wd zD|D;`C;Cl9j`ZQ`^=FtI??o~D3A6>ovG=mc~B6`UWzATAI zg#UG2M<5VDCHNU_CsnAzG9Wo9uiQat{ m2-;pRQV?PMUd8M`0R{kXPg(A@NgTZZ0000f**Vdgb#D>`j6-4T?xN=vu3ylyY4W=nVnn&}P znatC3Z!=A8UDOMgxpVG0-}%0C&J~_t0R#bv2*?4*<9O?tA3zTRKpYx!WXNB-ek*&N z=uaQsgo$)v=`ug8FXZlLZQCI>0%Tc+q9~9g5do!f90%;qacuaMNtPw7>MuW2+`Q=d zdr-w<5vFM(5{V!diy@gzLRD1`!0i2gpMO2igQjT+Hg2C*<{JHC%u0v-W)BLKGNCMS6YCc~vbW{XCn{A^hkzE&#S7RHJ00R}#y4+aCY z+ig^SH!z=ng>t!!=KCi&d-@~?W4JL0Re}J zMhp%BuzhZ73h{WHcY#%(1&9R5&a8-EHaEGSdjx>%@?epK7G^i>q}^+#CZRmf1{(e^aRx z(&_a6C>w@>Znujb)q!%s>9XSIM5i~S?O0K4RN0F!&d QKL7v#07*qoM6N<$g4%#46#xJL literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drawer_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/drawer_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..fc99eb0a9cdfa00552f26cb812a45babb93a7995 GIT binary patch literal 767 zcmVckzDNW~MYso} zZB3`?oZGJL@7cY#b533-_~M1bIsDG=`}zI5M|j)~2m)Xe&<7xh&3yxgi4oHT#8pEd zH3YkkoeFG5J@Mv+6=+0wbdVpu9Pc|HD3=M%Mt~$qkYyPThX|8~A%uY45mJUhBT142 zV}KsyCj0eTg{)}F>j9)Xonp+aV}+wJ^ZEEe%K7UMQc zCsx*FU{HFgR6-_`LF`Wo9l>XaL?T!oy@lrOTR52cFkhx?ofoPZSQp{BImjYy9v$t+ zJEviT0Ix?ulJ$UsnU6HD;qXskr=a1GSXl>PYj0B%R8{3uVBKc|kpkJ7HStq)9#JCW z;-wokqoGi!3gC6=DAE$rG}25mjn2zMyoBWI5O&nnLaifM)?K*%asp@D>KD6B^Y$9R zT+Lu=b`}ba$bj!}_VTH?RT+6H1)(O3{=p!ECjtpmnZ->LW?2fMmT=)G_SgAe+Vi7O~+c9|dJxZ_(Ifx>002ovPDHLkV1g`lS9bsa literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drawer_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/drawer_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a73df52e7d00cd690828d3b16d87477a03eb1491 GIT binary patch literal 727 zcmV;|0x127P)B#6>|wq%Lg{(S_8{!X}`Q2HOT9 z$xMZbM8I&zQ;W{4saa6b4UV6VSC>_%SOhw0b$LNB#zYR z*$av7pg+8sb`oW{`^T6uKc2jn=yY^a4F^#a;qiFjb_=jc8eP{x&vd;5i)0c-H)b+V zJ`>!KU|N5vve_(JtrmEmhtKCjFc^d+NsNH{o6RQMP1A(e>xF|`C!m3OMIpW5;HlT) zFP9;?-4F<&W*AUO6)m!K%fbL5?h=??0=nXTeJlf&VGtnoxm+%0Ynq0yg#zneFyt@M;I}Up|Qs13Y>#%u?UYqnny-EclRQAa0mq@ zlxPnKv6HAKZ{`~7SRwEGkw5JGCxCVp95WO2q80;bD^MkFXC(^5&n@Qr6o zLh02c_Vw;Sda#MyfesFLWF+2iBCyvgSXf?$L^4vsx3?$QR04hvN{t3`qKY#UmoPj1 z9D@Y+an!q2!qNVI1Ofpj!I{Fty+thWHF#||YGw^&mYBNSbEpz=J^qKlxiqpYV@0lG z*d=0q>{LAQePxA}OeGi{i;x-Y|J^W$ zrJ%)RMXtutOy^K-YO1o6&j>Rm>^av1c3B3ZQMQLdA%w%>^{aeZRk5n9;(90t*_0u* zZJd16$i1jxlD@|1FBLzYroa976>2AhSp8?shYD1Rq1ZnH3;=TmbkYIj#?}A;002ov JPDHLkV1lhrM2r9c literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drill.png b/interface/ispconfig/interface/themes/default/icons/x16/drill.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e1d4afcf5a3aa10bcd4f5f057768d69015a5e6 GIT binary patch literal 729 zcmV;~0w(>5P)7+r{ki4sL!1QkeE5m8qW1Q8+arn(qWY!O~cbRl@5>4MTSwM;5& zW83kZIkvNNcJ}pt^NcXf9(Z`)bKdWHzwdp&_Y>ON+u?LN5eNie;yAI_c*eHj-;jty znGC!lIaRu@caS}jkM{TXcL*)h>q{8}G*#2T%r5-k%MpAsh=w)~ zlF1O#DVa9UqM!&UAu=O_L;?_MYHAP;hY^p*^ZIV$<@eWN+10zZNmu7cnC1$y2H7n1 zB-0|3_>ow|K*2gyJ|*s_ocD%qj|b28DX&X*t1lCu%h=nIEhuSVBeoU{&yHhYd3mLY z>%uVL(=_|3&5ngNq%Iwtn4BeQP`}I|crqwD>IczqYl_!`C0i0qi7F#9$aO00p z8{(W#z{EF9)lFM}w!W*YbU3DYf*tua8wLDf|K=h-F0+= z4YWPPE8Ka|$*7bN4qlp}A(pIz4pdWlJv5YbzQ3@KUclqNoIBw;f2=7tExNwaj65wC zytqFVqy&4`oZ!s@P=70zcj0Qv)1+x>sA>wMqhs@iVOZSm#;rgl{QfD%7YSw`cwIJ= zyh)-U2&c*N7b%(?W{g?L9yY({i8lo^NgjTceuQ zyu@TUW!ULrnBCZqE_8z^lQ7CZ{fH9mU-+Z^6OmvM<)A=eMc}NAC?xyQjfynTqU9>> zrYW2A%+2lWob8<6W3G^lK6rS(_k7>;p7(veSK)HGU^E)x^?EVAb`YvlH>5oLdxZ#{ z$t2ur+AJ0XVLS2G^l4pP-F8K}Z+5990X)YGpZb?2e+)q#4u`AUZueP}$$-K_JN*9l z2!(XnSZeIQ{%RuHF% zMF=s854^$m=nyU`XX)}fVKwD!>OAwRr{-YzVV0A-75z9*di~UjtWxQzt{jj2uW%_6 zfqO=Ryqzatu$NEmQz>|O9xI4l6b@>13%E5-Eleh3HpR7c)<_&xYY(@>^sEI=5-XKT z7t56~!7M>8fx%1~}_4;{pLZR{elMnE2RX#9PfpJ~UUwyRNu46L8 zoDK)W!2}1b7CN0yt|0%-2ypc|pq}}}k{hDP5I0fi(ObMIxGf* zPfk#f*8KJ$PLA*#$5d@z$Pm|3k^}Ph=1K|6m*QJ67>vrXUT@UO3HBA!b33R4>eo$= z!=%V9UvDoSTSQduC}6zT9ybgqiW+k8e(d5N2|Pc7b;tT?h(p;O1}vd5K0rh1QB-)o z3~yU&wfG}sY4T4yRx0$vy>{H*dJzx=8ejeoR4TMzc-un>Rwyh-@4KlAMixaTCsDkK zVRA|e@TBp|_{K#MGrpFRCwBSQe8|GR}}v4&baKN`@ex8 zpdzwaplX2rpag*wLzHTW5>#SP)24lEA9!j^lO}y=Q_`d{jdhbYA%-;SVu&$5SZgEE zh!rtWRuB+~EeOau&MeFR%N6zn#iCpe9spe55cnGYwHul-58X@V(pZ zgwN;4=;&ieQW%isH+ZRJ95MMN5{e8p9yf~_8F_1BXcT2x4pvrH+UMuzYgR6|w4A7h z*NcJ9ODL-?K`b_lWL&1l(=eF<3xVq?M56#JDk{R<+#Dj2$O^xe@WsQgAZ%@WuR=?V z5iw~n$m(R%&|+MjAH-C28mCRG)BLoRp<*lhjoc4N^T(^-^$&b}Ou25^p6H1_aq#=M zHo#KGZ`rEQJKB%a3ky`l<^~DTMHR;muw|7a#)m<^i7s`9cj@}l?hj^LR$@mMx4PY~ zOi6nAnW|#QI1mpuNUM`LPG}@taaN;K`;(!`#|eljk#u66XRXz4cdR9Wf|J)U^nL+g zGP?2_7RJOn|IS~k4Qs^fO8ym|RKm#wtX9};woHl(24{g^`zV9da*ALKyWQ(QEVfwe z*^cbm;_&nzyG1W9cid&T_cubN!AvBhO z^VhR6D>-oI&R-L{t_yyD`9>fI!C;6lwUNX>$y#qOw3?`_YtmSJ@g<@!dX@^5n-@#= z^<8)#2p~jZFXvns91QI-c!UXpPgEj2e*4DwILS@Yl(IDc_KoQ*%*TC7_3KqzovZxh bD**-o?CV|!MK9*L00000NkvXXu0mjf84|6< literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drill_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/drill_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..eb43f2be67476090d9e390fe7f1c2a389a1d7463 GIT binary patch literal 758 zcmVVHkcscXT;DYg(?5eVbf$PE`NW2QVFmXs}nno&> zIoX(JW94V#n6VZEcqt;q@Z&WDxs~`;f^* zA&UYXzKXm8U>m{EHKfx3tE#HP^71lLsnnXjop9~rP1yDZ4*FH;3khXYL0PA~3N>RW zu?hT0FX9pFC-!T*9kMKE)l-B|gyAl9=sJ3yk24`Oj#NDCZJk*vW{0oLzoTvO&1DSn ze6ERTvBc{`c!iMt1VUtD#{B}mL^@Pr6nZ>vMEz)??w#PM%xb`%l$8M<4~ z8)&UYCYf55igy$hI-T2#$e{AZFsAA&$$(z&?+gSs89eRl%Vtk*IiHNnQkl;Sp64C3 zuAGPhCOG;$~! zbUn>LS3mo{7>}pT?@p(?&@{MEmzybWqi|A;lqil~ouMI4I0juP zr@am`2(gU@^lK2Dt}NDdyd%N3{!3W^F4aX`iMd}~@-n$~KyW-TWd7oW^TcsPb0bz*0> z0irkyw~MEbFTgJl2qu`%3qb(5#Kc5cEEYJO&SiZGan5`d{wbw7sb*bw&EQb^amSnBRH;Mw6v~Esw(yl7?c^ZpfBszB z#C2vg8o__FHb>7|n*%M2q1r&rRw;ce3(@O!YP)^zv@GMJvhb&a(jpG8nwBsa3~)|w zNe?%pquhe*mcvYRI2R5z z+9GU=3u28luDBP$Aj`AZe|Ca~*sksjLlni2k*1kzsRDHI+$ymkuaoV literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/drill_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/drill_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9568b80676b8d2f0e44ebf6255b7e8b8c8aded8d GIT binary patch literal 818 zcmV-21I_%2P)s(W;0q^S`e{gglgp_+l;l%O=t^+ zVB=}9QI_R$;v>=7`uh5Eu6Ss5DPw>nO7gdnt)ZDI@PZ&z*=)AE7K;g4S=ksJ9fsTO z0z967bfI7Xe$PBa!2>A}h~?wrQrG!$l=pZ%_M)O9qtodujV`XNyjX&yBsdydQLsM; ze*Y|j0S|2+MocWAB`_rfpAXQ zekM8lG3lE^L(D3td_mYlF(0(u>2_SI5#DO^#n-;CiLAGC6SM`a(@>0#(QY&>EG!ps z*-phT^PmiTk)SAOk|Z<{t9C!ukSy*^W;%<-tarQT>u7FJo#4l={Q~0YP#i~4t4y#j z(#MZ*7&xBA2=EKuu$ZtuUS~8W##4Zd>+KlaodLwGdQ}yAG;h;^|C`@;!4(vt)4^ac z=*iFMp9P+NpbS>XY_z+T*g>e%YJs#=ptgxa&rb~G4(X>$`f^iDrXe-JmZ)esgCONC zGi&Xk3s#kv{D?g{!%&!p375;|Q+=b+tWyJ=&ZFzjRWo3;bBIJC20;-hSXf=xGt6t$ zPBN*^qY4H|n#I1$BhQ4qE>&!-T!vKX$TIztk-<-3*oe z4>TIQdN|;q06TezVaL1YZUpO?Gx+ zI*#NC2mk;8 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope.png new file mode 100644 index 0000000000000000000000000000000000000000..be0567184a911992cca5ba94d00eb437678a831b GIT binary patch literal 477 zcmV<30V4j1P)YhQaYB*I0G!E9bVFH)fXUPQ4pj$Zc*cjp($w0^%2*L9P8 zy0QR+BaTQc3>xr|CX}WoqlnK-)5pwWHD$rzh{Np$LaP8u1}X5EnP%0%Sz3XN8%Xjg zWeOX4w`zjE;tjxlFYqc}r=<2pV(-vqKdOys)e+E`f zgW8Gm4mU-yT%O4O^SoVh3b_16(eQST(J@lI+ef^1_iJaP?sBt*mf=x!egzl+(Pb+q^(2Desdwp7=)ps(;K{#3ie98%EO==Jiznk>tw^-n;!h$< zLP=wivNOBBS+k+LQR0Kyo%ikc-upgw#>h`H7zRcG^yB~Iv*%$-Z-hq=N_OwLIDHjL zbuQ%``CDhN1gUU6|IJE^i-;u$JJy%&Wl#+Za^|`KEha1r_RCjrNyWdG{;qkN->idB z?jK>@vF)f=*YNh)d}~^x(ST{1t$gR;05p$kc*{bw0rO}=tapdMf+&2lkw_&&7Br7) zShN9ml>;T65V=QBi(p_zSb+>0Nb)IVi0gZgU@$Zr;uNx z%W@q!@IC*aP;Pk!uF_E(k?B50R$M>IY4Rpkp<}j0c;qPnpI{3&jB!-j7PR`^E z#xi33fwJyi=G}dL@%DdCF>$;|&!WFSeZL=-fh68!GOLv@h1;xJ$O^)(*DEMiZ;U_b vbdlU&7lz8$zimsb&OWv0W*=+pw*UhG1-}*41;#Kd00000NkvXXu0mjfWOyIz literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..49b1a4506c10bbdc8e26120addaab3af79a3c554 GIT binary patch literal 633 zcmV-<0*3vGP)R@)jTI^);>DYH_2R*UcoFm{cv2AY=*g3JuY#C^7yShaBBFvCDIrD?EkSK{lTDg* zXLfwECb7FHb>Q2#Z}$7%``$9c8n-zZ!#My8`2Y1uDcsdBrlJQWdzUXhxCtqDmKp{c zcTQg)r)H$$$k*$2c#D-C^&71ZAPpbqJc0rv}w=u_? z#%9pP>&H(f-3EgJEX$hY<;p&29%+op2%`dAQ3tO$6JxyAnk~#$7ZW3B9%*>GfDy?M zQiKU|L3c~-fwQCoF)kozP9YN9c=pkr-+6{0sKcE;0grKtu$&elCz^O3^54wG|FdW-GyD` z`gkb*I55>;4vrwk#?QB~y*aG?c#cO8ui*P|6`5kWKnBl{L1w;aF|5qP`r7^$i?**} z*v1y?BQicBqkNn^bqnw7M*){*eakuA>jcO6jeFAV^x>3ByHPB932cf6W@Z^|-i9;P zLvQ_B9G$5Er8#$r99&@f8ecwPT&?awHGOfcvRdJm%BA<|{tXpZU$PlI{UyKv+TmO| Tn&&YZ00000NkvXXu0mjf;pQ7{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ad363a2c87b6df52ca7217fa36222eba8698f893 GIT binary patch literal 533 zcmV+w0_y#VP)abpbD?T0Y*prEyDY;y)m{Y`ZoTrQ<2!%%4BzxmVI z8B!hXfAXI**B}lLW3DwolZ#{$nWJN9Qt{ig>o(8k2RsO+zl2q%YVq#A;dF1m+^tk9 zA(2Rw;{_b8JSgc!l51?Y7zWOw z3S?M7l20ikxxV)p#<&Cdg9XPZNrY&!r0!KQj4LOmK!plC=$Kqd-Q$?%9K`VpxVz@N z1xbEm3Oug@n)BC>)M zFv5~66V7sae0s2A&wsj0q6(XfQyU}mYP1h{5w^fd7WeMl)XsnJ@>L#r%iE;_p8^a3 Xni>RJzDLH#00000NkvXXu0mjfJB#*k literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..66898f485b51cf2e6f60947a8608e0ba0d24b165 GIT binary patch literal 658 zcmV;D0&V??P)6>rfM2ecTQjTTxL7&Q(a6X5blg_$^WTmKpfTcRoe#0R2B+B|1<-eRQ${2dx?|y z3J*-!e}x6Z+p$(!MSOCqTFo>~1OkDoABlEA;)tVFTc{*Z9jXxC(d?SHzNK~S+}&Bz zg2WNWZ9%-*puiRu1h;Cyjk20A232ttG~Nalbq9=l2{`r1c@5U>-4|0-QlHXxsX8C0 znGLH_fz0R#PJ~+HRNWuT<%^hJYK=w*2Tv7%8;lE20fBvTIaS{nE0!{tNjBi(Nb+!R zSJ%*a$C*%N3uKy`W0Aitn_OR z^IxZM=x9G)JRL*d!5{g0)W<_*rFx0XseCLo2`rA{Y6c6rcSJse=VPPTzc+?#PB;2{ z%JNFVKI#g(TM_tf6gDL&o69H|lQ?qhES`-#LR+MVZhITn)|EhV0Z4qIF%FE1(ETe~ zu%)GG)6C2udD7Rv2xe&spS3w+3GMf1IoLMDMkU sefg#aWzLv=xa7st1`NrQ3H}H$0M(6D1utx9&;S4c07*qoM6N<$g5ky~$p8QV literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/envelope_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/envelope_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2116ff56ad674ef7a7d2f22c967e050d427906d7 GIT binary patch literal 585 zcmV-P0=E5$P)q$gGRCwBqQ_o8qK^T2Av(_A}YZsHC zh*pt`w%7gvtx!Qk@Z4)pJqhhiJb3UAC_VIIDHOzBYAN(mp?a|NR2x$Wf=HAWOw=f* zO-;6qK)EZEwCwPgtjbQEXWYIl15VBzEG>1kT zFe!Wp?uUvy%(MswO2P_w(12^7oQG@LB4mMUzYzt#AHq_<_Hp;#I6l08nOJXUsG0^MP+%?i z4HgXczr0USGP}m3*II4D8!V0*>(x*9iV|Of8-~|j%-j5Fh@wMeu zI2&1lksibj^G6L0?A1Lw#gK53d7HXCg~=WimNt*`jO>AE1+#C2`|2@kOC~!T&%Cx? zBqr=W`sFna#R=4zWSILiiU+MlN8|419&)AUvmcxNNG;dsZN7zeKd;h;hn4fyd4@evZY5_b~jmE3oU7frtIr_OWCX)%4%O!|IToO=syB+rXJyccY7=|Hi+vdja^}%4kb>a~BBtXzK zjUzSo`+aVt+_Egr>HlyzM6p;r6VOrtUDr9%imvOTP$(dZBJ_Ga_`Z)yrNXs(y`Bna zCxP{P4bwCc1OeMO3*G#VkF&oe2P%OOdUp8}iB2HkEKtJUhv4cRZ1N^l(K zto~I%|NMaGd8av~@lsA)c5pZxP%f8wwQ9A>6Hgoe%8A1c-~a#s literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/equalizer_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..fc1fce9c3844c7a5ad0f624f9f5762e5376b3c1e GIT binary patch literal 621 zcmV-z0+RiSP)+zUIlku) zqLwt!KFjSoW@Kzr3nnH44Vwfe{v5Pb|m(>TB%eX zhC-ppzqTU?0&2C|ULuhwPz!1x5Qq#01C&Z7kjQX2JTb1<>nNAYXfzri4sl69oJ=N| zPNxt>k^4@k15MNT#$WT9Oor!)L)?V`L6RiyX=6H_<{K$iRh7rIp3P=qv)Pseq`81B z%iPn6xm*rbs}$OvvZ+ zuvjddWHy_j>-z5k{eB-FN*_&mNvAK=4aWl2Cj{z0KoSlq+h z{~Xs3WyIqfcz58z$Dv9TndU&6&1P`9T>LbT$Aj^Bydb^o1X0z_;?uqz)vtSa>TTRB^(a(_ohLa$Ggfpwr*d6ekKU@auhRm$o>deiv;nd zI&%snz^b^zpq(^zuC4T@H^;NtrK5c%l?iML;XYeru{s!f4`F-@Y zVUTykAKxb~-NE58{%GQbZ5)k`c0L!M=&b5TvVmum{~^EtcdZB|dr(@b00000NkvXX Hu0mjf+$AH1 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/equalizer_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/equalizer_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..10d73390ad1a5be5e967773fd6ea4ef7d4f1d7e4 GIT binary patch literal 648 zcmV;30(bq1P)PIV9NR@s-s%~7m(3PtQE?gDa;6`!f%8e3m*II-Il%yDw zW)hq!Hkr)yy=Nyf(S_0rckZ3{?m6$=H+MMOws9QeaZKZg&l0~zT=`Gz5904d^0;29 zRMum$So~kx;W!SBMq@LXOcrSi{%ABB*L5AGQVEpAFpR(E&1Mtjav7~w3lu}Klt3^| z6Qj`xf*`Qi?RF6e1X$tZdN!M7>l8z=V*=`;D6&WkGnou4q`BYkXF1)^=kxG-y)FXL zA&?}AMS5bPP=Lqdfu?Clr_=bUy};%0Gc3+G5Q#(_0&z^x>-C^03fk>9lkfBS5DJCB z^E@^-3J9r9EUZ4nOt=kmxc?_Xzu!kHl|rY}ajBv5FP-b*{M=QXQl>~;05`0;2&AJI z6pO|2JvebR8enGn3nFLcaqq!%%+6iG35ya8C`4ikEX#tbs_e92FvxD)A&~4X^2x#w z>@KR+Dy+dSxkMW>wtgufLouw^>tAJAMk0}5Lqg>{`4s;VXD?pBu2#eAR~d8;wsA7Z z<3M|(3p_WZllV55%bg}MFgbC{aZEp63#JNRCwB?Q_E_?P!K(NsVPQGeAJ3` z;kI2%3qpUOP$*sa6?P#aU5MZ&AK)jraqACAm;HfmQz*Ldfe%y=5|iG!)Zn8n6$d6W znLFp)nahmec^*y?5hsekG|TjcsdglG&h$-YpW9Ze^^(bCuKwGOAPDGoyYGcU!K4=S zbUJ;tSS-+JG(aTFsZ@BJ zFog99NM%{(mJ-Y5GEXF5*LCjGd9_-Fs;WB#@`gZB6mIFpTCIjqD1^ymf>No3!C-(` zEXHH0RBA&Y`vlYJ6q=@CI2`iw!{IQJ$s|NkM7>@|Fc{>ZKp+6ywhswrvl)uTB1WUp zPBm11BoaX)k=TiE6DZ$5Fiq2chmHNqCoIi@?7A+Z(I~$y9*<+STKS3e`q@qgZo3VI z7R*u{SdW3~=>N+9E`Z+^ap zNi;2j7^+1fwrVBS%pxcPSIuHJ!GH)NHjs$Aa5m9G7zkQaLb#}b>IVb^ML!@H7P%0O z{KyYfLPmYN=Q2uTLB(8n?s>TPJkL4za+s!RILeZ6#KkyHa|Af7|EcYBe31Eexlkx< z`Fy^We|-*P4ApA27z%~5^aQ)t>s=WP2FT@dAd}&6_(xu=)sWBUQLooQ8q$)1Zaf}i zGMPZ9(}~z_x8ZO&MB?IkJRTS4q#^CxfFR4Vh?E$M#Y7@;yWK80-6s+Wn9b%x2J*~6 zuh)x66_d#%OePaLoerYWC>o6hoKB}WTkiMaNu>~E?9AMt+wHrL?kwXmE9@WC|B4hRxT(TFv+?} zNLHfz<;<8Y7d4>Vz%%c&@67YeJIgyl5Ck~M5OKmGP;61`QYinaol(3dblU6ndiRRO z;`YB@M-T)UhVi~!F1Ohg)Iy=KJ)h6f>2$zMY}@`T@Av!YcDoo124EVdWd@S#y6`*? zk|gnHSr#-+;~Rg^*XwnjXBwsr4HyU^JhF|oT8(dHTvb)h*?ObVKs+8_GaxGiS(bTZ zCpMc+#9}dw$758hRSbtiq|<4h%jfee0}>icCKD)%g3)Ni%TFW{$mMbnMG>u53(;tl ziz1N-9LM?7U^<KY#ZSv*GFU7Yp@{wc!{Qq}vtIyo-_)A|KYZME?gO_IR|#zj zN7wbwXXz-FN@4lO`Ao5K?#g*yrRkcKZ*i{o_0v=@T%!CYg|@NvZpC+lGa_HVaA!w* z_u#EXUy+M1{!2nT?1<(+u&Zn|c=YX8+&}f)@+=L}z`(wJnP%n^og4~#`8YOXkIbM3 oJF{0`f$#niB;g4R-}x!P0IUHaRYuvM_W%F@07*qoM6N<$f*w{8?*IS* literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser.png new file mode 100644 index 0000000000000000000000000000000000000000..30473692a322b339bc2d97f7d3760e0f38cfa0ba GIT binary patch literal 674 zcmV;T0$u%yP)qJHDCjhO~`+@Mo5J^ZUQIZ*~b_ghC;R$Kw!*M8M^8fz#=PE5%npF-K4o zh{OPr0F2=JRR{QK00SN6$Y!$;4u=K!pSW%UORju*w?zm6CH;U3Pk zG&~xOq(Y$}PbL#E38I1{83f( zFa@kUdHMpcaSy2~ov&Ofm1JB`z+4TiY_25)yr18AiIsN|`_5U1UAbH?%Y(t-%s^YM z7EnsT>-ECg$DQ0m!c@x0H#_g(l`EBs-0%0#z|CfJ24^yvoUZFN+^+N7Zy3Q58-c?H zd8_lm+qU6EA|YUp$5ZFfXZBaXJV+{)ilT|6D2m+c^~9!%1LL1oO})EROdIaDEQA7KwWgZ-IuZIrRj7kuFE|B zc#e2Os3~e73C^ zsH1`FB{4L(#R!_Xnl3{NAy{ugLJv0Td;6X1w3XHmew=gfIiK(McYpUB0r{|4EO0m+u-R2#>|JpiNk0wseW zsz5WK3N+4UfzLUp$Wj(nRaL=mx5H|+La*0jk2tPCZEl?&8xRBmfff(bG=Wcik+rwC zgNytlPAI_XmcWyN*xDMR(J0zx#`{U|46WIbSNbp9I`ODKO0cR@@rt5}bj&>O%K>iM zb8=4s+FZXlc)70S)#$D0>Z%5-1aFIk78c;VKiESeZEP<%olc8huUE=Ck7*$CFrTl5 z!&`GzYvMlkH@vyIDRy^vOR_8@m&>8Fvw25kH4mFiCQM%K@lyp;tPoD6Qlii2lc)j> z-cJ2_2UbEM(oi%waQ)_8`i+xB1zDkUZ*Q+e;~y~3FgYt1nlyOI+jozgCkT7T*`jUd z;o)H^nN03#Xe1H=V+`fxy%4M=VUTUCK6!Wd1z=z+Su6G<-EMStd(sv z8sT=kyV8}1_jh(!YYFy}@g=PS4)WkYVeqoK^UJUiZx>f0de5^P-@klKy|32c;yG*M z!|`uk-dw@ua@CWF7zhNUcs#DbA!-;uwq~;#*S?g*&z`cGmJ-0v>~DjbQsDLDkMlxB zMFs!9dU6wk!Jrh2#dbD{qS#gD>T?!XHyq;6399x;Q)A=7IxFTzr{@L6Zu84#raWLU z7_8)4lgVVX?^d=B&k`?)GD9hsdB$cfS3E}}BQF+|l^=d#J^Yjl7$~VA@T;g6q{3TM sFy@LoM*MV+8U!eQ`AydtU;8D%0J&Rv2GC$4fdBvi07*qoM6N<$g16abz5oCK literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..dc0adecc108a24404ff3290f5f5cf8e9b6cf2319 GIT binary patch literal 785 zcmV+s1Md8ZP)%jA#!+Fo||2*e;&ch))tX3QGMkuc-rU4 zcyM+FXaN+C<~Je`kf1;$(^xDPI2;bxY&Ph0I_xl-WGF4|FCPta90z~fIbPKSX4p^O z?RJBS{9_!Ef#Yrd2g56ZfLJUB*VN-75)X zgU&SXC_snngCpH_ZBOrAi$$Xz$DS5^?c6!Rd6`-q+XX6I&0eAhIx9 z3z5jiT2Yg@i{A>TQYm|Xf4^^ieI1e{p`fefk4Q8No6TlSTpGAV5lm_}!^vdQ?(ukh z6v1Cn=}tTG`Qb&NA_$Xo82;|px9Kty9+y9*@tuT&^CY(WnBuuC5`!gh)i{$22oH^NHYb-9+mC$2=p`;TD;hB2nxRCe} z{P@++-a(2?ph_fYUSL(tnrz;U#+i3vGc{p&W6#UlTcMAlwmFZ~Zvh4XH5!5E|JEo^ P00000NkvXXu0mjfSm16{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a621e08432c730dc34d2e77ea67028e991e8ed GIT binary patch literal 699 zcmV;s0!00ZP)(x zkU+p31SwQul^_^Nl{5sRMK4lBJOm2TKn|gn6icAwl0y+JD}uEC;7Mq=*o&HjAm(7f zn|R32QAjokCE3l-?)c4QH^ek{;ANJbdEW2+W@kAthR^4NP$&d}Kme>(E1XZi03P3S zC>}V00E7Vuhx4Zaz;_J@3{V!2#{(ftvhhT-5o=qh1GDmLYcdb^{G>;aU(3r&HmDy;mDD!h~RWU1uh@58th8 z08!j?ZK?rop8d7?=wjr<%cpX!#$bZ5X;L~mg8A*uRWyn5)8KBmDUAG#X8K zkB^H^UH)k$DqGiR0u!WB#|MpV!msD%zCKaal^I=EOpvt>@WawAP7PNPrmp-)0Vve zmnID?n1KFlXHnR-n5hP|lk0dpsDT~jK-q?Ejiejx hnzJ_Xj_vs?zyPRWRX;~Ts>lEU002ovPDHLkV1gRWJVF2f literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..57b9053f24f603a9d40d163be9f9eba3e5ba382e GIT binary patch literal 831 zcmV-F1Hk-=P)Xjz}DJt!~fBAr`vsnTt z#=U&`koOUCrKF>y^_nPNT3lQ-69RkV$h#<^)N!xb@AZPu=YvD8P8$|1!L!{oK^X&h z@gWrYo|&2HAAWtb{du>mSG|^z!<204zI)M!WRAy+ND?bj?t0Mpr1aPtDnL<&-@b%| z*&O}6;@6K?sa40%7Y~1NXUr89Xe+JF7yL*7j{BnrBmMg}G6Gpu2ltFQ2j-NrRxBKyGd>Y~E%7NxeU5 zIig-4@Q&vhjXCi3V;8K;uLKzPvm)N^Me<#bOLw(sQ7yx&wxWhFE8f zMgtX(Zds!o>B7e}AS+kW&Mhr1_Fyo$>IF?rO)XY=#z)~@V`aJt3zy1sZ{CMH8m26Fw-cI zI7S5_BJ^pmM2aZAHGO}yfC`~TB+`k-L6VbJV(gzimh)SH0RY#uX!NyNM#caD002ov JPDHLkV1i^Jf%*Ud literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/eraser_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/eraser_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..fadaea76ad3c3296bd7630ebb978923f674abc47 GIT binary patch literal 746 zcmVL&R2o23N%zHb*-(faJgJ?I2{ms?fUoKfWCo1Oc(WL6K_$U)ZAP z_xr&_{t@R?ptmpfdOVX#A)QWRVD4Rn1TWH>3w5Rc!u`{)B58s(jfPiME^>M9eOLi} z)N_7c0cv*sn7DniZ|eE|^wt)KHG&%=iIo-fJe?RNkpXc(xKt`h!C+9X_MGM*>M;9G zZEV!OHGYUK;%>NDEJ`CIBXYT1hN37qc&&R!WUCHaEEdcRjXt6YX2oW>P$)>DP)Mc; zINV6X6%T$U5~QJWICkgWW4gu}qT*t+^Vry!O!Y6AB#jnawvfWd6pO{=Y&Of`1RWTAwl_}{rBdPhR%?%EjSWOu zp)4a}nm>Be-m&>6xq|Ta8T1-d9W4|oQ*;yCR9D%p){|{iX{ri-m6tXjuBp%qwFy3z c@JE0F0JOw*tn=e#5C8xG07*qoM6N<$g0+xP$N&HU literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..056f680ad288a1f126e2c0d4beef406cda8ffe8a GIT binary patch literal 622 zcmV-!0+IcRP)$M$+k2uA} z%||2QCbimx_EPSZIEIJ=LKQ+mAaUypP^sd;33vuxfg6ti2P9C4!~r1zh4c^ush}|% z$Diz2NeMKqDzVbfyE{AoSei&Fx2DVf*nn$m+|ck}j^}+Mxg;|4e}MJB9L%>ahQwFvbA!oE?(8aJ7nSBcB5e zi9#M}L>$58GurZ+s%G+`zYmV%B!od9(rGP!`fPa(eI_+D3=a-e6^PKxFI=hm>v7`wx;^@B;vZ|IW2@bC*^K@wDEc12+2v?RFcw z-7bWZ3z6&s$U{xhiYw?l))9P&932FCLoe1Ad;M47M?H|p5Wd?F5@gX!5CsP^hOrof zxPcnfl7Oec)3`lbuq;1%r&8j8BDx8>aX(=^N7PiHW{p`3HK-*)0A*298s`hDDZvj& z@twwu+oTQ2&1)v1w1Ha6SiEIgdPNrZ#W=iOkeHd7L9`GL4}0ISeNiE->^Hgp{{I7(6cvN0d;MxV z+?Ka*|9tiGySV1-*S|$T?mJk3gk`0v8SwC2=VoF0!obe_1B^w)>%bVs2Vp6(Kip|a zA_gEmus~FllH~AAi)YtnW%$6r!Tbx3;emrB2Ev(%{Mu5ItRUwpf?QBikuPk(%lV0g zmH9UVD^LLpe|uK}#>iqI%*XwQr94j%-+=UYApIMN zLD`iVsF)o{a{*~?Ak7V;f%qCDG$ugN!U@FeMCM|U|Gok74}bsz01;pAUZ(sDQ~&?~ M07*qoM6N<$f?IzkWB>pF literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/exclamation_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/exclamation_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..b0595f1933e301c4e52e3daeb5fce4cdaf9099f9 GIT binary patch literal 784 zcmV+r1MmEaP)AVgt-f-FpQYe-C7xX_Ro6B83Q8YFJ8#+}9(-MEm%xNv1m*tjt!xU>nOG4gML zN|lzDq2HmMulLQAY2_wo-kbOCIdkrt`-ou}5SnFx22Ozx0ERKgE?k-hD}uPUsq57o z8bf0`FmNPj0-_Ny>F=K!@%KL(p>u?f?i~%TGQLG@AU+~In0UW6aBG-v?iUP0hjL)N z{Aca`Gu(THkPtT!rxEu|0kp>VUV3wVH8eF!&|q8lZK3(pP>-Bjq@LhJ+ejbF)w$xU zA3CsPLl~UAxDtBu-FAQiy4%AaKR5dFngKc(iU{RQ7=o`YgVPgB;Psvq8i$_>R1j$@ zatvEQ(?OP{9YvF(Ty1^XY|$K5)q#&B&XSeFy$W*5wGIl3oRdLU>JG_@u0SZX0Et8b zChnfc9L-#37#7?vUl}?1ssjzgk|auQj(Al=hD<39l3IjtIBbb=CEJw-3TOvOiE?TM z;yE#zgC@Q;a}WdF(10V=QXGtG&k5n6SlG!^PHhRx>D1!Bt7!mOQbJhCd%Hn%OeeqC z0t|LpDx26x&PuI=`E2U9*e3K!4p#M8Ck?>2SdF-`G-wN`c-+PP47ERR3RWDTC1dVy z_%R+r;z}HELLJE72O@V^=8L%OZ ztw?$+z9mMSPBOz*E&-vJiQw%xi!CyC1v&zL2p+3<4)pZ;+S~mNO*APU%cobD#dt9< zFGON6J^Kx|7uV^XF>C><=b`BC0#}~^S1(_H8$x%(87i>8mS36s0iS-Y!`HP){=Efab{ackp6&&+0r3Dv+W-2f6A$0R{lF1ylAbe2BCF O0000ea(E5+`v;6!{{3YP5RrCNi%eL>AR=k42I7OnLGpMF`27cLi#@lX zo)*L3&-|-buV(oENHMBKi!>Plef--Y|IkbTe?Vd}iR``6$zS7$l_ml|b@%)4|72|9>1iaQ7~dc^4wmj%phd!w+-=7>9mdpx6L_ a00RI|$aT|1vjzgn$+YG}o7fUR zHI*t_7lI&yB6ZV6HdR5yjV|1U>Y@u53KduG#ElazGq^yR zGdy4n)5KemGyx&gmx`b2ABqpCuu_~dxe&0Cz=Aa+=tjd?Dde}*KNd{k%aW=ZfwUo4 z>lM}T>JXGDiPVA!$c&E38B@{J-~b7vn*!1bBur&PUU%UGK+!M1ho658{rV1gu z8MEzzt1d;>CG6bxOJG5z`s{TyUfu#~Um-u;fm#u_?OXB=nO@l++CjAAxJg1nmR9|C@mEK+j!+&RzuWo@~C9 zJ*T0|%h1IaV1xVH0v?gQ4gtq_UizTYFmGN* zYEu}=bHg~aErNZ}=r!)PT=s%!;Q>_W+nev0oho6b WIuFC;n3;(H0000XLm z+Gylsp7->hJ2MthwCKXef6hJU`~Ls`&N)meh5z|vUj@@KjdRoqj!Gfnl7bfGpTPwJ zoZ$&$=pf#bqyY$ZS)R-j?oFAwhTSkY?c_qhiUgLJGlGgl!b^T%L1@aa6JL{*RSQ&V z@@i<=h{Qq=v{4c%36UT(Dw8v2qbcMPCt4BQv z58bq)((|lB@ba_3o(n`}P!o?WGGehc0lwyLqTlq>6IfS20$Wux^-T-UNMQOEu=5mD z+D78WU`C@b|0ZC1?*bp5g5{KeRkhOr=RgfM(WX?O=n$fsOi(6Zn!gEX57bBtR9_>| zb3A@iN>4%sK0-~8;rdb)8tm=pWqT1LvW67G@*tc%XHh>EC*Il)`1*i?{Z`q0eiCnI z^HFx791nWJ*zNQ=zcMFeC}jCFojm8{XPLDcz?I%bj4xjXhO#j=H;$+bqO`gK5AOum z&!*(ove9b28y#B?mmjl*Rvf<`mCk(B)rlQtC7Aq9_cr?T4S4K8_q_qH7@Y_9x#0f7PTvm@tR z5o$I&u#2j3YIl<^#}ZNFd|^|uY&c_IY-ybd_}?_Iytv(|1u_Vf65?M^*QjZ0RAAe% kGS?P)ezBW=1%C)I06aAWaD{41^G5`Po literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/feed__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/feed__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..54fbce83a8d8d6a6ef54897e4b9fb341f89b0541 GIT binary patch literal 761 zcmV^kDS8l!Z^7z8q!f$dMG!pnWKfSH3W9j3pok!1!3SOyETV`Ww71d+v?(fr(1Vpw zn@Y{2B^#5?Zg%`CpAQ#cGoA7Ig&Lg+w0Qn?v?cz+dXYX+<_BJypB z@LtCFg$bZo!q@pka^5n0C4|FJsIN!f&tQjrsCZH^cp4`M?!l+$u_aVuMu*?yI5;Gy zBevCt=Ic9gs@spl6irxGS610R#ja$9Y7fEPDC$m+a2vOgQm$TlN$zfB(Ub45oEpYRPwn!_NTlmJRzv6 z5=bj@)wayKXTzXGL8KOpCYe#2oG~+;NcNCGx*;I6KulFu6bpU1c9aj?)7+|3PL)hc1Y`H5Lku~arnuI*X@#zMGr zsJ$w0X%cQ`0{L7OBPT{0%7cTg8j<^Rb189Q5tuxPw`(tRL%peFUq{gFL~~V~S`~z@ zz6kC;f2b?@u9Ve^TdP`bX&uO_uOqQ5i1@XBoZ1({5amRayDgW!X4LQi$Hmw8-?2PX s#6r8I%3T*e?!DaeednC-yvI1__@AXX_c5`jNfPR03DvTKEJdaV zWo1Y*G>PF2V`wE_K%oN&b=i*02K&0q0yR}tC5n_}8Rkx4i8~|kaM%b;P893YlOpkL zg|Z5PYC#U^K{XuJAyc42q$K17nNgV%V``eCsDK2j;{u8)kR>t;a_*HWfcBX76|spP z@Zpz`f?h~OX3T6ClDbMI>$1$V*)M@5GU2N7_v?qEVB)Fu+WY;_fE;O+Pn+lzJB|wfCuS zdU#6$o(!-bu zNN~+sP;~NY#t-1y9|FPy?rH{iHUh6t#J`knXTY^D;GQAOXV}p1wP0sc4{mnenbkPI zp~$l7fsvfETt5^iwp9WXPM~9js-Fc5L zl`h$ax!3B$q7lKodl7vtKD7HH@Ckto0;Pn!!rwZ5s+M(V0kpn)#|QsSJ$VmUD?siZfbaNyi0I*UvNpX8c+eH<3cMcm z#Cm<*i%QR1wu5({2libeDubGO?2+L(>jHe;-Aca==cZ5>ABV5+2K7w~&q!cy0@!mF zs(ur39k`_u+`kF9sXM^*Q?S;ZV11)>z^zcPuF$4hAaVpHO(rN8aNS=7vET6-O&X?p(5RnNKld1kHV!F&P4Wgh8|SHS`yEINyTj_v_%USK|!mCAlg(yF4_qFY>KFrwQ3j(21b*9V2ZTS zYLa3ioxe9T@7>P1^X4gG559Nq&-uP{?m0&&r4T(RLQ-PLkmxr|w3r59n(IRv$Vh=n zAu!%Hrm}QIheU4eY949Z(%fkUElZN8Gz@4<5Z+!8RJmNrE~d8H-xisALknk`2fbQV?LQ{R)yX|XHYFpHSN-?o7yVg zw{C;%y8!IJL|y_a`BanPIKF`N1-$n*jV94B97kZ_7QLG;UXVa~8t6R_73v_a1GiFv z`#%9UaToaf9HM+P^+RG z^5F6Aj(4B$_dPf%O;Z$E33^#->U-r&o%mffGSQ9Qbpetw&Kd96)u3cs#xPnw?YELVB|Y_HKfWPv~@IZl Tv$35f00000NkvXXu0mjf=(x0j literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/film.png b/interface/ispconfig/interface/themes/default/icons/x16/film.png new file mode 100644 index 0000000000000000000000000000000000000000..4efcaa7df6d1f13aefea3f26258dcdc510f570e7 GIT binary patch literal 667 zcmV;M0%ZM(P)1acH=3+L#h41-bhCn)P z;6~bTgp0*TzzEpQ1jS-;kw7wpA|a%*3G6&fVlT<@G#kUCofNE;r5R%XNziV$wPAcK z3hw%#b-c1~Ah?8Sa&R+@-N*Md6R>Lo&+||&m$m!x;rjs<pk|c))HZs8*}m@OCEP*lIIP z99;gK;n(>kCgTaBVTnv8tQlfA5;%^7Mx#Nc!b}*31m_H~L=@Im4B3Q%C)>dFV$yKH zt`khBQ`BlTTBxLwYT^CeZDby#5sj)@4HFkOFmah?h$YP`!C){rt=H=>RB3&Bw>SRJ z&uA$YqtWP8x0TwXdK*`DYMJN`gSO#JY3F|g7yw0+8);_FjmH20002ovPDHLkV1m^t BI?ez9 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/film_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/film_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..da770a5d867fa606c4f3e781b6febce3f1ff4cae GIT binary patch literal 764 zcmV@O;$>|5hBC-zv*_>dM7|2N19OIydR0^ zDApb0fig%YlhXqO18o8tcOs4HfBl8V+55Ho&Y#ggJ$i!L%B4>Y-22Ws@B6;{J;E5n?Ck6ufbQPj-bwt&n3X0bKrpd@L43sFlknZ0t0%ItSWK97i?=lcOixb>s4&7%G0dt^ zJRuDPE^ll~PL(T%QZwl5>l2U)Ot=Y%5IL|-6P0oWpL5@^wDeta1Xu9Hlo8mrjj5?A zX;>+lD3!NiTQ-Q|AQ)7z#VRly6FW&jsdE2}U|?WiCjv&G>M8PKpX3PcKM`cJS!w94cY~TXL>)IOTW~0Y%SAz58rnM=C8x^8ZV@fZLL!ln?vul} zasuS@d24xj*{Bf*FOq#{Pa&A-M_W7|M<$cmGY}Dsjg86u`D@RPm<~a)Y$0aLdjwSs zoN0c9o}NKi_I2as_zNDPx>o~XkW3~eSNG^}X)1KL3a?L-Gt#h#Xt*6Ao?hp%F5iW7 zjZ!0~QcGcUbW|FEQ5e4*P(q>W8r(WXt3Ho|kq#tN8FU`)@_d+k!o`Nv?M9GFrDO`* zB?m@@H`BU-wUrX+&$kE#2s9KhF);zk3N#vRhQ@MmY;&guhGAf2WJExX*Bpw%Kq-Nz zPRF6(dxWDQtgJ2I&Fi};Y%lPha6xB35YnC!89}jFL^_=oE$in}E_7pmdjr~EPhdO3|t95-BuL>JUl>3k4@dTv9U# zZC!!^X<~fM`?=S9Zj%&suoup|=e_%V-#h1g?=dMQYPH%s0Lht|nGKv_ZEtViRojl@ z-uBT0Aq0^rWs7e^RTtGr3I~y zgHE>x&-K6zfzeR|$I^l=9Go-(qmTWwf=niJQh{Xf2mOdmL=Zn8#blIYdLo1i@fggQ zsWF88r-DkQq6NcaBjAn)n&Xjm48bLQJ`U~+;NsM{#`Lim4$*a8gBGaQ>${~=>847}XNAe;|Nh3Ov$N+8 z4i0wrS63f0vPXFvR?lMtSI)46ijIozZvh4X{U;6TGLh7$cC7^JgsBc>1pwV9wrAZ{fjN-(fY$yuZe83cb?H4CA@-$ffM z63NN=X`DCj-P`@HGlSNq3*WonyYHNH&;9QAm=FSUb8`y-ngfBr6#ipGqtRP(T9jO$ zjTSiPM5dGtyxC|!W9^AbU@%#NG(oA0q0+^khrBoA4AYBUu0nL91acvEss6wpslU#z=2?}JM3_KD&Vbk;gm~9qo)ify>2+& zPK6=tKMo?1h!QM6Rti05f$F%I*$3AJY&IRbtpxRFjw?(a3-{#Yfq-e6Xm4*<>Qh5~ zYm{tnZ=0K&o5tT)$QaYF)zx9OzaQCH%vW?UK0dB)V;mQhj zg?L&#!szIz5`fTQ{5GI#x)jpY?%d*Vi;t)_NAP*^_UYczcibIRf!;2Bzxp4)L!vo3iqfT-HA#X!DFbo63!^4!8$eKgb1azID ztfCY(?oaSq?{GbM8LuanFf)&xhV!egBYluaB+%2-Lxpllsv=g`SD~irr?mY-k}u-b znY2C(f|Me07*qoM6N<$f<%U2 A5&!@I literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/film_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/film_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..17abcf8214bb09fba039f70cdf76ca34566df86a GIT binary patch literal 736 zcmV<60w4W}P)gBtvCnP~gx@@e` zdp?*Z(9xk`Pug&Vi-RGcwYa}_Fg!eb(1BzKnITv`ain?^IF;Zy*Au~sl!cfTQyk*{ z(Lu3TREE*cFu3c3a;)2X5L`mnIk;}1?@X8Cw7577(epfvjEpGvxv7a&0@Z5OTU%Rm zeqSMDjAyf1%+Agp8Bhl^Gc)S>>dmJYT*1(2dPw{7P^eZZd_2E*d8x%c%76?;M@Ll$ zX2gVUgkXk4h{lY=ip5R5?JYn)N)9ZZT~Qh;tv$l@^t3X7IBv8>N}^ULTE+%jGaWKCbWY2spNc8|j}QcK7j`ts{3_xTS?rn zJ;sLIe5MQ>$3dY`AZP@cL(?QUXNbhZh;>G=Yp>({wUnB<=G982mjdBeiU%UtQ#EMFHY;0_Ka&nR) z|Mt(i6LnLc`(^Kg(~>mEn3RpA-9`g~)!xcqPu_S4Uk(Hbub|*e1aF!@1sDJVC`pwq SM1|!50000RCwBA{Qv(y10{fofkHsB0W8Rz zJ$v>X08;jDZf520Ss^7zWqN4FfuZ(pT73O|A{Nk{hzq} zESL`xhsvYqL2<#KKYtjuY}o>0GJpH}li~Z%9}F*FeE{>J;`qY=WPp#44~WUiz{J8J z#KX!UCd>oogTz7dc*EfL@81loSFZ+Z*f6u;#<63^zWx3C7vu$2s5pKXfD8x?4FwzE z7(Y`Zr|+Cm!NiNkAU;SOB#+kxzkdBFLh{^WvH!}nC|Gx~ZtpC7#s5pKXeE`-3elE%w0Z5oyj+e1aq;0u*OpVq!Xo jZUE!Z&kGbA01#jR)KQfAz34v700000NkvXXu0mjfWI(Io literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/films.png b/interface/ispconfig/interface/themes/default/icons/x16/films.png new file mode 100644 index 0000000000000000000000000000000000000000..c004ac923a29fbf11c59a946b2d19b42807d32b7 GIT binary patch literal 741 zcmVz}*d(Um2D7ARty!+n&oOkZ|-4A7Ra}#8ob6BP*$~!Ui4-5>v!hdXI zW8;Aswp2@)n3%xa+?@5|($#!E55q8^ ztgWqa;$@8GFXNq$51s7p?mE-yG{(lpJ~kKm&@|0^xm*tFzr1zPnu%&v$Nu*NI6a-t zg@px)7@OY?fty%-*1fg7yeu_#6)&-kkB_5PtHJGZz}_l1&K8YEB?6-d@er5YWry42 zf~vNh@ftM))6>(kfKB8Eybf6)lgXf77YmxrW;vPQdehg}_azt%7X5xd4~0TBd9|~v zSH_dcB!BUGpJ(6xB>gjK0*$LwrOBg)A3g6n)C|-OQ}W%7nhwFMClU!eeLuc`bFaDM z?Nd`zD3{A0R6-aT8Nu-Iu+3&`6^smyYl>Jaj=E@DSaD`%rh92=iQey6XC{?O(Qw45 z1L7er{g~slV&M3odY+eCyyCc12j~5WX_|)7(NVfgE`{0A-qD6zonH9-9k}6fOP%7B z=kxgxi^VQnDs^XP=e^+RC9c$y+k2N>yfa?mQV0YBD3wZoZ?15c@awqRj+%bK{s=Gt X6pvr*2VKr~00000NkvXXu0mjfC=g`C literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/films_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/films_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..00ef91b2376097bca7f81ee67489be8a2f3625c5 GIT binary patch literal 828 zcmV-C1H=4@P)oz?%dRZ zB$V=ef+-*chlNih{T>4D*7R5}VET4F8eQ z(a|bmCb+nxv9S?tZEf*oNm*GLwQQGnrc#s?$m9Te2Fn0A z5JeHp@bIugd0CeA?Zw;ftPCwKE*iSKyWwy+rgnzBF3WPM*XsrMFK>*rCLR3VqN=;1&WNWdj%7HeSNBr-H(^DH8eCJ8jZrp>!H)C7pJk??J5FGKa_`Z z>3AKCDLgnXVV75oifCFMc; z#bTj{hqH2v)VRy#QmQ>am8(Qki|xzQN6-|GR@vdw<`wD64#D?XsTmMw*+O zb#y&FI~{Y>m22i_Zydhm_8>OzpHvYj4{b}M(Go^25)%*X@}^Zi*!pt32Ja4D!NRwV z4=>+-M$Mga%^T@N;JKLpRPBKB&;pSy1>2h9)(J{0rHb-^|9P(ldGV z8NFTw%C4Qx^F0aOH zS2r7sMh|&w;E9^CzietNA3r3+w~!m_(DA&7H<|E9fB^uRad2b4PK7!E0000q$gGRCwBilV3PUQkn0S6BBC z|B#uPnakA732BGd>qTE*U;4AAzP_GWelW1mq@)N`T7cEyIiS7S9&|dLn4X@l;nO=7 z7Z>64`H)JbG@YEBWbTZVn!=VWLrQETx)HPf%p%mMJ z6q6yUGIV4M@kCPdvv@iI<7ESwU>XjGCwhB(QCV5Z7CIh`+(My#2^M@u?g1kTi>%Bq z1cN~+iUMwGYKkykp67%6@%HI_hnji=ne|VK01wB2T$j)3wd4(HAIUyKCh$AB-NG9n($H&JB6Uz0hy1M#f zNl8iAX0s8y-Oh?9ic71=#@b^t|J+R!DL_8FxlYbka9`OTibe#MWtT^AwhWhUN(z#S zs_~t5sfJ;nL!N$gQ><-pqq$`q{oN->m4nOg>bi|cWaX8Hz<3y!PN#>c*CQ({6K0cv zz6&TjiEm|PcIf#Sw5cP?)z=>Vl<~9MH99)lz_Sh*4@)4&3ASSj;_C_MXyPKPh;!wz z5FLlrjd?tM;>EhW1he(v;qud{nYqu!c}bGs@p#x}GI6{JOa1{A6kAbf%f}(}XOtYz zF$?-Hw1ahAymS{v;TOziIZtOWpQ1I&g-|H;va_?ZigsY>xO!xD@6m3*!dcv|B10y> zM*CACMg53JwLb=HLH4nwXxu~38cbBP_q($9?x2I3Guk2Hk>aWDjnnUUzXccof z6hQ?JmTr_3eU5M5$L*e*BSRS;IPdb#IrrT2JNH~^X=w>0j4>2MlBBnM3ADDhzQlhd zl}g>>%d%21^!N8;Y;3IX8)$25qg9@auXUIfgUt`1Gh_*Pc-x-{27^c@lL5J~Bb`no z91g>>ETQxB^JFfuYzs%a4lQ?#-Cz4ifBY`&hdD#o$zMo7ywrd>(o7~ZH#$0s#>PepY?%$pb)84(E_JhrCNB@#rVQ5XhqXe<_EB%JGYb93|Oy1KfI&*x))zn>1z z)z&u&e z*2#@~hlhue&1P2=Lg?!1LT6{E!{KmpMj5VBiT8@Z;AL~kbnNand`qS99N0M>nxUZ` z6Zk4BARgk<4;hXROjx!F??naGe|Xu4WD<7*0idPjTJhjLo0%~bP1DfZ+l%h*ZjU6Z z@LpEoy5K}P-&^jn>5+MSd`=!OEWp~_TrEz(?_*V2UtfR6d76l8=>FBMGajDzeN`2* z!QhHMJ>BFha+K0garJP$g!AQqH2hbB-vSH(WhGg%9XR#+00000NkvXXu0mjfcNbrJ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/films_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/films_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd451a8b4729a79770b5949e14c277c7bb4ad67 GIT binary patch literal 810 zcmV+_1J(SAP)oo&B+)t zM_YmEixfVjL1nPerDzIS_|T+C^i63!w3Z4@2z9K`f(k4`( zFtA9d$mOov-R__6@8ayQbl`CAJ->6#?|gp0-=P*47ePdlB;Mt^(P$JN zj|YMvC^|bkOWb*aC}4-x0+pMVVzC@puwX*4C^KhK9h_)PTumv)JWf99JjGw^$xo zUR3x_Iz_F_%k}p5YK*!K#Gl{cZhCHMtk!GWZEbCaWIFvyL2x>qBwnRbsbxkr42JwY zURh#pR|5_guYx2`_<9{$ z9(AL+`5f*~_?~7sX;8l1rQGAAS(ZgdM+X@uJwmLFP0G480@^|2Bng9R*07*qoM6N<$f-oO|qW}N^ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/films_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/films_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b14d6b553dcfdb3f25fdb63de462d7316cdee618 GIT binary patch literal 799 zcmV+)1K|9LP)u5Cym|ARWrTP<4km;Ultd7Ox70YgySo?gA6Z^r zzD3Q7RB{Xt4`XU-s&sU?TrOtCneb|_q7rEI0rrL{0FUn2qE4q1u~^I@mTsg{DR{kJ zsH)0!adDBk%T!IpQ9h4s?ijnjGDxj|<9-%rdE(i&Sdo#D5gzF2>EVglOaa+U92x|WIXMZt-OdtQp9OrV(|>{mKTuU+L|sD-^Gnfa6pEri zSXx>lj8_!J=)ZWUy}d^p8ym*i*;xz>3?xs7ysv3mS2!Go^fzyjwx%JM%j4(P4vbYz zM!(-5fz=AI8JDWRr~Y zDib8B><_O}P%tqu!3*eUZbOZM7YGCbC>H5JL!l61Lb+abbaZ^MTCM5&`g&rs+1TT` zrsj4Y_xXIp9_c5I3l4&Q^B(h2G$OGor#zDL?$hS|tb(GValSUUW}v+J(a}+vofBW? zi=MuFy6>OY%g4vZvAMaK;0TO|wWZVPDWe`{^M$j#>D?R0n76(Fs)dgkHN)*#tv@wa z9r?;TU_7iq{*d7KK!K_$uvAE>JK-gJ#~+cmd;2gv_cYS4ZuY8BF>isJk&pdLTvP6lIne2 dlJQ%B0RSkFXX@tEtMmW>002ovPDHLkV1g%ob9Dd! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/flag.png b/interface/ispconfig/interface/themes/default/icons/x16/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..7a56f68691763b44537d11e6b17d51765a650ae6 GIT binary patch literal 726 zcmV;{0xA88P)ByH+Hw^(rG$QYQ5#B63*~Waf)r`KCW=wTg&{=uK@4o5YBMtSDnNP*WkO7E}yO zup*SG#5|okm%HnC<5oi$z3AX`_uTV)zTf-(e$PEjQ55{orGLk9u+boAlW#|3o~W0B z{Sr{T3^<(v2IeWYNF-H*0>+GlRV3VJs;JmttF3i$Mx$wB&hr91gsXLmt6Hu$Ke&GU$;@i_`BB7jTm6){LJX@Jgz4tB13R^#EWB+&O+761FN(U!t;z8bxs?w?Tn+wgq13wvqKL6i_yqL>f~BT+;c zG#%4vS(NBGEc_fEEF1cQTaQ2B4b2JK;+#NT$24*WSNSc#0J**0eJtJa5&!@I07*qo IM6N<$f*q4i6951J literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/flag_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/flag_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..26f8217f6b92f072165d9df6bddd5503ce1af101 GIT binary patch literal 858 zcmV-g1Eu_lP)Q50S0jx*z(86Pw1 zh~pdaL7Iw_5||Y}QWT>;B67;2(9*sF`zXvT?L&X^BQP~gDFvglutbo`7Z~Y?nt~}k z(Zn!w)J7d==C-d{Sx`S+Se(b+d)>X(Ifn^?fdBa%hB*!zn*5;IOh%sMn^|!Qd7e@g+kd?ROIZ;SOLX5ekKkv_GbqXgrl;6 zfNh%e^sNHVyO|~@u`o9WtyYVd4GrB4SfLKsA~3p{z?*P{^YGZMra#JjeSH?DreK<# z#aELF)|C}-B-fKjG;VHqTwmWq5-y7poT>02l*$a(q@*oQv9UoGlZl%i9mUf8JXV)U zF&QnF$-pZV@F0RawY9xwpoEIs*)yQZ2Iy@Y#)w!WBxhym-;9q#DwTrg`E}@YI@HzF zydWblN`N+*=m8PHwt-CqX*8B*8Vve5((bBOL#0xornONIkjQ)nbTBbgoRg4WajLoU+@sequ_e8`%Gwvy zy5j6iAH8v8)}KhsR*Pj=GDrlDz6_!6-;3oEreC(=M0`$pUQ^kbhY!Lky$1qMr_4Kh z=8g>ygIDsp)WkqtpK;P(u-naI14s{H*c-~=Bxi9pJC5x+S(4XOQP{L<6Rx*pziZ6c z;pa6@w`R%uORk>+Xs+uqO2kDlNeI%gol6!WKRvhT_^qo&_bpab*3U$Cd~}EkdEPUQ ziT;V{k?z51xq{azwQ96hwi>N#YZdE05L~Y$;py9Z=Y^6)bRG!DA==Xt+zD!e3qj>% zXc&m-6a*(jqfwbsm@S^7WaB}(J8)S2GS=}&!=r=SqQZFV-ssfYdw)K13UbH zIUXn%fyNN+Nkl+3_=hn=!X+f!W}G`WQ^?CpV>!;)SXO2-G0XwlfByI22ZouLK{~Nh zKXvMSVa=Kh#bB`cJ3BGx^TFwKqV4+imkc0M2FwuPi8V+fwzCe$ax2}aPf1B0?COHQ zuMa`LACf47rE(LM0Y*TcYZaF9V=RaMh4aDv27m}kJ%2#^&SYmCY$v2yFytj}IAbUGaj2168=%Z2L7 z%6HVrV;bP0UhM%HATmab!D@;p*A*0G`KWe_)rzpY8?Ew-erXt&LLE5H(m9Pv;aCGz zSPz#|*3rCUm zhp=7S%x|8D+pSgY$vL@$Myq|2IbpdwB4d?ADXXwGBz$XQ@MRrK2F#yP&Z9Z)SyFnj z`rFg-PiqdOm4%EsP<&q-<3FgF% z)b9RfG~7RkzVJurgv3-y!p6~2Fl>x?>Cd3NKd0#EzUuQw?gU4at5b3y#&PycXu52A zwh#Gh&w*q^i?67aE}s%!ci_h3c6jKYF(+vz=WR&(K12cGYIyzl!w-}^q_IZT#i{LiC(%W*K%CM%OGM|*)#mjN0j zplA(nE&&WKP%cG?D*~$sGa^>K z5=u+Ao89iMvM5@li3!Y3Ps3)j;axa9#DD~Kzl9G+Hlar99 zrZ6W-NF@^BXxw!qVzyZDEEF215iTer6cVu>dVQVI<=VW~>D-i*B<^c0hWN}378ht@ zGP*zzAnJ6mlE8!R?vZ)GOXNP*5BSo6Bdr>vV2M!O(BSwuHU^&OA&TNM>~=eXfxsvk z*{J~{g5m)QAgv-tpqAbj_j){zX`0<=GQnUlAmI1EqFg(95K&rJ1h`dhAwoFY8xBY3 zwc2H}&+m_tXuFc*X)zEA@~<&j#=+p^pkd3VekZG68fq&Xw>{^hiXagqI@<7Rz0$Q( zi+Kw}vYLZnXApS?x|j+gAFFJ=-ty??si#Xuc#V_jQ^=Z?9~!hlTHF?3pBl_$;8;lG z=+5S@mV1{^K8`2l8|z2qdOD~poi`^5L|2TE%3#O0xO`;Kaqo${SK96`rsZ1&;~1DF za#LfYBj2b{PtRWuh`j5^T&8({Yo{l8?MyFq;_Ls60eM_T6`gdIivRhMC=PWj<0TiK ze|mUY_U^`u17$c!F&m+nU?LQ$#_Lq`d6maB>P-}DIV}EsKU6aO1$Ul&z-x+$YH^mJ h)G-xV59Qwi3;-o3s5{p3VDnAer#G;bQP)MR~ z)IJn(w#{w1o&HB=O~I=U{5bE|^Stl>d0!?70{-U_Mf;v|r$Pm2GAQ%ZrQ9Xf*g}vAke_i%!6P0h56SyNI)#TAdz2J4$0>b}!G)!nUvg zhs}mnmkS(~yOT_mDit30^o&vo4PpslBs_!A(CqMxjJ*njLF=*ExNnn_urDpay+RdJ z&>>POc$o}pGI-e4_0kD6l6Z(&fi^Fo_xgho`AuZz=j*>rPeUS+fam!&qNAhH-O=${ z&RAVMFz698AOm>)1Q=w||Jn(&S-(iNhet#}E|;UDz5VUHMpF~1R@;tDO;vseZgX4Q z!XQ!IZ?TL!gM-(^ZSC#jk_1-sE-mfzghG)SS66p(9;n}NjUF8bxq(9vTMP9kMg2ye zm8|bH*N^iFtUBs4R-C=gtY)jV!Kl@?2$SAF4w?mV1nx=!IVPMdf5F65TgnY(XQ_0yuZID;_fbg-5{@z5BChhMoiBpyVBU(dkPuYFg9#-n(C zN{2ie)7&U!&4T@taHoom6dXqmjmd}*LgLr0g(i0P9Mj@reLCKYf9f9~bYh<8OzcT& oBFm+ABq6?f1;P7u+#dl30OT(mne#3l2LJ#707*qoM6N<$f)#steEg2XQ3JtnrczPPvJ%uF zBb2C?Id$pgc5m;UGc~9`U3kuW?tRbmocDdsxr`)9_@5{E4a-79lO>szax~`%c_L8k z1k|Cxg?XT7j&feYtSs;sVTOpQL_8dpn3$l+&Ni?rRaj4Tb$B?#R8qeC_rgJj`Llv} z!ci_RZl@+Uce|uiYMtZbn4X-3PN&1$*4ADIn5PPu8DMCoz&gSaHaa>zl6K@`W7khl zOu*@Iz~ywpJ3kMW+FeT`8m$)AmX100-4Pka_ z3hp`Tn2ZkLI4D&rM3X>UQ`57bfQiVRj14gR0Kpe9M#chRcTth>VRRGY(ht2} zkLJe47i45j5YWNN9*_Wh0jv8HRqDZ0#(Q8R)xPUxWv`R=rOS1lUW2YepA1a)i3#+B;ls6zd4`dzs8(TWEN$WiXb{k^r-Glu1NBo?3CO+~;MlIx`tm!MPd%9NNDbH1_`;D*!ToTHaQf&@QiNCPr=85J zTJVZU`7$e&>@72$ynUtep4%tg=-d+8O@#W4{h5Ni#^H4!BRAbYx3zaIdqCv0Z!Yn~ zfr=Vq^VM_hREgR45#5~(?Y2R*+gcy{*To-95Z<*7+86J!-wV)@BH~gOy2kFGl}wp< zQeeO#`lcg95h4j{0*_jLKtE=XDB1%&CMfVjMFq2P{}}F#?fZmV4@WRS-;{)q02Kap qYH7#J;CBh{eXlSqT4ld~2`~VC;~8CZu^prU0000pxhJe03@&Igaav415A6~RW) zNW2IF5Jn~hCLu8Nbvs6ZkP?JR2y{Z=*$D_h1cdR@2qc4zR%7svAYFmc5wsfTf$tQM z>0tYOHB6vLfy!18Oy}_RR)dO1*d&sYWCi^o50o1rEhHUZy;=hsy>+HesDF=7&{uj` zK?IXAf}z=4&2KE{*U;|uKsaaQzY!F9pfb$!=#IrBhMmq}3^H+8fs>n|KzmRs9;emq z@`ZH-@}&x9c*5xE6+?%f}D1#itUAgv$vcn4?%a+V&3fi&&rJUw-{WrSPb)X#4Ri ZzyK=D8PSaZ6-)pC002ovPDHLkV1fy`*4O|5 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/folder__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b700c10479aaec7febde7a806dcdbf808c4a76d0 GIT binary patch literal 647 zcmV;20(kw2P)^@RCwBqQeQ|@Q5gT-bMJDlR*7XK zHJ4COC@4dM$d~>>L`1#jqlEO74@J;pM6V@6L`Fdw6rq6%K`Hc*L=fyjC5O>gL$_)X z?#{N|bI$EM=dLYqIS+iCd(ZiPzw`Tk-)F>bGpJ=4I8R#$>sw!37sKkqa!V(4(6X<0 z^ag}j8)}+}4V}IA_t%nc`HF!%a2;n&yy5eKFswo#D+H2WcWWpx7z1G{1foJjt1t&XcHmO<1g28ENr|&6a?4pXG&N$S zSk(Cn$0p1^4Awo+vSxqO<6!rGJdf|etHoX92QP;zO$e{VY(B5^Rr!`H<=uJK8M(e; zB2<{2f!r8G*O5*<9kbyS@;Ki7Ro5?t3C_K8a)p8#Slvo%YfHoFQ-?!4W7&4t&Ea48%KAG}(tQ8`002ovPDHLkV1nmQBB=lX literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/folder__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..4f28e2e721599b95683792b0f112bbea0f444cbf GIT binary patch literal 642 zcmV-|0)737P)K^T2AyW4G+ZPL=F zid3aknnMu16utQe=*5Ev(Srxc$%_YnAs#(>>ZKRG3SyvMs`w9h5;35ZQbKJD)=-D?691w^11md1ROn+Ac95Bv7oSuN}30UeF0w4k6 zSceI4O^&4)z&8SiJBVc)QVhz#HV!Cs==f~WCr~MWLbdW0zMn-ZdFem0lko8S#|A`a zgo`9n;M#!!gB#XXFqOTBMpz^#kr}58PV3uV-+&H!?y-1CoZEVXTt}v%d`u@&vv3n5 z7*5R~2$m7kIQ^*C0*pC zszat4M3EUokI&l_Iw@W8)7kM@>>;1eV?X=}#fQj65jxlo1cc~}Q*So)g|+m?IbA$P z{TriG=SR0HpYeX_0d|@zP)QfNd*98>-3ulUYHmHP9he1hB42jBi3`jvxkG#hSFgQ* zX9w`S8f8;M7;YMpiX|elu4}p6zeR^CE5Vqiv`f z168DGyAy(cqTnJft0Wui!Y(8WMTlD$-4wEEkrsr4D zX%f@C`S8wr`D)46z-8vm%sKbmJLj=%n!^sp@Q9`<3^#rngZFmfn8prm+`RMT;~OZ| zA1Va0>#!n6rgn?RT$2tWjc5#0#5 z1#2Y-;5~xw3bb;e zfM_BfkDkx?>Blzic6h=*v1<6_X?_wfG#roM7}#0b*uaG`+!_lg+D!P2sf<>r zk#sv3i&gxqvyr`DMDQ9&()q=A^I|o&u=uc-4>;o}m&@Lq{Cp*|l|^RliwZJ2o1nPy vd`>)@zK+|&{LA})aFE_qE42LmUw{DsNC*}Agds<(00000NkvXXu0mjfcEkbz literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/folder__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..7725b6302f38d778403e2c669904e43b534a2df9 GIT binary patch literal 626 zcmV-&0*(ENP)(^FFM=RBRB1#I6;Wuxo8k{h@n|oh;I;K^5lT_7f}+$zgNPK59u#_0%PMIqqM@-E z%x|+ZJAH4nZ4g6~fwyn=?fbs>yTYE8;3EXCk{U#3=esd@%9nugEo6wsZ@-#>*1JP3 z3-*)od)u!8*X(?fP!5da?1~q`AP6Iy1a6bSrRb(j20}^@rb(ci1eWQ507O6-s}+G{ zu&Y%YyhqSF16MoHs$CBPUIx^3aQmbp0$(gwQ3gtRQd`d8&z*Uc-mmP~tl%ExSJymW zZE&1}OMdu5Jy2c=x%Co0+Ib9&jN!|Jv}cnvzV+-HxY3Czl_LLZJV8l8;R|Kppir=} z{3(az-8nqUf55=R8L*wD{I`fuUl^5o-ScPMKP40jUy;qe!{tl+@NoJDj-4GwPa;Nr zX_TOKqr_sZ=J_*DmZ=+Vh)U=}B(u7NL~NC4}lxo5Cx?gC6+fgd0{P{ zxU32T(_>Co5112)(J?H(c!qfF6pr*oyn45VN34B4k?rLS0-OP_a=cPT>im_dNSY!K z9X*NuaP+^0GOk9AQfIxfQ9-pXx<3CPf?vPI^~u!A#rgZg`Q+%W-u}bU)(a#gN~Myg zC({QP-q=`pyrlOFCck+>ybbLY#aLK$ck(ZP%ONxSTF=q-=av8i0G8iH!7J5I@c;k- M07*qoM6N<$f|e~FFaQ7m literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/folder__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..221176212ad7e7da026a1c1b692cf81e4864f573 GIT binary patch literal 592 zcmV-W0Vs@SVX1OfN8YJ z%l*;szQn$YG4aC3{dvwk-}ye4T;MQ+F^tjFhWm{lT4T*DY+X8`gZ8e;^*Kmc8ERQb zE)UOKZ*8UjU2%v4bfHiY&m0GY;XZ-#2^9UVt0-WcgD^gU^a(6|4+0PYVXSfl+<=u7 zRq!4`c?C)qAVoC~Y)=814r8A!{wENmK-{gssjb7W?}re@6ncncn;QkCAPLb>2n zzMrW>7^C~9#T$A*ZYpRm*9QK%pS-;FyQ17LGr!T=*?}w91&Q^H zv{xPkP(#a*MtJbq06uNTA)7=Q^DOGIVv5;Z?m7)}Q{$~G@fogS7xDt2P5;+bL{kYE zQ~eMSqL|KQK5rVDZj!5@%bR1j}o3ThxHW7CR_O%T^u zQa4R@XU6v?yGdFQT=FKEQF}%);;@6GBv6vxD&H$}t>YPVl4dP8(0K4hRhY{HO~&VSbM;ttX}-R^bS77rn4X%Rn<6vS zJ5SZ+(=*aPe?s&HD0k5L;eV7YFVcJ$*T2_hYiqT$TBAT=pV0Z&fBjd00RRradz4P1 Rv!Vb1002ovPDHLkV1hFSH<17U literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document.png new file mode 100644 index 0000000000000000000000000000000000000000..99396001e4c01d97c8ee408a392fa96adec2e9ad GIT binary patch literal 697 zcmV;q0!ICbP)f(NMwL68bP1&?A6wt~__3$`&a7PLQU zHchrWGwb(lca1Fw4m`g3``)~H^Nm=3B*9Gx+@x?4|JS}n5oWlfqGX09hK8;`ez3Py zLD={Sx3>WA$NGd3kn>~gI7U9l1YLzuKe!WL9IL#XO zl@dW)jpS?I7_7Ai39QkG!Z04VnLGy1oWR=R0z}_=I9*-H_4J@zE@Rc3JiU^=G!kmP zBAFn86B&aPR%=)yYwXmag8Y*Za<%*rdnOyV3O;kjm` z;W0rsq5tDotbZuI`MkTcwe2bog2?y^B0Z6y$T)^e9&r3ot!6~(;FWU{H!g^28{zWN z!ocY8==kvKw{zyst?#d^0}~NusV-(~->YY^(bD8o;rbqOB$Fp^ zU0?o{hEtqFps5XJOPp*JOw((jx{m34C$3eGhLEdQn%NjbpkV`CNH_~QWYZ}Wf4)a0 zF`zWAC?x{h=!|5|Zb&KD6G*|~I*xY;1S3f7*of4`I9T&u=yi1nH8#SsEXr&Hq;?875aDymRt zdua&)l6_+`j0J8YpU-1xWCY!j$nDpoqx}XKwf0EiKyatlFpUwBfX-Ixe~@a$#oc|> zaR;GL2xFFIuT@}3?n_^VAVLmJ(~!*y%vo6sO*Wv;Fo>I>QmHUaDeyrh)Z|kdlnMn1 zYL0rGN^uMx599GWhF~Dzm9@n6eRt>AP8|SkMTEeaek-i^+E+J z1&mNG7EOZ)>IvZwUy*Aceg0{C&z{XK;r3QWWU7QaXZxV$B^HZ$R+8T(5@N!SOeV;x z9Xz^A!>RpjK)N{6+7|EX=<4lw`f@}JeoQ{m>gyM22Ke72DNCiCvCiRQnEu0X_Isu$ slg=D#(h)69P2Hs{=O1Ie^hbaJ05}?WHL+f?!vFvP07*qoM6N<$f@zIY9{>OV literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_music_playlist.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_music_playlist.png new file mode 100644 index 0000000000000000000000000000000000000000..bddb6de2f7b326787d394624fad2e8e1ec55c7a1 GIT binary patch literal 786 zcmV+t1MU2YP)>q7Ok(20n?9K@p(_frMsm?(VkK zHryZE-8uK%&UJTAgP;Q+=O4fCe82Dfe$v820&7STu864<|2I}l6QkBbHtiE}5Q$uP zbhngAfaccVtZRni>kxAQ5^+>R9S$r!J%6XNl?}dqMHFuk&YD)3;Go$Qv_uTK_4m-j zLzc#}QbACZyZoBc3(om&0&Xyvlx}UD9zVi8ZHUdyLaOhF!{tJ)*Nb>Oj%8(F-(t!5oLq|<4PPE4TJ?|(csIXNgZqiPQ~C=5och7k$597SQRoaghU23*^F z0#4zQDO~R#h!=M%kU6uZZ^M9F;b;#yp=kzwsTy8uPSpD;nnN;lU6+WZz=lYnDqnmo zvY8F!@(ig}hFFZ@)?pvU-bpBA6r=@VNf7KzK`5Z$b_#?L%zyfb$njw)dt3;#*P^La zL9|mrTbuAkE-R4dmVw^R3IP)yFq^=EY=I(?4&mD}MIh|M^b*C5gGHoLTzH_PSS(89 z<_O2EAkmqml;u+!3@#^dZ(7BN3`Hvb6_*akIM+iEYIh)arrzRWlt4|D1Q;}d6;($ems4ax;1+0{`Hob}LSY{SpiYw`OjZzfk0eAFAq+Dh{4GL~!|-G{jAuZfNf4j&>i3zI-!b-2WVT zLEP?5(F5%7mgM<-O5Sx~VqDb2xRzA=)P#Dr&VfLFe*THLqW@^?-+u%c0H(l$yaQnG Qh5!Hn07*qoM6N<$g8t!Un*aa+ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_text.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_document_text.png new file mode 100644 index 0000000000000000000000000000000000000000..50810b11ca981b79aaaf3a430625f2d7f7ffe5a7 GIT binary patch literal 749 zcmV{BvhlcU4w% z!~6r8B5cq>$?y~;5h4U#BIwk$W0&yQJ?az`1ce=fAPn{-9U~8EPmFe7t$@&F}kt?|Z)=TYsWJ4#seYrUCrlCMwH2zWSbuSIK3;0R_r7uHmYeTBN9mQf1TgKG+jpVfv zkMj*h5=2k~-$x9=IRuf}wL@^%MRk84^?DtS1NtxR;4F?AYSSS>b&t{)}Tw0pdxZkoz_#S-jwG2}jlF1~Lt}bLcJ7MZNrY0xh zlDbqXh2>(gsqvNvn&8LM<00Lz9Uelh)ljKa;LsJMaT1dg6L4LZolp=&(!=EBwnM?D znM6t|$YhZ1?WN}qLIR!6k4_Pg0uLg(f}$w+zPyZT_Y8d74$af)C1h};(ZD$(3l*$x z0r`QLfRhK20+P?k#KH0DFzbcU(J(ldPKUEf37X9&Qy#n)SRoRZGvnBOF9MO#+m=eD z5Y=iG<#HJ+)x1K%r< zZ5xs(LFoRniSp;A_um?|N>$ekF#1tmfyEgK8W|^{Q$5J}hh>>8cJTTo1-GxTIT2u{ zv!{P-cx+<$-G_qz`0LPHC6Q=Q5Af41DIBM)o!AJlNOiHew`*OrcB~s6D*BwYwdZu? f{iCga{}EsSdoXL-3iPiE00000NkvXXu0mjf+KyP| literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_film.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_film.png new file mode 100644 index 0000000000000000000000000000000000000000..75b398da3e897227c6cadede7fad351c2b61fe2e GIT binary patch literal 775 zcmV+i1Ni)jP)Zy@;HhkaWeZr@ z3|>4-Vddioyjp492aqHz&e<2o@AZsP^!fmRusCef1f#%HQIEl)%Sa~D=s6ODNA*JW z`5{qqaqhI#-`|gPI(@brK(;Llj=Lqfx-jVaHgws5ZRFwO44Lo0AZ)Pd>FMHMIRTX1 z1#npGx)bMh9fh487`YslmNaC3Y&v?$kw^p<iVy2UIA`AbtGM zv>b@FluRc7VxR~@6P%Yhp%X^lv|$PfUat>_!z~D(80d;dqu_Mr00X;3-9@H$t*sK} z&$Dsi~=A8_NKQfeBG6L861H)LUdiH_;nvgRH3VRt8`T3ky%L zAQp=ukw`#U_zD~k?E-Mppu~WN$EJ__yHH7SRiJV2PoHuO@p!y=?rL0MoLIDR4=2;jM`Y=8o;5ZAOf}3 zRHO>dJjfZgG%_-RY&Ppot!t5!5{CL%l%{MT*wEhH+1=YYdH-?S-IUmJhoLx}dp0^c z+M;RN%mIK4XP7$^1&$seFh~+KUyEC}DQ*7aS?~N2U;s3tTL}j9JTw3R002ovPDHLk FV1hNiU8Mj3 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_open_image.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_open_image.png new file mode 100644 index 0000000000000000000000000000000000000000..a63d6295a4730d585c52872c90f3bb5237d76dbd GIT binary patch literal 802 zcmV+-1Ks?IP)gpFZEG{%ifH)_;{D|ZqTH!LuwCe`8hC;P<;Srz6M#0!DuZaPZ2#>ErjAE2!jfi!Uniz-Xy}1_C)5 z#m3q)#I0FmYJ585J}DJgu=aOEji+x=H*!RPs0uV$W{%NZhMHzCB7p!nR~Ia1Gi-J{ z+iPp-^-($BUBCZkp@2bCRp`b-VtL^({4t5?&jb$h9!ksX=&T29W}v41>3>T1<1JvA_OG(ELOU=&n?dVgza-feexhL63iKb_liIXQ4_vAmR=akR%P_9uI{U zj+9Dq{P!@8M`b4H_-fAdZ$-1h>TLr#)&QH;PO%AETrw^-NH7Qj;@jH>{`L!kZ&W0s za7BcLAm>bh7+=L^=s8yBClLxRGJ;PZMsVTrC~oyNe_08KBYGp4?+g>?P6{@?o(U}s zlB)+XsbVF(i=~i+#f2=xZm)OXLE`$TQ(S%+nVA_Ar~rKwIKM6->U#fX?o?|>wcY7* zaP)Aoy9?EwPpJVF9uLEwntHcTvWe)kNj0e7W6zu`_JnHUl%o&>-3PtwYP$=wCdU>4I#rVeW_15*Z^_~(Ao~0C_zCz zh@dDGLA>=YNUuG3(SrxQ_&@7_BX`HZhPNlE!SZ zv-896&F+@93Apg`GT*%S=G&QBVXdY5vQI(~`GRf`(P{es6S8due}Y2sqPBGA!tLiv zy;_Z`b8|#mPg;GSzCK>On-4ww7|U8ii+ASL5~+lYF$A_Uo&f5s^%&r^gKQzc+l|QZ z00Ce-r32x4(EIt=1t^mSd|arI?P?aJ=4k=M0jxg|km`a+N}5&5bzs3-P5ODaSszRd z7>vg>gLmYWHTHsW@Uf}>-+&|w7{hDDXE>gI&6%`qE%sXA?aRIj;Y5E*;LDG6{^X)eCEG|)h5cx$$J)2*L9=`lIyyX|V zeC~vJb$xH+?2!sxZid?(sc44pg9Yc~wRamYpT04x-&^(&`$htvvk(GTv&uNes37s) zHUH-OZ?<{$lDM+^$-bUHFHYTmrk`XBju>r5@2>y@0Acj9U}wzMBme*a07*qoM6N<$ Eg0zzxUjP6A literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folder_small.png b/interface/ispconfig/interface/themes/default/icons/x16/folder_small.png new file mode 100644 index 0000000000000000000000000000000000000000..b60ab4a1bb89ea7a61c1700a5ccbd6ff53d04093 GIT binary patch literal 336 zcmV-W0k8gvP){{8ur;ot9H2nPUN0}=;P>_F~Myn*=Z56FNY48MPT2jjm$mwbEu z8Z7?jA43MgSO6>h`JDlV|NZ&J@b%*-29t{4r9e3af?oLfn}H4Nf?q!%{s#vAw{PDV zUVQurmLuqbZ@(Bh8G)WR^$1hEl9EUc{5VDKPXhzL2XL{Jn%z$V1?q99_7 z;N|YT+|Ezld$WJ>XW(P@ee=C!Q2w?sA zY%NUEgKuL7i9LHyKfVE4bN%As63on$APhq&pD1Rno(J=Hk6lel-`I3Xf{MUK5f`OW z2?~V*8`xfdDiT2e*dsFolNlI%yNwgjAOjjE#|bF`dolx^8F=^tHlXauAdFk1d_a4Y~&-05{_WOuvTHH2q6_V$M6iYMkxk;#OqUn z=Y;cu4Y2fSk+s^wetPk`1Qw&37zcNKfJ&vpNvM{1eBT?3{6P;~Ru@q}MkgpKN(@X8 zL4wy`_CdW~hbt$yr(C3iai!a3J@xsy z6Y^Yqcadg)9^wQSj&EYlXb+Tf+iS0`(uL)tlPH^i{8a#{!eGSg=d&=4eSHEAwjy?(KjNJ&?|@SNpRL{#bK|G%&>z1t lEPR7-;+ejKk6+gW7yywehWuo#G1CA5002ovPDHLkV1jma98>@R literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folders.png b/interface/ispconfig/interface/themes/default/icons/x16/folders.png new file mode 100644 index 0000000000000000000000000000000000000000..b3af87508fe36e87c8080c8a8c0b63741c99aadf GIT binary patch literal 574 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 wRenI*24ML?`byev literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/folders_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/folders_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..477e7da065c3d10a2b840a936fdb455435c347c6 GIT binary patch literal 565 zcmV-50?Pe~P)maL_nZxvLbQ&z5*e^ zl#5`6pHRCwB?RKIW9P!K*pgRv#Rwg^MA zv9K~Rlqq6pq)JuEQYFe>OU=@;LzQer>W-@PPv{b=P94HO(5b3awGv2O=wyf#9KifA z{m%GNLlTyr^!f1l?z_8p_fQs#1^tgC_))9Xo_0E&-FCZ8syxPLyz(PyV-1hS`k2YTdmf`Y&HuCMxzmVo=>hjBq5TN$z;ehO(r74(8+P0zg(+; zrCO~zjYi{QFc=`%18%9`_b8Fj2wBOt?U1BiKYPVQYXsBj^aIq3LZLvtUJrqNWHn*( zNYf0;<#LqI=gG3nFenIu_mV*H!*yL&tzxn0pl<|e$ecj=N~m=`MXIXO$;p$~@cZKX zKCKZ%(q@uUspROo9+If45^6rkqoc>?`2HFA8J~jKm`X@eE|*VJDJED}b9lJ_7WPZv z$L1KtJ)>okt4ih38{5v)@$tbsynh6~Kez|oZkG>|=JUC<|B5@|+c%yJkD0ZiD0d0A z36nE8n3Kd3{o8|kMDBPX4IDTe4)3-Qmsoj|XyzlnFVJ$$w-c~4?}E&Xz9+Jc2M;k4 z703VvvT+$2-vRssJmqWP4-?71fxiL_ Y0O-lb1Kn4a+5i9m07*qoM6N<$f@UQY<^TWy literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..2213a2b205c6f68316690c69cd54ba310345ab89 GIT binary patch literal 732 zcmV<20wev2P)XCKpMJ;LU(uf+%WIlyyRd=0%emX+aw$3y_%ZX;Kc{?=KaikZ{~Y5Ot;&G{~0rcZSXK{` zB!Ss%CO{yH0>ok$uMI>%Mj#M~C6mdNqA2KGL#acxS_7Sq2YeN*Rx1TbB<{uu&;UTI z)q0BRs>9)cN~MC1ReaTqM>XJi5o|Ua$g&I;iEEPHqXa34rnA1I84fSS&)RRDw>Y(>wpxZ-gXgZIK1QqDyr(Z3Fe?p#W$& zwA#kdxq;#CHk;l{=f=IL<2?}FKdO}0_*m%vG=JE0W*3>yWwY?!u0eR#>3z1e6~}0R zA-%vb%)VFO`sV8DhevZiZOTl*Eqzz8D%yY0kB$N?FMixS5CH-FT_hTraxc@l!iJwC zYX$#(GT`-2oNz*VVQrIP*~k3=#7IIBvC>EwJn4b$HxE{j+(lv_MVHp<$DHtX{yB9X zH5$|XDdPZ6t literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..fd24ec75072bf9ea2910197f86a02af546da2b84 GIT binary patch literal 743 zcmV?P)0H^vb%BKvyqhc=7aB>efxGkGjHB3)9rTQe+EycOeQn4wzd{6m&?#*#Ev8c?g5!1DrNRM0eyLh||hHwb7OpwsC*M{_L} zi$S$oMaLRORq&Mwf*?U45P(o91gfe~C)ahK;SuOFoejevrl{+Bj%)~mfRTAjpP^P1 z_W;LnFh76(Hh%ZXvMgvc8dQ8=LCa)HCX=~Rsf6`#(TSljQpmZvvky{9_QU9KZIxjd z*inOiNGg@OzOwSAz;S=GnVp?@e0O2fJATZ3h}+Akmpun|m#Za^&*}7udzu!4Z1&uf z!+QJu$>Xi)aQek5hT$i%bwtuWL=;e|RA6Ic102WcLB919AKm=DPmP=z5k)zygeOKE z7p86elxQ0OZ)0btVJ%&U$pi-{_3V{b5R8uNWbN3%qjo()Z_pkeJ8B=;tBoeWsVhrM zOVBje6~P-zVD!_S-2kM*TWXW_^te5wM2^IN{wl%p$6H`ntKb=k#Ib2FVZzJ~0QtGL z0ItA%hl4RK3|u83um)VX_!PW+9b4K8ctl?kA!Gdj4yBU+0y}L#N^l#?5ZC1aiCqVu z2OFn)hgzSkHrXaqLzcz9@If-ZGnq4h_A Z0RYK->XBohdbI!m002ovPDHLkV1g-YR)qin literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..40c0cafa1f8653519ab1d49c6bdd6dbaa68d88b7 GIT binary patch literal 636 zcmV-?0)zdDP)q6vf4&dyu%<(WMk83+5k4Gl(Dx2{<%PmjsfF z$u-Hv-}jm;iAi02@O$68_rCZ0e)oOflO~f1{m%&TR45cS>h*fER;$rqFbMW7S(anE zu2Uou8O35T&ooUBc7X4nI6Jx^z(|(M<M~;<#al2^MR_Wh#Z1^Nmxw_lcFfJ zvy*=YzfYd$QLon%kY^HFW0FiJV{4iwNEAg9mJ_+Pb?XJrKLX!pt04bX6+x2CW}k$^ zOmMDdbMxja>>mQ(M8?}~T0c3V2gkxTwbP-EYL(V2 z6-pvc7fEb18k|TPkH-PYk6A{XeR+6#N~C!oR`R-Q=kA*Ku1)T zq4FERTHYgiIrZU}*0~4XYwXC1IpS3I3YQqT!u!CT^FNX*@CmZq27WOSNGJ{b5nupe WL&6uW%9Z;70000^`fW=l1<+b;Q0&IR(l4B;Z!QMq9}@PP_NfPlA2H|$w1RXV6)l4;cyTm z;5ZgyvGDA`1O$G+KbA};SE|)2iX~(XDisOLW(Ke;@I0@ZEH2JnBSr%T?RNVChRcE= zK)GB-VFkN7FeL%QaNu&e!0mQ})9KJfs;b_{p8zMaS)fUxR4S2>@_0NkQeYScJDYKQ zN{=jS0h7rD(P%J^-+Lt#i*RLa?T3-Na;~^hhppW@ajZ^%rQE6=fMl zaY_REueYL`jE|3BwOEM3)-==8lM9%CChYz7iQETbLcwzfV3PjFt0g9HeZGlXJnx1` zByb1MPY&;wKVCZj8E|h7Wo))nLLw2`1h}nVVxdqV7YUtC$1vIGcf{I<>lc2Y7*5Kv zd~_+Do)3(S+>L13%bvkbI5$<>64&6y(}!Zv>-En4Y&2HG02z7*ow4I;IM~v~fwS@8 zqvfTv_rSMxoHjGCNCqg1GCsD*y* soG0bzX=;6Jl)Bi>9YnJI`riT!0JS;qS2;Z#8vp`#%0h0_>B^F7TK}flyAuGCWT{jtx~|IsY}-b=?Z7mTAc{eR!(l|DQ3eE6 zRbUv)_r@47$!4=gp-?EcS}iJWlUist+Xw_?P*-T0#zEHCpFUtfV*uT5_Z6ADsZEgiZTUB zlCZkE@R;&GI*tR&vbc&P1FbNSOeSL}io!u8N#K?ZGM}G+M)CKgKPOJ%9}rAWPv76# z`cjajKAWYb+2=Hew}R+t;u^(tJT;b(d+ew`@5q_6x-Rm&0<0kK6G-*q{hh*89=>W=OCwvb=3nLqTKcM zJJ)XM%<}aqGZ>ZO9rv7hu?UxnTptI$0|N8d{#VKCs^Km{fWmfE@$-b8$0EGw{Zp%X_!={u8fAv-T?U` z9v-gojJ42*X0Hj@gdG$vAs|3t9S5|7>`{@P;n=`p|Br-i%BgXH#o!~#NK^4P6&pA= cg}(v}02f>71@~yg#sB~S07*qoM6N<$f`}hEYybcN literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/funnel_small.png b/interface/ispconfig/interface/themes/default/icons/x16/funnel_small.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f307969e6bdb4857eac0ec158f26f1840cd6e5 GIT binary patch literal 379 zcmV->0fhdEP)YiAjuyhlf!_MC6BIK91@822z z{{71k6y#V2l;1VG&D5QIXE~Nn3_@QE4_|gF*a$W#B8(FRkN-qcE^Dsg5yuGZR37 Z0RV6pZ06x2wTA!z002ovPDHLkV1jO&r``Yn literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear.png b/interface/ispconfig/interface/themes/default/icons/x16/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..9db64b5837dc0abbf0ce73f90c944ad36dd2cf10 GIT binary patch literal 740 zcmVU(LhNA*#;9_Gg3s! z{3+boPC8cX=lt|O(=)v5q65!)U*6|=zMuE|KEX6i`kzn4Z(v}6Y&IL!)zy(82!uiH zcKb!9d`G&puIq7&t5hmv7zRZmk;4J3kI73ME^z$7200uKPimS*gM)()xwggJEsmc# z#w?HRnEA3KNq45ErY1ce&pn>Smdz@(zyAv}+E4=r4YZa|z>@raKk^|KyjGM9wX~e2 zR4TPD%W^viRo;w^4%H^`u)#YtB z44nYvg+hVAK?5y3wJq=}u9nN?ySuwT3QJ2%8{9xjBoeFK+(`gAYT%%O79MNw)ZN|v zba63h&dq%?gdjN#3B_ z?S2u9Et>#x)WAUlEj-nCWIZNP6v^py-gLQK6MWw15LZ@yn#;@E=J6Ud&{~sMn<${g zM5h^N7$-pT!#dCV>_X1{`O4S%%hByEGZaRay_z)udU5gy;y+%n&iKvv!(QXB00RIl WkcEbXM1o5I0000VGy2kc6B!iMe`1t z#J1~-ZAXnoOR0wf%Mc8@v38*dDJlge!WR>|;6ouQ#&$8g_~46Dpgt&B6uS$pxUJcZ zjWV^gy|n6y_HxdiX4Ip-^wbY?X3l)y%>Vy0^D~kp!T&5JeagzpfMr>Tii!e;VSth< z6pA8*49h&HD2i4Y3x~rHi9}Wt$P2-(s5Ya1f&pB2cXzuW2w*aq&Y|ep#bUNJuv)SApA0K}VcVRsqH~9TOX-AfPgb|0havVcPDlIJ~`y3Kl-0mNcmX;0< zhr`8joQ43h_4;g$&*y`rq-3b7sydJE)|C^?&(A|35a_L|tG%RBsle;?Ku(Tc6N!jG zLN?FyKp1g|OEG@Ge<=Z;Vn-+xIygQ3jUOEy{e%Sso6Ytfi`z~@Hu(r64sj_)zB}aS z=U=efUrEEmPbI6>A~~H-$zU*CqaYHp$wwG*h)XdjOI-*CgNi^P2!bGjC`PcAN^Gkl zEVqhm@)1TH;!?~?5w%+FPSl0usIIO#SzNq5YjSed(b!nuL%xQFtNSuCQn*{=5E}DH z9)6_9^2^p`MrcSr!4U4|N={BWTToD#<@5PLr_1L0`kr%y&&_#ZYU(q%L#fe6_G{8R z7K*; zPX7qQvdwY=y2?6~L=-jcfXQ+(Sq|A)pSL*9Z`K~V_b}`9as7n(k&|H+*JEPi9>@u3 zpkkIq`LCxNU4HYj#4rUQ1e?Qs)%Pj)9{~mcW}1e^#AJ}@00000NkvXXu0mjf7F&E5 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/gear__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..97e8a0ecdf9d4b4b4ef051cbda39f5ce026875c1 GIT binary patch literal 833 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/gear_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..b213087219ff7eb5e95224af6d1b83f89d002c9c GIT binary patch literal 663 zcmV;I0%-k-P);WaIq8u$YdSt>2!LAV7uK$Y)axuh>>YFL9`tLC?1dJmPlV*E>{Al(E0^~ zj~H^m0Q=V!I9QIy>vh?#!m41kTCweR+i5f! z5`A8if$&884#s^QIbeVV=Uf3wG7Li|W3$=JDM=F3G)V+k++wJ6HvG|eS8Ozn}cCR;^O%osFt0eG^grD>I{4<5F%H^_rDS+*0-xFj*>V(7LWUJMB4^SqPd1J>Gi^Xs-7-;m+tp9~AfJ$C+v-%Q?#qI)uz$^H=u0Qm8y?c8C xWIxdt;+nPq#`A)k_>X@uMvD3k;+}pBFaZChKHTIlmazZ;002ovPDHLkV1kj}G`#=- literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/gear_small.png b/interface/ispconfig/interface/themes/default/icons/x16/gear_small.png new file mode 100644 index 0000000000000000000000000000000000000000..87f66c5236e915f7470884f42c28cbeb5627cf07 GIT binary patch literal 445 zcmV;u0Yd(XP)`{{5HX@#BxBAo{|EOZP$I zAbGse2=wD&Lqij78yjcEef#!2eE9G-!?tZ(AA{d?R7@bmM-*}%AW0m``m)50ELSnPp` nfBg6nw*f;lFHmd%K!5=NWdq0=;HFCO00000NkvXXu0mjff#lDJ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..d12036a6ebebe59a5776b1ac793cc62fd4d2f98e GIT binary patch literal 554 zcmV+_0@eMAP)(Q;R^{gb=QR7UMb>+M<1{AnFn70Ybrz8y~=^nKpq$B$+`ZnC9P6`%a7z zF$Htr$8hi5?>qP2bFLv8jWUf8fdZ=FZ7>*=zzgVfyIt1r_rDi%G@%jazyZOU-|ye# zdEOyOl3cA;uQ4x!_Gsal$K%m5pzQCxUhlD7E(`H^d@mA-Y+J3?`C_qXXti1o*hLo! z{xo3CW|K7<4W-lR^xEzAtk36LcRHP3x7+Q=<#JDoq7(t+w8Y53DwWD;_$2z9i2OP&Si^amsW^>(WG=2%_zHls4yaF1SghQk3BX@JvS>g4<9iMB*0M(Iciyx(kQHL$%ZP^@vZveJmCu zG4=MT9`P9{iJ~}ETlj+MjMqdWL1KDhmtY16U>ZyTE0_cmU>umJ%D@N=WN-w?fLd|| sEUV>N1PfqJHJw(?%&O6s$)^AV0GWV-S+`1)W_45xbZc1>JTL2ws$AA5tk^DH^-kE|v-l+RAh2 zBHTqOx(VUHcG}mOJ3X(sk~sFlkMn;0|IhP2?|Ujd9uFuq4k;ojWTR9ntsv`2zECK@ z*4EaajTD(sXs?k56m;0__OlGbH1Iqxq*AHRI4>Z%^2SPw#iC?DqW_d6X?bmJ&EWNV zZ@As=i!@Cih{xj<*=+V3W>LTZdm2C{lL1i_i}`$B%H?uKo6XkAvaHo?Ha7%=!PR21 z7)O9o5@Q5NCX?l1LJ))%GPk+82_}=tfyPEs2Q&w2W@bh)1B#-crltn8T5VdTQf&)J zz3^C7>2$gZ$E}!|0DCoJP+MCI?d|RUKp?<79FE82cF=4v91brV3sD;%kytbumCItrauUuwUx&8AX<&|?>Lw;Q-J&GEiYyKc z43G%Fh_0FN|O+53%apS3v-c zPQ#w-GP56Jt0uWr%9Jx0Lfn0QeTOC{CM4`XMQ$IyI}hyfri81rsc|U{AQt~dYtjNt zy;_Ko42F?jj^mog#>U8BGKt*We$SEwqTG1o!@?58qw(aI`Nd?lR>SIy^$>Uxh~YX3 z3_pB6A1N3SPb2#g15%IFAvB^xH1y^1Pqz26O!tq+bUhEQkQ$N<^pQxU6Tk1sxsiQH zHKInUb|Cvyr8;xl2EQyz34S;qe)N_^|1H1(uwN(WO?eda00000NkvXXu0mjf`Hf;l literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..1810f6118eafc1aaadaf72f3dd8b7bd27d0ad92a GIT binary patch literal 779 zcmV+m1N8ifP);&Qn_!90kBq>)s$THQpFh)^z< zp;D>*oygLFg1tZtn9$qP({om*(-|U>NHm>Jf5LbaDIH9#F`Law0<`*XQ4}}g@i_1G zdapa3&cXWn`sP?HMvBGa4_rkV3mhr{g+c*xxtt^jf> zZq|4P6~j$!Y_E z02FgcZLP}GAyuGX#Orn-@D#Z?G&E!mg+e0w{%#9-a^(ULyen>PQ)k=uuT==mkHC)b z6*zrU8;y%15GpW@40=4C*4f!v`bu6Sx2^4XpCveTL}loPnmAv}?11C^6sXuN-VcH2 z>eSuzKNYy_^ZAbZ{r)QY^T-{9fB8;sC<)+gG-^&9Ws;!g@{muB?|s!=4w{;^t+;|4 zw3QDLdL%()9I5O-CTZj*OtzbV_FE6W0C+FaV{vH6&%D0GI#(002ov JPDHLkV1i zQ^y&#|L4wx*tb3SeKYgTd;j;|_dZJ^ksu6{fDSs~=X5$f2H$}?9*@anGWqMs(G7;Z z10DoKLZQ$$&+{HxmX%JY^9lP37@3YMfk1#IK(qhSH0`L>Y6+=S>QOu%zvpy1FE*P^ z%WydSf-1&HaH;?q3Ua z`At!jW4hPvc8SmDi$Zvvo&&@QS11&i6>uC!91aJu+wDE8)jAKL=Y_Uxy=4a#@Z>qc7=nAojRgtsV)2Ai3S{t^Wz|q9|sH#iES9GYh{qsR$-A zGsexdTcA;|*Jn$?rfpFXJg>2WcfsduHcK=72K)w=4+eW+W5L<76#NX_kHuoaTCGMe z%R`Zn!{_wEFf!5mxHv|7NVj2uQmLfk{RudHiUp;-g>z(C0Q(J7;5CRRlgX?3d|tzQ z4!pX9rGN52vb(eMkHG%H!Muex;I1S|mvgxst?E5^U^;Dso2Wo%RDkRa`uvejr)Ne> zAHjJbfHiOqIKf%43eEtV(Yn<86l~ zxtu{HnC7>ho_FXFJ@&$n!+Fm6{ojxC9OC!;L1b`93n?JKJDpAz`H9pUjRv&a?Y$Qn zS`ZoQh#rL*hr{8~Xf*nCI?Wdfg^yV0ky`J?eHM#FEP&4br`c?7<#IV)Fc`eTvg|pf zQh6wo$&hNb`W;u%zzIeMK&4WFa=F~9*Xzw%tu}76*^V0w2CK-VHi*-6d;$&OA?7>SD@#G+me<_ zB`Mz9ab-M=8Zvu{|nGqt=4cX7E9y4 z!+nqJ^J8PrwpmsaauvDIFK<32ud6$^1hd(E8~1Nt z8<6RKzW97Tq1$OUrY2xWezHW~vh%VzwOS4R0gsSxfk1%Dw6|BOym1GHC? zyGv)`4A%A|Qu>t<2|{SVJ%k3(mYhP4Ad|=htzY$#*xU?ZX&|CR(iwOXBayWNt{=f4jIg9;!{NsJD( zv$L}|{ZTHLw^^=UuanJY^TBwIode8?OQ+L{E8sYe^m;w%bh?IGt(FDsys#~8qtVb} zzJQgL>7ZZ+Mx&8D9#1Tn%ZWap?=ia_nB6NB3R`BgIczeSmi}kJJDtv0CX*4d@7TUi z3(N#JB8{(GF)o9WAPCY#d|FGiew64TPc%QZ#7vMqsU*G$KE>m4*5MD}=@i6k7G{tD zf;=)qg?Ioy`~7|2HL^omMmVzBY!~nM!8+a1 z6G@byf#d~LAJ&PwBUUdUUs8?5Pe33P3Y|!$QhmHX1Gi~;hUm(STzqcjy!YSbet7d< zHh2oIhQs0G$z+oKC2Qcur0UW%(Z%Tmy2%EvYiGP)UW+C9n~LP|S2P-BduHOd07p&O zARPg-zyJ<|L-a`h(YiS=VPrxzv(VsSDi({27~hTe&DM;zGzGL{G_qh;I@=I;CHgkp hps%AW>;6}O0RS*007t|hXvqKo002ovPDHLkV1lTHJgxu$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/hammer_left.png b/interface/ispconfig/interface/themes/default/icons/x16/hammer_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e808616c4acab4c2653eb7e7fb6b94f6ef358e2d GIT binary patch literal 620 zcmV-y0+aoTP)j<1z4!a>d53#+4B>P-Sv($RtD)2BE?~F@a&)lY@Bf9_Y+h#Z!(y?-lgZ@O z(P+e3tyZrf2!>Xx^%WO2ub`<+gw3*%G6;c$Y>57z!aQWa6a$F*ARQy>s{V7J?u z-|s(znq0>By>vSL-0SsTU#GtYJ~W$6nZ&f98Zd~M+wB(ccJ2^b;@jY$SS-pIf0;}s zan-=#a4?(A7DSehR>cp&N4!cBAA+05H_3qNqQZm3@%<;@b1Ic0@fh6KN{{2XqXHAl zcnYLUCPQL+@Vo3kK}JTSQJL?7@7ZjY#MC7(*$Lxkp->?4Z}5hi6F9&Iuz}M+0F*Be zjA{$$sbR@ro1Q(Wfs0@hoCoK?S>RSpH&io=YNVL_5nuo|Am4?KAj5C~0000<2|CextX>%S(dr8gDePxm5q&!AXoyabUIDB zTyCpgX)qY9MMXvR2%5l`OeVtxpTH8nn<^?Qj+B>|AB#jH`_|Xjm5{8UF1sZN1OoML zxBE8mE-x=nClU!#tJPc(g&?r7u%K^mZ$E3bT2E@V+WmgNU!dk2{vZt*DN$&0I-TDB z{{B{<&sQ7@g{C1Q9!#ZDS&&I4lSZ@ITx&9!4waUc?wOpNoX=*nen1Kc9>Y4+*48%S za5!4AB#8%t!62=ztx+@@{Q+^1X9hWyl$2QF@wk!4_*t>JmbtmPA)C!M($Ue;YBU-p z-l)aJMOs~5jVTlgBR}&7Vp*zKEXGtqPXDyBvN8!vdS6vlB^}jjHPzMC(!|8XdyB<# znNJ6@?y0G%fL^b+>vXyXD%7w}X;hM4x-}Y~&t?np^S0qimW0D$Ie***+ljkGzvRI| z*{M>^-xT8TtPtb?`PRS^^al%t&j9amO^u9-+)7hZ1mW?|LY((PaO;nxV7ml9)YaAT z^b*I3`koTKjoa-q!cX1_A$cIU@*fFr(rja6BZrgV+-ZC~A{uZ)lIZM|5q>r!ME7$D z9%Ag&w(wQ(wWXzn!)b7xe>4Mxxp-gfIFl?CR>`Fki88U;w+pE}#ZGffnd55M8?i37^g|(VJnuOhD)H zcxusOzo-}N0Q`osly^%7G@y8f=;HyRz299fAB0000< KMNUMnLSTZ{5^KEx literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart.png b/interface/ispconfig/interface/themes/default/icons/x16/heart.png new file mode 100644 index 0000000000000000000000000000000000000000..f98dac0304179df36f99e38f4f9724f8c412edc1 GIT binary patch literal 747 zcmVrE_J3#BI!yoiThdKCOG^ic4i;6*&Bh)7RT>_G$%3dKt=LJCDhNt5n2 zOOj1yyR)KTCh7C~{ZvUBi9{$N>#t1J*BO5V2Kk zw}C-`0q+rejy={zO1OV^czEsF%1S9`+qt&qwZCs|O?tK3fHWwKj;>x_T%5KF1&cKr zY<4{~KqlidA%mqXLNK6wkk+ud@xq6oo` z9ETL7pMyA$*hvhiDrHrb9eQ3xYNS@Xg%AGYp$_3VPU*tLM3FijH3I_!u|7=9i)otC zp5v55A)eysv&>Jsk!C=sa3|p0_I!VGdT6MS;aoNPCJ^hI7X7H#cUzpl0{2-jbJA{} z7)u;{^P|Xi8Jjqt&kvb#tV*$L)^?*&_M+%DXphxy(&^IVz5VO~r%9IRt1HA{H4M*P zG>oDoe{8kNl_+`x?xR0Qc0)2F<A(LMQ2M#$5z^*bT;c$Rds_CMNzO(W0|IdGq4U~S(c`0 zb~>FVi(-H_IgZ8{vSC07v32}lulK;fpoFHXxqLn^l!J6#hqxp$Xbi<-5zKW1 zmSv&d@6YL|!M_eMfq<}zb!HR=^4TnuN6fB+o+_6M=TYoNt`Z)Gfhva4Run~|8me6zBc7;kns>tC@VVW=;Eqfp!C`~` zS{SSwCXZc)?^||)@6+@wo0g+Sp#bcmQU-t(e$4B-sHkdV(C70ybe(Zx7Ea`xDCSt! zc-nQQICQp$f01oslFgmDUybc^?BR;PpwU~^Fhp6?8n(OLK9^-N5Be^^vxBGMdD~EN zJ|?ZQHQws}o?t^b@_UZj0TWcuyGSy4&L!=l(IMM%2==qX1-p zDM}N00000NkvXXu0mjfw0?RI literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/heart__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..d90fc15c33d5c226dfb51294a63b7841405ca3fc GIT binary patch literal 829 zcmV-D1H$}?P)#$Nf{Zjoa%P;9 zXJ$N?nRA)l+TIdhJMitbIct62-s`dnr4;_>6Q&4Zmcw-%?RA8NC?j5>^h4%E-x!)< zL`TwtDUCfNbBqCV0oT=2E{-SZZPx?4kl}q%Brd|pVZUe-^n

    vhYrXr)pi zyFrZLSCkklavp^-WKVz)LLK};cWU5bP{Go5vs$gnyFrfQKz?nFLt(IO8@wF>p64On z+G;w;!P8v9-i}{bSz1bkV=;LH^W4-ls2T?BwwOmWU$h~Ra=`u`gyLLIb&#{wKGp@q z^B;?gYsB-cTCoTOuP-6lk3I%j1PC6dkQ%uM{w~KWnOcr<7?;0-3!bB49$v9nOdd%j zB4C=Fhyp(JG5Alq5YL{6MDHc2lvk@>aOIhNl)Ma{ARyHK4b_v9X+}RUFOR09(WJY% zDNvR-hebQ(LM)wuo42Om{zQft+?M3e(fmSkQIJCwFwa9%LMBA8`rI-MWhY_jTN)rh zBBjPa%Bbk)_NT!1$|^woH9+(&z$5p9BQ*B}iNxh0AR1u&xwB;hq7JdP&|w^v+rj~X zAfknJr+~|EoqnC4TTXHkXxp#yE^s`!A`do}hjJWL{|Ybwk(N>>xY?T<00000NkvXX Hu0mjf5TAaB literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/heart__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8c315a4b7fcadb1c463617b6ca6758f9406166 GIT binary patch literal 751 zcmV+wRw$ok_dVCdH!`og|uRn!=W!U0j?I zF(Oupi87Kb>y*uER=wV@Ezuzw3z6#}hD)D-F_v&_Bs~o}aBBFD;{`#WrB0l4s@G}~h$#$1ih2aHEYrEs zQI8`Ar*)LD>%V(gtnC ze%mmJA^kjphhQ5-L6RsZN&X+(u89~CE8oO~b8OTR8HQ20FflPqo+o8MkcBOUiuvZ)L=UIq&DIvNe;>ybFo)8R;?sp(ZdL3Z20;uF?eygSLlPMb z{7XXU-$WX~kjX1tj9Fp$LiDhKN_qt1F*)~8ab=*rX}in7sJN{zCXkRvRQ(Cy^9-Q% hNZcP??dh)o0|09`EeVwoy0`!U002ovPDHLkV1igVUnu|p literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/heart__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..175b98096e961d61e0628b2befa8d01bdc4a10ef GIT binary patch literal 837 zcmV-L1G@Z)P)YA_A zNefG65sA^mYEcxVLb)k|HWDOMt}0rz3d&82Ub}1dG@lNrD}ZZ`(CKemVtQ6U+BJ zaf~=XD8wxBjJQ*__Y(Vw3R6)qXPWuuvu8WU`unRyuk^y9Wwo`(wsd#L6;)LVx?cD= zIM}GC(@U7TvaYUoLq|umzsiojPI6Aqz<|^jiw$iJg7Z8D;E0}$U0p4v<0zR-2A1bV z+bI}C@gQTh$jn38UrR1Q6{dK9T?%{qPU7yFE8sqa zkx6GDEQjfkhF){UV#$Bx>%>G`Wqo}#m(3!t>#z$2SgjV0^nb>!^bb$dwD_7>tQw}tOBA4odfuqXSZebKaU4RSkUODiiK6FSC)pcTU}0w|15iar zZO2h{!)R=-s;ZP6hnFdcOg5Rsq9C~Axm+^uIQPi+Mmci`yBCZpT?`wpt7a`LwmK52 z3i&?I#H?5&v$F}^b?=kgCI0V}LtuTIEJL?J7oAD>atHpMxiD;w1)wC$>;c)lw7TNamAHa!GN^4Lg9V z%`BBV1+^{|T^^sAXRx0kXg#Go(xQhElDOBg{XdUjhsOn}a_eyHO0- P00000NkvXXu0mjf`Voro literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/heart__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..9bc94cdb261df7a2f73e833ca6e2bd1038242982 GIT binary patch literal 781 zcmV+o1M>WdP)>v3Ll*zh7zUGR)I4TZ6IFaBe@5+ z-sWEH-ObIe-`oK?X`STTN#^^%Z|DDJhIyVx|1-1|#^kKvyNLM)paU6T71qxs32p(? zb>IZx0B^uO!|ZCJRxsb(*0y+QdU`-NO}${-g{}4V9y^%~N`p{G$HIk)iLen08BQkS zY^<%dW-QBr$x8(W44509ob2D{T;JQ2kzSclwovfr^Z6srG)=>U#udV+RnP}>UDt6OFPqJ> z!y+kYG|f&KastLEIWl03c^nJgK?W5RC7pbJzgR39hee!oO2lFcjHz5MlQ=L?Rh7Eh z+xIy%_*+FQ*XlQZMx#Ta&Q2qZK6AEB#X^A&k61l`9D#-gvf^=zLsLCIc?!Vm-JP8n z6T&H_QpB)*9pXlC^$02o1r){kW7{#Qk=p7pVnn$R%bS~ zE&W~Ys~tV5Ed!+0{ltUOqm<()ALH@a%gxQF6wa&s1KiI~y}Xk1Q92_s-BhXuxU)iO@m9iaHqzi6BA{NtX)p;;ks?ZwNaC5d>`z9x5`zQ-~gd=uott_9Bcw3Q2T# z9e3T`ao^6&o0-0E*TlRw@R^8(GP@(Q^Nlgo;MIGqKufs(65CP zeUo@xN3qvVi%% z+CMzpD>On&krk&0mqxjGuy7!>vc^K;;Gai zGtEWMaYk3N*=}kWcLPFV!Y9izbar&qJk($|E@39{05Tiv>lT&<+;yQ^Dk%|F9SUT5 z5sCNM-rfS`+)=O!jZ(0-w=JO&S}{aGyk9ZRE#mvk+1UYt{k9OI7_rzOCu9c8orna1 z6O$x}N)p>Gm9~V&KN4Ww@%{AD($Z=o9_OuCrs&0S-5oa!A1RdnXrok(DGJ}n=T|Xc zT4;n;9%=>v98tFJd3wpVyHfGE0j?V?SF01JRdxQ1rky=OX}DZ0u2enm4RT)`BnJ8F zk+np_cbjwFV(e5;OG~^*QEn$A5kn%x&y>q%iSxHedxE!fxc{=aw_gW9YZwLiX8C?w z!F9X(6(u3a3)QN*#rZqrPH$qdb7GefpPO6!@7Ikuhk@Gxo?VJY$Av9ZuYcMFxSz!$ ze;?x?4S>l&+_jh=Ndk0U0eC7LUjZKG0k)e(HXf5$OWt^m#{#q>5~4K}fCaE99Qmfd jvpH)hB5Hp{e*_o+LuO2*;iz%V00000NkvXXu0mjfkd14j literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart_empty.png b/interface/ispconfig/interface/themes/default/icons/x16/heart_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..a7754d7b659bfd7228c9bbc71168c50dee9671e3 GIT binary patch literal 626 zcmV-&0*(ENP)mB5}^y{|u$wZex~c6lu;OM>r5ZllhG(zNP6E;ev1^+)`~wGgoZe2B8oR zhjXP;NsC6K#(KTJ91e$hP1AfZh(sbUi^Za*s_JUH-3A7OK~C3oi%dSqWFQgV5J4yL z9r1q<@q49GSrZ`#AVv-~aKMEITE%f3nT9_ek84CQ#nJ3wFnFKMX0c_4*jodaj8$lr z+wFEq z^!G0-bJV~A7n+m7;c#F8ZD~aPpSD`9=llIW<=(geLk=}?z;$)9=hitnzMs$MUz^S5 z3tH`|TR@B)YT$?+o`zJb)qXoU{;UN07lZ-GGI9d&?r zyInS&P9F`Px# M07*qoM6N<$f{`v8p#T5? literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart_half.png b/interface/ispconfig/interface/themes/default/icons/x16/heart_half.png new file mode 100644 index 0000000000000000000000000000000000000000..5046e3e010f768aab84aae61ef40e769f61c3481 GIT binary patch literal 759 zcmVL`rw<}0lS2wba zv53(G0ZEV;Krh_65Kk^1G#y=q5paK4~)4phjAYBV<3PE_z3AYw7l#v#_r?$ zF1QAo;0HF|#_aGGMl60Fj6~)i&dm)Ak|b!Vs%@{X-cV&(B-{QH32@|3KsvuUZqedbPTbI zWm)$C<87iY&gYY;yW3wb6fSeKB&mCNdU}vXMk=Bxmhr36Hbo+lGYE%m+va#AWHY?! zy6&8xpR=|=wOXZKNs5h)kGnh9fZevi-8M~=AkwNq6SJ&WtF?N)?r%G}4uyQ4o9ODQ zbQGS+vfK;1hT_`17uVOrY<40Pi}}lnLcdj&>Y7Ggi<=z+VkVObK;XF5KDP_t{eC8s zXO^WKr4liOFJN)6m-7`EiX7hE-4#*5@8D7(YgpFnt*xz}k-olWz~>`37cZZthl9HG zudJ-Z8;!;e7MEKB1}rWnQSz)-d$*Iz?OzwgW`N^J{2KvjnigAHTDq+$N)F+t4Z|Q8 z?n-VBJYSV`{cY;xB-6w5P5;FybvrVUOeTl&`TPNP-E@5~kMid$3OCWAexjELhQVs( z^3zA6IEwa07Zw)o6bgkyK@c|30cUM(jdHo%g}|qd5)VRT0wStu#@BV-zp=P@Yj1B) zJv}|$OsCV%(b3UAFP58*1O`AHkxV9t))R@ui)b_&$G?C_kLP<4L5G0r5CJ|JgF>`w p$#T}cAD+$4UH7`uI+=e27y#GKWQep-8UFwP002ovPDHLkV1gmxTxkFR literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart_small.png b/interface/ispconfig/interface/themes/default/icons/x16/heart_small.png new file mode 100644 index 0000000000000000000000000000000000000000..52f2739ccaf7b9cc08a8d735e2ca1450f605c039 GIT binary patch literal 369 zcmV-%0gnEOP)p5LWhRjN3FPNR{QrLzuK|A<7$#c>1!?dK3UcmUv0^Sr%rPuX z{nNX5-;ZwGI2p*b!fU`U1_oA60Re&MuU|77ySuCW{ri{U#hW)A++1AjAUT3w_`$&N z{P~k7pI*Ls!~g#6Tkan}elUQdT3Ar<6G)C=AOaPwIC0{{6P|zn7+61jV&MJti$Ri; zli}fm2Twq91YH13R?A+0`lNT`{(UZOE-uA?fBrCBdG+f4ho3*UZ~)~98UQt<;>yR5 z9DjfP3Ie*H;rfpsn*@PkL`5SE{9#}y*z^56Cx|T$WaCoDIGPt200ImE&FOI38xiIL P00000NkvXXu0mjf!&;pP literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/heart_small_empty.png b/interface/ispconfig/interface/themes/default/icons/x16/heart_small_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0d9a87218553f08297c4c6191fe507f5cb0a4c GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xo_o4DhE&{2`t$$4J+o>_KMBCrGd9(58j~_qgeEkkA6g11+U5k9Lduhp&&*WjAf%Kf>18_=Ka4@yY~Sb^m!^ z7;dfLc@)2=;^X863m(WVS|rH!@6XT8$+x%V?o-&dW5*A^m{$_+pP85)8WvnkBUr&NA_{G4$$|)cq@ci{_Mq_t(6)rowH++12Pk4BE_<#NS zB}&kM9}Eo7pFer>>E)X@{O{ksD@gv9IU%!HGEMBa9@#4i#f`Wp3h>AuS_`|?Zu;=@CPKIsU{)&r>@4%&waWpS5 b00bBS_Y!jvdJ20~00000NkvXXu0mjf4!5YD literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home.png b/interface/ispconfig/interface/themes/default/icons/x16/home.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfd2813618592d0db02c89ffd127b348bf9335c GIT binary patch literal 753 zcmV%;cjmFNH0V4n$Gx##tIa&pq8 zaM$ZCzFJ+){UgDN`QQ}h<`!%*vl_p0g#ChEYiw>V%FEjt)dZ50*I@G&SH=hbm@B~% zhY`Q8M>mXqffXk>Aa<_3)znnrc4uSYaU&9PkIO>P_Z04m8id1Pw6{OUs>tk)$%z@5 z%SJe4n&$Nz4Gr#s0vBvH8|HtGBFkMSi-DI-Qlpw7c75H|bz;yz)Fv8qQ-i~T+^nsu z+g(_=3!0``M@o#dTU=FD3G&cM26}tzX>ukW4XZhS^X^&wIj7TU8RMO4`0neJARg1n zLte^ImW$nU(^8XAQo5&7VN9B69l6kG?Vg$Wmy@TYw1mw(>96_t^#@qG2%jv=g%OT0 z##C_5C5C-{xPQ7>f_O|P4|yp=S$^i&PK1mwH5aw0iPrlUZ8+-5lYBt%ZTSZ!Cy(&c z=%6guLxy!vY}p8=u^?~U;c#HnhV_pejtYE=$ww&~+Wt)3fO4 z=&^M2ke4!)Wv!i`F!XIoh`P#FG_c7An#NIHUS#P^HqcedP?ly%c+@@QoSR?d3b%vV z<0R~M8$zKF0)YU=$Hy(5JmjSeW$80WrT@%!@eL#b88p`~;MH%=vjiPk8g-*168S9Z jo~8QmAaIB19{~mc&iDA?U?;>000000NkvXXu0mjfxea2D literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/home_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbc5b967661dbc2997e7ba4d7f1c936abd43eb9 GIT binary patch literal 858 zcmV-g1Eu_lP)*E=bOiA0QgXF90!iQXF%5mio$7%>fnXw2@VufC=a9< zrRZV?qQRVt2~Sql)@HGfQ+av9&Vo=MNrTJtPGFQz3Ll^ z@%L53)@Ly~-EI@be-&(@nM*EIR;KFpQ7|`Dz&~!UWEi*Hg+8|!9*+l&jjfpH{S`Yh z`~%`YEu@K}c=lX*xjr>D1`34&_V0s;)bEjuU)n3BJ!W&$tWP>S_r31xucrZ?vHOu1v$KXJzQ=N z(@}pS2YA_5kL=83iJK{3ow61EVxNlnD*a?5k#|7k&VJEV!X zC=K|y<`8-wbNDo9#ngNbyRugY*Ehc{6sM*@tb-$1zSvI+!100{K&4W`>2zX9mw=SS zFnpK*g4Rca)oL1}M`wtRZENT$By}Bca42mRmM!uT*bE>CP)GqZmIt_RS_B_$5FEdq z@an>`Bzgs!u04852U^XJ(f{_-e(j|FH{pm9yizSesZ_w_av{gniW81&=qy+TK@?#R zSpoCaTVH-zjd#9Y-`>uy!BY0mtfhA#0MN1QKY@o6ghWzmo0-pYU$6JwXzbzqiGXEl k^?h($ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/home_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..eb4e40d3d30d25f981953de0a185858e645f6dc1 GIT binary patch literal 883 zcmV-(1C0EMP)jRppp3R;2TfZHZdU|qbjbXDzWB$U_ zq*uM4Qk7{Y^!Gl0;8WG7jDIrN$Rd|stg6bi+ZW;4jY=qKdAh^({1)u_B?trpXl}lP zh~UrVqu-p+{wiUUrfFs8FI}={W~M@tBzQ&!kYeAXJHOnm($~08Wl=jjI`+Qq?Q3EJ z_qo7kW?U#OFJF_DwFn@+f7|(`F~cV8_n21p+(B zqwuliWMw#dQc?wejMN}u@nHEBWw&C8%%lfgIVj5`HznVdtqXz^bCw*!sq9R0ujRkvTR_YKDfmJm}kzx7iTxx?-j%0?}KcOj%B^x z%`QVAjqPvIH|SsjK9T$*Ai+;YK`jKbWdsJ|z_#ofnCLhZ#b=Ua^AaYqny?-z*YEdP z-JS_5Py>j;q+>8hP$NGh+9tqAhGCXG@O&@PXS3vnHBOnw5IR zJ_g(yr!-|p-eh8&O|!CkBV{16cZ>IaiPl>cC0X<;*i zG_2KBFiUN_4X*dSxzoTGp1bFMzvuV7zu$XzoEAVd1;=sV*nJsv?WMR7rnqn1fIefq zw2$(5idl*`EJ3tbb1~sXM{~1{JzT1&5T<6ppDDFwovLkl;JR6UPBB=cc)tWx-Elgt z+1aUb;I`9gtFEjho{9PC#rat*EG(%aVnG{eJ3PVxO0P6J9EEv#+rlx5#6&&Pwwlu4 zd8SOUx+qL|+^_tiI6(1V2M6iSwKtlYEM{{S1|K&fHm5{R%)6h!Tv~%*FbJ3H8PtwLEx1LST(@R4PA+P(N)}J*P42n=|NXB<} zmkh=uai(EfR>Nuu-90BcDIWHsJ>?wF%ObW8pKnxl&&XKeOk*#y^KSiFfFSoq=x+Iqq`6ggA6oB6yebGRvfYB$zWVD zpc7f7ML!b4yGJ^K=_+=~xO6mAR0m_9~1+XY@pX` zp-D?X+sNC*1@Lc#`RI6181Oo7Sy;z^S2_=q> zaJ`^H^$E+vyDvst>7$>ilh`-2gZ=|?Kspos0y_T?l1b^ra?>fgP-v9qt;_lGVc-^{ b{{$ESjFs}rPQTCO00000NkvXXu0mjf+*4~G literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/home_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..02503c4a615dafefadf38e961d18ff04ae2640e8 GIT binary patch literal 849 zcmV-X1FrmuP)A#mH+Z zkD>5Uv@wIA#jJ}7ORB1?3)#mByPf|s1afeHLF&HJn%i~dhmV8<%;KCa11GOIodxOX zMrGr&(^+`x=uyGr^$(8veHa-TQ%#9^?Nr$lE#y#ox}vITv&E7!u}2XX7mX#!ro=a% zFQ!Oc1iYTEr=lcvP|Tprae&mb5KqOPt1b3%X8 zh6aB@p4P$!S(eY9D=V|wY$m8wDvS>FW2v=RF@Aqksq8VEM6*6=Y1!57>8+&!T3LWR zN-mV1KX1;@Uk!~$6D}z#LLKHj&nsXWR!L`jyMuL3=%Z}DAUuEhz;Q^g*N25#y#e34 z8Wk`;wa+v^>&q+e5fZ(U<8BHxdxjxC2HSUJ9_9#9L~Lz5RuRsgl=Pnu_3T?0VxMw)?yna}VZ3PyEcT%3PYym!ftjDGt3kuh-ZhR$*cj<`Tf*6p( zb0X7PkfkwY;yRrU@rw!i`|6NxwxH>;3%2Edy>q!(w-ks3>FFQBxENsIIl_mBrO~J% ziXsMv`!FcKL)w~5G(CC-Q^qksit?J1V&IO|fz&j*(fip)1Bg7C5kQ48={G_PK4I_i z(`crdSESjIV8~Lm%!m21-xztPwO2nfIxcX68blqTK&@86Cw@o%0T=3T+=6LM2@Fee z!8ARDW z@$sRe;bBcp=FP%FGCEgr=!ZKT^q;qUK(1SZ3SDw?45U&itkZf#>2gG;;Z2ojV?GD1`o690%)sbaJx$Qg z5*(rAUTIlbVp`f>$mMd+mV6a550^+JBAABlq^GN^oORCAM};>bonM>FFKaX!k5H)z z##C>s2*%g!OvAJ+hQ$(EJs~(yjjZgXJdWo@5nD&ER(h&OMEv7Sla-yt&oyd)ANfFnREz6`llGOeFyJvJR5e!zizS94F2M& zJ+M2R3^bmI2^jic)#GG_Rs`eBHfR|~?7l>d%Pc|7TlBCV-wa~2J3MpZ*R|ksEQ%9X zsZ@9!vw())Jok|nl z-6WV0dqNvPX~4&qA3*9_hj1Zv2ZFYFN!SeFNgx#y`1vUjC#Ye3HznE~DKh+Q8vZpe z6{hLc?Ptg6)6hPqS+Fhy2v6e46YDeQJT3eC1H7FlB#P3B)%k>|1YvkOg%nuSP^_3Ru+$;sGwELe1^`b< V4y$8rG>HHJ002ovPDHLkV1mIeiK_qr literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/home_small.png b/interface/ispconfig/interface/themes/default/icons/x16/home_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e2213d6361ca8867f51020ec5397af201c75c54b GIT binary patch literal 412 zcmV;N0b~A&P)9Ft}TIwtf2Z z$K~b!|K>PdASWeYo||U-N?Jyi;l`d{+iG$?vdLhV7li};PA1utQYzz-i z?qmoJ^#Ic#K1duSk2e~>eESX-V`k%G;OFOIc>DG(mb+(151>?{zc??+4ej6**!P;3A|fB^vUGj_)rbS4%60000&Y9u=)E+S9bVbifCUMpIenw_q)PzOXsrRHv^hCFLC_5F^>QB< zm%p&G^Z@OJ72Ne(s5?3jX@JTB1f>?|*MK;VEo0}RgFhpV@m~kuhCfjkr%+NsDFv_L znP_@GfkUh9Ff6=w>v<=1g3L9$3w^wT@sIFI$PNlKjdW2@HhOzwzkR2GqP%?vrBI?jWL8bt4UYgzeBVgOM6xwO#&}dWq z`k~5>tGrKV+@9Fg!qPo=+i7pmWufq2Ei2q#ODsI>?tUU0##L^X&MZJA)QW! z$YczpQVh>OwsE#-;>BtmBSuUJgbu17oSIe(09)$6gCEaTbD`F}3U)z>YQX0oWZ_*DEnct25T0OPY0So^e5B+1Fi1xeS< z|81LWUA!Raqd9SJce^N@KAAHQTd3Sys<|6)mPMZT6+;~6PB6-k*9xmaAWnVm?qx)i zhRgANr@fEm&%^0D?>^st;1NRZ$N`>+{BHpU0AFC@t1uRStpET307*qoM6N<$g4-%7 Aw*UYD literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/image_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..179d435193f4709cafafe83c35179dd10c5185a6 GIT binary patch literal 707 zcmV;!0zCbRP)2Npdm1ByQp(vu3 z%?+Wh)VB7^E=|+KbCL_O>}m_V2`9<((yY1xoar~gSYFdK z)Ty9v8-a_bFS~(e2}l(Ix6_6}#rX=*8wUE?fl3V)!&ttmX@m{J-g)fY+KGS^w!Yle z2DJHX(HaGmpe?J?WU^=r7|T~xmDCLbFBk6Nwdlc--6Pl^J!nN1csn)|xXTZr{+fkg z48t2a55_Ro64dA*v6z6oMaHAj0~AV0L|Qr!YKoxMAAm?jwc;x%-KUXUeh!g4i>g6v zfvT#U6{paSY?;TOoPfvqPjHKikUSD3NkVV%D~5Lwh%N_I;zs<-45Hm9!B{3BI!&O2 z4nYtExLhuHJRbOb5@gwrfGlA^e1k4!2%{IKFfl%e{K^Zu5=WVUaO`9>v@>gOovu}- zqCqIlA;6Zgo<=MdgI4+us70*h<}CrAT3vNGoK8&N99^eXOr$>CM{8>UKYzzD`|L6@ z)i_P%K|c8e=~RX%{+^z5oYxy(uhRxQ3)?RpD;@72>h7rP1?-3}VCnOK)fn&JE&sUl zRJ=`F1OhFY?Tbdi-5X?l&pzcqQ;RDI(||WPf^v4+dX~$Sv)?`@XBec>N;kr%4pXzk pOuwC5O8mQf{r|1Zq4HON0RY|R{&}h6;-LTl002ovPDHLkV1kJYMLqxk literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/image_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..8e8fbf583e27cb76139305ed89f891d6a14461b9 GIT binary patch literal 598 zcmV-c0;&CpP)eK@`Wovp4%|=5}u{ zCMLIMBDq2#5uz3riXdoVp`Zwg!9T!1LeRoe>;h>5Rsj>xf51{LL@NvNlExxj8s*~V zHha5!yS|yV5JkbPz)~BCGiZ&{@?n}XwF&EQaAIa2O&RKwPfi2VUIjWJLFY&X z83B%4jLo5Z9h zZL|HtU=5~1qo@eQqEtaDMN|w}RL~ym&7%q)BnnuB1CL>L=J)pfXZ}Rjb!=vsu*t#Q93Stavwwqpic?ip zy4~OZa3l1M(a}LpRTQGpdpH;)FcH9Frm?7G6=1jHvQ@>=Vgp{FgJxAVAhJgXV>wxt zQK1H%%>-7C9<~Es5lH_A?3OAFYMdohdO$U$UIk#%?#=UK&jAg zti-8LSc%_3nnR5BTHa!pt+a9Ca8@jUw#cH06(L4+uZa5|iZnr*Ylro4z=K92{{DCWDn zUo!)u(gXqj5%4?@tJMlY5a4u*aJyZGJRT<+`6)OuAJ7{Kh##002ovPDHLkV1nl>Fbx0z literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/image_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..c2967cf773644ae9ae89a29538a19a8e01ef7752 GIT binary patch literal 651 zcmV;60(AX}P)txgf^G`!LRSik8?m}j6h!=>2J9j= z6;f?XnocJ3;eBtiaASq`!r|RFGv~~?A1n+*>?9QIF!;>E!dW`=+vGR6=Xv(^>FL?+ zu&>R{UFBZC&jRYh(c26P1L85VMQ}YpbSJGv;8bie2b9UH7XTLyg%Disx-NVYnAppZ z;Pi14$Qi)uZy*_u$ROeME^yEWCJI2e56KZ+-g8|hE_UiA4(!GZNY) zLUC6l)+1+GEfNr1-g6x02LYbFy^B|xj#HI$I95I(Evr1TEd+*ipzqT&Do;<40C5CY z3iRo+R9iwelf``d9$M`cjP4#oerOcKX$whJ)S*j3Lj^P{&G82Uj^ilOPOE^m4#&n% z6%W=wAgR@0=mreKfSEES7Bv!&|H6@61+#~5LU4ru^TjaV!m$HQBf{<$z`9@Q{DIV|(0*Tnwgmdrmde;H%xQt7giO4(a&T&G$; zALN{Z$V*qsg-`cCuE-b5-fMACUm@h}|6;~?Z+|O?;v8_qR6*0l2BEzrs=N&=th8UO l(KZEd5M%SG2mT)c1_0l*>lb~CCaC}b002ovPDHLkV1iFT9m@a! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_resize.png b/interface/ispconfig/interface/themes/default/icons/x16/image_resize.png new file mode 100644 index 0000000000000000000000000000000000000000..3c66a736706690f71ce177979690f30913a5f1e7 GIT binary patch literal 595 zcmV-Z0<8UsP)XHC~rfL4Dk_lHM zAxTvPs)aO7WwROf&i>nH*YLlIFxs~_KPnN|os^0o4EJ$x&{BYu26|_UL0EK70mlSN z4sfXqEX)G8<}u?NUF9N0naG{jP+wDkUPo6xE z|4zI^L);D?Vz+t|_g2@@56^6d#`rq9tX zW2QWf>cz{rF;~QCydrR%vp7C(4_Y|yEkg)Fy_Yayc+|!eEYriUSWrBs-)JkWX-?z> zwmsROFJO~dUO!$R@(+$EZc?Jiv9_BNkcomc`c5WF-mPr7%Oiczs=wED1I)SF^MT}+ zC476%55Deftk#1~Zxlgk_WIt!>hr!6se*n<{^Ht;H~T+7$WO2C4ozNMdr1UKgS(*2 hHSTTHFy{IrzyJxv#7ZKm?8g8A002ovPDHLkV1nR`3RVCB literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_resize_actual.png b/interface/ispconfig/interface/themes/default/icons/x16/image_resize_actual.png new file mode 100644 index 0000000000000000000000000000000000000000..5e4a6bd23737d7c0278a8b526ab22db26f23519a GIT binary patch literal 635 zcmV->0)+jEP)&Lf%0Oo(X` z(-~>;0SZcupopdtqbt#cOHo{O;UDlvxbX)R5&Quz#Eou5Ckq3Lf&p<;5jS=Ot+aH= zG}C!p&%F>y3U!kUhx<6+`R;ely+`4kW0s+GR{C(9GBizts;aOo3#MtgM7;hFq$u9b zP838@ge=RDrYXX38@(qNq3vZ9AhMuPD0UfB{5k~G;v_*F@48vG6)?t-Q$cU6DzFPe5nviX z#RQJlfm8FqmE&CIPAaGlnM?73mL$nKk%)YelHE_!-@>@uQ4a+iUpz^%0tlgJg9y>kTX|9z)x6Ksa%6m&}(0ilTaqseyP9AV9`(w*}1WXRc*4nBSfr)ZLJtsnmSKtFPqcGsqSLYq6b#n%1X z?YrN&m?zK4%yEF|BW1791M_X1x&EAbA)n|4=6!l`GuZsupTbIlS-X*8#_?Bx0RZ5m V{YRLiCR_jj002ovPDHLkV1l#SC~N=# literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_small.png b/interface/ispconfig/interface/themes/default/icons/x16/image_small.png new file mode 100644 index 0000000000000000000000000000000000000000..7d411b90e0b170e71ace72c9d74d88c11d7c89b7 GIT binary patch literal 346 zcmV-g0j2(lP)Q}DxWn^TO#HAP*Ue6oD!#CqJ;McETQth#^Gq43KBM?_EUYvo~1wX!jXZrK+A4BAP zCI&$+p#Oln_&FIETs0UN98~{-(UkpSU}Rwf%i}fR-rc(| s4cy(!a7804E9*;)*cr_W3;+QJ0Q=QoX$1siqW}N^07*qoM6N<$f~9Peg8%>k literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_small_sunset.png b/interface/ispconfig/interface/themes/default/icons/x16/image_small_sunset.png new file mode 100644 index 0000000000000000000000000000000000000000..9341f40174b7fb796cc19755ca986e7b45849b96 GIT binary patch literal 337 zcmV-X0j~auP)Q}DxWn^TO#HAP*Ue6oD!#CqJ;McETQth#^Gq43KBM?_EUYvo~1wX!jXZrK+AH%gx z5Jv!A1JMaIQPcMsSRQW}eEar|@fXm5?K|ZeSlNUa1cikd0a11JuX$7{g7yLVq2xVx9(ibhse j)|VKuGny9|00ImEvmRvp>f>G900000NkvXXu0mjfKUR+V literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/image_sunset.png b/interface/ispconfig/interface/themes/default/icons/x16/image_sunset.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed90badbac4e0e5208c533eabc3036260097fd9 GIT binary patch literal 532 zcmV+v0_**WP)qh?V^)VzfE`mPMfuA)oF2 z!7a@Nhe$gRj)aaCbT5X{W*{I|_QQ~AV{m-@4APlKsno^#`_53nIb=EozgUEu@e$ny z2x>K`ULV8|I}pTnb9H$M-}mw5$U|^5g%vnWZUeK@f%^ zr|Yb(wd|QK2qDmDcxW~Ss#T7;`CDwfNF)2&N8`%i^lO0UGQiuF1jLfS3JuET)L-F+ z4;fnF9U9-8XkSZoS_&^c4XpuU!qE)|Wjs0Q{#ygiU^7H;?_uXgV3uzG}#VC?CklHkL zl9?p)^4v*U1gS(ExO2GYp7Y)BJNF#s`#%2Xlh0OHk2Z|4IWozA$gfKEcO2)?k$REK zy&QxSqxCeOe6vqtR$E$MbM^!bT#dQ6Piu_7YnJ)FGnd=YSysP;u=(z#J7aDTIKo>v!Ij%lKR_ zAT^x9wTm~Q6O|B0z(|h}BU8snJlO-VEGBK+{zLbzD~reKUVHN%JQIiQF$KV-(xG&3 zuATWyxq9$Z4{P|+Ao^8-nY05_F;F@b9mZqOG#{M#M|pyHGr{0F9z53%Xj^T-XmL1n zsb!i3Kq%^9X*rGYF&B>?9YBVtuvC+i=hKJ`#bIo3!}_ro08E{AFg#-XqXL+PnhynfNV0Dy6Zj_=~Y z;`sK-#m~Brt7>k9FmBAx@4PM)db6N(22>K)f!3vCg5FhL%=%MJLhkS`1La0|s3<@HMaHEAldI^epsqiIiD~Ud& z4aH?)O_FZcCbUyCM2<3cogO3=HZ4g~>~VteX|x0?nXiCzj)0~ilgTjKb=I1d-TOi@ahmO zmq`E@(uedtF}mpw!7Dn<)&g?ZS0D zUv|C#WOE!gZJIX>0uV)h7#fbCsnJ1i&jLgd6_#qUt|o#&SqRx=68SH47#z!DVsRrH z_yWOoe4U?HB!F84n0)^k>C}1{iyG=17$UVQb~ZMnNUwk!2*PnE@GfPb>ZyzV!~8KW->&O^ zFT`3J8*l!NCPwW{d;3XFtAcY5+p@Ct3|ZRSMl}^!;Roz_AV_^U2xwH>wjK!Sz`lgQ zd^*jt3KT^_K-XcKCUZRxd&(U|42=ddIGKfs7Jj z&xVKbX1EKn+yYdutA$Qdd6_@cTH5 zV^LIu9uoW@W~QfA2~ZpY480z~#Mmm>Ngc%{4DlijHKhsof?<5Mo+Dno9mkH}#f{6A zPH)eNfpc9~@6DOk1h*FzG&Px|+l1T=IvQ~17~T&IAs7*GojBmx=5cmp)tyadgyM49&{|n8J`28RVEQ3dje?0j^a zb#UoJrIUE*;^$@gTa!;QJJJfpKMub;i~R>$@pf zu(|G4L*4Gx6?u6+1Hyw5IgI2~clMt-m7I9};zN(zWQ|%_p6H(ew_0$4y3IdaUllG{ g^cJoF`o9S<0L{_|FS%WnH~;_u07*qoM6N<$f=;VX!TUqDAZr!LW$H{h1g<*ni`Fo zrZl-X>3wRB6!m`)oRY`2}*AfOfz9X;OzrA(NV>K}vZkUo7H7 zaT%%J49=ap07+Cr904O4Ax5S|e>~X+uq-BQ+x|oM#WN2M)V=ch4R|IF+hYoV3#CKp zURyc#mvXh?$8J~fu}1XE8ZM_Dn2LeYq3AFkgRcAF%-_$`h&R(1Jja9Q`T=dL3G6mF z96Ho8O#&bk6_}e(V|d8L-8(xFAu24@+$yk+xF{?`*@bmtG9wup-|FI^IPzc zfIRCRAJ1yBSgPCCL%P3QH;h~#t)&8~8pbl&xa#OG^3@%0Z_?D)ar_cs0H|*LWio_S QaR2}S07*qoM6N<$f~@c~)c^nh literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/images_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/images_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd5889ea1662a021627b6b9a55ef949683e1e8f GIT binary patch literal 750 zcmVz%&hA;leG%s zu8Nqc3tQr1Nd-QY1lfWWJqbPaP_JP@KM+Da6-kI`@9l#SnH3fqQA9?RA_e}iu11)a zZo8B2&h9$1Gu_!;CD5X1;LgX~x#!F|_ugTqY2tq_;Yx4s`U7LkM~Cwt@C$-<*L8g@ z;kwq^+VeM>7{w*O|Fl3~g&+t}W3hBTMV1bAQjQ1masYJ|kmz(sfSq#tw*&biaM)vF zHJM~-1sumAR}`Tr3eyb(2i+P9WjhrzXsHY^Mnp*xT2l;cBLb@~ktOg^Bb_|YLlniv zk(n7x&D?{lpcLMUy%0%?jYC?Im`jRO5#NGQG;@{@>&30k67)ZGA}2>eo+Lrul8>UAYLxA6KtWjr05rB+i^aiQAfnrykEU!SbOIL11zgiwj$!MnzQaU??fKV^6gQHn|W+u7nkJ7)xU} zaQ0XoYU=9;V>a73HUGV!W)-xxkvS-^ra`L#Ey3`4EP%pN8$ON45e`Lhz}JG#uAW)9 zW4U|qb?PkvB0^kMnNCfdn=`UaGtvZ%V@R4QC^3d_^9eK`KZi#H!GT-;{KbN>QHn#f07)#RB@elbqq3*8h z{t9&7?eD+89wtWP=IH1(L8n3p0jp98;vQK#H$pKD*w6%6HK3X1NHd^Q?8FXWlL4Gh z_^4H@EFj>VBWxHb7K_Z45@+`~h_>jok-_omi4_v65@=65&`JVo-%3LuNrmjtG!2Gf z^rq+L@M-P|I@{tnxcwLmLJ4sML`Im1ECXGUj=F$tGvPSSZ@!Q39$M4)_{2N#cm$4Q zN`MRHL;0Q_-|~lY)#dkI%;QUu@N*i>mG=V+ zy#g#(I9xi^wk#4L6}2!t5<^e7hf94Wh!7Q)YO--_4B^%Yma|#dg+&acQ+Orc;Ar^} zlHwkIEG=nDfIB2G`|&ICxy`W326paZh;`{W(w#u4B?=jCh9{?yDNMmUbrKIAKg>QK z%nWeskp$PRgs5RiMFnpVwMKm75^{E=B${vii{U~`QNLF23xbopLZG0<~ z59McmUN(v*0|CYvs=kMk&5{1jv90e+uv%~nFq7s!_5AYb3r8p)8g=4@+Y4*9ZSU(L zOg_tyFo$;0&!4ks&fIA4?To=D+7LSo!Ge#h(}<{!{;R@3 n(;fK!0ZN{rOVI0Pvcjn#JW@p1) zWZ6VC*n))COLmCp=rJh7OZyLW>##Sw6x2Bif)3tvFJ82$YhA<;ArBn{O{CUQ+ku&) zb!WzzdAIlb?i8!IC^Yc${+M|_&-Z!13~RUB_@9SAo}ULn7-N6uJM#SE8TEU-dq`!hm6XXU`|t}BlOJ#x1dR7`9xpBSbbj|{ z3Xu@-6TlJY7atk82Iz7`0?76ODY+ib0|VxH+`m}_=cx|B^B6zwJX`9W`Tg3a5*|k9 z5Ox3>ryQ}&^<|;ZL)Jl;?=@s4u>$PxT54`l1(bs}nr0%M7V4gqRAa|)-qa5_|<*OllS}DLV3}iAHO?DWhnrt@id;WG^hiu19dJ0OfIkEB&5wj(q>Ky}VqLNnK7kh`O^Ql8cKKz;Hsa zOoaV!0*&u6Mvpr0rE|I6z;(eX2T|`nu}^H@rDQ(t{I5^>v9XG7nuBNgbIAFiUY{f9 o?nbBO$S3R59#VSU2Y&<@0E&bcRNW(H$p8QV07*qoM6N<$f(nupmH+?% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/inbox.png b/interface/ispconfig/interface/themes/default/icons/x16/inbox.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd80454b21b68eb84463a17f991b786f496d88f GIT binary patch literal 482 zcmV<80UiE{P)})`wmoE+0clIHbfmi~?9vbbk^g1vr)K-38e<>HV7I4H5{b`^DpnGeuPqAesaeWs)si7oOux z;_>$UN_cL9Tmfx8d$4EOHma2h;_>+0V|87}VX=sqWWMW98o3^}SJpPShQlEoS=lg* zxdk|fbD3dQIuJXd)p*1h3}9InZ0Tg4_^)v;Gt83XAs33uf((&_X}fljA`qf%*lE5$53pl-YE--{KM zP0Z$UXf>NN1$fWs_0X41WJMwoIDP?F5I2Uy@3Jh$PR4Gg^--(MG?Q7fJp?Vw2FF;h z&o6&Yk*X4yrM`)%5bQ-=XbhQQma1Q(-o3ee_|H3d*HPzL4awl~qXl_xnyxJSoPPxv Y0CRP}poBWv-v9sr07*qoM6N<$f?Mv~;Kr4pP<2vcfj)Rzt0~%Yp8e$S~P53?g19NN*Y<9)W{AiuH#RaKi_TP~L| zlFK13IKPV@H0Jp@)^en+-84`Y~ooyZOj1_`eg z7LZP-8w!+4C7hp}+#O00mlUwd=4Q|rSxgMEE0e*-`g%hFirxF3!|HY%+3&VImUxO@*6$>tNe1vS<0b$3!e)?SZA8wsQ!AS(Z zUi=6p*^05Vqj>tPitfavUbbx^#yM$G{yFtR`v^{qW%1}?AHOs$%-gBq0q^}LI z{10BN%-mW2-`Xl^x$n_pf0TT~tRgi&5$zc6!He6|hFX|=N%62in?T22IDF-Ce&{vl z^o?D-Pwyuzet6gdKlge$%D@CH(|WTyHRDK4O?45;Ah2yW$cpN^T?*M3f*U{$R(5i)@>j{JfLoBtxl<0UY9UVtHlj(}z zE-yn>)jloRFr_VAo|#8^HHX+xTFjTlh$RQCQLT3SqEN&TCz46*R4VUxGIf z1Pe}}R9eA^cN$i=fXx{VhO#?lQH-4IyWwz9sx3iHUBT?l7g$`F#^%;b1gvu)mYELR zhGBwoKQ=yp>8(w<1W(K>-a#Gtd>+pph9L+1Xtj$VR&MH0I43WzBeNs@grZKO{I`HN zukWF%uS1Ub(J;S4GZ18Je|WKxTX=uel?BHTOkEvK!V^(E)*fcAKNjvTiVX>6?ML$$ z<5jl!k>3$odVcJ1f!rhM>11Z~lwba>!0kZWy^rSZtL|Q6Dx~YSW)ftG+&&E7xCVG! peEY-7#`pf$`Gdc*jMhH^1^|Do`aLyXg*X5J002ovPDHLkV1j~HFz)~W literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/inbox_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/inbox_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..43e8399fa136eadee25b77a8a13ba2dec316a877 GIT binary patch literal 516 zcmV+f0{i`mP)qTEQ^+HRV zKA}PfhITNR%mx#aS=jvn7XN_FVq&oQ158X73lf$F4NZlLmiBq=`*q#(k~SXEr0JKO zlmlMRGgl2MUJ6kLig2H(_z*xIl zxGp@$X~*T!_O9^U7j;O#0U~`X7K{G5*=%A&a)?VK@JKwB$i!2~%+C4+rza;!CX;~%l}ZK6D=R-!3F49h z{`vOi&qatx6UWnOl%Jmi4Jc>SYN$&S3972X@f)~;lQ9&&%d#0MX{q^%r+hwOCULp# zq0h2xP_%G&a~mL*4o+b{yaZQRQ6L<#!0Sy!gdi=Uf1NKEUa`8k^e2CCd>CV!^K37z zA=~Nd+#50Neq!)<{?WrZ?P|XaT0h?9TOiY_tk>uKEx-U!v&L=x6o3r?00000)+jEP)RO6o6p8Cpa3}8Cg$s4lMJ0>ks@*8+%DQvWg=hsus7fP72(}t* zY_)%xgd~&9-}AkJ1X4>xdf~uh-udpFdxs&6G3=xq*kRFEu_j7@Yy8~%pX@iDeUkDC zyl^=C!dLIyBu*zBl-2}7YHntluneQ7`6svH%rd>yWRN?$4wThzP zSU8L}&TOVX$<(xPu(`c+pQ@@bc;{lV*sy`{2(MrS%M-93SF6-gER~>X8g!ndQHif6 zyn+!dH7tbM{6XLHS`OuM**3|t47b}|2a3B)CS#uqi3Rv)Qz6=dvtk75@pbt_zAl9N z`)$L^nHdBEfw~6SY!*Y22v)Ny7T=|C^4#&}`S|SuiJBp^6({g2ZLB!S*dGa zKg%XD`(8(MbOQH>&%=9!e5QuUs921Uy=C4^B&nvUR<5*w&Uv#q@(m7(6S6kOD`D~l*}=T^~`8-IWx-HSUnf*YaGy6Zy7s)8Vu6l{eSx~LyGSh1r? zO!F}xZ=UZyZDs;{y(+vW%egbo*<2w zexY<@@t&sZh%wd$G_A`PoFfc^E;g6$KN2BNGcI5ajZaN@zK^X+1*U06ezsPtp;#&* zB{e@jzOxt)akhVOc%h=N0BVcLL!mq5z;%`wpH)CF3v~|Y3T?onHkF#GGi!APAbA$xr|&c z*JDtvR&jM<;rJ*^T1vovI*vLQRZ=c-JfFwG{(g@E&F(s@*l2ymw7j^7r!FH<23#;& z3_)#Kno*LYG{@Ygm7=s`#X3euzHL^FcVOz3rVI;i7nhZSh_8bzVp4am)uR zNEMAacIYB01ZC0xy7`?$2P4;us&@j}UzzzmfA%%4-MOee&YLJkUETBP#DqPl8`KZq zoHf2ZeXD*J{}X>r&p6E`M*oQi#@6VEDM8OanmFa=66Dy3#3k0iX))V)C3oS573kVB d?2!KwU;y!t>B?rMI57YK002ovPDHLkV1jVN1(N^( literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/information.png b/interface/ispconfig/interface/themes/default/icons/x16/information.png new file mode 100644 index 0000000000000000000000000000000000000000..d39b18dd117ed09b463494a3f6307226c560ea2c GIT binary patch literal 725 zcmV;`0xJE9P) zNmAl38k>qOH7Fv8s3=&mDtPm6upYb$dh#w5JbCftRTPEZOAi(lG!{x*vG#{i+teo6 zo!#!v&N^?CZBs8EeDK|!*?phyzL_^mf*^qZ2{pV7zX2dIfS4j@BnO0y$-x<^LOX9& zY6gNpCI&x1`0^%zSH@Zf9WiR?>fO^P3#Ebn138+E8(3h|+-CD%)-Qhew04Wx-cy-3 zxu=2%PWL1p+#VY)2SQMXZ3C(usez-JRR7_0{`KT+&+jb;kx8ueKFApfW&Gyo@p7|a z(t6zl$8q5Kqg*H)HyS3`jM1x?ieqrrJyBJdkkF1Wyo|^Ftf5;yU<%WNV!~d6qFi} zOeP`zm%;kl(mFC7UEr@)7QQaX!)3)2-Jo@)LLrRHh~_BI1#4qvbsm`x15tGuo2X1p zRXo>YT7rTqb>-eNTps@xj#2Km$L8NnSGdC_kU^B-&xBtg@gjhB{<>xi-p>z?9Lp9@ zWQ=`j9h2DBru}nqwpN|{xZtt5C*V!J4ctWt*|q`hMMkO@Vn=ciJ9Q37-;i|7w@*bC zg72R}yq^ZK^b5B^YD2O-GQg!6ZK?nGgYiUJSeRtR9{~mc6?HIRoA$v%00000NkvXX Hu0mjftn)|m literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/information_frame.png b/interface/ispconfig/interface/themes/default/icons/x16/information_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..3dfa5b731be52cd8a715c9f7619287fa3875f848 GIT binary patch literal 900 zcmV-~1AF|5P)&x5;{nERz|5y z^WWV5o!q~Fz27A3gNN_%zR&Z$@Atj0uC=ulI-L$2$K_{231K&YGJ*x0BSr}2a=8h@ zDgm0Nfz1N`4Fh3+O-;?gj*gBlr_s%qXK2m)qjXU7Kz2m6D;;0PU!64K1Z*VWar zTN(LSb93`azu$j(Yzn1;R}u6+isI2b1v9}oM7^oB>xAbhMaoZ4Pp8N~NXYUomy3mR zsHLUF@AZ05UBCAWlS>6KS{x`Vv%_ZFj+AD`r|C4_d|bonC6gEw4wX{8ay74zoMezFynHR=brZV z_Rhy|SCGnC=y7xig?>X(l&!~M>y;ImY`}U-!i&)`d_G?%;|keqw!EsU(%t`Z5oWVJ zPi7;N$-w0s0@)#mVt!_$++oL;85IZG9B#&C0@hee!S@9fJDeKQ8ykp5<47b^=)X~w z|JttZ5O`tp!{W&d`DT$MJL3uz2FKJ@H47!a0XdqXP(=s^F;A8x38JxZE1jHm<=s2HguW*c5)rZTV;sd| z2zRcyF*G#zV03gOKn3`jXAMD0ixU&ybefjqu3v1eGwYL(m!~lPZ4&EiKT+?9qRmr` zD`)C4Fwi$dE%7jsNIVON!>W#+g(DaZ217CB>~*>7_g%Pf)z{c~p!UB;!`RsSxt^Yz zPp787f1tv8l}@K+I!-YGo?ss{_p=qsccv2)#s?dBCH$;tl}bn a1Q-C8M}wExY}=Or0000(@Q50VLoH@>%nKS0- zL?q6PIigl7i6~kb2vQhCLPSLn{efQc*@v*lF7#%%o^GLKq6W3^LSMi@<;=P4*4}e*f);$R_Fn7z_Ffl4DFxf$Td0@?Km>${Al-QJv>KQNN~1tc0E#&v z@Jr+Cbk%D#mOw2JV*c9Y-XR9&BfJ&zzg88Xi-g)1*e3!;L zNAT_ikMSIq%QyhG3g7hJzdLqiap~hEAp|DQ2mQU>-asPphlkJf91k{0M0&rv@e(VB z>sJT*mzLK)9SK;b>2^uY_ihhQu%6`eC5Xk6u>7o#hi4u}psmI3zcn-H$Jam*1QR({ zU4UAqrm8t(Z%-BBKUOZ6Icg?5Wdk{-h94N&LP68f?6o9aH=t+w4S&dHvw>-u{9Y79 z@OWCw$jKZDn8yBLu2@7*F-#LO*+VE4O0f9Y53DD5=5|03tL;K$vs#I9j;3H4@nkZc zH?XRdS_DleAWAYP%d!l%CTAUXS%F+m%OhvAv5Dct=3d6#){8_7YK>rIMNvSqEA{#% zNrbGrn?cTcLkW5)wVP6bo-H-W%?>sRW{Tnhm&*l`!(A6J%UbF1Ag!VsYAhj3O?@RA z{tm4jky#nFGm1kZ8jG`B#%UIMk?^>~ZkK(7BON$xGWFmm54*ixIBJW= zzl65-qwC*^=hyfaYh$>Ku^xg$2>!)Mkm`(^qupvq-5lC>R0I9b}@6X z24rUr%n!e*z5$$D6=0<}IYPbXFRCwBA{Qv(y10{fofkH6w2C!fV z=xt+QU}kXzGDCq_7Kk4M@oI*@e|G=5sNMmVFqq)ZU!D6F@_)CS-*nBiS)vc6<5w&z48Aq>n9Nr z5r%)iSwB6var*{HoTyk}`2T8NfK2lqoj= aAiw|{C|{--cD_si0000KL+2~MHFK02BR4Qrt}!dpqg z=X4hG@$Srejta%bWhAt1-L5~QYdUR`)isT&WC9R=2Y*c1nqohLL&SMOkT(=aiSmKE z9ed6j+Bz>do;?nJ@qTnmQWiSh&f4Y^r!G&t9#a094@HPNna@!a3J7U58;*6fe6S7r zzk2L_N@=B?htMAW7U*-^NBsK_x3(}&VNOv6t7+`oT(zw}JneSzDj3OS%*P_3aL9C2 zxtDQD3#8;kDlG`-uJp7@)Um{J41y4ch6gm23Z#=!fpH3RimxEz{rJ0AQ&~|&a%l+* z;UFS`Nkqe5q++uecYCK8r(^}x#8Lb6;l}9VV#;vHtXFHb^_omIL}a55hilsJ^;tO% zqa`a~8d(YVJ!5Yy{r9?^n`&yI;w$iU!0PmQd=?gCoN@xpM1q~b=St*r3%}+Q|0Ne) zLCpLgd-9<7B`sZfC-oL3D`2m>037pOyn6iz?e8!jOa8u4M&Q;kFf$7zlR4ymS8vbV z5!&BaSp^+Ui ZU;uS>8=!?U^y>fs002ovPDHLkV1l`4Hw^#) literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/key__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..c41e4930e72b0ce4bc6fb9fcc946717242659a40 GIT binary patch literal 819 zcmV-31I+x1P)3h9#FbrS`#yLHYp{1)Tb}(EPW|&<~VK?0cN8SKE&}* zxKBYpsOc#aN}1Py!Xk^d0whGuhMLl=6-TPBl-G3@SoUORBt`b)51jHXoUkSYpz&dc zK7c^5{7nFH5%8$|W<@dKy|BNE`7tctF)6IMrl&!bNz?Jk3iy1lMUOA95(I)d5`jU6 z2tP(c?TG#wL9fYJ2l+TBM+AkdpXycb2|=%mDAuTBPc#R<#yQ2qd+qSz%<)SxW(T}6 x*+qL}E??Q9~%2Mrov|Y355| znrSApWOMHB<=*u?(}9Uy_}#;EIQM`4_dFcN@Asptnnj2dj6{Mo0J(&CtUn8cx1xwo z9sz!A^ROF{@rfvn(i$rC*(Y=TvPhlVmZhJcYdE~=@C<@T)lhlP}CoT-Xwn%^foS7qLKW-I}&=>DPp{cmi{J!hi_{5O4 zK`J`SIq>DPUnd&|tnK6JIVEOV$w-MmI=pB6b(wupq zFpIa_@oV85>?`w7hck$ci^16Fc?in2#t=6S6 zjp{fyXK&76LuLvqfeTpU0)g9|&RBJ6$dA+(8RhbbI8|J}ku)pz z2>>M^;PtJmZT_v6$Mr8rsM%!%D+{Jjl3Rr~ zL8T)OE-`eS87AOFL5RqVN1h=XmE$%%IeHA{Jvtc3nhR3G)@>yD!M_3w0H3)(0B|&5 Qj{pDw07*qoM6N<$g0WDN{Qv*} literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/key__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..67fcc277503098eb0b3aeacd91179b1851330784 GIT binary patch literal 750 zcmVQ50Qwp3M+ijzNhM zDGEVpF$5MOWQ2%G&>OAk%a7>wBh^O|Ax8G!M?y#wy?g{>g^)Bu*n=ERM{QDKn2VOB zV@_&$A9L?*pF7Sl+O%QabI!hdul+dtaGIu}`>F{RBRGQr+W?dhvJjJRgkDv}h@?P6 zl88niYSLg@K66nOmFqVa9L*~}QleSc<%&xSfG``J9PBQRd=Ivf&2vJ6#HuiGF#=K6 z3LV+`CyFZTYP_8ff}i{!e5$G-FK=^3*?~i@!B=g@pHra;N_GgV#K1m+gtDUjwdL=- zp9DUC^t2e&-&JM^Rs5H+7N4gpuzgQOIkORE7HlQ-4E{*ivNml)CO_`$Gn?Qfl`|e; zBE*ME_8GS_8>EmJfv7Erk{}#E*HocW#}*bN5QKTy%z$l;0n$=fU^b};VkO9UJMiY^ zs3OZ)nw!H9K8T62A%uB9#K>0+`23^HCOLI(lA7p4qKQ48XYIM+>1nZOS80LOZqKwu z(;-6%d%b<*0sru0jzdp8s$&Gm7zPw}eQXYHRC9UJz}ec%4Too^f_Um~>7es% za_%)5A;%r#qQpyB7D@~rf?02lSzp-4W1oSX|7fN2iYCg@e|4>Qn_tjUZ<_(Kz4))_ z8BprU;F#{@`Ad6gf73RtkKY|i*S8u>uSdJy4pi@^NEte*eqGH?x4LL)T%^J*G#95` zF6Zj#_uTHpTfoD2z`-5BrZfobeBoOCvBtUvF(koN2=q6Raf(^b07*qoM6N<$f~5*o{{R30 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/key__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..267f7ad4fa70fa78b7e97e7eff9d0d93f1f1f2cf GIT binary patch literal 816 zcmV-01JC@4P)@9yl?UO^J{X7iXHSMN8KZkhzHJ!Eaj04*`L)- z`cW-g@8ej_mx0SSd>^aVu4Jg|$5d4nE&$b14>eRESc9(i61tEW_FR0X*QdaR4jWVTQ0wUiV(FkfX)7YS1d__ zi^U1&xaw-|w(~s7cf@ZbudI;UbkeL_uDgk7=mo}TkfmjC;{TPZ$|6BPwHI=y*T+QR z+cp5-(iHeHj0EKuZ#K&l85ER`7CurXbPwvuoylnz`NymsR2^Qq>L+d`f#Unv8-TS=M`{QgRHg5>zO&thc`Cv@qz6*x@ z@{66V_0I48-8M<`BRP4G-gK(4r1wLkdUnb+L4xi3-+_uwyae3VPu}G@d5VB2?!EN;V0uF=g((ttQ zEfE!j3`=@A$y25|b60b&a8xS#ngdD>0u2(E%I;*7^DlYy18L| z9?iB<($Dvv+vHq?IjnouKMSmo6j002ovPDHLkV1gzke(3-J literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/key_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/key_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..2bfd5aef479014bcc30257385c955f0133c7c019 GIT binary patch literal 580 zcmV-K0=xZ*P)LoxU@eWPy_1&`ZR3OE z-TUtDyD#runC*5;v{f#bce~kaW?>6~xoKzy_Pk!NMLZ-DiQgIv(XGv9Ll}m+aX1{o za5$`Zz20}kCzFZ2+wI=Y=kp6__^7YhBY+O9)9DPx<8i4_DA+rljt}ujB%)+88L3*W z27zP>kf_y|^aQKbDin*wW|d0ibUYq^`Fy@RH1rX}80Hu%fS}vua=k8>OP1p}D?qFk z15AaO2sxY~fvT#XkZ4JzQbY33f|w0+^qA>@V9;zf&rl4Q0`@@-{T0SA=a>Sa)oQsF zMe#?YQJG~~8F5h*&)e~&&2Q(WLf@0md$3bV6V|RAtuv)&%;aHGaSxzI{gAZkLSf=LHhl^v4VU) zPk5du9*^gDx^ubQrKX@>uj5#gqjylN)rcfX_{}?lVzKxLK9AU8@qYvis%kVECzRkM znM~dchrhTJVvr#7&a?P!6oVQY(<4K4d z_gov1Hv<2!T$&KO>VY!LC%I4U&9}GRWlUhayC+vO_2a$$CSP`~^RJd+|8mcAlB0{l zG}g7IdlT-Liv_48_b?{;JFX4Ab1vm1bZVDNPHb6Mw<&;$T{^lAkF literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_2.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e3a9619d9de6bafe78f8ceaa140ee9285618dc GIT binary patch literal 329 zcmV-P0k-~$P)q$gGRCwB)Q_Bj2Fc92m@KEZt(2pwg zEBa?1{3?%yo;(zMMcbVPgT}R52bRRy*>ST*ljr%3h^}-DPs+0F@d?1D3r+)SZP#_g zdkMf8L(aJwrvW(MHF%xMx8h4``#xtPJ?QI*6O<6G=NSF zAcinBm~v|d(An^9I9pX!n;k$W2BA2P<6TF94z-I8u-`L8|^mYs>{MBC$$B*~r9G`)V5U~v`u z@o3j|9pM2v4r2^iYgG(9ga{17pf>q15onr5nvmlNf`Hbri9p}?vn{P*UIEyw>srN} z0GiOC3HUH4u=EwoSyh#aIRULH3`2DUVBmQjpr-8ywTXkJIq?nw4Ra2PqL7R7f7YnA zZL4D7i9nv`vXm%_W{bjY(=hPlMB+HUaN)T1S7cYuvMg_gpZA;xxY@wBoG%{b{S{yU XE!IkRK?U!O00000NkvXXu0mjfkE)B3 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_3.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0740661a15e5e5b2e0c4b18afa9f4cb9deffc341 GIT binary patch literal 306 zcmV-20nPr2P)erEt@oZd z7Ka&QD1@M5s1<>2+p>g~*?FEN0f$vpMI|f>tm_&lQ^GOpE+9kD)f}0C75(Jr+CoKO0tT)-dT{7zVi2GTT5 z91d=nhN0H9ZF}dB%aNzZ-MkF1C-yVDEvygh@2>y@0H}_xRLLc@xc~qF07*qoM6N<$ Ef=k?d?*IS* literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_3_mix.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_3_mix.png new file mode 100644 index 0000000000000000000000000000000000000000..b984bc036379a10d5479c092bf824f126873a94f GIT binary patch literal 353 zcmV-n0iOPeP)Qvk zRaG_mn*vBiu`Q4!$$je#v1}GFJHTvZSyB{5kF^ne-={c^?-I$T00I!jhMT5Y6bOQV zKQ!wA{x3^J9JSnmxdS{QU~(=X#vK$z!53yYbNFc8StXJCJUjYUHU}rXlblh)C00000NkvXXu0mjfgLaFF literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a173cec333d362e02cfffbce3f44c30cd7369e GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X4tTmahE&{IGI=A{VFiIUe`UUe{!pSb)Wh(>{Z;U hkWVYGd>2Y!kgl1nU2yKY$Q@Jd3<)Yv(n&u5Cn#S5XFk~|G-g7dEBG2OJ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_2_equal.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_2_equal.png new file mode 100644 index 0000000000000000000000000000000000000000..26987b80284d4c025941130f6ee8e788c992d696 GIT binary patch literal 343 zcmV-d0jU0oP)wiI+hF!ChyIg%uJ%l^ZZCeA=%p_ilVzGr3~XZ zzS^p@EW6u4|Sv3AiBFb=elcLAO}}Fm67;W)-aU ziT(E)*Emx_S(bzcvAkD?X!ASuJ+kZh-^{lGu pCe(VTe2;1@^iugtwetQ5FaX41FKcXc{m1|S002ovPDHLkV1lg5k~9DS literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_3.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_3.png new file mode 100644 index 0000000000000000000000000000000000000000..04bbe9d067d66dd33d6d779c43881a04657d8740 GIT binary patch literal 319 zcmV-F0l@x=P)68v~^jwQcLf z!~h$B_Q$SF+s-&!(=<*@4D5|C3^(QOF=#gxAh-Ln$JPpd&xU!qvVTk}sOy@HG3)&z z@B7|~L945(l7>W4v^EF7s0)Ku#c_P&#l`0>a5Znm^NHikp%3auj?Y(s0RXYxfmHko Rv*rK*002ovPDHLkV1gy(hC~1W literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_3_mix.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_3_mix.png new file mode 100644 index 0000000000000000000000000000000000000000..3729263573c517e1266ea219b6b0ac48cc3d83d8 GIT binary patch literal 364 zcmV-y0h9iTP)?BDpvS}I)wg`YrQ52oKt{YS(?1o~@572ph9nddn-WSlwTx~^xrwI+fqvn=Dr zS(f!~BA)0pxAu_06^`Sa)aJ0|Ur-g^G3cH0y>j^{zg7Nt3NQeMRvu^(`*FSi0000< KMNUMnLSTYLjhXHM literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer.png new file mode 100644 index 0000000000000000000000000000000000000000..806a18491a1ab903272654fc3b957344d228dd9e GIT binary patch literal 297 zcmV+^0oMMBP)Yy#fK z0~koXV4FRYjdp^kvJ9lL38?s&eN&|0$-=VRd>?NfjOqLSPDDBB&WpEg%bjzzhVHt~ z^SZ9`(FnkbpsK3+JkKcD7(-3dcwUx;_I;=0IHCkek`P!C0EQ&?{3XB$BADk{V2uE* z2s8=Mfe5B)QVFcJ1Xi5@%r61vVdm%#ge}YRnPr)35yo*O9)^M1wyncXM8Qa06oofw vnm$6KH%)@j!`p=S67Ch!NFI?tUjYUHN=}RI8ysQH00000NkvXXu0mjf*?M~< literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_2.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_header_footer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2648663702d2fa2cdb0815b8930ff033eeb518b2 GIT binary patch literal 336 zcmV-W0k8gvP)809;DbG#bb8Bb>-Yo#*+gr%RlJ%e$^4@j}xyNma|TNbTuj#z_GHL6}3= z(}h-mF-C3M?g{`W1po$66cfEoa%=+JWQ-K@hpFYjhFnx+Y##6=hkLh`;L;8SZ@FkD22*53$jki372R7ZcBm i$SXuo@?rV?6<`1rhX66@VeE_m0000BrHwSGZ9&&9uL=bGv0Nb z<#}G9%1)BxiZ5^5cK%Tb@TLgE(C_m(iVV$x9I>m*?f>& zI6zOF^VLDgu&)E=IF4_crt(85ih{B%yYW2FDT<;%+_1mNaAe!|bp4rO7#A_sld1zT uhi6%qcP91+v5pW{;KS}qyoL8ifB^tVkqaEaP*-XI0000iR2;9~amt~34G%Z}z zP1EE!&$ARR2CRj$EVFf8cS<6g>$xppoFI3>P*r8Sw8;zaA8Kws$^VP*7IYd%k|!tg5OL5gkb{zW6jv zN8k5T9duciAs@$47CHpLQkG@GJkLKuiA>Z*QT*zu5_4dA-}fXQXjvA?Y8VFH_f)a& zNdhbau!gFq3MBz!jJmGd>Zb%)2Kb&JNs_0=3NLO1dj&XK+qM)%QTpfzrfE_f$05h^ zo&W=o;u8(S@GpU7S@K1H6rg^^M9hJe3UF@D`Q`x#_B~Z#F0r2H1&-rrU4*7-h}U&Z zd7h_m^qqh@*L6c?+xA&F|EZ%u`0$NCi*O-~a#s literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/layout_join.png b/interface/ispconfig/interface/themes/default/icons/x16/layout_join.png new file mode 100644 index 0000000000000000000000000000000000000000..868cd87ac58917fb85eb8c64b763d389f42acb4f GIT binary patch literal 391 zcmV;20eJq2P)^@RCwByld)>UFc5}MwxU3=*FxW* zbDtqoAdn$*$3912qYvQ0Tc%E33Z)OwDRii(kkx}5*>Y@EcO^mCCqsWYg!D;2zfQKu z^Lz~ex4`K2d-)6#vev#qmSvANpogb}of2}{wkGZ=gpOZn~_pCuxRV?$l zY?_8PVfl)p=xQ)zKEE1tT{qf<5ku_4g9aE;>zYO>C2N3O)^$yXIRj(P6!mVk8y()i zY>1NqmjDl1D*&7Pxm%44{$9_e(^|6zaU44n1$aec%*a3~MLd`Q*JiUtu!$E=3Ai5M zT&aX*K9^-#(uXp9Yh0Vp6PEd07DYh~!#fR|h#NTObCIU$#!YUxcfQ|#P5zDL@#9^% lap5X)CE|h)F9?RMhjnkaN7Nj-@p%H*9Y8BJZau66 zyS|L$m|v9cdw||xFm`&jFQX{p3&WYZmxu)}&-O(ahEpSUTwmM4`DgFf82`M!2vdiK iV?#;*!`d*}2rvMYF`}{7 zTiXI{r`uSDj_<3YPV$@i^8J>4Z{B<4c|YJ|rZ`U#pa@dzB8q272+8ecQAa<9Kggpn zQoN+_O8+wtldS68qSq@nRS2%;d;_B_4lD-be;|>t6#_{eOz)ht&5QBnJ=*TU5b0lY z>3{%g8*BM=qbIAiwMNx(vRJCoXfZ&DMmhcB;&yy$%DQv2{~k%K_(k`?FosBQY<7#} zQgb=WvJTegYst3TYk99%7g$(e5LjamIn-pd=%HSmAgJ90o4vQUm-TwjFbq>T-PYy{ zc6B8p92dh0SgkfYZ*)}MNV$fFhFcM{`NZ}q7>blYkm+gxwPBH5(3dwgYc@8H&ngr? zr_=dh*zdo8Hl4nkPNyGVPbQ}(Cnvpib#=AJhK34K3`1gj?w_Gbc#liiRec4MtgNhv z=QxNtoe4n@-qOAc{yi@2A%_~&q6fXWgwSCEa*157IpBE^cXwkKl}cBb5{f_W%M>|0 z?-F@Fb|8vC6bcP`(2ElQ4P)XZxJV1chd^UaQe4F@TFkd5_n-|6^?I zi(3%JX={UeGG6J68F+Q68G5u?@UGedhE1LD1VWzEJ1$QN;WJwWq7wFGR@mCKz-)a8 zjLVyuf7^s!f;&M^V*w3mKf2EQQHabhL7WOw7(h9By&bajn#}FYTxZI?8J&jjzXTWn X)tXaf(WT}1A`r3t))QiX;06oEj_-E(YcfSbKX49^ZTFYea`!m>%D*vPxS%SDpi7N z4OM-QBr&<@SIqQfd8JA!E7eV^XvzQJ0aCW3!tra^qfNrcrYB%ki@>45mIoyD%nhrO z8OD|ld&U)UW}Sx5ph?MpuTvJoi=P91wx%d|Jr)nU< zbhd!bGDVJ-*T3U8%+1yP$+EFvF!=32JpRr5#o|}RV)4>xNg5p<9*#CNH0;{i-(U5d zVMt~@l1pxbziqs zVSQs@H~eU8Qs3?T#Dpw%U=b_e_w4=ooyiLqwA=G}M^8`Bmm3`&-6^9nvtakyrLBAP zOU@eA%FH7*qb-2{l%KtJS-m~3m;;2~h4$hCjDIu;oXh2E@9XR9-go7Sy_C*@F`3|m z=Oi>X*TGyGAX9krTdH*ccLs0GV+U4M4dB_1Mf+^aoALVx*~#nY2>r5(p2n&V{m}OMI&Y*QHU0?1 zAMU|(Y?tOV`@B##xZZtsPONQw&ocbS=07)jhsI##g#ZHp

    c?8m~DQ00000NkvXX Hu0mjf{-fV$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..34f9353271f9c794451b500eecf89024f70e2ef5 GIT binary patch literal 960 zcmV;x13&zUP)!n2iy^#6V2I zMQ}F@o7ydCOKGv~w9|V#&S|`T$$u{AoZo-Wmop#x{03;bRn4k8Rh3nhBMtq)@{~M^ zC|31m|62}KPE}v4N(ujiSDA6NZ}6LYetjOV_WlN^MutcR=XO}J;KgaxijCtd{w+nm zd!~l3k%{mx{K#?(2EXXJbN!ledOE0o@$n(SY_^a=t5lL~ySqp7`nvb{%^M%E%Ds$| zSY9O)j@lNJtWSk~qA0!~rqffVKwzwvN?A|0w|NphQ;c#{)2$^&WvPR#C(|?^yAe`=A&mjo%cJP&S!5_tLtlPYpHNJJa%DarN6=RtbCTJ=O4vS zw1u2L4wq(lc(5i(C`Y4}R;%^B8sEo%YoB72qZ+CuhFID{zFk2d(`wDlS`A7rSAM>y zXTL!63Nm;<1h%^#neqA^-d^MmVLT0*i6NFcKn>tp)halR20D&|%jrbG?}sY@C`wm7 zj0w}DuYGE)I5KE9%3X$7x>&1vNOCq?7Su|+*K7Lu;>F-EszLjff>s-7ckqnK@${I< zv%FF=#9}d2 zn1(q`?TDRA<{o)TVD#) z4wn0NuUpgHT&3!`P$boAbr_I}MkB_>#jW_%lzsbt?^BXk4v5~qAq6JV<0RP)H(Su$>uX25622^BD{zx}A=B%iwD3r_P{)3K=M0jN-dyI$abdkt$Iif@&JBr7X zX|I*z1}f@XJ^}-#R3IZt5K)bDp43sr_(P+M=Y9rdsHAQVP9Vgn;Qn0oesgy(gy4gJcb7J5~p5v2lq7m`Ypf!0k~U@?R-%!00000 LNkvXXu0mjfT%D68 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/lifebuoy_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..f4cd98da01d7addc58c902d9db9b2a0fba1016ea GIT binary patch literal 990 zcmV<410np0P)vwB|?moO#?s3WOG?W zz${~1aAT>~0d5rty(=wid;4*3M|-d5Z8r5JPwvV4yw8*8ockW~LoeXsDfUyWQA8-B zh|SX^hU9XqYNj8{15{F2DaI*6+W(1%NXcUrHRl6vLkwOly8~8T8aOoA^czXUU9cvZ zVQS?$_l%nUW1W_dqKWojv9m7+#cs}VP&N2wxV+}d%DfFU-YB52? z^f$OYJv}{KDD(`&F!rhTb|KQ;ok@sd3KMW9Q)%VMNO240yk74c37+4+yb}f!TOh)8 z?}lQ_963;4_jIdqVPWefmKA(H-={<2@F&kI%7==geD$&nmt(7GS~TYjt|hdtPf8r0$uV)+bI5WU{G zAMMgBM?*azyv6lJpPS7kZ1p{k(7<0du(9rlmO_m}`=08LJkK%>(EtI>eX zY6Xwm4Gzj7aE~?QA`Ao9QYljVelH)*K`$mSO9l|rkx0tI^PI)yD!uM>Hn1$~e<~0t zB)CZpve|6I9$qy2lS$|p9VPGBH~r}@Q@_9j7SW{&!u))AgOauj7m6JYM>`>;;o$|~ zetTW~rTmF)RUMzzz`Ko&>lSdGW; z-75S>?Gv0?dd*e!WV4q&efr02{>#9u(W&%lT0znlX4?TXN2cz-a zvw@xG%ZsXX24Uv{X?gV+eD}fUS^4Lz|H^H3fc7p>O+m{L0(adGIDByy(vR0cW!Y9` zQLBp5()?;{rDDbK!oUsgVU1!}Cbx~b(VGwkY5_Hjr1qBgN`2~?wtE`n^ zp-aQ9Id$&)9CzI5eWWjX;m>(_{?G5>|DN+6a_0=-vQh1#nx=|U&7kaqB!=c>y=Sn``U}olcJfq+~KtG(0?+?(cVfKYHdo$&5tg;Mr~* z!eDHEf|w{=#q)d<9}YKYJ)UYI6f#cx{VWRiSVIqcmU@w)EGCHRzk%D+-rmlKLR(mt zEgfiV3`bjAGx0ft6pzWz2(rc=q*if1O zs*n@eiP5Rp_}AdvSTH!{`kV~ZPYZnyy~+}~nlq+e&(GgpNL~#+&t0H{fT6dsWN$re z|NT49B_Tfa3DWllVF43RuV8}*3a^9W^r%4AyH#?i{GD{5X8@*t3NQdvsAdlb<HoVv^USjYY&aEvvdg*88S2FT8vYktNAiqpG4FEA5RYOSAQP4JW z=KPh}XLlXP1LFv*VqMPhs*v?xxcT7rp!@Vi=whm=9GtjMpaB82H#K?f-c?nr5lw3} zX@d+SAVn!FrJWT#J##Ar1m_g(fM90sFbpUFz{0GRJ7zkB|cWktw zpkZAccQ-hWK z(e(Fk@pYbeaV%?Lwqjq_Gl^9STsU-ZdhbC;RX8P_SpB#GV2)udJoTX@Ov{cWkYYXY zR5lrvF=j9!ET%q<8Oi4#`fNd3YwL{}7jinCwQ!VVCL;r`R4Rq$p33%16R2j?b<5$m zfL<^CMWIj-ydnw&{HW33Q9oe6El^(owM&vTLIZ_D0hP;nBTr)vP_Y|_jpvMEU@+EB y(I9+Vz|Mhspyoc|b1Y@G%M`LXoq9LHD zm6U>ogCevQN-1>9{y4ADQVEkxW_ITL=FQughgDTYRG!_#C?^;rJD3_snQ0d6GH9@~ za?XP>ZU9buCY|=KCXP-|k6JER8=mxj z^Qell)dBca>g&$jJS{6Jq9_>=K|0Jjj3>@jv6D%Jj=EgJI)H}b2%T+qHuUubJoy5W zoHe^k1e;Bgl0YV^Bqfy6`S;5&y8?PbSe%hGn6V$`1g8~wJKl_9LfW?%U^8M&O07=H z7!ySl=h2PhQwucC^ET4bd8|BDX+>|_o@U8xFoec&;#&U9KWhJzxDC?ME zIHJ`GnCGn;Yl*lt(9tG}s;OPe^Il3Ig&jbV;g7F-Kl4S-G{;#uovw`0>urSR4=`Fy zW!klHr~8)ib`wm%o8ytf8Ny_ym*VkHL*9q|WqZ!+ii;gYudgCtwXeGF4=yi81Av(< zJIE$X%b0hi5}$BE}4CEB~-K=p+@oO{l2Sq4n;Cddfi2C%K50$@B~|ANAcK#O!}bag22 bp8x{@^4TYBLk0%v00000NkvXXu0mjfw&rkm literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..febe9fe85e16d09585af1144385b297d6feeb2b7 GIT binary patch literal 794 zcmV+#1LgdQP)$!@#*+x znqeG6DY51!M}iU5_hjTB|bseZZzm32!guqLjkE8^eB|hbBKwiNO zt>idN@YvuoP-#@9!{+uM4}`9UY@WvYTy9g}Szq3YuRU-dX}jOJGSRoIY05Lg%h3XC zRH_<)ri0&Bcl5;R%a8i(4ZZ*%)tZwxxx6-c%;P;Duvi60jk6<2xSfg$Kv5FVh=8g> zYw+x~Gpd%wnwBrn1~KL!m-u0=wfotNmj=O6*WRqDs9RNlA=ncrD(%`55jd?6nHtnNf7glflO zZZkd!!>@0EC@%qPcQ-2v^b`t!N&-}kAhxzJzMRjCyd=G6rJo;b5W;4_8<@i)oa?#= zRwfNRFFRN>-%3Q> z7p9uOeOZ_bw)Y0;a@Uuli__sdZ)zMcQ0)NKAhOI~@1O{kbTamJa&(blc-Ca%IT{nn zSW4O}E_Go9;n|A&$lCIhjF1Uo%pe-mJDLzT0A9V@BbG)8&-}rKP8T?x&g|F}{vI5+ zxFV4V^gon^lP!=nc+_5w0(5u&`xjtvWE(;uKZzvp`Mi+Nb5LGbZZAg4MktPBCJ@5m zaNX~AMG=z8n31Pep=*alahzv|zb&*6K5aNmNC-4x?b>epj(gbvkN&0kX-7f(K Y0E~n?1Kr6a7OgU*5eHIZ>HJD{X z0Q~1lorbW$W}_-6n>_wwhXOYOP2RnGip6Ak{a1W>F8nsUmW+8ZKSDK4LQO!^jhp>W z@8RR8u06f3YB|ufoKlpNrTG2+F6L*c+q%q4dS1!k%^Ofr8LtWGy5TxI&fYwu=>OFZViRT%cXukT+6s%E%dJG?%hs^*Z)lvOpO%kpo~{SNuz=m6ok zMzWSjU>C4lZGU{LfJKodwXiX-5yBYce15@l^xlz_DEgS4&8JI`ZeM(r8GyTL62OWC z#uO;222zPgcur9ydpiAz%Vr}yA!Umov=C7|z%9*8E-EEhv7QHDTPi%Jz5^8aGW!1I zH__T&egLV{2t;>KS>B)T#ZP1KF9G%k>kxWE;0!49GejlpODBL*derl|xZsZwpB zyp&pyQrkj*w7gf|$C=t!3v!c_J9F+{;8bLq>a+N5h!&&6x2u_xR z*$MeUV`rm2C)hb8V%uxot$ z!C9lR`>G&}z2gMl33i{-X5t4L6lTgZ)gQ%Je0@F*i}JWdS3O2wPe}A`_FtFTWNRRMB#|ULK(0 zMa}0wD+dQ((d6-KE0ld|5*@ZB+inJu{5wQ*Sl=j2+5t>z|X*T zfp34&dZrZgdVSJrmw2mf1*H^4L3=NwJ5>cqv2Mp5i1vCk2xhYhjaH$uvI5d+IqXFI z?+mhI1%l3EvFyWva5xOHSV+v{STTY!pGSz_88s_KPMs~%pt%b9b_Dzb?;*d2kU)sw gOT$kG^Zp1h03~)>^jurcDgXcg07*qoM6N<$g5=zANdN!< literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b35850e07c397c0f6be274c1c23c83415b14a6e5 GIT binary patch literal 779 zcmV+m1N8ifP)j@(ijzsf>bO8 zkpuYXmQvcnZo3cXD}70rP9ncsXfnOS0*CQx~Li$FmLfhJTQ4B2QD^%^2{p~Ze3 zKaV1U=)4SR1336!XqA&S4sUz2@2aoHx!0vA%VvCO;a52DEFdbYo#%TlHTJ#g2hcYk zE*8*@+{<2@^YF3Gix018dJ=R!nNif`?9HXYj_>tCx46d02|WRz8kF)0Ob8YW7 zwRT-Qr5kC+FfuBw&$0r1jjix|P9Nv%;E+?+WavEOqhr9^=Wj|KXnIcV-r;n+H7$u` z#?-Wgp{jqtYZcU)mmi6Rt0tst7e75P8O#qH+**LksIrz`pVbLra^zHMj=R(BiAs{2 z=@}k%#q||{4Q$s!+JPgb4zgNKMHfSXaJ7p$l1ha)3?oZemS?P1Cy}HB7B6wE4&4i= zNDfjmxU9gGcYsCSy&rt?S*mDJc;3znf`b)BHzP?0S*vBAaw0t4e?!T3gN7^23sb&B z-1YowEcRja@%6Rb7spq#Ss#zqHknAG|~8DIyBYL z)XANA7ya5%gUIiCTJTR^+PXf#5m zX$qlmWHX(4{5-@b?wB@WyF=6drEt;B^pmHdaCAda6k#wJpeqSLp18WU{zx}5wrp(B z(2I|u7)7`AR$J-ayZ<1qs;cO=G0_5CAdt`V@wsKyz$%fcnfB;hvkV(M&d9>XY+@k^ zc`3KeuXek#T!yq`Z_Q;3 zoleIM52}^&VoNI5Z{A(I4Qg?-^1WKGRgTD=SN?wcN_Gc$l7i6Ny5 zz*CF&kD$?Lc+ZcUQtce}fT1bGkk~7|SS(KTjl8llnGDKivnZ8HJu4In&eqnJ!!XRY zD2j++x^DVkKzn<8V-jM5umT$z7{`(%p{tCZiaEe6kSvgcZnum2ec8PyXK_H#TSvL_ zVeJ`kk&C1#Jcq%*1S~?%3-G4^GK(Id4`&vs`zycz7_nD-=$-fg00000NkvXXu0mjf D;}J>d literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_small.png b/interface/ispconfig/interface/themes/default/icons/x16/light_bulb_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6260f5277b36111596cb83c4933c9a555b098809 GIT binary patch literal 320 zcmV-G0l)rk7RCwBA{Qv(y10{fofkHsB0W8=A zSJpG~GBPqa{`&qu+od5Lc3j4?BOlQA*XLwGM0bjo} z9KUkt{$pWb8y2+fnoyy0t^7;_<50m SPO3rx00005m=17tk z-n@Au!66`F{O-%I@4RC2daqu+k|4psK1#UOE5)U=lxSWTbZ(NH4)>0OQcl3ltjw5MTg99Bdt^AHxg) O00005qAdklT8A; z{(EQS1EMe3y=B{(U9?(ee<(P?gkjs)a*T0x5Q`gy zd^#T)ABeKJL5?>##4J$NYa)J!XUBGdt9Dcr85%6emMVqt*g(u6^MuA5PMaK5tIR$S z@cNGQlw}Eox1%8I@?_}JJC_sZc%H`1skRc>WVMTXoUX2oiaZUztpn23)d_cdEqvY7 zu)scQ%$2|0?eyBLMSM*~lexw8Fe}_$qsXcX#6GN0#8Rm~2n4;N zmx%MJ+0?iB^cZt>lMs$3W`IW{zNG78xoGN*$Ft{@D2?zyNr?^#=YGi~|4w002ovPDHLk FV1fkrHt+xd literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef567de3648d9cbab0c7f5c46dfc900739452f2 GIT binary patch literal 770 zcmV+d1O5DoP)2&DQ znA!}as9t7dq$JWxOJfm1SZ_fOJ;ca8gis(vFM%0BL`3;8BPa|DEM!`!73wxuNx7NM z%D_UM-fiC9-9M*uwb52a4;}dU&OP7#{eIv1zVA>NWB8xNq<(mwpyXCZQPA-Z?6E%x zWO>aKaIMkYSh8u$shwEj$O#6D$%gRa^peNz@M+YzS*^nGHv&Wm>P;n$Wdb`!uriPN48rHCG7YIRPfw`s>V}WASh2;7IRP4QQh$4B3GUmreZoJ~Th1OII zl{yDKcbOMl9MgOpXi>zd%GR`tU-=H1nga3jWbg1tuDtyvI3LbPmB4cxtVAN|MI_a) zp%GN;ba1xBvH{U34B9Leo}KFV$0GBcF7bhlfIUR?weCixtWN^txa_%EAfsbNm>n}(Vv5WV7D2Q0FOF` zylDh>8wK`#a8#$yXjzGgUjx(lbO-aal_*)2cqA5sZM9Zw(RK^GzTM-c5Nc1mLbn@o z>#Ctz5QOlvLAc!2O9m0@&y$d%E$L6(8;X@$z}07*qoM6N<$f{Scq ABLDyZ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..af2683158f879e5a2e3bfac46868f1cb9bef9194 GIT binary patch literal 764 zcmVo?X*)E zpalX5jS@)24MqqOh>;irBy3pd%7leGVgwhO=*nm!8~+1cxUz{x6x~!qG%g6QMi+=g zn}Eg2WBSB)I*;q=kR~l)TzHc&cV_NAzw^yG_cD}H_@BX*zAU^X#YY#zz~g_!jvfM- z=KhSq=j4XrrslS>)6~e~7YYpLfw=NLu@Jhp03{^K=2xL>MKv)MPQ)X%|bnBDH4cA$ghKo+~`6G&mfJVDR?s9u->($f>u(nEA zoxk(JD_P5TOByzGWET)HT+`5hj8cu^gj)Q44LbX74>IU0seCp!BQv{(k$+flS{zL2 zIe7huo6Y7ZtLA{!bxO_-Tt1`z-U42bbtO8JZ0mktTbmnyZkqa4+@3pBM67;4OQ6@~ zg7KynKVeB6oT8m>|Co(d__{Qwv&t>``rEMB13J1Wh?KXHT0KWsos!pGE!fi#jV!Hb z*{!6n@x0^Gm8Vcu+jGJ+m=Qw<4pk1wWK2+13Ytc{IloVDm(G?*Ok~u!4B(^|72h@J`XdmZorQE1^7z;aojhm zX~2{Lf^Pt`L$^s8KD@ZKD2mK8hgj7LY*e<99T*&%0w!X|ua{bIeT+MB!@Q`TC(|(XejYL{jg(d5 u-!{W_M literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef5976d801a08b9f87379ce6a289e3d87adbfc4 GIT binary patch literal 693 zcmV;m0!safP)pP-z;| zHeyktr1@_)yV>3GOPW9uqaGZ1`_1m~-n@O^M;K%9KZ~z?@xGwtt%(qL^bhWZ-vl&m zvm*JFV0X3cIdJI+Q$_s3fbbTG$5s zL?q#x8JNfOeuTfwp_KxvRuplVnhqc2iP|hnDNsNMv5cJbP7f>;$Q)({OQPgopyW^hTl6Y-!yor2@b;G(*sH zeb(AoJib}cu+$?<8@3xROIE=V0<7 z|60s3PRaqND2$%y>OCrDe?o(?Mfn<^hQ;tTf*=EqEVR>m~F}@yo&L-i$ zGQs{niJ44k5GWiIY*bhahr-|2BGcMk*vmrTsU@SFuS!5sie-nv$nTFu`xJh_(S|*7f6f=<`QqD7}lJ_%VP6d zmMogPIo;*#oUd;>b#vec&-uRZocDRo`#k46%pk)QW&n43RjOKpO7*quLJJgffMKxh zI94pI&f%mbaqK)|k6t6dWVS6_eDcXT945!{uf z-OqVPC|3Y0QNZK2yN7$qO_UQMo7V-{$c5+mQFZphKx2JPZ&As^b1Q+J1wMx*Efn-3 z3<;dRkjL0vJ`y2|SYj50O&{#~g5K=)`ABthW6fNF=60HGOb@rm0hd?s4zyQ{QsRAy zSTM6Jp|xZ~fa!S~7kB1LK>jhvr5`=7y$s_}EBtO-pLhqBw***x`g-&$@O<0@ZO&m$ zGGQ{%-u5248wT{Z-zq$E@)W`X366iO8w~mvt6~YvrzX+HhUV4h4-io>0Fl#4vCDD5$iyZ`?D6mkM~uEH zPnpgt=VvEp7v}BVw5#VV%aCy!@U9IQvl2Y2jS7Ur3H;sCByo<@;aaj<{ti&jkAF;q z`_KW5TS-E3Tm&T=;GzaPS+b;JWjXxEIz!6zU9elG5`P40bFG8eo3uFfY(DZij&m9M zQQg{!NPnpmk(rNy5JkKI9SVvQ&24z`VHkeC@0_{Kxj7wL z7G~*16j2v5DoWC5{VGUN7hMHKmk}vlNCif8(@j^AS9OtHLU8sp7w{p#I>ElZ5M1btX@~zyD57Ep+B$NbVlI zd?>z2tujGgg`ld89`KyoBd`2Gk+o9>k@ol@s^6i;AC35ED0-#0EFC@wLxxzB@v<)vu%HFK$lgT4IIu7Xq0b(WbqS5;r?v{zWnOPCA$gYkt( z?-OEu0EM|Pdd|Cz47tD_B$K}ufnuMlg1TnI)8YBq$UvvXQ9A{346=@dmVl9s#pS(x zc?7DONgFIyace9ZUkU}kkAwvA`c#?@HJxg78<$Zvil!6UdZ=eG-^5lALF-|hw%JV` zE6eKF&@N4@(+OYJwBHo;_M_}r0~!=XiN6}got{3vh)~P$ zT530@j9VomF)aq9bOIA`LnQeg@Z;pM|M7F&eLIFEuU$Nhos%=+mnY`GeF7rzA;Oj0 c1^g6X0Gv1*Px}S%u>b%707*qoM6N<$g86}3umAu6 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lightning_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/lightning_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c8865c895d3e269262b703f58e72469e069e98 GIT binary patch literal 618 zcmV-w0+s!VP)U>*z<;1 zGBwjpA6)Lcyqt5-{Rp$)@5%ohr!^>*N{6e9VVJl70;W=_nR5m}a3$z)PR zxHF%5RaH;x_4*mhvK3neyWP&jGcUv8@B;U5Fj^z8D2i0AR?l26SB2+!4l&!&(Wp+by;0NF<^m{0`%W!{J3PmwQTOI~)#W zv)PcYFPOVlt4YCNkUqb$Ozg&%fM$=yVn30MNK1I9*^w_BuOI6 z<&q#%07PoJTn==*-L=!{Y=B@-fmkF0LXywtj|u3Aa6FiV*zfnnMx((2`~gd(H=E4| znQfbxNF+!+9>4NPPN$m2{6N4 zX~S~g+f9MT4|UmUwQdK4!Tlnc>%23)Zhm(lA-@F}0Nf+Kf(HEg!@vO4>?a{@p(L;3YX}nCy|s2fkZL8$3%`Fe z@cjM9>@Ox|r2gm6Cx$i4YmWT;$I!~c{C_WT2K-?N6co|WU|{^kb^p%p+ronXKeDm@ zD`a5!zlA6RK7M9QJALZvwy_5HNf4 z=;Q002ov JPDHLkV1fz}o;Uyi literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock.png b/interface/ispconfig/interface/themes/default/icons/x16/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..b5de7c4d78ab421dae924f39bd668a3ed7e7a056 GIT binary patch literal 637 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/lock_small.png b/interface/ispconfig/interface/themes/default/icons/x16/lock_small.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4ffe8e2433fbd36781d171ecdb3cd6737ca875 GIT binary patch literal 370 zcmV-&0ge8NP){67g|GcqzP15yP9y#NHt9(fCMeti7M@b%MYhPSV-G4Sy)mZN?aiR`pxjq*v^gt<^nd>k02K?fLw6% z5W_!$2Hbx1|DO;J7u(bY2!{k%Z20RRC80Q^8>=U1BS QH2?qr07*qoM6N<$f3Y^IZq`6y|t zZTvV?M64IV8bnY-sVzuv-i6{tghD+FUOaf~p(l|-K|xSYo)mBnjye9f83^zQkEPD{4V)V;d|QvGTB@hZeE)d5PZkT;w=}3&gr;p; z3?Du|I`VwxVd>qg7xz@<;Gv_Z(kDkpX765I(zY`2el$!frmsC&e~?8;c*` zzEMkZX!faS7_YY{*rohB#Yp^3gS|szH!r#yChC?2+q6)(O_YlB2n(dQ>A;C&XU{}p z98YfFnCyx(e6InfEjJC2%Vud74V-f@ror=Elu9N-p~kk-QV@*?`@64)VXYhxAf3tJ zcY?5}Dgr11B}K6CEXZj`I|Ek-h*l$8C7}M2!V6Afe$_w9-q2WU1dj~qG{;ZerwkUB zeFM=d!RKY^2XQM0EE!}l{S-KT0G;WHTp!;tEZx5S@1^H2&HDcTKL-#%Okh(O8FMs?3c#B0tX<3S z;Otq3r>9OaFarJ0^y?SH>!(i{-stNy+_`s`;qS{g3|3Oo%)oG}1nC6`Ag}?vGU9>a zzg{!E-@lXL9}_c!ii-;a!_y}W48MOfF#i3^@c+pZ1_c`%2Eo)chI>~oF|hpm!63lH z;|kIX5J2EC;F6LQ{}C<6-z2Ll5$GlS%puM96cI~ZiT zx*3iO2r+OyzQ@4J%EANE3lKnH1O5U1_Vdek21X7xhW|h(|2=(zf$9H0hM(7Of`j<~ zw@(Z|PMl!)`~4dOn}Pzv&s)I2<=_Ix96$hp4fycx!~36#vSQ3nUo$WZ3NZY6^N!)s z&TR~TcW-3)^P7R;>)WpkLe{nnEIfP+|6jgj_|M41@Zs0*Zy>z@0R#?%*H2$;d&9)T z!1DGL!>=R97{psU7+A%n8Gbzf%JA*YR|ak&5eB91Zib&Xt}%SOc#h#4Cp*KlA3qO* z^a2DBI2yYd8TAyj)z4Zhi?V#V^^8Gs9nf}OE{3n`H#7VP1|pxI4+AS38^Z-JFNU8F zZZn)@VET9Q^HkLMm}H? zX8HS%;oqOX44=P#XLt=vjW>XPzwqT-2QYCpvjfxDLZDuN0D>C;3K0)&hU@tFVG7g{{H{=>i6&cAOHOA20Hl&BTyYH5Q7W=2p~pEvok<|0RYy)V;Aj; RqCx-w002ovPDHLkV1k%q%fkQw literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet.png new file mode 100644 index 0000000000000000000000000000000000000000..35181f5bfa6db971f262034802a9bed597d4b921 GIT binary patch literal 685 zcmV;e0#f~nP)-1SxILLg}rbf(jA@F;GMa3vKbxq^8-LCNZgT zH~Z1-I+N@sn?fE;cKCfv-g`5Ty@vi0FgQSj0W4xVhcV+(dl(;FfHw|6vmNk=Fu0N~ zW6!5=UA=zc=Cw)r?D!~w+HqqxpWV8>|MlAfxb72#4t)a)>>$DzTeGI@=PstFs{5+*F_$ZCWV40O+uP-1 zO|xTyG&Ye;MB2=e>j#G=Jc>d-jtNlUx#p6ymnM($2k=Ev)bBex>z1z1Q&3JAaik%w z@8j*RnPP@PKmG% zXIdOR;a(R41;EyHXd6baHD^w>h`5th3xb}30$gu_g#U87xBeoIG(!uFXd1{U5{48Y zjx+-W>|g=IgfY_`T7Wpx1U=%`(o!c;Rdsd#)ymrL?h(9y@oZg|uHY{GnoveQYom{`;*sbH0%~$Rz9BxK@cFFP7~((JZf!fX`xU65eZNf1wx@v zI2Mb6ENf7!)x>7A2_|ltRxX!ATn;A^38+?8s8lK<6(AlT9*omFkR)lrahy252gW)7 zjpRGT|6$Ob$;jVDJ{jQOBL0^O(7cRzU%{JDGSOXG-czBGki0MVhS0z;{|hhxv&Si) TK|FI@00000NkvXXu0mjfV+J>; literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..900479f8c8a6bd7cff2c0aa89284eaf23ddba7fb GIT binary patch literal 784 zcmV+r1MmEaP)WtR~L5H z)Uj6AUEST;Sx09&S7!eL4;=30`_B31%sJ;W9>^MtP5_D+fNs3H&>aR9K>zS)@OOvC z@lIXW-CK&{kz+C7Am1u%Vm7%580Nn7(uLDCjg3`mXoF9!Z!*2+cIJ6u3;*>{mvu4VH_3vPxH{@8zfUdI z=$a-o&x~v=`*Ll2^PPjOt&YgjUu|r5R{F89uq#n01cN|^2aMB6c$Iy<4V$pN1JcT)@@ZnA@! zhC3L-7Rs^=fyKpj3npWOmNg((+CKI+yIx+O1yzMatpmKb`{Hsu?#5s6a5+^KsH#d7 z6u=IvIFV%(fu_k}u&?}D-U3joq6-jw;D!@FU$4cA$~?T;47mcJCS=%Al+0*M=tn1C zWcX{LPf%_<0Au1>OG$XObu+_r zqoboxUtbTANF<{gjYidEG6|w60?V?{(9l3JJ#qgn|uw-g8Gc$+_1$Mg~*489gU0vm<0OfImp_IM@p6AbLnpV!B5kmeT`4;gw zI_;T&{CVUna`-ohZ&CreFJ|MU{nLyj+AG{2(2bSgjguJ5tDvX;2`~WC3^|F>c6luT O00006nP)h_3vgAfni37INYcF}QPJMIiE0U1grlG zG?h8-T*vNRJ)Xb+39SRP<>N2Z|7#%TyDtXhK)b9*IOx*2aMxO^k815v;$q8 z-7RjfClQ+{KOP;OJT*N0>GXr)$QS8j-X3hno_+V=4sUR2N$ya|pgar`DAx`%kzQZ> z3iot;5^o|A<>TkiceH%IuWNtdO!IR8514*oXlMv}B_)`oK$}s*M%`%0fIP_Yf;FGd z%2+=nyTtc zcXCq{)IHDYYJ)K4H1jEJ>pu&tn1$V~n@p0ejq!~F&~tf|RJB%F`Y-yz0gt~qXyFsE znR3Xbk5^Y4{f^gf4>Ddf8rs0;3oug#Ou*18_&E#p?W@NQtB8muVFwZ6+&uScWPcy{5$9a)xv3ecQt z26k2X>)Wqfx%NdV;GuT3##8IWk&zLELLp=_nZKFL%*^P8LILr39D*Pq91b(A@`tBb zowa*>d>kSXh(scgB+24*Iw8wBq|<3Jo6Vv~DKi@z8zWq{c)ebvQVNpEq{svqPZtj@ z>>ilS=KgZI?BU3Go=*_@l<;5m4$H*vAl}!&KOuaU2}rDd^;M`(c6BVsHB>7B6S=v* i^7Y|mx3TzJfB^uHiB2gLr$$Qv0000YM;0(gUaoiMV4 z5MXeHEkd4+-<+Add}B5so%fAWvQe!}%Afac1kNFw+tbGADA+OCXa-6 zzXFe87@UR%Elo3UA_cKOodV^$n%?3t$AcztO8?1W07gTFj;8fS;~E+f)!NM_*g4{` z0jD;>jb9m_t-Yv5W1Kky1|y9INEpPQVL&w+Ghkpi4Ky9j>H3)lRHHG@9AR%|rF&2m zWpm-h##TCg1n<|LZcCEX<-K07t#2)@uW$ZTn((^yq^Aq&N`RF@vyWNYXX$J8<5RT&xQGCZnO?xJxei!wyLw}2Wjj(Z!u$}hL rWJ$DFEri9cgq!UgySy4g|0lozVKo@_08?}V00000NkvXXu0mjf+a^8D literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..47c7969c1cf40441c2bfbb354e5392cc8e5c9cf9 GIT binary patch literal 839 zcmV-N1GxN&P)en(()Ew+p0o9gQF#!|06v}sz_+#T!CTr?Ploq{lU z8Nf-Wv48{;HI`Hz*RFY&;iJnHn032{Qao=fDofZx8qfHTgEJ}1wGMdocyRj?^NVfZ zc_+RU_9h^LQM4?N=XqH4`_~mH(6Q^VVz9!wSQPZO_FIaVz5P(hoTd1mBbo*fKq8`V z;UgPLQ50zb2~vU}mY;_ebt#zmICR?D?^x|!y|KdYdQfesNsn^3kJ-vmQH=AjEeJrA zO(g+>QR?c=PLIuguhJ3uARXokIYk3h^N5R#CeOzshsW3XW~$X98{ z42Y4M+#Y7Stu1p11OolGr_TpGo;4Wl>l)%XF5_c=K>_$%Gx$KW-QNE#kbu{z+ZjAV z;BYv=Xf#4364_&oMx$aPkpQpP3o@Au%w{vmNxL}KisZVNmX?4)09-B?C=?21ad9zl zTpYsTFcXW#Ac-TBH8(ehc}}U<>md{hKrk3&2m!%~nbhPzU|F^)olfg0Tr^FuBKQ{b zf3nxjA>M*`Ne=!7^P7Y~LG;V+vaGX76VWP#K}J77^vv$`j`Puq0Li}s3;?SUNl)Ff RteyY>002ovPDHLkV1lG@hBN>G literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f623924d5699fac8d508fcd5f4c6f1498b529e3f GIT binary patch literal 761 zcmV{&&|AF(_0T^MR1k%z1VJReL==?NL#=#?Br93qa^-cH z7n^gN&TV(Q+r53ynr;(3aQJ@te9rlN&pqc{?kNf;Fz10v4(MmsUgmrA)I9UIgJX3) z8Ifye_i0$x6~s-5D76NQ*(Bb^l-ggTR{R*;sBmQ}Gi%v3@VY6O9KOK9w3y9j zQ`x&a4;^vUyOrhNi{|9)toA(+2ov}5rrg$iuFFObhB6_XINeR30nhXI5Y0jby$$XA z>x1eaeD?XYuYUh{2Dndz^wWCcfAFEpX_IXHr6vT2zlDP}yvklJR6q^mc%eLzNML?( zF)XoU9atjbF~JF8&( zY&VTKiYd-15h#ntA+sQ12La+JrbNIf7SL0uNTqfZAdX^+bHu5Ef!syYw2@N}hev(B zAl}@&H7?6?4tF}8oBU}1(9p=7mc)zn^(|iXcsyunX+b0s*;0*0qee2BgsQ3#1OctB zt%O;dJc~7G+zSf}5E%il*9%FK9JRHzkmWd5S69VYEQS;-nQUfehT*cq?RFy+(y+3! zB9Z{{Y=hyV|G;jy_nD@taLjm~UuNWMhHo&Zp2>_q!}x|G{uRU5Nr3jHEPqn}%zP5{ rD$U%=uY^5+^0@^7*rFo!Pk;dc!|Wt_`k#&t00000NkvXXu0mjfU-n`% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..d91043572f2327b50b9f6436ebdf07341462c28e GIT binary patch literal 550 zcmV+>0@?kEP)X=2qFhnVd zASIy#A`x6=+m+wo&ZVE^PQRcFyO1tjxX8v$-3$~GiBWMxR7!Q!H`8;5_mXF+P;%k$ z=G}A7op;~dFnlquInxx z$9ZOQu~?)$&$}CqMxU|$4*dF80b2-BDV0h_u~>Y<{ATtnS2@!hc4RrLC#`7#D2fOEffk1 z9V=^SVcG;eSscbkBQQ5JxTO z)#~-SgT*=J27mK+&T6;Y28$4lM#Bd@MRvR07%Iq7qxAGzm@K2y>2Q$ZaR$=LJe$p8 zXhq1`)Y3yQ|An*ZbebBE$Mb5ndQX+_`*Rr6a^536Cz12Pe<6?k93Jw4$pHdB$REp; oZwj>wjU-Q4QWMEfD*gyC0K^$B*-)hsrT_o{07*qoM6N<$f}%?MZvX%Q literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnet_small.png b/interface/ispconfig/interface/themes/default/icons/x16/magnet_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9574801432c582d9ac0b8a6db995236b4a24ba9c GIT binary patch literal 380 zcmV-?0fYXDP)~c0NUEv`gT$WSzN2w@ z-B$g-U%sUQxp(n;;SbPe?GPWGw~Wke_1#migD{8<68i&j75*^z1#~tm7mx7v)tjFD z{q!jVgh6bO*e`^aaC-r$i2KLe56r*5ef!DAz;F~S24sW9fN}&4_zA>ZZ{9GlqltsW zeqxITP(nh+T3TAE2M(P0uc@h7ZfF)=X!`EaoxKYq-^YrxRU3ltjw a5MTh^&y^p_kPUVK0000fsjzWsy+BzJqAM5TM4~HVGn~qf*^tth9C^g(JTbX z3Afm0Yk%(U?!BE~C~fNs9r*D3bIv|SIG}_&5KPQkvqVU z1S0m*!gKl95%182tG(Edu2d>k>9=s>-z(4V<+=ndGdHJ zStt~i$;Rk#jUI+!MsMG|b$@dFO8iaiWy;h_MLSE`kgk>%V++Y^qZdD}eOg^Cm&-qh za5xMp8GCd)9NgH{)SbK0==i;CHv1f6o&>xAF62+(3-I3Ia42rK`)?=0pU+Ct;mGv# z>})i8{Q-!d!S*_^W>rM!0i-AjLZMIy1%tuM6BCnjiNsga??3&Brs;nC7T_Hqk|h73 z&SY6efk0p;l~T;%;gP2xK97a}YuM8!NzxD;A(YGIwjs3-u&3iJchPD_t!9mVbQ}QJ op$Xp*E=3K-E_%aQ$8P}!0I{+p&aUo!nE(I)07*qoM6N<$f)MIU4FCWD literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..90772659bff5f28b9eedae925a2f872e4c6b91a4 GIT binary patch literal 831 zcmV-F1Hk-=P)rfK)048yi6o2nmK^yWms~ z5kNu^H_Niq48!;!fP)0KXoY;CxW0D3p>%gujXIYWXGfz^uhnW@c>Q8b74UoCK$|6^ zsHg})#ZAB_5s0=mHlMz@Z>Oe2tH=`31dee?E|*dk6ezP*71Z3c4Ua~`OE?N6l|&*@ zRjW6YQ4*kZ9 z<+wgmTtqk;==R%>74Np~v*Qn%jxrfi0+HRa_Ib?lhd9ujHSHnD#$h_wW zD@>M^yi+$v1G8V9FC&r2Z%nV(!;q5el=1n3=B}-vXn}zv#&-+ib zyroH9IXLp=0t*ktbUGb6`JhUrY3S_i=`b3P^v}*Z2ce+7;PP7_FITu5>l8VQ0RV!D z|EVhY06c#%VJA@NJRZ-`*Eevry}fnF;jlf0ukj;V4}Z40{~1MT07}ri+TV6002ov JPDHLkV1jm!gnIx0 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..c005a93041ef6a464ce9af6db99ccde86a469c2f GIT binary patch literal 866 zcmV-o1D*VdP)JN04SE1PUcV;@1x&s6Y`B%z{dY0)G@D6clM8mJvaa^+OOzl59)O zNi(Omxy^JRcf0ql_X>dxJ@D|J_kEvpIOloKi)CeHfmW*pjYb38jUWgSY7D~)&~_h! z0>O{qj7FnVJkNU(fD{w#V#YWnbF}z)WzPP>qKqURqi0#xGd?~(^M2%I`o_BF1L7k1zap6797VF z79Xp$&}xlAt&mbU2H3x{L_aloZ^q#hXYxcI84ibcDnBJN_du%XIK2VZ=>;~HV975s zzUY6DLPjEyof0rIxjcavw%UQ5B$X=WKDy)yQYe<$t%86MVK;z~FesSbiGcCp4HO%| zk+QG@e%U6+mI)juBAg(I0m0Qijn{V8D6WDK#il36mP8(|R;z(w7@%nylu9Ki6bg_? zBy+>h`yCQ~GZN;}%LqX{ygo`BEw#$&_qIsG)`Lp#F9pWyP>?|4#bfgNNiR^$&>}+J?U^bWWiwYOKGX4+voEwqw#d1 zj&cz==PFz|l&vz$@fD<<0RFXB*jyXhYFVGem~8INI#MLMT&}NZwTe<~gMdNQGxl-b sj{JEH6VGmK$+h({(4N2{_*Z}d02{e^)$2}v0000007*qoM6N<$fkAJs9sncwGKAjW%|Yn1DZTT>(o*lauCBhj z!C+he%F6Nx6kPPc+8uBvZ0oz$(cv>5_vO$KxXR^1PN%bXc=+9u&d&D1sj10V;Kqrx zrBMmcgwTL1TfuHy1_i{TW?7aSA)#q=b8{W+`3dGQkV>OweASFGiNT}*xd-wuGyjhD hA1w_we6#o~zyR48NUXS;R$~AF002ovPDHLkV1iwLS!nf`kMkNfH{3D6kKi z`aw{eWZ@9^(sp<6?Hn!8H4psYoO7T5bN=T!_rXji6G%@_2Wqt%tQ`bFAXp5;cEII! z2n`8C0-`96@jM@d01_qGVB~C)GkeP&uELVivfNA!lM#!>7X5zz#PF*ZhUKNj5g0Q~ zsIfw{cY#9&|28tD_0x&+l47Cv) zRu-gSZv3-vp1^T}O9(=;IPt+pOY0qld*FK%fy%&JLeZM^RMWnWocMPadiDzaDrtDRR+>OhQPb zzuwS&y$_@AHgB$@tLw>9*_H0Fc^Gn)`?T4CE)8(mrxlA z18Ys)1ygs|^%099ZD{mU+LsBGK!7!Z955P9&gN$CIgh8|{_N~bA51uP@fZ(SBZkE1 zp?Dt>heF~tE}j?(hZEo?I$5jLf{KcY*2&2Qv9i+94edH%1Fg8~YX|u+A7F#Xc4s^G zw#f~ghOGaeR0{9wgdKSWiqFC|>b@dK!KLHa9WgW^-u7be4>~{t>Jf+>X&}_>U(+fA`k$M}PqU+D|`YjS~Z&00000NkvXXu0mjf6xMFc literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb38a2ebaaccd7dc01482cc381682acbf30ec05 GIT binary patch literal 794 zcmV+#1LgdQP)$KhJs27g1VTigI#tkkM#F+Z#nu7z05NRWLLG zED!^Ns;W-PvK#>rjT7wBinKbuslK_jth%PomM8GJ$z(F@^?GN&ynka|jfO`+Gf$P2 zlpx5s184?TzxQNYXYcW1`=JW+e!W1E1g&8h&Qe%t$+cE;Gm~RvG7+CAaT)1Il2lXg zYAxpsMvH;n!;l0bHp{}cIsc%o;l$ZWtfNz@RHpI^>=m_UYy>0mWH5q~>4Nejbw#g- z9u?4{C}v8)XJu#ala+tlL1lS*ecHUb7+z-}mfx*{xFRN35vAcFn9C#}4(W6{#Ih{XXf$)fFNYR1@|u{E z)t&DHZX+5FEkEghI1`J-#>n*SaE%s*Va{B>ceeMlq{e+ZY$1tlq)lxwwYo5yqgmfPKaI}(Y!fSiW`8=#jS=sUVDbebN& z8~Q=bN>y?(iRf)B9~FcHtvx+`eQx*p`w;vL+;gg(_RAja0K9}+7%xTTs0m4m2*Ez2 zqH)6MbmEmyS*`Y#?(V*8Zuhxc1PZR9YzLIeJC{+ycR$l{ Y0Gvou#fH$Xf&c&j07*qoM6N<$g6ubEkN^Mx literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier_left.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_left.png new file mode 100644 index 0000000000000000000000000000000000000000..c1bfed84f8f6ece6443b4c4c5a3cb4c867fa056b GIT binary patch literal 727 zcmV;|0x127P)n4q% zrCPiFFod?Wim{YZzwiS*2tho16TySvMJ)xvyY$vv6s#b$AXMp3B2mLw#q0L;m&_Pn)7BnMfoOUzmH_Q^;qQP?InR@cDc& zIywq85D0h$ck_)~cOG6m8R#95THP&_a5g*7i=ACvoozjXVl28&l(L+_Y|03jA=PR% zID944FM55QUctc=4!HU)Y%iTS=0AV^<{;Ct&#+=sRkb59a8_atsjRG|vY>#)`cDmY z&%T=MfCgr(R4N{)%XL)KjoO30cDLK2F_M`Bp6MC}zzk%)q7;DIJ?Jbp5^hyoZQh%>9ndD|2VU5$c3yrJ@q_+ zbMn>UaDdb41eePNf*^n>ia>EAr;^G1()?Vr&)dxP2K+*k%PCgXa$$b%-M9Pq?tUB_ zd-P;&ZEY80CUMyE2>eBoB*^7*Aj@(q3N9gjgcb4^vV(laOK#81ycwUEc=q(*K%OOp zY$3p)ELH3=>nR)EE#w38{%~dIJ?y~u#l;0J9DXq#jcyiYxl}~wU6ui5g+Kuo>refx zlg6H-FoPNHudFOXI6U7XHAg&>rX#_U4Q!N69~Wj_~W;kovR*59wQ8X z{``sT1pyu&Ua`MGM~U%sunY6Bv4aG^{`~vr{Z|%NpjrWpSU`3GP{HGGpWcB@glPr= zZgyrChTq>m{P^+XE7oWPg#!rx{{8y}(4Y6X*qPb>0fk`ltjtWT2ez-j1vKCmh5_vC z>|o5s#>U6W%BpFmua&iGcHfN;Z(jW3U}a+e^W)2xnN#|X^mVpe{{H>@8H_N10#Tst zA+4=F(|mp1N`UcwZra2i1)#Vp5WffFOF+X9^Yin6$7X;uNb}^$^CvhsnA8B-^BEZ# z-=Rk_27vk7+SfUQK+FTgUx4`TzkmNO{rU6fCy<6~+`M@+ssTX24piV_Z0D(OWaX@- zA}cEM{o9u}+qZ5zcYNPwDWLogApVKd1%LnkH88RFGB9)UwHM`M=ip>x24a3WPyb-i zzyJO+9o@b01yI>ZoMG_m*DrMgD`!oR*y~R}e_en2=@SUQ{P^RynVqX1NFIn8U>L&% zKY#ud;NjsF`wNT|F@6qqVIDSikoec1fB(Gy%EAhg#~TYje*F0Q`{&mWAT~@h2ynAA zv;6w<;Rn!w$JkteY{0FfyEfeAVrOCf_n!ftI9Qk&*$(X3a2u%U1u!N+VFkt*27Lei z{mhIBo!2)koO15RmyaJgSee+rynp?7a&N~uEmfs-pb{NsW@dh1R5P%$vce5ugr!6^ zH8qB(PoHxA{{7n)$OWYZK_I>j#1DYjWb@{oT~$>jIqdB0s~H&?UmZPq6k-C%01#GH zRb}Af;sPZmI0o4S!a%kVkgh#`{L+6D6O%$KD=TT3K4J|3VJS8?w$|&{pZqs9H7$kd yV<92gKLe)JIR*yGEV8n)cQL|Xz;Yu%fB^t~Z|5!P;mke&0000|o5s#>VpN*RSteSIoK1&dl(cgN5PihNZKvfBg9ICb|KP$mzh< z)fMCdZlFs7Dk`d$L`H@e0fl*?(&q#O1ok|A`t%2i2_OSt*u}*~#Mag}?Z}a{|2a81 zvsqYJSb>-UhNYyWP}GAhN9Ner*c4sA{_H;=A72Gf123{>Tn3&XVZdD9p#oWy#uCYpvAjFJjQjq=e0 zUujAS%C_BhciHW%v$bl0nmEZXFEji9zuEWZ5xuv*f@+IpEx=?lwUQ(`inkpY4g&vFPL_6bbJ51%hi3<#+i|eZMfzw_Di*NU0}&#tB}k^y zqT;eMye>8xNNd~Wh-D$#C&&sak=iV%*qej~16wUYEdDWb(pzuI{m99R%gWSaokcfh zMJ0uh24?4Y2R@5Ik9-f{cP*i5S_y>?JbV`)oH}#7ko44;5UyK@KkeMqBSjMM!)HO7 zo|T*oV+&J0pYM-@bm^YgUw3bwJk=FwAIFiA=phI{T zX5il8(T?H?90-L*?{M7UU1#&qt7-F%>(g;z&m>ZmIjpMrMco4{%;((hL%ky-V`Ch5 zZG2~E=ZSTfPY?w4=3tA8Ah#6<>!0oeSgyaPsmb3pJUlkUaaSK~Y^+b>go%~;ah#Yq zU|*RJ|J``KUJwihZ!a%zY3=Quk069y1VMoRUAoffcDv8x8!z%apHfwIru2^hsAZIj vs8sBAO_3<~!G)ppR#bq>6!*nF{1jjS5$Iv!&Lq{L00000NkvXXu0mjf8IEDQ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_actual.png b/interface/ispconfig/interface/themes/default/icons/x16/magnifier_zoom_actual.png new file mode 100644 index 0000000000000000000000000000000000000000..a445ea6a22ae0ef103cbd9540792e54089fabeef GIT binary patch literal 772 zcmV+f1N;1mP)1KGjZ_ZxHDJBf!Xc^d&6MBorGkcSG#qy|Fj``xz)H;>q499Os4Y3 zn$km?tf;EGh!sWIXQsQ>QS<1j@<`e7iou^qC$} zSvO)XO*JPX1c3rXqU*BC8k}&K9Oezk%5;`_17~A;bZuK>b;w|_fC5Z~J|;>zgg6L+ z>E^vTE7MtKb09>AvvcucR)?MGhjd4>gRbj4s6~xWK7_g_Pd02vJO?e(qx(&3f9|Fd zBF}$LY16Yx3D4VuoX6w&Yh*#QnLDgNWQJAn=jrZ;rPph z1AwA_T_-a*e{$4(jK09G{{F$?K%o0UNlowDY4eTi(;;csOXN6nP}5S2%!BjH&4O^~ z(!jvbP#|z^Bo>Q3vt{C82)TFre^M4CH$q_L(-^?H`*&1Vd)xc^hI#{mE00%KS0-q~ z@bdf!Z4CF>m*<237A}_y_3BI7@eIjmP6rP19y} z&Io{(L(R)--kQ~9VQvm(6poD|50WFhC-36700RJ&U1&|T;aY|O00003 z%4{-LXo-anZEA&bGa`_Y7KO#=A?Tq9nYITBdZ{`*ZI-w{ynGse9-LAK&@T`F+3h?+0s}Zh-RYqo9l+Ka55bFc=JV2q8a_ z0)dTSm0%KMJdjK#=QlSKfH`)41n_1X*clwhc4DlKI%_muaB-otZTiRoJ6ca?GS$D= zQrAe4pe)PtY$}!7WhT4U5%bVxk2TzU#9V3NIXi+7?kxeJ-l5m_RYZcLuf!o)QGc+B z#0Dr3eph2@*ws*6dC3>3p%deent|u$r|ja(2QFpiyBPlXCFV!*cpMaf&~VTs(PXM$ zKWT}@GV(HIs?!R_jrC?a7RVLSg-&3ruHu*J;N8l!Oydjh2}v)5Xc11LesP?WL-mxZ0R1mecidy>Ml3xNTsbGg3S9FNxbv$r;+@^ z8OGso{4>%ZT*F}TbZ5tju90z|M&d}c6f;rY0P(LCdHu!Pm^?ft@c`(0H4RU*`7cMz zhe!u@_4fMjdcEEEO856nOz~H*Oa&6#I+0=c0Y%xIrye%X++?*@c>4PK`@P-^gVAX8 zS#d^Mgpm2L`;%0#AqGJ3+kL?1?%&~b*0%e6{XJgqxyLIj!RMsl;?mq8DGYbnm*xhx zgxzijZnyi^!h)!^ww@ejS+<>YE%@J{nR=_$dYtUoCP`9AQIzTI839mokn>p1(=NPF-mIn_c-kRmM-wX{&` z$H7(`5`)!^S(DxD?rdiz=&CvN!JnDgH^2Y9c{@Z)=VMUozX3d0#<1D!z+$nqk|Y_! z%LtYaD~**z2*pdK((2)%0H~Yyrh(Pr180M#;UGfl+oqsqjdakNfo}6&bAbFSmCOD= zS@97z*^*^>6^f#G4#uapVtDFKk8|y63u6t`T0A5Hh+qTBG}hN>ZkN0P7E+5Q7vND2N5Ex8Kg5iCE4RN z@%m<5KVeKtG7>V`qJr5pq-k3!T#Gr zGw({02c#pU$^P1%+G+Y<+tH zVCDY(O-(JmV`CGe95?)OdwXjJ8*Xf_Ok!i=9KN{{KUo9<0T2#{pRBLvw63n6*AT*9 zf*`>EhQ8D6^?GmN6T5ky&nSwra8x4zN=33^lnrZrk4jYf;L-n(-U@?IMe3RHl>P}Y Y0GwGX>8zvJI{*Lx07*qoM6N<$f|c1=NdN!< literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail.png b/interface/ispconfig/interface/themes/default/icons/x16/mail.png new file mode 100644 index 0000000000000000000000000000000000000000..98b9bcdaebe6e7a72c2be4726d5f0e24ee9d84b4 GIT binary patch literal 501 zcmV_#1~YUWV-Fl_kAO8gs*UXNzWCHb4p z4@V3+V1NY&T)B1}v0-(OK`J`Q<*3o^(v%5^!SRk5a=;)44!8;)9)GyLA8e42k_^M3 zW~W2tVljxd`+YJ^Gsu18LZMFq$8jXufvW3y^s-pcMJh!`B0(({fnBpul-ssuGct9Z zBH=J8%mEhy0vq)1I5eHl>71*hQjAAhEEEEP*nYgarja$B2AD7lI{Oa9YP}|FG9i;I zOKuHjHU=Hk@r{2{;qcSjL=Z)r^B00000NkvXXu0mjfEL7MB literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/mail__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..340783a4f84ab42c54ec15d32e47a2947d54a5c9 GIT binary patch literal 621 zcmV-z0+RiSP)eR@8zpWCDdSP z655c^YD!%Ox+zwWf(sQ9H{w?CXZQ~kL8;(QLG4Ohx=}%j(pB0;NlIc`E2+k4(nj;X z(&s&~2qLy(2kx7hbI&<*-^^9M@8d8-Me|HoRW%w;;wGIpk79t+p*o^~Bv3QiPR^j-psDqbUMn z46cbWM-DM+s5SX+BE%g5>2VLW}g0YfUV_9{?a+s0O-frOl_B|$@u$iM*Zy>6r0Z1nf<*Vkc$ zJxtGJ@#uL8%|O0jZq@5XRo*o-Hilp@_(#)Jj2@=vMo``X0);$W!4{i9cILR;Q*Blq znVh_;W3lAlx-O8td`ZXBDXu%xfm3s*QpuB9EZ%+m!Fl)M32`2KOd@$u3|@IqoOI2RU8U5mfRBg7e+V!Dwm>uT#G?2r00000NkvXX Hu0mjfz9K7Q literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/mail__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..d37c01966cd419ed4d61601dffc237fa361ee385 GIT binary patch literal 661 zcmV;G0&4wL1`;yy&qPEMj!tD&vya0Y{2jdCcL7-9v>vJeS{Fv}gqYIRo; zict>b5<{$DS{8HpPRPL^X8CU{udZUV+lAx0JB)l3qa4a5hFHNg4CZomn4exVXR;}GlyRL z4PUtj`kW_>u5ppC6z4ZzssVg8>;15O( z>KO(anugJ6)UP7Mw{%8Txg7@EevN(mRm|PUAs!z`_s1e{s!amS7wDTN8XFrJjm01Y z0>8U1hrx-@34M@#N`aQ?Ap&%!&6{TRFue z3?JTo`TFR2=pnBSw5&q+Vp!nueKvpQ?2&Vc1HmM`0iwyP(6wiNY_p|n<>I#mf-G*$ vVffm4t{m{1ZKLr>7mt|c43>d%s00000NkvXXu0mjf;=m`K literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/mail__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..adab26ad22409820be0be7618ce270f42bd6b0ec GIT binary patch literal 534 zcmV+x0_pvUP)>Ky z)vx+YIVh^l5)$6cjWi6@EkYSFDgneayAJ2tCIOf%_$~NM$7}nbD9ivvQMk-R*+}s>u0{#^B zVi8*_E8p&08;*x2HOt%vbz22u_vsT-M^d_~ScZIa+Gi=lm+b Y0E7M+r*@VG_5c6?07*qoM6N<$g5mP^4*&oF literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/mail__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..7c07eacaaf27655fcf7c30e2264f13f5fb695851 GIT binary patch literal 644 zcmV-~0(}i=ca{Ai=0^0x3nkawBXzv__0= zs7KR|?d+Vhoxb-#K^hkM!Nd3RzR&Od{xZw5u$RHH$Kkv+G0`jL*8k+oPSZ4{^QqLM z&bBrLyxxDJzE!JODi$%hurSO`!(fSU7@0x=>#7Q~(b!ewAuln+a$VQq^LWrM66t(? z*CtdW4|$0pme+Kh)x}GA-EOptV=T%t);2d`*6Y8Ca#SM^d5IyG*EEgQMR!A(ytI=@ z1dF*G6ai3F0^knEuUq#vHQ7>EXHZ^xfbLT%JfED#v1ALv(I|*@R?1~ZUc75eBwQ}n&QG)a z4vIXE(^(2TPmhJ26y3GB4=}$lI@cylX*UoQ562(4@q8AHP%<9 zFC`6xN}D30P_%<|a&XYa!9{R&bQD48?&8?h(T;A;U8-43Yg&`o7$K5k6YWb<^8TOq zy9Pm!DE7d)=e%>i@0|1Qxk?`A>dZ4}!qDv%I{%I6I3|hVf6V z{&0xBRtv96rH5+Z`^v>^7CX%*z7GZnqG+rVLo7Mus-EW|ol0R|1hyNEu|=38hFEgQ zRb9_hLa_-WnZ&&KjdHz?Z@nIZF#Js!V~!YN$st#D9Y+a8bzguCPLj)^T&tlg2#itb zGsYY-jFCgG&chcUUJ%F&QdAY0Oa|N4Di#X`8Qa_6hiRHJ_Y0?KKMOdHqjDTp^?V;4 z+s1{dDP+=V?1&eR`;o84Htj~C zBEc3ksn&`FT4=Rum0B!{O5gOsAJBiI|H8M5K8O!0f|V336!9Z1_#i>Wv`qquCYyG5 zb~fJGXlZCs@WR=Trq3(s0Wkuv_kZ`Yw?Z&-v$ zGjU|p%HEz*h04laRLEB z8)t_5FnHoB@+%K%6AiR?@b`H$j-l)<%!mb-dJQ@m#nqLHAOVMpju80a8pvLpM>G=Y z__~@~TPRj42vZIjB(7b^yyGXwg)Yu;E|7ZR!JVNc400RJmU|LDATMFd>0000uSca@Rpt3dGGgTc2>AMISCFy5L|G?i~{nNJKdC?Qv{nwxblymH?8{{NMfuCzm7uY*&=6Z6Q984Q18H<= z9J7&2mjP?8U5hqbB7V-7XL_+nnKOqNCiCbdTx@_vTD)HPBngrzLTNPI+U))zFjq8m zT?mCcarR^$vx|#v!JkA7noU8LksG`K<}g>(>B81x(GDC;B=Dh7Kz$dH1`YJ{@-mL6 zQf@7Cm@8?T<_Z`zC_X9K)rEKS^Ry%m9Culq-^ld#B0x@bt|d|CO02@)T%(5?SzN8x zak#G!!9ZZ^zF>`euT zY8vEH3Gucz2sCM(7HYTPcTp1ITCd*^=1R-5EPYy7Kq{Gp&*#J6qJ>%u5SYVUA(YKt x6+@wJ{72ZTD)ZX$v3s!n&-|A#3EzJTFaV<3H54w!zr6qe002ovPDHLkV1hpsPniG! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail_open_film.png b/interface/ispconfig/interface/themes/default/icons/x16/mail_open_film.png new file mode 100644 index 0000000000000000000000000000000000000000..a68b43779a3042f174f9a0654af64699a5111b2a GIT binary patch literal 772 zcmV+f1N;1mP)!VjVhl2{b%pb?g*&scU$WE*=&!gx#P&r$Rbpf(JpQKTf!7 ztJ%)%&i~$TDk=$zzUA#O?|t9*e(%i;S1Ogjz;Rq~&E;}PM1hyLxi(7WSItQIR3XXo$H+om!tef4%ViEDJhg@`X20WRlvGPpL zbzLkhETH4?u`bVdVOS=NhKZVCpz>)4ORrbakvZDMIE>3QOv_WF3#p#rF_s({7=Y_I zys>LTubObkAf>o)Y#p__O*NMfIK)l%oEu|WabCI_Kb7k3udmrC6bi6y2O%|tm?|O6 z`w)Et$+!x)Gm7P-|R-RyVXbAVGCb3w!8Ekc@T7{;4 zpiLpzK@%DE(Vk}J=5V^R4-cMhTB2=PTqN3x!E6@Ov$KE{#*zLhxE`=;IOue|Z;#FM zurhx+;0%)q(=aV>(Vs)bWOFk{22VoW-vM6mz;gl=HH=tHL4-zUC&aTiB(mEJ=VM{Cd$6h32F>F*S0Y@N{ z-~@WD#_6UBtz1TmX5)As7Cq-bfz{$UxyVN%ZTJs(x~{Qrn6+)%^JV@E9QLk#6<`2`u}G~_3`2GR0000U#>e|b%q=HfGBrybhjWSSMnR#=xz z2OadqIM#f&a$KP+6Drq==B2jv{`K!hY(?1k& z6B7tIhEX5b2Dj4*H3#q(z+yO{>VAakcI_)tWhOTAB*69a7v1}Pk&d*ip>^jOY+scc zsjkjD1C`$U?j!1hUZhrX)@lFIju(6&%6-dKsNu@JcsewIge>Fx%c_46hFuMb*4iTy zW@HwNq-O4yj@C#U?hekYoTjRbP*9Av9qsrqHHG)DYth~ugXqy=7u~SBU65xaB3(zo zp2WCh;80U1D28HLm3-)>d0al!1%vn;bK>D+J6;VkNM!u5`zw)1S`kksF+3bal_;P{ zECIz(ET<@nNuXu3uyGtNU%!Td-m92r+=#wS!#O&R#JmSJMPJah literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mail_small.png b/interface/ispconfig/interface/themes/default/icons/x16/mail_small.png new file mode 100644 index 0000000000000000000000000000000000000000..629448fe76b2bdb70e25fc26a5a03dbeeebcd898 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XPI|gHhE&{2`t$$4J+o>BEQ3ADcXQet!O?x@F5Q>zbMvn8@!hY)-uV^771zy&vAb4tHba}JD!7s#q^0DcI&&&ON?En8u zeemQ_(gdbk6)(PI8t^`9KH~VPg88Gc2cxkuv$3>vv&4lkfi~s^Kh&Mr?(DDr-rBjn rTytGSLUM9-quw!#SyMF4859mMnAC*w$h_GA3IGOAS3j3^P6`6pHRCwB?lTA+(Q51&XxpO-oP;F{j zLrW84GDcZI+`!HyOI)$@5BM+q4es2rV!_V1lzlfS!6t-;AZ(hJ&<}*EGc7Yieb2-p zCTh~gNzUAybI;dv?!CrjGQt0R`t9!SyXa0#77eDbAgiQ{zVwxsg*M0fr>3y z*5_`$zQcHV16N8ogh#j@=JRPao6~-=vXZW%i#_9J7ykOzR$HzyWu%2ec%CdR!6N71 zKDlHL2bgiI`FT9w*g$h{55}X_)z@Y|U!C^#kh>lG{?7daq}Y_A+~_IdQ*LQJGyD`_ Y05=0d12Sk4Qvd(}07*qoM6N<$f*jZpZ2$lO literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mails_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/mails_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f23d9f8a04260238aa53cf6ec72875fe33edcf81 GIT binary patch literal 660 zcmV;F0&D$=P)v>p_(!G+n!n>TOf`vziV~cx61t@_K{c_g{<42?6 zDzHd_=$Bie%3rHhY!On!vM2#%;cU#M6UKb0gxbai+9Z=lp6lD(lQSlseNJJi6~+=N zTCdk-g*j|W;BwJv1cO1$FDxJ#jiR!;iby2l`gy%*SU7!ZKW;xMd@&bazpWMu-xOL{7O9w!Z(d^2mnnRCao&mX?KrZ5Nd92gpchd6)#Qdgwghr+ZJ`&Avb&Cz0PvHpn;n uUkNGk__{(%Af6kq`H>r>jZ8zHLz0000jxBi5yVqLD|k>45j=`|@KWeaFP^-36ufzBg9uhH1@B5QttmEXtS!=} zku*u0CQZ8C&BmG42!27uh1uD8Gw;9idmmD}-Nyes^1bQlAAuxE6Xe4GFux%4+p?_A zK;+`+=;NWjJ{MB}P z+@g3cl|ncegyQvbF$$#;1_)2_cwpH!_M1&fHcj*J+|=a`d4t!Cen0|39F}`&@e%Z$ zDYVKns5hHV2My{#9ELmnaS0keAU1dfemjjqF^@e$YBm}qKq{=pTyer!$mLL~R&hXW zvgbIYEJN#x!sC|F8|+8GlfftIc)L<@v4Aj1z~Q3Z&~+UP*(_G`dB^LT3ak1WdY~Uy zZ_FSV2%B%`?j*0@y*-tipD&8W_YRn=P%fi45I{T@!`k|~<8`sjM-6SWh(sa*+bFn? z$GYWPqi;S}(&=Y{Ihbd2YYUpHI$d~awNDNYlUGpxGK;RBE^KZm@#^IyN=6py(eSac zQ#d>KR5Ao}Fi&430!`DL1J$wC-XbKsfHt!5h!W0UcnH5-gQ^-mZbdyo)MHZj$jCL9 zsz&~__mkt9%j4&QL!ppcMcanja|!kGb0@b`t{1cE{H#RZUa|n6=wAh%JivW&r+>P> kE?9JZ>~B{9sjmVI007Ni!hV3NEdT%j07*qoM6N<$fnO*6a1~KTSPdUcMGIO`DggIK=q_#j)LP_Z7~Axw+?4 zr4nw8jQsOdGYnC!*YS2`<%up)p_Ia9tHrL}9Uq6cy9>YBM7z`Zqf^g)+Rf}^HRv7VHmJ&``+5l4mx7o5&7NvI*R!` zEYqYh4jK*I5j-oMM!Va^MHFc&j^n|(CCgKpTdbJ`5C^(GEVnNhK@=q!gpz?iEVq)# z`$tFkAxKdeiUaXNZ{%_XW206>!57Ks#PfJvCax4e1sDM6l0|vdUl6PS0000dHf>tc zFBirlB?MA}RbzD7mEyugNp$PNwfq2L^cQFlTan7B`H5v{4&rcYgoZNRfjvJ!G-9mm=VE?MBHUpju zq0mH+&xb>1^Ix;dvW!F~gQs(I*Lms+K@hN0t1;ucy)G|IVAH{7GkxX+{mG0MEC|TOt~zXcXn) zVH}CYy7-oPQ?Xg1c6eX_fti_eJmbOmFkXJ5F`rB#Uo2vW#$+e+{d>Igxp&B}uHy2@ z2yW$ac+uPYT3|ftR6yrN+pt=#m|t9k&*egfKu)Jqk4rz^V}0QcZd?qadvGwa-PX21 z;>QGeZ-R=V=p8$4Hdsl_1dZL}_rpjVSWCY|E%OkkPaenJv59oRRvM2)wa=t&K~Q9w z+olz5Y;M9~x9i=Eq;{~cPglPxeS)&~0B25x@Z?z(3FX9d&QqEKX7zi%AW4R0QrPG5 zz+$oJA5_ycIfKpQJw179`U6DY6(qJ?siOH90^#uQ_hawxziQ~{@Eo-JOGlT&W8)vg zw{HfQUoCmxB=Vi#wMu0}EtendKR_}gnT<_zK#lcl=ecRAg8Pr(Hsa*7w_jk)nt)#d Z3;=dMU@-jMI4b}E002ovPDHLkV1j>iMRNcE literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/mails_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/mails_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..097f686dd35b51b91b0eeb79059b05494513d1a8 GIT binary patch literal 649 zcmV;40(Sk0P)X5vkY^(cV;uHxKb2(1Qm-<3$hRwHN;ZZ=M9vOBFnL(}O~9H6;Cknwr)YA-2VA zV)JXa+ucokFWO#IY;a+AX5O!PpZ8`&uh+x>d~$kbW`84u$kG%Yz<*Qn-*KEhLG1F> z)WeBH0*8l&{_52-43sJryv*lsDs(EOl-RW_9^ynij-~Z=)LSh$uKU|yIqTVu?G=uw zC<=U;UL)O8#uJfGJKr`yGjX$ooE_QAO+%Wax1t{ELb0Tg9W?mA(#O|zeYK^Z86 za!WdSqgq9WkW9l6k~ugUb0rC5p}OXzLU(sJj@je2K%R} zRPFTS9~&EkmpK3Qoe7=B{Hr1?YZu;2 z8s0x!Ec|>tD2QMxb;UC>5y76A?F= zc6Vmy|C`C~62mayKZBm8QeaFbKsfH}Pe_7&HWtb@j0Ux?QAF3YKq4MLKL~}u<8u9& zCn*X%)oO5)$(&G&+83FSL!DJ}o6SN%6hUw}=8{!SgZF+Pj-pYxN~Z~3hP=Y!PC)=w zRXMs0`My*FZ9Im7q7bU<`k%=%TaOs*g9&h~46?Vm3Au6^+L8n#rffCzVGQ@+Kys_o z0a;Z+k!21AI8@yY2H~Mtgl4Y?!_mkzoTCq8RyV}1*{A&6pKZMT79AE>&+k{r{c z<1MGbqdA@5$g|tK9*Z5@Jf6TJS0Bl8wR(Z%nZOhxPUpW3BoF4^&wrourvL*0CkG%y TNd%~E00000NkvXXu0mjfx{2a! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player.png new file mode 100644 index 0000000000000000000000000000000000000000..d69971992487c683cf8540c8a2397f39ddb161b7 GIT binary patch literal 619 zcmV-x0+juUP)m}DRm^L|V` z=Pom3mfghzhdK8=zwgYwN}*5yi=rsI^tn%Z6&K52(y#0F`WGJr8PZGN2gPFXD3wYb zc)rs@L(uE>ew0e3mvlU7;JU6Ck8yFiT!s(=)9Dnm*$iJ^9Ki|+%ykWiclPk?)w=_# ziFrk0wOaWD*#1zz38C-NBnP(bARh|hrz-IH-VT1x!r&ZI#c!~IK;_`0)HmdE0)z(1 z6VegkVd#HE2N8&HjMCIv<_9*v9Sm^%=`+mST?~h7Y;U_k3L6b1g?v6AK=9=4N8dKm@OE$}1(j{q5G^i~ z$+)M_=DrpZb2T`xi$Zq`;U;u-sQ1z(9HW2^-002ovPDHLk FV1m*?4?q9_ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..19b728cfba42db8aba6f1eaf1666aa14957e196c GIT binary patch literal 738 zcmV<80v-K{P)Y5X*jG< z4`>dXp7!N-PQTxY4JYOc5AWyi_j{h_eP1COje?sX2m$Jj5Nfe^+ayezrn$fqnFiJ> z^}VrJY{=vB1WRi>8x_IY+S-?RJbsI&{}LF6QQCKK@YK{4WLZWwn?){{!<(B!Se0bt zRXf6=c3i*xFi0_uQjlCM7Rv>AJo%#yvf56SQb;CKh)5FVL>ZU5Tkt(+1D_!XfhkP$(2C80>7Vod2w;iv$JryTyQ#___eWt*Uw(T-_r$MH__Z|R7%*Ez>*M&L@F3ux&O30 zZm37egIy(vJZ4B_oY(6m58T#9GMR*?X(jrM|9imj`FvI|-MO{FhO)eo=`^&Q0yB8N zyGY(|(KS~{;6n`7&cXBZ^JV(Hwy>__)EOTVi;?4|;<}vE^|1;GB?b&p6yb0@w)lLZ)FLX7Hj?WC5R7|ql?bgeq%Etx<22SSld27xUYiepRzM|mp(N=8M zdr%wffKgY6#SCyLwBI}PHqjy{5()VIekh7!{R@_`w6tWgP*oL8>l$7>p2HR;{*%c- z35VhB3}Ece^ACb3jz~m(Un-TVBj-bXeSNKDp33z3J+S*hPZ1{qGETQuf2-n@J@P15Ai ze3Z7f*0xA(5G__WW+5(A5Tq`;DY|j(reHxRUAYhy1Q7&(fbF7)x)Zxl1S#5$l1M`v zYH4GWkfhDm%g2j%UQJ1A@xo!|&AfBwo;!1;iHQk_kR+*}hI52={6F>xU+VSxn)u)} zF;;0DpPikZQB`%Mv35A<5G0ey?{jl=59o7WK-cxgzC)0gmX^RdN2yeTrfK+ee+D}; zN7>zm;OG#hAH5tQj-x^1wOZ}q05PABod9}l)x87=@Nx-lW3WZuSn0mgr ze@lfoP}xURvX_LwkrtSk3&>QsKp;Rh@E9A(#1^(AUojAz!upRzD6(cQYH}+{`1)I6 z_nl)w18B2Z(B9$4=wN)%YA!;c#e%4TfbcGetE;QDtiy$Q^bMcKE-BYI6pxk%0hX3=W3_R{1APW*K_Wl8ZK7IJ$JU%}NCli$LGmB$07(9kz{)jm}IaQ;Ef5QH#Z5^n%DD zvhob=_7tov4!e>^J~d;Eb|nXIm-Dz*#vSn>+=PJ1Wa?EECD`1~w{K{dk9FzZ=66A* m(M?J{&v{*2|Apm00t^6bA6*(rQH_%T0000 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..04e3adb1216bbadca5277140b5be0922cf8c8195 GIT binary patch literal 660 zcmV;F0&D$=P)A zgr-;wEmBhigT+(Mg13Nr5f6F|r65=kLQbCakV8F)puOouyoyqWiX-@d1$QYo-0in2nl%jBnVvi%`1%x1H1{2?fiS$c0~ zGMOE}-@k6=jv8%(X0!P@o6SC?&;0?@>C~*dxH+HCLkNMvV1VIpi1!b6P`3$;yc#y* ztGM^***f*O%qB6JOy(PK{OU&x!n;a4wb5#|k+j)RQUz{aTE_RG9lVBInGZOGK;`09 z|3@Se0)z%W-wL)~0$M1DwevniLs#Sg>QUzd48yP>IBI7voWcFaIn)PToa#*F0P0bW zrNC%M#p4IcCK3^PMqcdgLFl@UXfz6^(<$!-L#z@v9_00U<@!-9 zhTTGe?~6q6Ti0s~hVe@f0v2O|d@&dd-p=K6cWKzUlP(hpsi)KFr}cXMIiE)P54sT)g0ZWvDv}}+g1So!B)Z9ds24$0WMsxNr)^^m z=RC`;P0u#n>3cuhat3|ya^CO9^L)?qp7#@adwW4c5CkXt9A&W^{~y0tyj4|oktPyL z_$vDz^LRXiR;#t8u(orsOR%!CGVAqvud?YDK|Y@^>>CL@IXMYQlAtIGGMNlsUm3)* zMncwXK0p& zkzktwkv30RKcb^U0#gHv#fi%!fT6Y;&HF8I)OK+Kh7pSd8yg!X3U-c$gEbhqK7?f@ z1${El2^fYea4#&BS|BxRYiscNe5kCfgvn$=ESbc_lb3LG97ZaoqOOjU2>sL3Fva5~ z1l)ql29anGy>H1r(wv!f4#;msI=>mi)tTySwq|@e4TZ z*`T7BX5Q=d5EF?6{&+81h{a+kFE8hHsL%zlv~U;g>@PeV8Apxt62h^HMIwJ?FhKJA z{ct!OC@U-D?}99Z!(mRO7k=W$x7+CKY{v)#oA;b!{eA@N>+2G=dMFeEb<{4FRIjeC z<^q9$pAqr5Kq}r%4CDBTTNoXEj+(}csIqr~&d^!H5SBX1%)+MA>FTvwZR_^uoKB|) y&bT#mUxLzyU{nefo^vjj`;^UQgDj8y7GMB10cwch+5B+;0000x8dDh&6suXkldO zc`6o*EqFYh>0WMU&>^T)Dl74L{1Lrw5$L+!tJ}Fbkw`#M6tr3`wA*cbd9Z+zNx`Pe zhM8kixbyhMH1*hfO^T*z{R4RYHaiK$HAN?>s8&@(OeUmc1(#2Z;dk2%-b0Z31lttI zT%7m(Ksc;`)WGeYz^ylc&F{nEBW{HJrwsz?k^2PQZg)Vz&KN&>0Qa6eL#frkzPfG@ zP>-~$1y<8+Hjzvw;dDCTa5zw|*RlBVGeY6xXfy;yNA*Dq+XxH`kw|1f!IkIl`)i*U zy&3FkLFP5XM1u;+C6B2H!;{dH>cC-zI@Il|E4i}b`G!pygpd-*P#o2&_YiELzZRO?OXrL?d69^ zZlobLHK>{j(bgng(Z54rNl{f5Hk)n0Lb+Uq*XuRrz>!L=V&se$BOqJd3T7|P1t}d& zyjz5l$z%`;gjeEfs^7*_$bDvU$e*z2uo|sY22@CH800000NkvXXu0mjfSR_IT literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_black.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_black.png new file mode 100644 index 0000000000000000000000000000000000000000..cbce27864acfdc6d3f61d9f8350e441ed7bf1309 GIT binary patch literal 548 zcmV+<0^9wGP)e!oAmQ<5aqYPE$-CL@g+FvHEM zR0@V+z;PV3+ig4?AEBzK_%g?_x{?5_h|bz!lY4;N?RIf(uR-l5Xs1uq>z~+B6uikQ z_BLkm-qyex)_M*|TQ5i^RgfEm!}B<}0LG^$u(%XPe0md?nP<-d(qQ_(np>X2;mJ9w zP77nr9yxdv+ED|PUav>C>&WGD2!%o-3%l9G-PH}^$#t|^eXxeLo=3=Lv;Qp^3B2Av z0Su~OFzB5@r_%vLq2Qv?C}j{91iLDgN+Lk!eM4l#VlmN7-&_zJC|fTS3cg=KWWeCF zb8|kQ|2ql28}hyx3?a)hbY1@;=-JJAIv5IU+eRc35jk)L0s-;PHDIIzjqdYPcLWFI; mk%P5g6$qyU{$U#50t^5wXy%u;fT+^|0000h7YZ zK|_}Wi`a%hrKJbyxo0o=FG9&7LO?wA5^~5n|3K1H?b7K>ofG|i#q1?fY~m+z!!)9JLy8$pKj()zMoE|+ZE z&MDul&>`q{yPqqS$~)Tr0+>uDDsEVom8({(5JJHBeGG>~obHrx85HR5Z0!Pf3U zj%o~5B*x>hvIA@%wO1j`44vfS>dM9IU=SApfsN~rMv0@MmD z%faR$pfASpBx@nP_(}n2zX3+0(H{(E3azGClY{a{>@-87@%ISBN~k& z5{ckjzmMY&ACb$-BFwuQeL%mT0)h5^TMpD!+lmWKccN;*U(P+p4kp}q*^ULgXI&zK2<5F+>IEQn&hHC{Q^MHurb-Ueeq*AFB z4z^k?IZV|8`}k%!huXX57TL#5GS5d8T&Ah7{m*Zt7Cuq&7qY)Hzyj$5o(JwHJUs8G a00RIiWl2b3$oIJb0000}M{P)_;q|l^@Qn_$X;V+0%SaRt|`Gyqf@(B@D3RkgQ7|WeyA{SV8fm~U@F5)He z&@N==2GD{aWTdm2ojYglnVIWTRTX1bLaPEZUEugxt zi{sjB2zLXP)r4&~@qt>rQ3UqiuA|(41kT~yMFkW-+>2cyn-z$~Vu(hc;qV8bCr!NA ziXxSKhhG=BGIyzhc}u@s!_n7osP;PWw}zykG^@ZfFsZ<{ZIntSgu`Jui(0FN)1N0u zW#6FF8Oauivs^*3Sd?%a2idX-@KWpU}*_b6y+9uACMXtE)CLm;QW(VuoE}u51-A= zEu4?V(wuYON<~rd!?tU$ibaK%J%DbvA0M00wDic%4m3?eyWK{o)4|8Z7pSWYzvB^H zzcz!Zmn&(i8S57f0t7s=HxF-sc{6A{HI!0RQY0xp*~&=gY5AZ@UONT^|Mlae#qkStysw zh(@Eb7l)36_v=MW=5E4uIlL6*d!8?VDgfO1d3>gY9tvTa0PYq(V6WN4J~b3NFycu7 z^~@s(kjtZ^Sjc1$X2-YuE1ATbg9CgcHp7k}83?_fO2MIPT;AQ4fhXCl^nJB$86RX2 zz_CM~tIxm)22r8i9C|oHg)Mw?1HnM_pjYS1z;s<)ibQZB9+v@O3tvBen!y@f^wE(} zCZ2GYcG#%Z!07)tk&w!IJ`t18oN{Fi)iO{3g#wVzJ7&FZCk-R^ojSf+tzw#*DP)h1 zV399GHzRV;YB|{20!&j5Q=E(mluFxgTdgonOmgTfa{d#Q$~M)^(#jN56(&7*YBK*% e{*bzV1sDMAIx~q-A^+b10000XaR22I_vrte}aNz?K+}M4$f=d-~;SX@38&Sk%QBV}jO6fuhE^A$wZfqN=);uPf zbn=+SJJ)+|J293R@W3~m_x;YDb2awlG?ZuB$Y5%iX_LFmvk$3I@YkB#6Pcyj7ktvRW@nMuo6W?~Bo-YXC`Z;9-5ThebDT40 zkxnz1rio~D53W50f{7URABbWoaSUay8tCl?ViN;x)7+^;{kVSj9tuqx{;G?j%n`j9 zR4fbGY!=~gSlvajTE+CMw-`!~!?p!D*Z*b!-oZdNFs|&wvNUQw9lk&x&c1$urA8hf zTDD3G&qR)Mtp?s@fZReLHa?F^pC<|Lm&{a&!SkZ;?>ia7)l+1VOVkm-fz&}Fv9ulULXs&!yMjy1Gs+W3F=xN zYjcKOB)kIcz7Z_ZXF%{K!-z~Chs*Ejh>Rxk_ZCoJD%iZ#a7PFIBM<^-4xm-3A$xP) zCWfa^*g0cy#pc_N5jYvFqt^is`%uf|q5N92L2Jr&d8+N|oE`KG>fcu3Nra&8>D(7u zQ_gA76WzrETAhc}6*f&1rN?OqH^Y{xF&ng|9C1`bwWJ`eYZY}YGaX5&r(*G)@vYlb zuUVGY_)`vMv4)mbMD>M+_KzwQMM0^UD`%F|ix2Se(HE->I*dVy_yl&0jUsrCgGDy` z6=e_kH1xUG`2JpQf0Ds~grB|${x8}R#%}=z0A%(yBCGAKwEzGB07*qoM6N<$f;q!1 AhyVZp literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_red.png b/interface/ispconfig/interface/themes/default/icons/x16/media_player_medium_red.png new file mode 100644 index 0000000000000000000000000000000000000000..02cd6c51238e070c33808eba10bf8e62dbc5ad3c GIT binary patch literal 638 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 N002ovPDHLkV1h`(G$8;0 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6513814a6f770ec84455724510aa07d6765da29a GIT binary patch literal 779 zcmV+m1N8ifP)YjkMm@x+hhPMOSo9VW^=9?tLvMvzJ@it9kZ@@xX!Og<(fLA+kCjSTPSMCdF=$k3pmKZJs~7pc{8xJuLH5jmh- zE>msk?(V+BA~)?8Ig`m?Zf+cbK!8;(dVA$6fQdzI8W|bkhFmU(;d@<(>NM~jZ^Ydv z{fNb4Fq_RBRw|XqqvC+dLZJHkdjn*H8;L{;M^qvlbtXu)CT@sCA_#}WJe5wT`U&GrQf6Y&MH@I=v%-NDC%jDf-OJ3??QfkS}GC z*SWC%N92a({@*Q2t(>J>PkwY7EY<6Z3=;MHCSZcwY$SaJp-IIlpCePB<*)c}&k zVu91ij~I)Ki(8SkS}j&e26S9IiT)QwNWPF!Wt5<%=GYFPn6tC99N_VI(D(T#mU0Rf zyw|ZbJ&jLa_v3O$08dkCtwwUUZvp5-k!Y>g>p6ht3pEl>ojCyOdNVvMEbadC1GsqO zlJ3p3;Vw0utHEFpsUHY1KR?e;fd()N4!7#8#Rl;8Z1_10ESVOYJRh0k$002ov JPDHLkV1lw_V+{ZR literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..aae7e554d15a6d84a6eccf8a25b0d7aec81ffa6c GIT binary patch literal 773 zcmV+g1N!`lP)>mVcHP?M zW>;FH_gjzNlt6f%w;n-s4o66S+f z2L=W(KR?f=kA{YZE_uCPsaC7~r(~NciqaX6$Av=%KA&&Tq{ZX$NU>N9l%Z)FR8{4i z%jG~#CHi;^)9e|vQ}j?cnMo)V@-o54B!TUi69z=6_BN=*4P|Q)L4Ad32sfx!tBiXm zCMKTH$kC%B7YYR=lZ)u@@270VXzvs}Js=Y<7X&yL_>TX72`;lTNIBY1>agm;nW67JYSf6-!G?sOUSW z*n-&pO`xeoxa+eRy#5Sr@-He=4;_IU^!4@azr1@d-*WZ`fO6pzPKLYT^|%oVpG8L| zcXR>6TKDxWp& z?hPmwGdc+SuFQb-ff;18S-9P9j?8)-W|IQJl!8bUTpNA?yLlVO13Ebsb~wiF3!NmB z$++_Qyhep-tJTWCL@Jfy*!nsJe`6Uol7quiMDgc1X9qn_Yp|jD!fD)Mf7A&ojEJIm zhBfkFjYn^muLR|)pO(`QEwz#;QkYTMyH5xf{|GPuvX?^mPi4f(00000NkvXXu0mjf DH*jPu literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ca6ea5ceb2c1458a8b6b5332cbf571e5584cfa35 GIT binary patch literal 702 zcmV;v0zv(WP)BvsZ^j9jYgrY>kRi8Y*@ak49^%6;(XQb_am81 zQhGlS2wXLpO!8zhImM)hHJijYhb+dJL~u z51Y+~Cn+ax+`WZgq5<@u#bQCH(?P4%I^{s14Fiv4{p92X>2w;sVFx|QiJ!j(PN>yt zuv)E9`WIe-3v6$1&pzJmr*C<*tbr3mQRI=_5SBV1$g&KN$HPJSw64);P%4!;S^4l{ zkbY=5=7hM-OeVvh?sB=%Xf*I89LBYS13FV)A2X2vU|@6pawagfMtiMR%Nr@D+P7>L zcXoFEy${l>y}c_UovTi#6UY`dm&;{-3bZJv+R*Jrcz?gH84Mcp3T%u&iN#{kV7J=` zthwNDI5y}c^7;I%iQZio3Kia^QZFi%%IgsD-7%d~1?O0kN3B+0q>22`_5H!_#&NIL k%d)%}Qf`ul;g0|V0MSQ7O?JI(jQ{`u07*qoM6N<$g6K6wo&W#< literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..604042ea3342d3a7a68d353b9694c3406fcadeeb GIT binary patch literal 793 zcmV+!1LpjRP)B^;A$0CenlT)apfpA|cA6h`@&m5(*!RqD8|wiHL+UBb&{Q zHMFVeMTKq7{k{Fp4<{4-!IyLI`Tfr4_r3QV!Rd5D5CqT~8XCgJYGdkVGGpfzWxCJg z6^pYDhXbRdqx5*Gy}kXY!C=tJvb?2|E|Vmw*6nr++Wi4FR8(l~b~{)^CX+!r zo#t_2VF3)PWyh^lQvleQnwZK6QeR(hpn?wp1yuSnNK~SYc)8PhO zeeevSPzXAmj>EFqEY*~7z{ZO}@#UXd8+QmItj zK?l3608r#|Ih?5c0lU2nX0sVLzSZFP#WP5XI?$fUWI{Y1$MW(r_DB+*2!drlYn*}r zOgxfxzu%9Ei3y~#aiml=h^;HQgZcS+R99DX2Pt;*xt<>N5^#Of0mYV)im;T}AX=H_Pn zN+#D|0UnWtqZmLor>3SjpsubCi;Ig$tc<~C`iYJUow(Ka7&>)%j@8Y*p)M2v^rJ}h zu2!o#fSxmn?^u^!psTABE?1xY{-d0qj;uu3_5cl_NPX34Gzyvr0z@Ja-UV7g|0l%% z4Wg~hfjhVF&cqY)<>?5%6wO&u42Q!yi^Y;*g(3FswbY4VFvxf3CSSvO`Y8q;o=lF6 zso#x!PWf1RWy_>8?JX@WZBQze2WcXUH)FAw>(ntZ;GYqFp}+FmR4VnGrNhN%{tGYw Xps`l%JTQN(00000NkvXXu0mjfR~>rZ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/media_players_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/media_players_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..365b7f20d11d820a8656250f577707b9615977c2 GIT binary patch literal 748 zcmVXLKqF~#721+YX{?Dg zptT`g@}nU($!^y9#&?VD1_#?z;K(vgZ;-E!*hnH zw6i)iG=z9OPU)SIk&*KbheI(8V;7SaQ&qJ)91aV61e{LimPlt?TbmLL2Eiig^*U;` z8jsm*7EDxO?VZHg67VwgGT2DO@Ao^1FtZ{;K5T;y6Ka-YsEMsmHx|&PEfGiL0*yw4 z;tedT%b7-C{BOvhHmv@ZB50A77?Bf15B9RDpCClu0zP!AQL?VHzRz_9s z!mmw{6V}();dZ;x?BBBmE-)}Ku>JEUp1tMK)d5bBBnfff95TnhqqSfIBKtTXD2jqW zAizQSR^4ni;~Re9%C#|+l=9yza7l(lmt%(zx0y^P`RYEO54l_p55GLY`@Rnlsz6CE zLEB`UM~Ccix4hgIpdUq`xy54P0+dtjQ|U9#j`#7Js;TIm=;wzKo1X2L=v=Kq3tsm5KJ!7X&F1<^9Y~HdtadmaoUMLjmtT|2lq?1UcQXG_1 z?dpNcY1eD(Q*0VWUe5zHqYeY7n8XcwQAb%*z+^H}LHW<~{mI_OVs*GNjw9%XB+N71 egxici0t^79ZBfG0lb4$S0000jMX9D1(Jr8Gyq^-m~x$fYG0C53>{o1oA@$-#rP)I(CCRASN` zvb9}p)WrHLtDRX^i3xcyJG}Y6_q{i>GfcnVht<_p7%Y`a1zN4v&M=G%wfVb+qi>Inj=*lW1Iw}y2n47mavDCL@AbmM0z@K_jT-_= zQB=prKOq*2f#2^3tUl=Vdbqf_fO5GEnM?*kp%=te-4JNCTC#vfqm_g6^Y_7MWKm!O z42EeKAE%r%Ksa)56;O9NJ<)8oaDwnlu6C~{VG3-mG$*ko znL#(WyZa419uJI;jsm(5GMNlmmW5<834uTWoX+dS6`m5v=kvUPSS;a#9UYy}+^j?a zDJT?;(9j^qXaFdWTp^sDhH|L{McnwffQaKN35`apj>UfRZdWR0ETI5a~+DK4L1J%hfx*l;sPjYRjG$z;N7Yuy!el zKYSJ91@PhUHPeXm9?TEpXj)$O+_}5{IV@`HZ)7A=mdzLQ{SK>DXVydTfj`6u1dFxD zBq$b(s0lKv2=M~j)TC6lL3(rcIi75hNN27*dYbLh!{$BTds-}&%U5eBAR($lgAfxL zV+MTMR&25ma<=(vIzP9-sCs*OzRT=%TB{F2W#!Nl-!8U3uX}KXjoO2-3RpLg??Ni;Q9fwg{)2 zNx99o75igzXJ_mCPEMA7@SK@vXX)qQ;NS?kTyAi3 za&jsV2z0qzE(C+YE^@;u%2&r#APaCD2cGAV&1NZ@$Z1xG!-18R71-@|B$G)i<*A>> z(fA5v0YMOC7>!1xQmLBe=4Py}u3~I#3~Os^M?AHa*b3OH=Uh~&RM(@?sAheA9RmXc zSX^90e}6xGJ|8Gg{WR`G5)ZT6GB-E(C=?38X0t)3)4}a_)11i97#SJ4XR%l?J3D*h zgaAzjt>DhicPuO{V03g8B>T{4G{|H!h{xmjz4r`)$l;75GVI@OeEgq4KA)EbcwQ-! zt*!0Q>vcpx4Xw5g>RKh#;xF_K-N%09md!o1rJ}zbm5~Y%aD_rCW-^%(4o8qqX9&`= z%_ZN#YC8=2x6!+LlG4(S7Xg{eYN$i|*bbT$y@~ zPOH;Ul9)?U5gfrk0a{;j+Q#zo(#QIG)2_=kj#5cNA`yo|+CZnJ14=dtuh$DPzpqxR zJMHB3vmy~-=q%9s(i{|v#S0A$=JDz28K>KQzRzGV>Z6-C#Wt&+%S$^BBp>HRUG}r`ypa6_c=@@*((jkhmHA{I>Za zo62}9jl_zgD3FOW6PqP?MalXaA9{MVb+v310#DjJaaXnipFv|wokbLJjjI|efxtw- zA2yfo&Fhz+dn{!^$(M7KW0(hJ1&bo5fJiUPvdI4xU;wxjWSK=E7`Ffb002ovPDHLk FV1jsYe+vKr literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/microphone_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/microphone_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..8e036cd18aa519b45feef74d6b1e0fc237c102c3 GIT binary patch literal 781 zcmV+o1M>WdP)Wk;Gd5Lj?=g z0+sf)eR$55k^(pR-hJ)wJSfM#+gB6m(gf^G&nfe7mvpsHk&OrIyyR$NF+W``g1f$WY!|U~8X=%wpI}CEXlvjihP^;C@Xf#Nt(~LS=t;yr@V0wBQZnqn$RH}*N zoM#^Mix2_^gF&FSwibJPd*$`@^_ZENf#2`P?Ck7GoaZ99h_aHB9_Vzs=UZD_`nkC| zw6?Zle0&@&EiH&dBH%dZnOEwAF!9*khLMqxcgxGma5|kZnN0BceC&xRqpPdywcT#V z(9qD!a{_DzpWw>MDng+Uy1TnU?nAHF{6m4wx5v&7>+h1-f!pc1m!+>FCwv4Zo& z760@uF5+S;bxI()u(0s8qr>Z;pZ_ETs;anzH1$Fh?d_f5JaLmxV=*-B?}MF_xRqTl z7pO3({AY6`sm6eA~~ffeaAe7@RvDH zsC}G84{x((OAvk$a<}O5Pk;dc*-}NX+C8<900000 LNkvXXu0mjfbz^s} literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/microphone_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/microphone_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..f604b5e333cf313109aaead7d152453d6c3864e6 GIT binary patch literal 829 zcmV-D1H$}?P)WW1vYAhHObf1+^pyZ@d^08Ig2VN|;j!qRzPxw(s=5pUun;JUi@ppYJ*6{W%q35Ah+alIjB^s102U$@ozCAj+#Iw zlL=m7_nqt7usyIn7%pL9CCiBu|e#N~3i zgTbK5Znr}y6f)rr-NbLz5gftbhJiw%0Hsn1$z+nS8&5M@tyUNw9tN}742eX-NIb5{bVl{8^28d3jeC z7Z>vcV#W z3F-8BJO-J}IvllWV3)!toNjC?df40Lw^Z=2F_pmPD97V*+9q*;bZu={R4py7)ipII zD~pS@MN8j(!u<48;gs`CVQ+V50G-=KQ91Tc8#fB1q(?;ieuNvRt?NRESr%S1n zAaryYDZp_ij18Z!lf9dbuqXacY!YdD&)7ZqfmkQqZvh4XHGXgOW5Z)A00000NkvXX Hu0mjfit=(& literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/microphone_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/microphone_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a88db39fc82213c938daff99ee0309dcd0a387d6 GIT binary patch literal 809 zcmV+^1J?YBP)?biu{NMZ>@ViAx&>5~7I%111hSGzK+36QF}O zP-LLiw1pI?ZC~5>{O;8vmY1A&-~GPx&b{Bc-xU-^!SL`f%8yE=f>x__2!i0EX(J&; zoOMZ(BBfFZm5;hIK;(9V!Ej@8a&j~li`gs|%jWFt>_Q@ucuDDRmHaC9%IEXP$Y!%{ zpU>xyL?Ski$Ahh{EgS97&*CR}WpDwtS`CdxgG?sFV5QaCTrL-umX_djI+0GN+gP0C z8ISSH-~xKRo};O$2?qxU)y>V#SYBSn;NT!uR#uMVY%Fujs5(*3)tZ``@pwG0TU}j6 zcXu~}!63T2x*&=oSe)e<@05vu-90xmGczBJM&WQcU^E)x^?I2nyo~<-{^{1%R!mJz z-9IJ3%wQ+Dz5N}5KmY>+10eUI)9G+@bcAFwiBKp6zyA*7s!j>yayc%b(P(+FrR6*t z8jK`R2ZP}(YHRfr4T0r}tJ>*F(0NlxQvMTAOOl*0n=PhT><4#SmP=GZ9=p3Sm`r9o zP0ttKk9>U~>55Kjm~mv}KPEB(!hSd$-stW1AR65S6N$%v($Blp3la46^g&FoWp7`* z)q;ZJMqc^XNbGzM4-eND7Z*O&*PC}do*}+^DwTvJ74X5nfk(wB(*Az(SGtrY(`2Bi ze5Nv<3+yhi^JN|si^a<(lVxaZ>|U?ed#R(b(bSMiCH8z@eAOM-J9U+9{O;9Tkqgkp z;We|7=61^U(de9;3p|{d7<(pKOXB}@0Ip|tV}BkZm0#6cff>L9cF@tiwlB{uC|++OeD@G7r3IC nh81=s@DXw4F3za%TYv!oMIBU=s_yXi00000NkvXXu0mjf%@uc% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/minus.png b/interface/ispconfig/interface/themes/default/icons/x16/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c15d3684753083dbc7f89112cc720ab5e3a219 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XmU+53hE&{oGifjHAp?Qd`Mw!58+7+@1haIy-eBl763tFw z)VLfF91s-oiGN#VnTU($6SHY{^J8lK%dNVn2xaxTJdI>(c&5a{QlOUAcj9jB$$f^8 zqu<^N%Ut_#j&{X+ZbP>xq5h`IOOIUmp3LqZ$DXvd)o|GrO@)>ZQ|koZ{BnIhh56lq zZ)`m0*UdKl-RxIpX=P^FvF79}e|rJ{dr3b}ePxtqWMg>!KWc5J{V5-yiy1s!{an^L HB{Ts5YFT7% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/minus_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/minus_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..e0cd5a83535146c17bfc75905c8de8306be2fdfa GIT binary patch literal 656 zcmV;B0&o3^P)1RCwB?Q_F7CKoq@x#PT?yY7$Z) z5+IUPC_$=J38_*Ei>@oWfFv`3Sf@j{6E!u+=tT`j`m3 zz~<_2f=?ohZDy91a_Pmz1e=@F2|?ER`LemcUp(B~d&X_Mgt(nwPB0;}`T4Dt_4RzH zs?6~`a?Z{s|BRdYyphUelGSo~YcN_Libx^{u#nbt{q^d`#)|E_EC_E%RV^;#;GXm>i(K-YE2 z>i5aAEaIG#=ldhiibBbFJRvx<0(Syg);;)sT&a+0n$+!fNkMQl8l_k)Mw+G#1$MGo zax6<1oM{q00qn?oJ!&)>B!qC(KgeP*QEtR~vsG}3zVw>S<*?m08f$Bp<{&2GIlmB` z*%RzGkB^HtRMjw`e%1J9+a19fR%R@){rTkN6HMDtbfqB*{|}(V_IJlQ5S*z1s%{Q^ zzx1}%s=KH&g9sb@orMc>wcoE>K~NH$X(LG>+{NS}y78VYZ{{^EcVE*IaYfNZ(5dfV zeB``S=ltLhmrR8Q}VPRP^nG|10rBW;}FV7DS4)%LIo=MuW6LI#AHw|A-2qCu{DwRr8f8+Wk`cmHIa>Xd#LkPUlXk?#K z)6~>twOA~-R=c~AF);x>Wi@EE(Bg2X zNFYigmVJMJA4x$F_q945xan!=+S^N+mKkJ+LSgL9%|oDiFN}?0eSIB)Kmb%Llw?W` zL`Fu2Xz-@I9BGQ(+lzr|rF2vh`XOeBlE~?Ff*qesCi_b)9vgj4jABI%X_-NY=cSO9 zmLl$OV9jE||CW->SS-i!%pkR#sM>Ov?=B zY_|U4oSHhsPoF`M0K*VR;$B)|Bejc4qd!=zhvdZ z9JaoApd>*iAvw4ROGKoy8pV&EU}R+Qh21_mOau6yXBUE;ybB8-xl}4Gx!T!f!bv06 zs4p|#uW(6a5bCc$d;2a<-RXeM_H=}<#1I|tE5F~LbS*dEUD<|czDfh zt}6Pqc@D>vySMl8%f-b{?`WuA$K&xG+Kw>;p2#MSvr_5!vT5Rq=+flU|HB9RT^idh m>bjc-EWoNEd_>^800RJ?DtI{m-6ksl000011pYmDn*M z6$;XXhElKrYpdd-TA{11N*Dfu?%ld{Rb09daVNMFO1mk78=<8Ip`wMnCY=H?v2<+|cg*NN;I%3IWdTeGU&HJ(}drolL(1AEUI&u!H)hI5A zX0sWt6S0`XoNfoksSr-9)d~e{+eWj|XuF|2JTDkwBoaYN(;VU)cMDXggGKgY4^~&9 z>pBd>V5^{$A(2QR8V$6U2L~Zc^OQNEfDQbt)oRVCEGLV_A{^3J6y+S5BTk~C(Gbk( zp261xT{m-@hV98o{4cJOaK$uD;(QAQTEKesNskWz+Zx_+!!vOshfPp^Xc~X`O_j-FXBZ|_;Mc-|^wkE{EvFmQufM=UPsl<P)PCS`7MQ)Qs(BXpY+1!0zzxU(BkraVE-~pc2|Wa! s($keb(rYvUtK*sls)S#}b^Zu204tanJ7S!1g#Z8m07*qoM6N<$f|Mgm?EnA( literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/minus_small.png b/interface/ispconfig/interface/themes/default/icons/x16/minus_small.png new file mode 100644 index 0000000000000000000000000000000000000000..d1430d5720cce0e6667dcb855d9f69ff41f59578 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xf;?RuLn>}1{rUgjo>{e_v(d>Qi-DP$d)I*?w_`JVczBMz zcywTgmGsa5^;V9|c8sRSj~`8x*idj$=~2uFwv1qPv7-*H=^G^vSj?Kx*38Jj$j0!n XM&#VoHT!n~O=s|Q^>bP0l+XkKhJQTt literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/minus_small_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/minus_small_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..ef612efe465ca6a2bca634860a3a28f31d3935da GIT binary patch literal 328 zcmV-O0k{5%P)PbXFRCwBA{Qv(y10{fofkH6w2C$$D zEM;V5U}a$N0y1NOSPh780r8UG3=G?%v4j_f0YD{Q9D;&vrfzP^oc#P;Uq5_MKeKC> z)~^pAK+@X?df^w)W(^w~dL<$E+XuLA3$fTZQ8_h_Uu^( z0cK_fVPRng9w4|VB&0@^0pEdsUM()J&GP3D2Plo)1BS`Zzkh#xhlB;;SOB_U$&+{Q zZVLVT_eGI`;h*rIKVP1I`EnB^PLvCPfw=AdpFa$@KYW140#MNsF)RTH0*s?cnQ{XF a0t^7M;#J1HT~*ou0000igP);uP*9MaH+t$@c}0?xsMqPi>sl?vMhsvv{&wAqoa~WeqrCpy4A#6CD6`1B&G`1pB*2QU`=J5P1xO0|Np~M4>@W z^b{~nylB*`&lE_r00lzKg<`(&$bZaP@~qN~g0+WFHBEk!?#@UamF_G&Qx2EG%SSHaE9D zH%<4jZOg3k$D$5e!ZmB zqt{cV`ikJ5(AGC&6x4vtDlD2t4qXDSYmkl8k|h4Z$xSd(gjW~vXaWpEa<|+o z))zBQ@fVy*#khE?-5@(jkcmGTxUM)}-L&u0>o8f(t`r658Z=F3h1`z>zCBYu0uW9Gsk*5zgR%A zX5u{o;MvUU6!UZsA#ire92hVB!beyg8oo-XrTCdC7(x^9R_f9@|t*_MYh20v6`{n4s2{7&X`p)1#}%ZL?f%&n*9Xk8-}r) zzY{)lTnl`EI-f_t6xb;#s1D-0^EPC~X2uqlfnu|750q801h_!htgt*WDtF3ZXshIt6bfPq1+ZFuO58@-oDWCG$%^)p)_^C(LYk-Y4jpB7eP3*fZWQrM_TX| zijf}`$0b#Iw@>Q6b`?!WuJa?O5&kr)e}49c^J1`590`u3VHmWUKplr;2VVS<1rAMk dF2Mc@FaX)*D+p0tgv0;<002ovPDHLkV1n*`R5t(s literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/music_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/music_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..e55eb3193515a9bd6b8a9e530d2e381203e48830 GIT binary patch literal 616 zcmV-u0+;=XP)ZCx5U?aBzs3UcLHk2S2~qmQSDl8UFnF{~5Bp$AMOe z0neZR#cBXMJL4x777@p%PhT8jViN5D3dJGIt2{UaF@TrrD+3cV3&V#`oG1qT_yKYS z<4;CL@#z2mzn*1a;D*cPFLq^6d31;YWHpNb-xmfJR(1vf0Vame-*{0B;RKrb>led| zzkk`_ft@hLkwNLvAw(F!7;LP67=#7BFfg(5fccD!KuKl>hTne}K7aqtplGq7k-=_j z17;wiCZFF7jDNo{u(HFw^Pi2CSuvo+@qz4(1K48$MEv{r*Wu6apItzv5s+s7`Qyu9 zCMISE4sJe1?^YKE$r}e|0{v@@CApqu`S|uVh`n4()G+PO6lk8@*Yj$^>4J5L3jRyzb4Bz|ay_s)*5XKn(r_r%@w!G=e5^U|r2t1sc zior>q2Z4lC3-haHC(9U$MWYF2^^;{%D}(CJ%+Wus43ao*&QWnWkg1VOhoa5_<$rn%$m>l+Ic)fp$$sBH=E_6m61 zDqu`mpeP75jZzWn8o{_aY;xz=$%gJI+4n42dVuoom7v30g}?z7Sk7Sq*U5mt%dx?7 zKFW;Gb9ab2?#Z~_CxR0bXA1zg=!T_((SY?zKrwsjF+!xiHh`K2VzmmvF=mj6pM{2scNTMCFvZ>Lk+n^#E5BCLIQYAnvYC%L}m@95&q@#X0B)S>xGWv94)*aTjJ z_P_kd{N>YV*6V`@z7D+5NF+bHAenZ;y;2E&3orn36DJ2sk4zN+0000DA-*Cfk1q0X{q?Azd!!a zG@TL4l10~F9lQYy{6$bIiLL~GKQmQzV0?9T?FHw9*T{9w^|!(coeCnM4RA$8*$j3B znoU;)vl!cXR>}?hCrgSj?RBB^`Lw}A4L(&sQv?`<^l35I9Ct|_puMwX;j3kG#tuoOPW^z z%W;ooNR7dUXWzMtQu4s=L}Dn0O4-Dh_uq2l+b=#nz{@cm#*0j_9B7eKa-;1w*Axd#j6& zZ@&HcV}^=QMSkJ7^X3-y3L^v)IlD}l!Nrh`Jv_56=zlfn3K~m6WyAqQ385{1q~$&d r&mN`9rg)m_pwmHvFpVKUehDxD;Ro;2fvh%800000NkvXXu0mjfIAky% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/music_small.png b/interface/ispconfig/interface/themes/default/icons/x16/music_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a17dc8baf4ed85e65902d65e15a4a5028cac79d4 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XwtKobhE&{2`t$$4J+o>z38|?M{{Ef)klQnkfr;Jm-+VrwGiwyKaVskai)~XloOxii zdbzpw>eHX@?5&*MINLu%aQy-aW>2;|`^#Q32v{3z-e3mA1`^i4l0uJL%o3MiVB%r8 YwZhc=&Yu_ZKrb+Oy85}Sb4q9e0LQ^?3IG5A literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e3bf83fe83c24076b73e249383e4347f34f4d6 GIT binary patch literal 565 zcmV-50?Pe~P)I07NWnR zq6PvYHfgLZ>@0#{BlrS&18X0_R(t{R0W1Snf>_xFM8QIBynup=x9s`IENiNS49xEA zT+W>Dd~5W2Js5`Z4ZsKf&VJnQ_u1`s!|U~edORLXe$;BU&hz=yNxrQn?TqQP?RJal zbo%`_(2Nh0NP@;j0y=?MyI!w2pU*g*PG~e59V=J1W zK+H5v$J>*8njG735 zJ_4^tY_V7%7z`qnN?|-6>l>g^{Zgr<>*;hFN-4TfcXIg?0q zHt>AZ!Knwu5?#nZVwqD+$X1F*cQT;y=lYYO%&FmUh-5OU)n;dJRW}%Acp_2UjhsOO=C=J5#K=z00000NkvXXu0mjf Dp|kx! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..215a4f59f29b3039d2d5118109aaf0f400ad9456 GIT binary patch literal 698 zcmV;r0!96aP)&1wtW_i~v`1{}xT0I-3R+1trvQV~TF^Z6Y7bULNr zMkEqR&1N$eq_333oaW?YolXbka{10bpb8BNLXy!akpP#0Xl*ldQFc=^fi>0KP zAl05F0G<*Ul0tz(p#ZH`3$NFUQmF*BS`Cdx!#Y!}+wCHk%fVzarIN`cF{$u`PA2Jq zKp?<6lgo2rB(wB*JdBl2r$aa#W_1eyvUEBPv)K&4-;YEh!4lnWH;hIjqR}X_*(`Nu zKyuv*gHR~My4vmbmEvl(3YAI)K@b=No6WWWP>e<+kP|?w)k44DXY=LaX0r*UQi*oE z&DLoy*YPyS46Ih`LeO|TzR*KH5n@J~$N+2$bUd=vYBd-P1~{Eg6pKZ60%W9qFc?It zJV#G)2HQ#wa@`68qP@&U?oOZ-`!QLAaLtC7?;H5Fz7?2=;_iY0CD8up-{o>KJ?Kt6 z`=rG8V_p)qfzOAB;MeBZy6nc@*K>lX)7|2!NCqI$$d?&3)=%NeRU5t>0T(Zw2VJ|5 z9YEL)IA1;eaF5UD^KdvEOl<<|^?D0EEEWs&wQtxzkUC4pcqCnAwa*8u&yDAgU)29} z>Pb$@-PGbN9R|L+;ju0Oi(ynEYOf3jPjRo}fnKFI75fc1pW80wol59i=E@%!hF g_~yYr#r_H~0P|&682mH?;{X5v07*qoM6N<$g6|JHApigX literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..a94cf2c98d5e252d3ddb17dd17a8f4ccd8b0cb2d GIT binary patch literal 729 zcmV;~0w(>5P)`+U!rkBdg5;5hCcfGPZ6yzg{68AVZ`sw#wTw@byT zm6esPUa!ZB^w*kL(wdT@R4U=%;9&hXQHDM|G3jj7NQC`FwAX62&}cLu%QDv1*0!`- zNW;z&fj|w6iRY0_CSkQ&v9Pd!bUF>Q*$j)t!X{I#TrMLXkHh71ZABsxQj!sfokH^g zk|eRol=_+!=_&((08?eN*|5C4%y0$)#rF0#+-^65!63rnFl+St{SZYFtE;Ps#bPv_ z5$U)A1xrgyY^vAm9RO#uSqu#gAruNR1=G{h1_9q}HbF@Q`FtMLYL%_~!MR)x_2Mhk zPoJQge+iSx1RW>PM_1tScnm`~H#ZGGy4?oO4xi$>w2sV|*WkGhbeurfqsQ^_F&qvD zW@cuPN~PEhP{_r1n4g`*u+4%o(Svqv4?1q(2qfF-bQ)@CEsCQMhreOe>BECZF*qlD zI4|r%X}7tm3DK;_S1 z=Ff5G?h71!UDTYDF*erqYEMPtwBAL#-9D!|Kl1mpd-k~g@YZc#@am++4z-7o@%xZV zZ`fYpr+l%OIQ^iV4*6QGmjBngb&TNV=Z{C$Kb7YL`vQ-`F98MspBZM(A1#!%00000 LNkvXXu0mjfBhgfe literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9f72fc51150a5d2d396ec924555b436fe248d1 GIT binary patch literal 616 zcmV-u0+;=XP)N*=&YhulMOU(0~s;krWye33v&_v)9*GY&ILL*J~6Cg^Gx!MeSPxXiShudOcdL z7AzJEVzC%HoeoSU6U=6_?9AAFK1ZX`fYa%$l*?r@8E8bO2_2A3CS_;3T9c7t8I49I zE34ItY&I+F&H%J(wF;NZg?K!UQmG^p!{IO-4hQo2JnHp2yGtNdcf}x+$;hrgpYN)8 zI2^)gG$Nf&O9o!A_Y9!lZnvNlU^1Ctxm?QiW$}1ChQVOKbUKyiT&p^b55>Ua@tg%M z7K>*+)QylCHBkU^1YVD_(P#v_-Ht#YfOfkrZ-7SiQ>m0Z4~0U|G!3fmiUDa~vQga$ z%2*^4k$W;^UF6~64+AD}KJJ6Tpwxrk1buXOho|RftX3=8{kstO{o~_j({`KCSfl_b z8vT+1?L|=kkVstr5x2L2FZcHet=VkC@Apf!3AR`)&U(1rZpr9H%w6qvvH$hoND(Lf z{cKtq(#wQG5Z`(di49^n8q6BR1d|?Q5c`u( z**~UJnUac5yXRL|G$J~1yw~6FoX`34JzOpr41(jhNdN=*zlby%js1GPj#jG${_^sY z4hLK=m%rI;vO{_bMJ(x^lH&aQ9En6??l)+kek4Q^X;etSP7vMIYBf|U6_m?mOixey zg)@iHJ4^tc3K&TuK{OggZ*MQmW;5dPIAk&zw{;lAr00RJ+_h?eHefHu20000< KMNUMnLSTZ9t5RYB literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspaper_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/newspaper_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e738dd528f6d5c753b9718d22e6f25ae80bad5 GIT binary patch literal 685 zcmV;e0#f~nP)B zACZNCh($~>k;KBzA_z8ue_%-;EKFmSv^FWkGL2ZI2@%q4ViQ4>fYrK)VwN}t){jMr z&gy99zGRGBWiQ;BJNMmt?s@0U<4UCxIF5S`;0U*~)Af4YS*=#sZnxlNS*GMsGMOxF zHXD|tw^GEMVsf(4XoOa)b@CUeLk|rhsc2M4fcrqSCP@+&iv{NMInwELLCM9G-eUsb zsemDAG^o{TFdB^r27_oc8qn+YFc=JMGUdkOF)Eb`Y&KgVpU)GM4o~Q0iVhG2flVe? zV`8MT3m`u?V}}j!-CsTrS57{eC~JRx47e6w2i?O=m!A-wg)w zc$`gjyWKaMyWK8yIvrxM7-Qgaxpn}W<#Gvf0uV(J)9IAO`^|&F09vgU!{LyvQ>^y! z^iUZ%oz9)0nM`J+A%`Nd0IuikIyizUxE? zzrr|JZ2ti4Ga%agY}DxlO1TS8MC54%&94nSULNC{`|KYBDxm$*x6kKedeA>X{;K^N zKhB1b<_lcOSHNn6caJ_~m%8gPPfaQSiAKK9fNf3cCetv%% z=Bw2zJRT2Io4_WM$xaW4!@(Fmknf}S@j?-B4L*Jc+fNeOKhOIZteTus8#bHG4;AI_ z{_h&jUdUO;iPt+U^!o>Ix$JB@AN~NGNq7Fj^pW^ZO%lUj3Ap7Zb zx_7Q;vl-g$cKQZ-opRI#7n7E zN)t$kpcq#2$jR(Fq+LKtX3-=4hLefn1GD? z{a&c8Rtw#37e=EIjYb3gexLb5(=^QIb5yHUaY6|9?{+%@Xq+%W1zkB3iO9&Vii=Pv zBu>m`GkU$AK$+4fK(Sba%jH5a7(_0YgWK(f&*wujnS`nnoK7bKfq*D~0&qeAbD{&U z*DIB0o=k%&MWa!1!*5K3fX!y}w+1?ZSGHIzWKLza(P$)q$z+1%aw!LSTil}qG)@?x zWjf%2Y&LtpQY!NeaQq11&4>dXFc=K(4(jzfI-QP;1o9h4U3s-yNlYB*B;EGM6j%qY z{eHjxe?g&8C}%R6hH^9&07<$!@0*QlyWM`TG{4=RE^E07*qoM6N<$g5q%z2><{9 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspapers_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c1409bfacfb806265d03638cde66443e410f11 GIT binary patch literal 717 zcmV;;0y6!HP);To0}L629PA_3V=Br9nZVn?oOxELBHRJ z!WI2v=!j@xJ)3j0YceB~V_V)JLZ_o}O1c=HyHY8i9mJsZ?t9IF$(@oN5{Ic$`WS3cYX>{ro=;A*}58 z`;p7#U^bgEJw1(3C?r5~yWJMld_Iptp#WKyk~1{Tsju0rW%#PN!3Jo<3=VmV&{cP{Vh$LBPSm!M^|=naN~=%jFW4 z8P#f40P6KRR8>X#y90%^k{SGrI(t62Wt-sLJWc>f;L5> z&?LpS3C8@yZL;~XiSq^%r3m`q&Fsw1eBS%Mx63v*HqdUj!5F&%z=40;>qeuoSFhL6 zYPBHK4!;b(>6n|FTQv+r0Lh!pX4h$*&*!nTv$OCEv_}I0L}U)RyuZJXY&MIYo*vk2 zHe@mxSS%J)t5uAQj6l;g%+JrSuC1*t5Rf2jeSQ7j|3oGT!6{p^m6a9BBq);>Iz)O- z&K(Fv_W69+-rk1QYK5w*n3QBmX?;_ zbUNX3xey2h!0QCh#1U+!7}}K!9N_H&BzhnKY4UhH7#kZCl_#AfgCtE)Pr+tMV%&Qd zeZ61!UK5o{MR*rLEi08u;+Z0orPFBvD1Unet8x}*Q!muPQB;fJEX%<1G=!d zxY%u}VKguxf5fn33b*b&#gkXr08bT#LHlEZNdN!<07*qoM6N<$f~OT&%K!iX literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/newspapers_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/newspapers_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..758ed144842ce164c943f4ad98eb45ebd65cd40c GIT binary patch literal 655 zcmV;A0&x9_P)p@W;aHh(|{p_6}tTZxM_xVUw4Oc5s|9mK&9f(mIB1x1VX>-y32 zoaCmqOFi(Od+xdC{NCqz&$+rnp@8jn3!P5)4!|+~->y_uy<0Aq*ladXI3qSgOdiMM z@r(6(ErE>HYV{O+9}EVl)oN#tpgVR1$jk!ry4`N0-|xdA`49VKCWLURWy@qTRFYNbg^TFt-=_v)=1?evN~Hp`*$kV_ zhFB~nLHfmFA*t1B74>=@dc7Xyav9BLlYXHn3WmcWip8Q-LI~H-=W`hfJ5DfzmN^oM z$R|S-7lA-PDlr<3XfzrUN=vec8X%j^!r^eh@Ao5}PQ&SR!t3=SnM^{|33j_3KA-O) z>n?x;0_cef+-|q5JblszEk&bIsfOQZgMjID`cMN6z#|)tMsm!|Y@JR=0(!k3#^bTv z$kXB)0vHNAPEaxxa6>AUdOA{O<{gl?ZU?}Vd3AI12heJ@V6|G|@pw=wmE@S!4~N5O zoS)<1{vO{C4>1u+z8)RnO{4MAq^d!MBsNXgK#dGiqk=+ zxZ2#tr~B)^&U0`hLZ}zs@9Z4j^LySuXS$i08EBdYole&WpaK83&-r|QHVFf3e?op;OOWG zm6er9r_*R^YJ#e&=61= zy&XQE57pJxsH>|(Pfw2o>9g6ar274S1cO27^?IzXu3~R*kM%-P6vX3k%+JruObB6o zCXPgN z&1N{APKZ9CzP=tUEiF>DxUqo;p`!`EXv2HP`RYedDFPBt*wO`--V{W6_@Y9>s^A`GK{T=Yf;3_im;Rv6oC&# znl~={+da0ceQ(|cdtW`jz5Qv;u<$K>HAH36_>X*m5+MAV@aue)moR<|_Uh*1DkeXC k(Y}hkcA%H(gdsppeFbX|3rZq%FmS zh9;yE@}9)`u10qojWtX?>pz-kyck%F&d2^NzyX_6Sz3m`~7~g*Xv<8975)b z`Z3hSiC8SQq$r92G6#dfdGfwit0AAy$A5#0ybvIiRmkk&;UTKkD)f3iY&IJzl?p5t z3)<~ACMPG+Y&J1BH@CFByc{Qx5NTy)W#KZ)gb+@*j8rN`Cuy0r@Fmvs|ENKz91I4L z&1PY>S}{I8j%YM0K)Ppw(*q3*eTS&1SgWZlTO5 zm&*cha&iKr(TLZrH`x5Kh1tCa7-;~K2%u#;;0K9B;(SY~%rn4o=jaAQwo*!!?Aj=1#H zgs*SE>_8_Cp~JRZEEcOXGc)l^{Do*N^cEe8$AjLe4+HM2_P~REMa`=`l@}788(*oN ly$6G|1zC#YrU^d<7yxE}ZbKYm%M$k}@P)=*3qIx5cCJ4oqr&xP0J93enIW3O*)o210fiOAM<@X_c}L6u;{>X zy!yWHdGsFT^!ggS6h+yi#~l8yJKy(9p67uvCO%MuAdp|CPWJcnB*2T_#?o>E0g0sW zsZ>Jo@$rDqqJEL47*CVUC@i1=qJihSa2yA=ZNsuGv|25k<#Kt_?UHXp2B_Q^mQsG} zfDa@;Ow$+B`I&d4(ZJ>HEw-kn@)uWEhonF61<)i}8_Q$xh(NDeSXqd}C#OqikH}`{ zc0{12X?QS1@b8UfIfk;zLVLFsPW_$lVVTG@H#>t6s-*p&-;r>Y1fX=7@z=Had(Z zil)5~O*_D77sQimxrcjIdeQiyUafvjY;Paq9~HFQUtxgvEx-W7QKXmFy?0000< KMNUMnLSTZJfdn)F literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebook_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/notebook_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a1264dd659320435bfb777c090d360feab3ca761 GIT binary patch literal 700 zcmV;t0z>_YP)3lE zNfWAK1Wl97=k?r4#!P7Gfy2z)Iq!R(x%Z54XJrLE1VOk$mq8pJZ#7NJs;Uacn6co{ zb=`dFUznLmQUSKaJq(52(5c8Q{FcpPZFBP`??t&~ifr7?Oh#rp84wLrMS(2KkR%Ds zW)rnq4R>c}lT>$^bR(vLgA3ashHA- zsFN8ZVJ}o75Q|L=hn&zzsnD}ZWXA_D8HO&G3mfHf<3E97B`9_X3OllephLn~6QmJ3 z1|0$+deQ@px``!D(AyTWE)u8H31v;O7|=$U2I5Y`LLePLz*+>de4qiMA&+r%xl#ke z!8QTVMPjqtVbwTfD?!;pP~K1QA|s<%)A8GVZk*=jp-M;GWpFC!F^Y5aDUqPdxHpH1 zla$u~ARZ6k*~`d;*5kg>P-{#32&kVykS{k4;iFGKAyy@$pj6m~-Xr1K)zQ$C<*##m z@EqUsdGz`HErNjC5Q!Bc2((7I@Wq7-i7+yM0q1xO{LDW50;Z+L)2Usn33rdjWa0CqpV imOrN+&{E}}00RIvB%<)&;sjFw0000sk>^} z=IZMFpXvR^op!9~g_q&`=6#;`H}ifU_h@VkEI5w4Mvo5sKi=B5y=Yk$T-WtBLXPA3 zFH;W(2ZyNu1$ht0x*~9>$S?e|xQLm#xx1_vWx*Hm%*{`i%p5Wx8d#(16J%jGggCMR(!nH+vLI(m=lpB@-c zCqH_-qOgcSUeVCqDZnPBNo$M9+B(jAhN39qW3j0ICNP5pD|Le9H6uV!Cvja3q~YoY zbpo#Es05q3$*YW@u_km6kqCkSbH)r9(2w#Bc>eT-_Q?=wES?$E(j!nx zsz;y{H7^Ta-_U3sxW;$n^Lgx7WF+IscFV>^lLp9dDhdobZIoOt9YHn~@eFdAh)2<& zPM|3nL+R%%UQgV|mcD?d)_4m|{{{_^<3Eg#qe$nxQmODVbywCk@3=FPh52`=?k>|9 z=OOT0xN`Lgq|h!BO=>hO#`?+R98cBK{M1zI=Eg+Ta|(-N%m2wI!B5#cuw3-4j? z#{=&f3s=#Wj^}g(ci23W>?TTmeFJq?kcO8{UyKv XWqFDp{DX2200000NkvXXu0mjfk+fbV literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebook_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/notebook_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..ab8597aeb5f7b62f5ca5e0c78e6e972009e58640 GIT binary patch literal 634 zcmV-=0)_pFP)L{0=|Y!QJvf=N zu63Jk;1or+qc>$Rke#=iS5F>9K|~Pz2gF<1ZG(;Nvg0lTVRuJmbfC0NY}OQq(8Fk& zG{0V-_f68IIK>B^rcd&Gzt5+ApGfa_cfmuFq!qeM;NS7t_x-x(d0>o*8*&f?@x#Kq z)zvaJpr)Fbn$97hrnvE>UdKVT`kc?Ati_@XcZ-veSwIFv1J8BgI1c*#K5W}Yx7)>s zwY4(!Jto~;Y#?)C6jGzv10P6wwA;Rz&TF2XP6u22`?xnYR{pfJ^OE{Mh6Xe#j=AYe z@Q6UwZOoLi@JZ=X?Gf3HiATavQ4|~*hBY8?(*$}#@T29V2oe&;Y>-Au3=#rq_GTVF zO;b-f!Du98LnPU37Vd$YGN3;yHc(quilBc10SgHn=RyO_mh$508mAU!iV*=YM3Na9 zL0Tg_X#yifVEl~${CEYy{NdrS!R=yRG&Sg_+$t*Kd%R3B2`AtNPqw#lt=asOfZ7Cs zX4r#?`r8+YwWO)@ZMHCKCa_m8ZNu zwY2n#MbR*NjHZjEy%0$|z-Sl5mG^QD*OCboUi{Ma^DB#sZ}1-xnC5w8;Qbb00EXV0 Um;y56w*UYD07*qoM6N<$g0`6?9{>OV literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebook_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/notebook_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..d52db4a92211f3c8098ceefa20cbc83b18edb735 GIT binary patch literal 744 zcmVP)U%CCT1QdonBwdrgC&*Pg>iVcC;!Vj=ie1c3@^y-Yy}f?7Q+p{d2%KmXmKTiB$# z?e5;~{yM+gu3j-ZaM-zb=leaM`@81~f!SH`5Cq{4{kZY}cvq=Z;^lG~j4}O&Rns)% z&xX;Vp=oMBESX1hivt=p8I9}lIF{Ge9`ad~F+*hGZbmXP)5w5mP*znaih@$91X-3L zNfMq64^LBHAL-f+11lF+Lr82Ezz32Z>2yV(&aZjy@9*PPFo?@8*YxDf%p>Zb_-jCu zjA(DEL751WTQXXkY^ab@rRy@0)w_FjL%ZFMFQQmHBv8!+TSo*NJBo?mh=eg2q~Yg) zE+Vq3M+8FK1t%&rExFAJ&Qyi$7>UhhgSxB=_ot>{i^a%*4$3e{?i5V~rGF4GouD}q z@ixX{3%kIi*#K=#PW{y-wu@->R0)7%B$;d$dznl}YalSVIyUCADrN%FL?E6dkaHgq z{wiU7Zf@|V&o^<8v87`MK95sxPSB%xJ$Ah|mMNF{fW+=IJh;_`o*Peto3i}kE)Y3E zK=X8hlqergF4E+m@d;e(@#FQI5H9-9CDl_`BHwArEPJUG6e=hMU!w!w28V9o^H5Fc zvV~C)Cw1}S;%9VUA4OJciMu;H@!su*H9S9$O9KNqTUTdErj7j&kfOSnOJFZLj^3+& zEW8b&sdEI%>24exytGJknBSI`^lm5R`R4xq5mt?aSYY(*>{IYDV^WkYJnv(vAIpq( zfzd87-pe&y%Qwo!zeHz8M~|hZrq=xJN-HblL${r)>%Z$m8~NIlabL^le-)z95S8ga a0t^6h3%FUq3R;N(00002(4~}KsUN@)8a31EiMWc75{*^5CU#hnoSlivMJQ9NVBntSes02k_l8x zpfye=^L0JJ)A&bvZ3L=p@JVQ!i}1A0-Ofzs&s2)d^bupWV7oN9oDcvyV8O1*>mm`eZ* zkpxCY;Md58pFs5ys3!?t?mxqKt%$$V+M@~W%3I4eh7GRA!lJlBk8&**5^HamI7wx< zgvF&>c>gIIS1&7KW=;@LKS5Ac^?v8)Kh{t>-VsGd_7Pauh9leCR9cV^s#T0dB0YlW zs1PYlB8c`znMe8S4yNu-i1nd$h{XrD7&gF1(c^MZcCj(sQ!l2sh^uK-L zToT3nx89w!gr6UG8-}bOP+5Ur3sX+brqfTE8x>V!)LkUag-DtKmU?%GMXE_AuaDKa zhHGUyg!tx9t#*7Vm0CONU)FEb9y(vND1JL7*TDKOzyJYTp&Kwd&ct9f)`Kf!9PF*5BUQWax5Nt@Zdo#J(LOt+hP+pNy#r8 zOq;mLZgw}j&U>2;Nfn2E%v)yW`#v-KR(PIHLl6YMY}*Di+Aouf;@|eMXIVMZvfwxl z*_}<=R?`;`bnhb_G|!G&%YF%mlLeHfFB+`6(=MPjQi% zWxi$cVCgQ!9GaX7V<2D{TtGSMKokWON(LvO2Mcp|I0<_{HIFcLevI!08uWmGHe6sX z9z>2rX5-_$f0pQxFyv3W1{zI^&qow{&~@DvF!}=dvc|taq1@%C+qN?xaU2~%KQKji zf)j}1-vqN)g7{JDU^*5U5O|&;XSWQTv|IvGfTn4#0HL@9l|Dg5AM`y;GVT|Mpg#l3 zt5zym?n>#yi&-_@L{AFV!bbVz-W+yX|L@WrWPvCim+-Nr2tbo?ZumbxRCd-G1 otIsgCw07*qoM6N<$g4PT+ivR!s literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebooks_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f2104eabb2ebc053f5c811733d950ada85a699dd GIT binary patch literal 787 zcmV+u1MK{XP)4VY-N})sx z2$V-+4K*=_2tj;@NDN`&Mv&;%wJu!g#=WlVZ^bz|a&g$ojlx=|A?0)dv668gaM zk`C>3W;)}!w+|&6PiAuOr5Cr~eng(XHAEd>Nf7?`ERYQuZLf3Ve z{`43~L?s7V{hi_Au|z5Zr?Y|!YZN>i3gK-aaD(NbH^|TI(Ix?d(FmrV+K@mekxFHe zT+1My+=VELxHmE~M*edY-NBBO2nGqqUBrjcXzW|vj$ubs;B7hpm(>a-pU1bkO-xKq z!sl|0J@Wf+QuqUtMvfBlLMV;q7V945xo83ht7~Dm*l@hF2P*l@W;42@QHc{Mg_;oz zi>v}fm$SS%te*^dpt~FI=jY+vXNJpZ<0M8B$mMcEK|oPBd56c2U}P7bLlry=3!DuX zkeLO(2XU$IEctZmoC3KlAj@1Jypn;zAYge_<^=S>*WSxX*!Q-wg1QaAsh(#nv7A7ljLB2Jxdz{GS6X~(fHx{)vuN`W9= zB#2Apx>@!opHhfy$&eKrcGl+sOAcKpTQL*#oY5_g(cc6OL=elMl@S1Cf|VI7dMty^XJ*PTe*o!(r@qyM-_juqz%(NX5DfccFGIiOFY+SW5heZ|y4U zz6&Rg*85s9e*aBC&!r!;?A3>dhHlXToe0>XQ)WF+U8E`KGzGr0n5wH2UpuFDy=wI3 z=Y7{+jn-Ws=YLgmmDk&Ea5$X!k7=T~m8}^#FVuP4saFpzcKh>6ql#Yw3;^1bqwYyZ R6@vf(002ovPDHLkV1oAFWJdr1 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/notebooks_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/notebooks_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa38738cddeb7d2d0d3eb6da04c51b8fd2c10bd GIT binary patch literal 808 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 D18PQH literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paint_can_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..effd7005d499999efacdb26f6345b2a437901a80 GIT binary patch literal 814 zcmV+}1JV46P)F?Ci|M3aU2*s-vVD;3+Ef}fg+VkoiM;P zCYekcB9TZv8nB1~4IDI01EJu|McCipmt$#?uolhxwp6X5vd4cYqC{K zld_J2&IX^)M@>#nn(-?KiQ?`sep(UZ34^0Qux|s&Y_(d=q9{Tz7?jr+7X{?cGnQqq zVGG8r1{v}A__*2c_se3B$0P4~y*?0xd6=Db^{Z5>D~XstfNc#O8f3&{V`F9_B;WvH zdwUzmF}vL!Y>ft|(+PI_^5d z4=k&Ml>gfd9xaJ`qR5D&(I~wBrG$-05!7jEI4k`Hr7{;Hf`7UPuuG8rjmbZ!^tf-f7Ji{z;M1& literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paint_can_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..e5fce1004072d9f1852675dbae3fdde8b0f47b7d GIT binary patch literal 831 zcmV-F1Hk-=P)+|8$%C>%5;SqWj?Cec$t)=Q-!R=e#1lUXLuFE|p51@%#M>x7$4#i^Zn*I;fB6 zVH+QSBpW-E$<&d+U_2g2I2`T`g+kM0gGeNTLZLwY<>ydqYEXUlHYCYpa-RU%#EC>g z7l}k_NkB%>k-#^Ol&MiVZVtJY$%7`nQ;dRRu}doo+L97}6A zNLjbGwk9&0%?4TpCy&QFNJ|r;exJbZ1J$i#kxeF(!Q=5D7z_&bxj7qQ>7h&}yFew> zXBF5ckByBPd_JE*US3`n{<&Ohu-U$1YU)>aPEJlkJnHjPSpz!)+vJfKorcw)od~&K zf-VqFrxUErcKb4w#$jP$0TUD7@2|`cndqLn>7uW3+hpUL5koZa5l5<9k&0T05Tll< z(BIz=p3f&Jp;oIQlSz^EeVC-yvLFv60@-LZggm3*b2a3sKz?B<{43LtN>8A%@yZUl zs_Gcp+M4h3JZ}jE0xbEXoWtQjD!GXW2^17p;A+P!6cv|46#ER;>TR-CTZ#7eivl?$ zK5e5Z1p~*X>_(^d39pocOM5XqJdDJK14kZBXP_#QAr}7vO-UVM{)1g@u!hU-V~)fYqeUpdS9?gXy_9K#(O34 zO)swjysrgECGTEuIv3K8ngcF677;dB*VEqjQo=LZ=Sik!GfA&+ z(LooslFrcENIc@{IVhQcT#ohM&P-C5wW%$ zw&l**5B8(|I6d!i6Pr8mIfwJU&-ZzsUoT^~+o8#0t5hntB}w8A4-dBrg~CpwfuY|H z;@TpRW@<%IZlQyvVzCIBOvaT?r+07-7={6k<6z{`J1}$&!L>WjfRxMSGY)V~Q!15g z*=%+g9cU37Ita2X3lw9|4X9SDsx3=TX(XS|mtwKlu;1?&oKELU8WGwKHj9>}VVwp& z+v4#!v%bDA;8!(DB#xHwGl7hpad7$v^S05GeLkO%NF*SYN~!Dn`y%q=jaI9@k132a zbx;?3yFMY+byvvLaAXT}-RYajoF-c!1~6BYH3x44~Dv zKsotg3tLO=UX!{wm&^Sp&Ss0y($Ws&yA1y$;>oT`)R2_yXsD8!y)0?(Xh!?~T8aF*hTx zx#&NKv?3jZkO>?X_vYqTB^Zn-*mD<(CvmSE=|uE3`!>Xgv@`fRhv;gXJce}@^Bk(( r$^aJldo8ORa)cCWw)D{4KLG{+W~XuP?`MYa00000NkvXXu0mjf6*p*w literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paint_can_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..25c85fdd646f25c09a8f1c229707804bb444b2a1 GIT binary patch literal 814 zcmV+}1JV46P)G zoI*NvXhl=3Y~UhP>_JPcE`c%hAxN?a3!^Y{vWLPRf}Y%)5Jc|{L6|rdQbDIv6OZs-2mM06LvT<-6l&-ZuE`JEr(I1aKr+QY*`ozLf!?d|Q&#$vJglL1OK z2lk0!kYu9;LAZ_vBk_0~LZOf`7!1zi8W2K2CX<2w!52^#)xpJv=O9TYlcx-DjZGvH z+Hg2rj|Nhd77ZK>!+@y#;;WEKrD!Z8?s8JmXf)w+x$12;o4Kc_=Z%;V#@1%bmJ!oB zE_Bwq-EJ~DIcdf>4f1#nM)1{&(w{Oo{(*IC#htBItJ&l6Kp+sH>&we_)V4_~mEOh@ z^jQru@c8(++3WRE*y(iAe=e6B?Dj>No7?P{%jGTcsMm*O4Idd~;IXkWvj~d%yRZN% zlL@%;a@g5%VrdMludl<@)au*cE2CEIQ$IGklgYpqi^Ysxr||CXE^P8n&~v}3P@)FEO!(38+4>5 z6|!jVafSjBCb{<^udtrNB_$=mam~*VoWT=Va`1%^OcaO%XT*sel62?=jl785z19A@ zYWV$!?edzBYDRvE!YWk}G&R+}z@6vtVl6G;$gg1oG17zmL z73Lid%h2@nn&5Eo0`6!;xD6QzRs=+Yb?uNz;x@< sw{j61{3|_c5!3-HmNv>2*Zv7G0NB8YU)ZqmO8@`>07*qoM6N<$f&-F^VgLXD literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paint_can_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/paint_can_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..6aac490979255607bef2c1a5b042a2ee6e1f7d5b GIT binary patch literal 795 zcmV+$1LXXPP) zvgyvgXdC-DJ@07~Q4jpiVek9=|L^nhj<1q`I zABUmZOD)UtSuz+&rBaB+Vgu1=be7h@aU3)n4VrGghVe)}Y8&rEmC0mw8PJ-LPN&WB zc)WoOM8Zr4Zl34CC_Z``xm-?(<=H7aNhA_!zu({Ba5${Jy}eIZMig7OSGGJ$Ydhp@ z4g><+#KeS^zDiIqxH&?f%S6*IgY7@4ZZkXCZns;5!5|`$h_dc-If<2*q9|UW5}Nij zD2Qz~n>7>)DPo_`r|kLt0XUs=n3-Ab*J`z`sYFPkvWB+|3gYqcaVrxtsDW5pTLT-j z$K#{Ycq}a~VRG{8)87lDcIs0X?3f=+jU(8FjnLKM}= zgg#BvXj$BIRYCmt`wO^Y-*B8O!vo!2+Dt*ME<#(|tu3+1bOK#n?T>Uiog*9$v*c@d zuh+{;fGf0!#`BF>POKSP{dK;jFWCD7<}YT_EP1$x>YVMBa)3E zm&&3~dWO;5n=NrgMLBwUuJ+L_bkL}so=6o~1`L&4B~)Ix(Ok~**~o05thGYv{OWs; zA}%d0MQ3O8Jv#X_F+cAqMojg8yn-MM3b-iNdlpvUnfnQ^|7Q`{f;1)Dsd|5wgYgMZ}j+FxRmNal?UZ0(-_ Z0|52_iphNnNfrPA002ovPDHLkV1lpGa|HkZ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette.png b/interface/ispconfig/interface/themes/default/icons/x16/palette.png new file mode 100644 index 0000000000000000000000000000000000000000..5747acba3bb22a68fd6cc55f3f982f9f3d8d713f GIT binary patch literal 855 zcmV-d1E~CoP)QTWHjFFXsd;%W z*zILdS6Z9n;0{n+8aqM0&I?DJ^({44SIrtV9Oh+NMxebN0ly#4quUVIG|bG*!0YuO z5Rg%l+k{|A(rW)lPYtid_12Y*t&LfQ?#fUw$j4L_<`y@;N)l`b8(?;?fJOpVV+F>? z$53FdLAqfXvWwOgQEagok7KcUd1-N2Q6PvS1cL!fYh5r`ITLr&=+11Ilk&02aR`0k zTwL~*f&8%-W)E%@>I?W?CW|d6c}bdaxTkaE_1!C;kP-}8?1fgH)R`z_CdBxnZ!H`S z2TUdto_sg05T`@9{^07REJ~8ZN<_Ht?`S_)x^XMKogKcOH!oz@n)TVPs#+TpVg4{b z7}o|aKVwz!5Spp}+j$OWsNg#tC1siH*wTBCq=)7zCGSg#Tewb(r4OT{qu86~87rLc zc$+9A1w!O>2%LVRpvYBMy`_28{Ol}>%QsllP3aFAMsAK(I!$Vz92h_-~TY~}IOmyN_&$G_u;e+jjL9jB=*XHfI~AIi{c{szLzCa6UOA>l-#wCWO`5{Tfk{2leh+zE3N2n4a hgedpF&-u3i0{~dnO`#1VHGu#C002ovPDHLkV1i1}ff)b* literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/palette_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..05f720dcb3ebf26e0a92e256bb32cfece06d81ed GIT binary patch literal 906 zcmV;519kj~P)_`Sr}dWTm*rZwjxqw zD1}xiaG>GZK`q|FTZ{%1F`0yzXf*m@)MVnrn9L6_8l#Cs=RuvxJj`UgC1x_g45L+1 zV}y_yBdM5z)J&5CQp#z2+H?GNhX-HuWp=X8+BtiFYwx|j#SFv1{~6LBeKG`^2=rmZ zj6ou*r+FQ*gJ8jbOEJPM;T0YEn9hysG?6|L6A7znVSSPA@|Dbax>KnX^7l4t`OQwm zlH329A(t=EUiU=WT&n_=^< zLWTtFIn9`wnn0D!4~zU2ialR@sJ2$pb(n0GjkSq*9HJyalx3{wRA6g&XWy2gH}hf3 zt-w0hVf>RQ!u}au&Epe3QnG18?j0}xG`R#{*8jqRgmF z7vg*&)C!l&1*_GH`|qu*q!|@I-MxN!IUSPATST}W9vt|-aqTt?4-JM!o<58yEgi*5 zd#8hoaDTWToI9ge{^VT<5PGQpI|PRBsNuU@b>1R=?cmEm&`{^vg2Ru3JP7?W9T4pf zOw4K6R~VS6o*#UkZ6g&zVg^KJoT&0B>(^}Ush|Jw0kuu5?G~%$9_LgtiPtd`Hg(mY zqP$2akqDW1iwncOjN!O1>(wuNj-1(<(lR+b;u5|8(!VVjn>S}8`YseQTx&X5YilKb zzV`6#f?z(w(}!u5t~<@pz7oCpW~;ftWLc84bg67m0IrD}So@|X7GLQ=p3=Z{GH;Uh zH+UV^(Pu#iTZ}Nz`?9t&=G{_-&3Q8TLO%U7elIy?59fN!8sy}(nqKg1@w-cvN<8kr zGn$%waWQKFA&(32NPh{Y{WnJH|1u2DroH_Kc;|SOb;80TK08FuE+p0D(Cc$oHOAQa gB_e+0|33;a0Q{3Z!&mi-m;e9(07*qoM6N<$f(tjT+5i9m literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/palette_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..e778052a4724695bfa78a50eae43e307f674065e GIT binary patch literal 940 zcmV;d15^BoP)rC zvvi!ZfJr~R7KJS6wJrD1Dzvu7!Fq)>}{|I+;ga=CoOCN?b z!+;~zLv}Z57r}~GS7}0u@PtC%p}1L<4DK~&20}kw>}*gwLe1;mp<=O!+9SbIZP1N$ zVW}W1kIdzA8Oh1Hp9}M`FX;azc7yCB;%8=O$MN2yUmmM_Aq`plel+y;;mP^Sd?}ab zW7!$AB>CZX2TPCSdAL950ZKJx4y4m2A}T@rThctEk$@rooZH#;(xTTsqB`OC^ZIAv|ALfa`;IA%;4k zkOPM?h*<0y+Ql%e{2Q=)-|`aI$Ehmn#I{~vKAVMs<6z)fOE)-kIp2IzvwKe$q`W=F3z0uNR zl`IZFhDUya+trB^o1;p@(ht8;6R&We|Ej=aV{jr=>DA_K0|$DtnJlY6amgF>HTmqm zQf-X-u!cw^g0D~8kj^L9`L@(7SH#^)22W)TUrhnTF)aV_U_~nzb4Fto9jJ<&o+($` zomxD352M#lVzux)YFrLfw`z{aLyh4!p0IUZ)@+v^Fh9P`UXg2fxTvaHa}&&+yF|&( z+pJaPHSF7e4vUY1Kpi8ja^@{%B{QHe3A-_YYJ&0gP5bsNbD=-nwo7a@+9(^CZ3mH& zFIVo8tC`ignb@eFflBym1OLdOL7>W@C8lpL&i{LQ=0B@U8=U!DfB^tb>QD_?^guZP O0000P9FoEa*n@2`;o^(Wn(EwicDv zu{70G48*3UV=|e{T+fYJxD*`t=DW<9^WA&CbFRP`!~Z(P~=P z5xWRh{0YSfQNl;s@+Ix77_^Z75;GAtQlPWY@c11+Yr2!kBy#$iw45e4V(N?<(ckB$ zQYkDvo4BP;hfdS~Gh!yWgc48XmUs@}=O?^{`SzR!ok#zuU+aL2606XuXImRnZl zgWKHzt=idZKsZQw`TPXsOf((!cJ;SAeeG+tL_!RQ!-xzIBQie^@3EaQbRE%X6yxIo zL?U6-m3AXmm$hboGSDvS1{hu&=%PJmC#ARX=y?z zG=~a%JFMoFD6UywL%Fq*VIa@Gs=hX%C@@J9OlC7ybogLz@uq9jsb>Dzv&yl_a~K~I zr5Fr0fc$Y+6;HRBx+=syHixSudwIU)^Tg=PtJ_xtaU~XaxT~Cu)VU~UF2wm#a2-4z z4{SCYo_w=aN(*sZe=u~Vh&IXMEh5~T9~nMh-?jteqa(qI*U!VgwHu0kEgdc{!u{cX zaPEiwJso}dlbq$65*z((e%;Gk#?jT@a-oAn{*q^hRPY;`KQyCbL+$T!Bw#JgM= z-U0z9{AsUl?mcp@C#mTcKH?HLl`wVrK9=MVz`&Bf6jfb{C7>D$OvU5$Bz}r8TpSf} zyalG<)VuGFGH;P3J7*akSyvW+#OEeuOW)=mb7rKoGO%778fp?UBh2T$pt)3N*jj-t z*=D#XkVD^?&Jfln*(xK7LL-G=%s`4_jB3}v0%Kf2%qT7+SpM-6Y6O*#6#n-*{}x~X Xsg*#sPGnt700000NkvXXu0mjf^U#Fo literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/palette_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..aba2912d024cf728acf450218ee5f6a7a2b53d06 GIT binary patch literal 922 zcmV;L17-Y)P)7-TZ*$gd@9Cz$b1C`O19#;N2m)lF#R$Vqmd%ENUBPk)i~cUfDW%Y}l528{RI z)vL*rKAafME-Q1v;i!kY*4m+g9j3fI(Lp(vbjO_AIz3jGXM>tbNz>EQhztxMGBpL~ z@mr|SXI5LnsRGoO+$`lbzMy=k$_H?q0{S8xWxravvcun z8G5rg7DG8cuk6N)lnvJ=>p}BzRILhprrTB_?aME+7aMc)vL^gbLnC)?c$0}(vdB?o z<-{&Xg%w1?UYgv9jcEm*o8M#5=w74q*d-<4e^xr?9e6hx8282IQon}ZhTI#rv^xC5 zPbT~OZocM}U1%#eYedrbLPFF(i0%d(qQ6~G#1_1S4%+{2iQx<_d~aoKeSv5@_=h*h zle101F<(#!VKx;)ojQ!3D`)Z5&_J9yXYVhrkrE*@4jtnsDym&uH}C9N7grS2G_+XF z`Q``0MiT*qXNGX$n;m^J2Ci;E+hle8=qPtWQ3L(BY0)kNx2uUx+cZXOHkH6v?z w7}$UOt-O0LyOn3g(^b07*qoM6N<$f}FpvTL1t6 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/palette_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/palette_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..2742de01d07069c414d3c36e1103e62313c21f0b GIT binary patch literal 909 zcmV;819JR{P);NG z6XH0wn~ytJXJSrk_PoSp>CGHmzEf1p)+OgNnLDY*-;xY>*0-C_f>w0Ha3K zl%guC4W*STH*H#yf+Z(TC-&GL&phrkS+GECc+#2kX5QR$-#hm{fiZ^vGvse)6^Jwu z=^+pc0%W4CG>;R92p;^sq!Y@7Ta@w&<*nE>k^dnk5q8nSl+TVPdmas^8;u5>FOHke z@i6rILcL`D=4v*ZSp6Y?v3`5$P5OU9+z1X*;A^g6^!VsYZyoD+*q83qH2B8GaO=G< z6w|0FOO<(7U!R6>I017gaKwgioZ>q94*HoWosR99Nd>gjcC%I!i^U>JnG8zH%ZR;v z0JdeJTrMM*%c4{&BHo*Z9(Qb8{xzEtEt|~_P0vnu4<>gQx-K?N6W*C59ux`)o!AR+ zatkaH2(*o3Y3V*9-V{8_6Yvl39H!V2*|yQ)9T**{RVt8V8Iq!4^P~pvM67i-i_Xl4 z*U^t>qbG5*){AqC36MYGLI3UD(w>NTSnUY~+ufaQck)*ke){~wtWnX8p73CRkvbRU z%!N3=zxWiQ(I`|^#rF@@E%K^?^Iw1TK{q9F@DdTeTAs_iGrD^}a#!aT^FLoMYTKXo zYZH?pF2eocesG>Fox8+M%yLlud9fW-jkA$>!pFB=xSlOAe=UB=CAQgZ#h+ ztQSK#+u48Ly*PKRRYs8_Wr0Bw*sGCYZR(llk8E9ETf@lMu7F4Ne8ag>uOnao15?v! z_&49Ny9yuAlZjvQ4nwRg_`f(`w@_E^|`}Z>(kTi}@#*05+IT3E2x5 z%j*hT)n(y3-hEgxXuB%{CLYI()2+H)9iGS9Hf>TEHGr|cR(*Hnir_yuDzy)E3st)c z-$=hBI22az-B@V#xU|vlT|0V(#J&jjwkrtHf|I^6i=p_5<`}r=lYDhis16-X#BQ9= z-K29{xNFU~EFiRV0p8O8i8Ic8@NS&pj4My?ZeBT_o!@7ZU~JsDf5%Q)hsvJRFPDJ2 jeT^Ld48PmWzXTWnxiL()*MPQo00000NkvXXu0mjf!g{N4 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag.png new file mode 100644 index 0000000000000000000000000000000000000000..f1fb0215fa952f4ae47be43b0d8b8ad7ad5e0726 GIT binary patch literal 591 zcmV-V0}LAj#NACw zDfYo*zL|O7H}Acf5ntYFunFLRhL?DrH4SjaK*LN|Xn3`E^yytR9{-c6G8xoP_D|!v zo|t4$`kn{x;Q@i~!zT}d0Ks5ju}`C&6Rx+yH;KU4A7PC5n&;%JaGoQxf~*6RN8|{+JhpUy1KrOez$9bWlU!LRFb3vh?AtPqqK>Ncd`_O zY869jSS%u?oQiQ2#SkaWAWSnLF=JEB5kUwscYQ8h9}95|adb*b1yo3HfW1H+FH!^l zw8wrQnuLg>=1z?TOcY@}9K!4Mpt+P83r8dCYMO=mTLyYU0zW$)de_31z%FMnuX7`# z*%FRx2Jd%my-u^yz$3jzOXS8`=UbR!UN_XlQ3#vfhYJIJeP?j;4LICE$t87BD)Glk z2rM8aWx#Vjk(&H#WJ({u1ND1jQ&}LedeuRD@cHcWIbX5WMZ12FO@4eVnkO&XpZR~r dpUC?yzyO?+yqW5BnAQLQ002ovPDHLkV1nEn3kCoH literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9a8be3784f95c41dafa6e40d4dfe7d2a5c70b07d GIT binary patch literal 707 zcmV;!0zCbRP)YyuKoXhX7ooC5``!RR&~vA%k^xXc?Tm z`Q%2c+59U~ayYO!bNQb2EVo(rov798s8=e`H4Pf2uItcM)vPsI&1b5M-;Jp*!P1&x z)sw5a93)9HQz7{zjoDghFVLVHSxfiXAfEMLmSE6&SVxB4eghHvt4e*z@^Z z^!Ydu?;(tAgKPrHpgX|ROOE@8o^2;DjbZ_Q*707KO*e;jpUJK?Ccs{OAVObCJEtJ;s5F%lm zKA(v^dYZq^$Pel3HgKX}01;huL+%%QTEDh!vOc^3!KiqDrLlL^+qBez^0XQu|SOuDyM@z=wG#edeF}k8qyN p-ewTSpl)TGuWrrLR{f6v0|4R$>z22QOXC0l002ovPDHLkV1jwYN3Z|@ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..cb734d0b49445931045540d0fb2520ed261150a5 GIT binary patch literal 725 zcmV;`0xJE9P)QhNa*_Sg$HsynM5Fj+VLRlcwkZ2{=q@)?(9S#v$$C1 zttByPKs9aIJm{FH${B+`LM8*B42ww^V{oy8U4Ip}IzbB1R=}F1pamimk<=uu-5{yb z3rPYcKttKU;N%U|{56COdR)f>y0xG-X%D#6nG=CDD+Y`r%|Waz{qHtWtUp?Kb@1TiPbni)W5ZoZ_FaP(qPBet)$J$I zT(-|SQv6oEF1KNdU_~eMkFj_cw<(db1pV>XzXTWn=7|Cg-XA-O00000NkvXX Hu0mjf-Z4xl literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..de3213da0eff22b2ce29ad1e3a22971fadf64c2f GIT binary patch literal 621 zcmV-z0+RiSP)rpVB{*x&(8MJq{ zU&PNcRLM8)Iu4xEQ+Tcmm*9CGyt6YCyR@5UiVqI`%|zh+7e9_Sy3Hnp5C&38SeAu+ zp@3{Qi%PkSYm1AhE-b+7w7(?+OBEi+z1yp+jUhS65HXj}8=?^;v3M_5D!5VRy+q)8 znZ@ysrFtDqDOk2WPn?PETn>R!BJDw#_Mk{rYs4#qT%hNv57An<*^hpo-K zvxcq^8n0U|$j>JVJ0F0DYbe=do0UqY62EAq77!~nylTIVE*-ra_K$yuW9)w=2RipE zp?1H4C-o|BUFIqt4sg)i!*e}+S|Cp-nw$B5OJ5@Aj{pMzNM^@eo7+l)00000NkvXX Hu0mjf4<`tP literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/paper_bag_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9b7b912ef8e6cfd6d9d29c023cb7c1dd8dcfc0 GIT binary patch literal 742 zcmVU zCZ^Ri7Y`mR_TWKk4uS_odQ%Yu#Y@kOnksD5W4(4+TX%C?bMXs-U3s&?*E& zf7Jfaq%TduYtJHGHydS+H_BIJOO&;5ZJPa#`3mX|X0dJzq^W61-ce z*6rT8(NQRhBA}`&G);p)5P;X~MJO0Vds`dAt*vloCx12)#6oi2UOdv%bF@Gec!=op z`vp-Xq-1q%ghJRKlouNbB0;HcFUR6>NQ^<#^*@PCw(j%6WlZ6Oz%-*CZ142Ipi`qA z9Vq7WB3Q1Ixm~-GOa~B0?s~&utun|iHL(VTd%P4B42Pjow><=|8rqx=jhzG8vj{NtDeY6ROH8vi2t&KYb3*#~KL69HcyN^hq8(InZlbxHmwMI{u$}$YSXV}@37#vbC}-eYJB9uTpd!@2w`?n#?0`Za^)^7!z_=B8=;q}aen zDt7n!p<-!)E&V7g7Wn>r9?NMHhxzdFG4vA*@iYIHrK@M87dZ3^LBw0po0pzE_0WsZTflk{FXGLEccFR^F;+05Sd0a0k)(!3 zmt=RdoAJ%Gn{7nY2akC>`@ZkJ`Q{CKdYwZW0~TmGj{mck0O~T}5PLhcoS0vHaLXSK z|BBQj5v(m=y%T)%kr@Be29^b@+l4(CU_fr$Htc?1#RFQ^H^m#Dz4K#&XPaIS&$m`r zq3gPG&N-sdD9l6xu~-b5bQ;rBQ^@A?us^MR850yUS`cqls@1t3br2z7+%y$X5fWLj zCNmk#q_wRv!I3lz;_YIo1SSNchA{~|5F7D0d?EBugHfnKlByPFXYpfqS0!r!SjPKD z(x?Do#%*&y6j7IdVw8kz77hs(kZ78=M<%loe&3B$3P^ z3=csef$q@^NKcUBNfPjPyV-e+H^Xm8R+Hz-T@O}JH6ReakD=qh>h-|oQ4W~rx_E7U zMeV{xJn7s!^fG6_6_XwC5fSXP+ceiq9YMNAzQkVPt=Coq-}8GAu3#>wO@W5~eg`-^ z!$3q=BDtd{dsJOcn-tNZZXCzOU9XA5mnuk1BeoP!@%(B(f|JpEQB;-0XBaa7>fQeFx&*PD_Ka;$ngLFf3+9~2jjgaCV`BX zF1@I0|5*MDq64NQr2-?w|u%Ny6u+yH65 z`v|v2xB=gOGBE!A$Cy&kw7<4E!*t>IUktat|7UDFeC|J9jd0MG%GmSl>azbiL5#~B z4H;vBLgJv@2E-yjEC|H>K+FqDtU$~G#B5NnGXpU=IsMP@XI#DMD8uq+Z~os0^8Z3H nFw-&ohSJFF-$-iy0t6TURoMiBFYML300000NkvXXu0mjfgW=@| literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pencil_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/pencil_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8430ca5ba26b9d8b9637c796a9c1e9054da3f89f GIT binary patch literal 671 zcmV;Q0$}}#P)QDScx7+yX4|DS<{0SiFZhy~dEVPGiw$G~tC$gX4|K_kQe|Nqru z92|`InwSJKUb^(^{?46y!3M~SGcatJ!N`CQfHZ&n_|bFEo;?%RtzUobUw8NW-wX_U z7?;*S6mZKh;?d0D@bf1_g}zyU`}1dyK6uAon_2whM}-Pdf{B3ufN2g0FL(d<_y4O4 zXU<-fllWb6jS*rY6S11_-nsE==hh9^|NdogP>}uySHnW8=3Anr3_lW!89qjQXXyL< z8M^_vG#{5=&+v}hnt|aT!UaskYCa~rmf;PD#mxWz{+$8FNDNj3uxWnIZ04{`^eV&S zKROJ*e*7?w@(?!$(giR>Snz3n#%SWOlWW#Y#=n1!{{o$H{o+N2Lz4d(BK(w$=PkWl z0CWul15+ZKP8>b=^2W6@H$cwb$TW$8QP=;Ow~d_StIUktat|7UDFeC|KPE2&cqJYQ8ePdIkP z7^La**RKpZPR7Pkx=IX7CT=^+$iy^(p)HlM=h@X||8s&EmpK|T#sbxegK`@XivY18 z5c2~uFDS9{MlU_5bMXIv-k4=)xm|1HfMSfyd(ScK{Q7j=>J3L2R$jjMAC$v@j$_~i zVs;>A17cQaSTX(MSJHob@!|j9PcKaQd9Z64DChtJ3;-ZPJhCASdo2I}002ovPDHLk FV1l5tJC6VW literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pencil_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/pencil_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..5a77c7a6b9665ed02fa060d0129bf58a87dab41f GIT binary patch literal 701 zcmV;u0z&rSRFXDPX| zE&r}2ln-i2W?t#f2(8vbSWqBnKqkkJL7r!33 zKfAwzKJ!w2j+xzF>eH-6?0e`LEyxp|?bv&(l1QlLbseYL_qRc!&)!o;&UE7et4^1e zWylh(vVudB45-wsCbn*;gNjV{%H0g!++1N%$Fc;0^S41FacT;Q$;qfn-LR_& z@;8IaY@X>R&Cy#xfRIw~W%*_Ew5>6V7I|~D| z&(Zs!71PlXXg3-Q)%jQqBz%v8WQ7`=uk>ARX)5cC{J>a*(N&X)?@>be`t;0Vtox9W z#6qa4bz*#|1kh8)oK9an|214Lgd^mvZ|-Wj&{)TF4u literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pencil_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/pencil_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..685264b7bbb7afdc53740c3c3b5ef2e64bb01fc7 GIT binary patch literal 555 zcmV+`0@VG9P) z1|uB^d*RLiFg<0%1`s9ohJoSLqyPUISQxN?2p>iuX21n({xC2U{bOLb31nBYkf4#_ z|NsALF%AyKdreFN882OWb${p1y(;No_OHA9 z{ci?_J&a3hAPTr;81ZOkaQOL?p+es*!2S8NM<2Xnugxs}@uNZoD8a-)0KhZ{gqOSj z`}_aZg)?U_%1QjLxW)*vkcn8$ckkSIwR7u+>wo_;I4DT}gR5a8Rr7ynZ0i6S>_D1@ zRLug%7#Na|L0s?`n*q2q^B;w1Mh7g!Xck++z`*$!yH{BVX%+@*W_`>s6X;xH4A(L+ zoMrj`6KD!EgWS7EJhp);k?#9;?|FIS+L;?5%}kFN7=8h5{sq(=9~XyVz`{j~7+Ajj zWMKUJk1?g7X@6~ThUvoZzZhvAtu{i%MLt83i&$Fw` z{^tZSE^{PaCHH28s}J@^3@JVf-+L$L=V=%t5V>cNAD=Ga3EDx`~`uy)fN^q53b zHAd-Lh}dF?A3JH8gRt|UQ>Kc`VSDC^X~J3fSl;*>1DIC#d%dt*af;e0A-9} zB@=MDTt230+O7E1RL&Y5{agh!HgUb4(7K(i03%=+i24tNLyHTAFDLqQv7zPV=q`HU zz$*3&4xhOivP@olmP%(kw^pM$RzJ|OR#>0Q7u5&KE7L?^=QitiPSa0l20!w(V%oRC zPQa4Yc#X~AvE3V?x4S6ePp)IlaJLt_#}y+uMQO2y1)9QL?a*7O*(#SKM=r?1!>G3* ztqSk(Kwl@tP$Q_uQ8vqfVGl7y-K3?8K~csk=!-&Z;6QrU+h1f00000NkvXXu0mjfSw$`LMn_X3TABzVeq(i&C>DOwXzos3==K?{X0OC3xHvya*3DMMX|m<;57q7BVHF^ zYG$zi_U)T)$Nv3I?#jyjk^leiAld-1=C2H8Yv<^DX=`iOefaTXV;BR&C87cmrrF)U z!fW1)j{VvS&yM{4`}Y!2v4F1m%a{Lc|Nb%TCn_5M{bx|aqInO|(fIlUV^nV04X}jLSh{Hd4XaB00ImEV1{qC!K`$Z00000NkvXX Hu0mjfsr82X literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6d55932f5ced7c31beeb4377beb857d4648b15 GIT binary patch literal 739 zcmV<90v!E`P)0fA4N*3k?7W$s@B6%cGn^=jLjWT8&RG|+_cKFwojGg6lc-j! z5Lxk~sj1ttBtem7_!Px6O;zEmtAj$mLiz52fpJzGi^ZUCD~h&lM<&O{a3%N!WeRNk zXZzu`nZb?ABjcv7dof19N25`6>kX(>Dqdn$4Wr1(-dYd@WR!!Ua&y-pvAZ!k!gp7| zaU7VYiDWYA6|9E^+_;-S^)G^cpp{-@%;(7NOiT=U0?as$LuY5F`*BLrVNq-#!J|e2!;-Iv(#WMkc{sWj9dOMOrlPi$r{g_@@z%lhbqAjNo@cCfcK)s?O z5^9D?;>BW-a|JBR0<*Fhz_pvBHP}5J9iGpyAHIBx@O};TY8`$WMlFF&stkMnNwZhN z@!Kw`cEwkaE2&6sYBYxbp_ZURA|}1(W*3pq`Ek5ULQlVrqwOvD_IVu|TiIP*c;ph? z9K(*ZwPAjG8k>uYu7I@D2li$TBUgKO6|))Xc>0T2pH^YUyz;bld-(lEdQt?{h@+Ua&0!ztlxeKFaUv_ VAkeGPf}{Wd002ovPDHLkV1iKaQPThb literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..0b58fd3fc9c2a76876eadd0a0782e21d35a5e481 GIT binary patch literal 784 zcmV+r1MmEaP)++f0yu5^ia05( z{^#?pi{nkJC)>MJNiu4bfc1Dh@JTsHBofBNg6M?8n2dLh>&aiB&K>k4PkvNsu5SDj6pyzGG!M7v&WKs{9g)OA7I0dI>YKg4!cHaHId@?A5^Q zH*29#m`%+cRzt+r@VU~_l&er0pYg~wCFP0&(>tvcfsmM z&r_#Pv$P^7+;t~}0=uSQ z`lht`sXNN6YyI?SUy$$~H(_?OyZouL*%_9+k<{#1pEhy-9`)NV0R{l^C@EV|Swcks O0000CSl`GjSm@HxTZs51*iQ4SN(E>N@=FU!%?sK8N@h2*e9V^kP= z8AO4H&+COKO@ZNCkVqt0_8>uqh-kzwd|bik6Ad%38N_y7NTo9<@zkNMeH<=_JM(6$ zD^z{u^1bCqBuWMNKLol-(A=CtFt`DWxQdm9S)>&LY9ui+F@dbQE(Co}W4L4X!}Z{o zF@A3vO@g$l5;Pw5ccOcDki+`?UD#y{zWoSc@_8?|)DQ%xyHbxWw>Ae?W~hL$KL^Io zZS>!~nD2nIL_u}U4rJK}k&WZ(wFihSo+Z6xN_V8fs$@c`<;ge}(PEZd$2k{wX!Z?v z6#kRNu(BKU7$jqTP-0KbJ$ISiw-i%4=tRCEcDhl-+TTA<%?%uLcwyULlcuM|BCL^t i&2cPrQNa6O0t^5xx-}LI%2;mz00000 zVlCC!T1yN?^w5fx*i&<;_Tr(S;HlOg#ES=S)q4+mkpv{z9+aL$1gnS_MHC6eLQSy7 zO106_68o{H+1>2M_tv-?6uU6&yqTT<`^~<24A1i;03z3qRr;{~lOcAVIxC}7s8*}s zY4M%u>C2)ZKoUi`CCM?5EW_<`K_b3H@?AqiDOwzl$Dz~|dDAo_Q^_Pw2R=X}f%X4v zKf00`ULPDw>5AgSC;=OdM$x7CU>Jsz_$r4`Vnk=naU2$;T|q6}IZW8?7-`{)Enry| zbX`X_n{^6SLmVz#O{4k;K>}zcuO#&uVpk?7M;rla48x$Kqr?6;Aq4`d25TM0v!1dpr$Hq$Z}1#z%tu_*ZDm5$}bUZJ_Ntp4c!F1l8i_& z44sIVN+re?s8lMTrtyB9yEtBl-QC{q_!Rr*ljjKS^uQ~-@Lg5w2~46&vESYgJ0%QT zbBSu_Kmo$o1kLv zGB8jg;gWqS`I#jwTr;pft7B2=!I}B_!?LQj)Vj*>wP~~o%9=*dcpSg9TsMKwQoR`L zi~U^0Vzk&6xIHmpPonT^4$RFW#?GGjYlMAk1k>s5%Ekm@pp`iiheMLT*Oj<_=2XWc3iWmv( z{$u&hfTwNuV$YClHmfm8z&acbIL$eT$Kz_^yUv0zBdGrz$6-x8Vu}^o+X%Z7BU|t* z0;yCAvMj^v^{NHi77jP>4I_Pkpb;n`!yxq;Vs}SII#dB_48y=?vni98G-f17tYw%* zK^71raHed)pa)JL1M00QL?aQF3UK5cKyA-l1}}G55!hmLF}t#YQr&wvimH*P*F#PM z*`f|sQz2v`9u9{YMIez#fLe^t!}VLe8Q68@<*HAyUE}Xiys-p4d4ys?uw@V=i7Lfj zd|s%QFzmidRP9aQ;15LcW^EN+RaGeM>$|`nB%rrI(O$kHXT=y{FyzB>v;@V@N)#B4 z2>9PZls==q`zl;y?nF(^>kNW85s}IGY0ihBl#2?x26c^Q94#w?Z{aI`%s)hTa~15h zwPO*jc0n{6KTrYw4?#j9Xle?Ra9FvOmAOqwe$p2kQ8Zp^#(>N9rSeep!Bp`01VZB4EQP?ZiaOFlj2KpXj#v^Rc^3KVSF9>OQ`By8GcFdv0EX(4giOcAHDZP!>u4z2I zUxzZb6rTBy>+90kBuQD6JrY2AwPVC8&kNZ6`|-GCoVZrc?1a`42nW)koivtb;^-x* gBz@7e-+l@(03U=p)io`%mH+?%07*qoM6N<$g7k=Qc>n+a literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d1fb19656ce6661478b5c106af45798ce550befc GIT binary patch literal 762 zcmVqsV(PD47#;rxv_ihmIF0U(3~N0b!uwF5um{^3|d-R?2kVRGE7n%jI;20 z0FA%}Dgmz>=-Lk)4HuB#-e#!)NA>|U6uAjWZjUXHVyp3bc^UhpSw!j%p~mfoZUL2| zgm9o1IuTb@m9Yg((*zBTufe&CH_Na)nwy=RV&8i93PHaIl~M)1D@r+mMN}#F;{95u zg<(r6QEeSqMJx#dBI-JOWvy}kDG`og#% z2q`MS|0XbPf`I{*lvVpwmgm-RZN-JTYynlfYml|FusCgF{mlGnvaAGOa-&U<*EAcg zdn{Gvz@>+M2p#|FzOfSA%nrWAU#Pf4^Lb75_# syZo+~4{p>mIi#?N2gW7pw;uuw0BWowr1HZnv;Y7A07*qoM6N<$f)BS?vH$=8 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/photo_album_blue.png b/interface/ispconfig/interface/themes/default/icons/x16/photo_album_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3f9ef42db4392ea9a12e4364c12093378b1214 GIT binary patch literal 738 zcmV<80v-K{P)e_3ap24Q^LxMV`@DI-CrFYs3?NkQzuk`Azd6z<>x^Cqpi-$o zV#!m}(^s6b48`e$TTyJOE*IQ2HBhLpP&_&~c!?$V_V(J2Qn_3X-5(nRjttRICuuux zUp#&0VxRYJFeq&qkiN9_-8U|AM) zT}M0~w-bD79``N}pzFq4)euEVIC&U4UUVbQ-Kn} z)q8+|8#vJc91B?}778LWaL|7MNM6-IY2zz5u*?iy+x$C8-BMNIxX`kE`;iv zpp$t%pBK1+X_^2@go*3tk5^&$barn27t)<)uh6(hg~wHc4Na>iC|hNYJ@>H5P7%a^ zU2^S;Eh1ZVA-=AnrA~*YY1ITK-2y{<{G<*2XEg+BEhqs$oPHm)g+(4a)L`N0z9Iz4 ziCivMO~4JP{VMd0NjN!@*;a+Eec&;M z9qQ=7+{_Ht(`jxXZ`Q#^!Nj?d8{3ju|&85$-M7-5<-xa(gABOjEQ|CD^!E9LvX+Zb}!bu^|kU%i(E5O6^_kr~>U&ddo=zqYF>io(3Y z@bM*vIEiO|7VvR`LmbCH_RTl1FnmaW&kZ*+9nSPb^%j4&K`s9MZ#)Yy0FCD4p?(JOBUy literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/piano_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/piano_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff46432f327db09e883e4788009db3b92482eb0 GIT binary patch literal 541 zcmV+&0^}Mh)&VLgVz5MbgQoY@(>=p89@iZb5 z6QigH-+aS2yl>tc-VjPD{3j&%XAp*6hVeh-W*9;;Tl~RbaLhDKAcTMb zkET+oCMT0g+DR9TdBVklw;6^3tt`;43&y;r0hV8>RQQ2l)H>;cg#qqlo6W`#TDe}Y zLnmGEXYNM@DBuI(je=2Y*JF1*Fc3O~bfK$R0mcJ!rP*wj{=_S>2fFh}IrmO27F_dd zybKj@5*E za~`Ga>;u)Kf$4C-{Tsl<%&>HIksHEs!xwS1_S71#)uVMbh<;+|00000NkvXXu0mjfK$!HQ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/piano_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/piano_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..84910e48028a8e36d04517f593d06e07967de6f1 GIT binary patch literal 594 zcmV-Y0?i4!-WC;Q;rZ{K_Ky?Jk#VL}KT#|#|Pn8a&|$^X!LmV$QiLM50!!g&+tNvWr zc3vv(FTj(@q*@qf4dt5xSI+O_(!^uMKQXfwxyMeR~Fvp1i@W>3h=uh(zLF2Wi?#3;GfHpP@!>Z=zDE z!1p#FqCHrn>=aLQ+Q>H=jcTb>dMnw9v+Fk2ydMkvYA$#7_rW@UFjIhe(m`;z9|&(_ z_r)w*qU)BFIIU-j+x#rMe)rCqR~K{RR{L-p7e-gn{4%Lt!1u4;Rt|Q(=hR#%@vC3F zFvl=<84okr!QlbpCtya{+nR^BRaN<+;lXq3j`x%w^-2o&f$WgL_740H@0(2-YIZV< gy-(SI|3`oU09^U*IvK=J*8l(j07*qoM6N<$g212|YybcN literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/piano_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/piano_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..920b66e9e6d3928273ae3e110f25c92421c81d43 GIT binary patch literal 430 zcmV;f0a5;mP)FyaU1bqc9@(Krb2dOWhSR_JZAo3%Wg$$e>l(_klydGINUG$=_-}chbJulw6h#|`VaQcJ z5%Z|Z4xUz36?94J`$Wv!6u|b2qL3Rz^i)2P3gAjNO;c`k*)$EPeBwIyy8|@vg78El zdMckt9bkNjsyt0o{u^T6<+=?UPokMsilCTKLB{ZHoPp$X1?z~ z2_`BYFPBGG~&}A#|^;ks`t5z%Ug+?cwztkH+~5) Y0O6tS)V(RCwBA{Qv(y10{fofkMCt#Iu0d zm<+vVfjEr?NSG!iB^mtt_m6>*k&%Iki3yBBY#0D}6C@A9JA-yIc&ztem^W`8*!3U- zm@Zwq#K6kR%D~Rf&cMOJ0j614SilB>H2wblo8jlrpJ1%euE22V*CiD1U%q$m-hU$_ zqyNW`ABWR>_U!qOO&msp^ubJF2HE!O*DnTS8ivuuVKhizD#*(q2FUq8e*6GSz-W*d zHgOQmcH;)ad`3pOLbL3&j0_v6=dKOpy~gwUAy)lAASDh;{Qjtc>e$Xtn&Ya z2^0PU4Snec4MYx*O)x)W!(ZQ>V0imz9)ppQ0mFt32N?W3^*~X}ya^hO`=XNn7H>~%S`yd{|tY|HT(h$ plLZ9-AG-UPfnm;CR0RM51^_lO1Jq^RLe~HQ002ovPDHLkV1f>0`0oG! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/piano_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/piano_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..165ac457f092d6e7c99f59f4e9e27c3a6081358e GIT binary patch literal 504 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 Ef@;Y&c>n+a literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/picture_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..da43cca6a1af2ce5b6d65d95f0969b4fb19159a4 GIT binary patch literal 633 zcmV-<0*3vGP)ICG0(pSzK#%srKHze? zjbfexDx-i#=M&jAnJ>6ZBr?V%PLBC-Efblviarg8YrsYT{0`|7`rSv}q!0^|e8~;N zM1iJhSn#f)Ff@Yd@mb_88)+&KP?DImp(RDEl!!IS5nQQ21iG%HzFf!3+6tQMpHUi} zfSWsn1Ga;V!I9QYxVA+KaxzzNq=Ft*Q4~cguzKf^?i%>|*B-F76{ESij8m0ksJGus zP7rP@*eUS(?#y3Dc4=`A&)W^S)PE=HKnY`98Tkn9G%vEBelmsIXAXjME)`goC41bl zmxWI_Qk|0PR@j1Fb_iv7_g94ud T<)x)l00000NkvXXu0mjfdAKNx literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/picture_small.png b/interface/ispconfig/interface/themes/default/icons/x16/picture_small.png new file mode 100644 index 0000000000000000000000000000000000000000..75a8a0b047f4d3522ceee9ddb96cc132720107ab GIT binary patch literal 332 zcmV-S0ki&zP)V~`b-X86w_#h@+34wlDnz%PgaGW`Awzkdib zJb5e1z|14U@c%0xgOTK4usmJ^zW;=T!O=>4M0xUS=JlKZ$5V{!S eXkK6d2rvL7k3voGr2p3d0000jA}L5y{nqwh|OJG9Z?FVp9}F+EYIHdo*K>v)S;z$%2e0mOHd@F3oWbL?fQ?{Vy;S zVo+2?_<-;D0`gn&#JX-nfvT$5-iaX=XINY?(bMCD30Tu3Fb0RfxB{zEf&FaCSYn8k z3g|=AG+bZa;QmfW?or3c2**I2V|a7`sl+(A+Ko3yg;&3XE@Fw13LKY|GMROK-4eR3 zR_S6&ymyAm=@GaF++O&oz66M;RLKy_>n`;skTsRd{*T_NU4TtL5a-poNbnjUEnrYlDP^;C z=1u==l*g1~nh?<*^wPU%lNSZRWSu_e4*>=MNw%3=f^+Jq00000NkvXXu0mjfA${7L literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pictures.png b/interface/ispconfig/interface/themes/default/icons/x16/pictures.png new file mode 100644 index 0000000000000000000000000000000000000000..25765340ec0c9d789623fd167e077354fb8a4bf0 GIT binary patch literal 609 zcmV-n0-pVeP)DAV<3A_5IPrh=@fJpg6g;liihZsV9sWkSx|wn%CzcA z<~lmNv(tMs{tJp(=)vQA-}m18&HMen`6SQt@INM|($e95=KTu#YHhyIh-YHC1T6j9 zKkMu1A24j&4sDJ`qsWdvg*d4L7J=-PgG4TugE90x6u^9#M#Uuxypf1Sgrco&S|btP z2ggq#rU8mfPWgHjI35EoC4qB#-mfWF0)PyU&V}`LXkPvP5pVAI;PS=>^g10{M1xEK zZWaET=)ME>YX1SiJL~VfTmQlP^{Y|zcHM=dC~z2nd6=e&w&53{yk{QVMyVo0(=?(j z`ML=ngN;Wj&KQ3*NOEw+Ue&{~Hq(!fh@h7LALlTDs;ZcnJdO5?J4hxS$TVW?M8YpD zS(cw?D}4KeC%s9eQYmZ_YvJqy@L2P6izrw+TFwh3nglvh4fJ&h#V;1lP@ZjN)!zD? z%P)*iWF9VQ^kcD#v)2LuPr}!%jhh^1r`>holn*pW z5C04m(ygF;s|m|5mv-L*^N7decyzrnwAnBWpZ8IUZ!`d7Yb5kYyYl$MoO`9#2gJM= vir&5bn_~LpadNqaet!Gw`84`pKVX=&Q2#WF_N(AA;@-2$!K?NIFp=3g%Mpvk5IBClpg{C=5LtsE@B?8K zHnyAj!B(41*wMSI;7|dHGGl&C0Xz<1lOI^4$3@Is))MI8rSm|o2vrmBhtYqc8Jm+y z=tVkIn+nPVj2y)3ZQKiGYulp0vqXOG>OXKl>GeoG+KdSWwYV%dhMh$)scV&(IbSt_6?3hsq{*jO_Qzdr-YN_3QYMPMqC z5dH@hhcSvW47VRbL$QQuMol>frB+!ZFGkUGYYKgR241};pe1flXDKGXL-^ye4^8{F zW6&L(IrG%>VZ}=6vCKIZ1nTN|BdunB`AqOU9LJ4s$ME)R3rfbu@b2XZ`UibzIZ&%z zR^7?&O#2WyvKo%u03e*j2aNk# Qe*gdg07*qoM6N<$f=7uxn*aa+ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pictures_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/pictures_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b685fcc6ac1609c157fcb8e6214385a1a0811c GIT binary patch literal 713 zcmV;)0yh1LP)>K+BQ$aY{00$75RqcJJ`sz>;5j+As=)J0epIRifxa+= zLPJK2KS;09sIC8@6OsUMENNukparZF;FW<^F|MvDSLy--)H+>g&|zEh!)rV~>%;C$ z2BJ=cpb@|lfvN(vw;ebHZD;Qvfk@)--0lD1el$LUgZuixaU4oifO4#byOh3zc=RGf zml1*>5Nt-xji)x2xW7j|4VxIYUgDaffN$=?_WkEkzCQ?_tAgI2(sBW@CKl0bJi4YD3)YL3CnaGW?%pc7kA zE6*Vq3}X1)F>LLSKYgvv44t`Ly~k4yYLjC4Pc5v7u7>x~<5;(z$LxFrZaAxy@4!T9PY0Hki$3h@z;vp_wSUG^Exv412af%PyeDH-zaa612ov(mJU< zpUHW7!tvzlaQN4W$%ga04m0vz*JhKRP4Lht$fr&tm%6LY*&L>px2aqotrNMhFq6iv vto_Xk7$n_}hToS%gRCwB?lTT<9K@`Tn-JSiDZakza zMr$!QqoxfdY85>c4;8VuLZH%{;8Bns>dAW#QuI>rW+@1sMD);-g9uirHWsSXKPU<@ zENPlxY_i!+cGr26R4Y_lap5sDJ8!=Ees5-^APDe3AA6pbHjl?%tzu-Si~IKC9?MsO zuitWz>(so*LZqk2&XF*n1%^m z)gf~M&xdHE7cM~?82u&i!rGcU`3LSNk7qD^{xTFrflC6!@h{xfrVL%zIkqI~#>mD7 zcj;y7w*`{iI^w_&(0P1Ozt#azhTVt9X4Bvvg;%u`&@~P6f6@xy$sPVhW_|&zPp6dI}3;SJaMlU?b_RHZe?~Z zhh&d3&xm6~U~rHM*(&B*LBdid2angNG*w65K8N-E2OKR!N;*&pPFnCnj5x?9*-Kyl zwq@}iO!i|SaSTW##9{F0rOw^y=>{VXvNm}!ibx~^(=>$}V)lI>j^iL-{fwIrmthzN z%4?OH+Q5o>fzAok2t=pOQUd6wkqvImkr_8@!@UC{Ztq=;ou!!)Gcklq|?U&C2 f^)qdO9|8;j>$=3BG=$a800000NkvXXu0mjfWs)UV literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pictures_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/pictures_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..1edf5320c1344f67e7eea9217fbc68c871b0a428 GIT binary patch literal 706 zcmV;z0zLhSP);pYL#l5d6<0zHx9r?+5*JaQ-E5PGq72jF4kmoC4fOjofYb;ux0-1XFNY`$BuX$ zQk4XaN&}t(7OBRy?L3N9_SR?QS_(LJIcMl-oI%BE;sMTtWcs8JQ+cM1N z40uXWUuOinXo@Ts^QyH9CW1@o>+Qwat`;adGAlA2JkLX;(I7ZBg@`Pnd8-Ixy@BTr`(kLHjd zSFy+0kL%}L%DRpGz{soo+h^~vAZ924qse4APJa7saEp-_nDAeO)oQ`rYd0_#AmLht zJgoc+NqQi&WT?vsgTVkvl8S7Y<}68qm?qJA;0SJC8bZCQ3G7Y-w z3Rgaj<#(-Q+om?oblLr-?)1N`#D)=tLVt@( zv?_{gCvI&(Py-}RM*e^btO)|WaiB||b7LA!Phd=xE&>BSbQj;v;@+7->|R)a?$e(}&;&yr?cI`9~kJrJe#NfK98(1wAT>q8L z^T@LjuAPtJth5E+h?)xy&b_jp=ieiBqk>Gv!pm0-JQN0B6+x*C*ZV(Yml6IW)A1iCw{QUEoYDuwkxW)Sa0 v0}F$Uw;hDz>N(=wPRTQrd<-!S-vt-|P0Ys?mvF2D00000NkvXXu0mjf0`4L@ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill.png b/interface/ispconfig/interface/themes/default/icons/x16/pill.png new file mode 100644 index 0000000000000000000000000000000000000000..d75a26d9ebcb157de5b0411c13d97b9e1997d1a6 GIT binary patch literal 603 zcmV-h0;K(kP)BDo=T)qpl;rIIyi^WzHMfoO4l6*G<8xACs%Vs?82xqg|pX6K~2u$6u zM2a%Fd31#9QVC^I912ra4m+I7q^SkWGy(BNGWo6pm-2aNstWh&sw2$Ch|#t&VQuYI zQ<4T?56|P7AmBI{{FV&XXNbfr>hL*+`PQZSRrgjtpa*(So`kTgG}58-~B&E_IW(wI)C<36A7X)2X^ zg?nMiUn10Ef>~wM9~1@9xSIv zofKu?4d*i%kdq{|dcAeHeDKAk;bVHYqS`Z#ZlN1;U2dw_TaGRUFV(Qld-9npM~U_ zo7mcTE*eNthfvC$=0gd)#P8^Ueaem9e~JLX&H6^fmKA;qFaVhzWlu|0+k5~3002ov JPDHLkV1fmeNV5O{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/pill_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..40fa6f46565a3941bff2a50efa4679ba49355a8a GIT binary patch literal 750 zcmVHr|rBtoZC=6BAy_sn4o!@&Oxj$s(Ik*?CB?Z@V;!NH=B zD9Bz_Ra^4;dh*eqJkNU)iG(;hI{F|UkB^XT zp8ZRP%@n28=kwhoxGs~)SZQ6?-rnxd<#J7w4Y+@SDP<6hR4N5Yl2B4o;-T50>-v@s zwuH?)lVw?q#bRrwjrqeJoFQGP(e<9qusNJgCjx=MB~cV#(lWaF4%Xq?P^d=_28&=r zdIm0i9fNnf9xf~_Op^1c8Q|v;jPI~-S15E=3x|e#0V z=czV%c7tPedK7?04ex0em4yu-o+RH2Ldk!3T=>?qB2sFj2>u4qt7sAw){B3IClSTuALMc!Za|FMhPN$#!hU=9IbWMXt6fu>}p25?G zk$*~2-Lfn&K1lW;fTXm#dcS*kI09dnBoxBo4?-ZYx1woz4xXFD_8@%86^!@YjD zu>m1LHJAe)&HH?>{Ij!>$%%<6s)@O~vs3s6yeR;g0I(JUMhwsp?eifJNjIMZ5AOkw zsVx#^S)xJDeg?kMoqei~W6#AN06lKt66rE&@=t2$Im8_5Ild?FehDxDz_vf`EqV?N P00000NkvXXu0mjfgLf5b literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/pill_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..0724ea882febce36a3960180be5637b9e5732da6 GIT binary patch literal 782 zcmV+p1M&QcP)=QKc0RCU1EX(zz%Y3AHCCLXn{fynK z?&$dP#_hgqu~=4Uu}ML|`!v`Ti^VGH>gt-+YIPy4?CtC8d*<``_*Q?YBw%nn5_xVk z8ttzfruJ|MH_7B!5{^cr6%7pyPY5mv27?;9FR84oY+PSoFXt0f{D=CRFpBeIPai)R zsXl8v%}v18tw}f>4ufC>0s*D}jEsyz8nr0{Ub2jlV36HUn#kd=H)>B6Z-E8sZ)0P_ zyRfjZ$~oa3{V|}?plGjz!u&Xx8upb#xN5m=%NrkeqTrw%aaFDY^UBG|fz@ig;`Mq5 zT`rdgb7a8vE1?=v?`&H$dwomKSa62*cU@ynr&H1F>?|{z%}t^xnhFXElz3AuFrbFi zpmR9tbsibwTp1o+sKS|xZU3z7cDp}OD&JBuO1uxCjNry1hvQs)Y6@$9KeBxk#j+k# zM~acP4XhZ%5~EdbvmK4QTng-8Ttr}b85*@3d3rsjMRCAgRFr}#9pz9JgGgfgdX+|_ zUGsRhz@K}1hGL9$aySW63Y$9!Ck%eCdOU%^;^H0-Q_jfM=`hsYJsJl(e*(Sy-A@OT zB{b6MmjUK-t=67XT58JNwJVFxBs@AiJpCPL?+3bOw)sGK3N#mL(!NW;@x#DLibYTB z%+rhhVhot1XR*JErd@MMWFT{c9i-i)%*{k0r%6haoHjCU@JE0F0PAs${VVz#*Z=?k M07*qoM6N<$f*gKi)c^nh literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/pill_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..676c293526668f59c20782be5787b40d8731c337 GIT binary patch literal 704 zcmV;x0zdtUP) zR?`vsAXG*x%soUx`49w3zUFEK_RvGn9()pf@jZHoVA4Y}6e0wlEUAbfW-TxgLo@DH zY>n*>cXu~;@7>+){G5h=8U_8}%l(~u?&q9y&+q&=(=_ov%gS*ax=HuR=-ztyW@2L3 zN0h{)>-xD;sdR{xD;A3jk|eEang;84g4yD0C+Q@(tFNywCC3Z50;4LTVt@ZC^f8WrvL4x_jUO m%H~-JToezrJIwz}fB^s;oL$!|fc?q<0000-( literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pill_small.png b/interface/ispconfig/interface/themes/default/icons/x16/pill_small.png new file mode 100644 index 0000000000000000000000000000000000000000..bf2de13448697709eb913297ceaa1e1e00230b66 GIT binary patch literal 404 zcmV;F0c-w=P)q@rvLr>C;aQzFYB*gze;@h^5w`Wld zaQ5uk9m|$214(Tn=mn7GpFe+sH3Mme7cX8g2nh*!ynp{*0-Itue#*!Q!Ztv>8p!|u zP;zyJRW=H_tCtgNgm=q?6flt2UquikH|49`$dmv7yK!m8Ob7q}_ubyVpZgC3 ygUMe8hKoQScCj-s+{TxX7>9mdpx6L_00RIRBj=%x93dM30000RCwB?Q%z_SQ5c;4iICtA9=sG> z5JW^G2=ORr#L^a1M4DcD>CKCW3VIRZLGj)i5GqBnmo6{q!?&uyLyBDgr$DEDoqhF#1LR{d zoSK*z*|)4G6dkcQg}m_Rw2z4kM2(xp2C#hu_}a9;un^o^Uq`V}z;U-5M?D^>D=SGl zxh(IrzrxLH%ga9Ga)w?imG`%{@;?%Z+}YXLF`Im77}$=-Kkx_=!;{DgH66s;R!2Gc z>5aujpOH@EP}gB_n$D><`R&ruCS5&}fk>lYh*XR)`Ov%R>7=D7__@1_Vk(8bav7gi zS3jB#xi=umP9R03f7dKgcSRzn6~BK-%VuFzs}NkSMp@H7vt>i*_(EUoBM9vf!CQHZ zWhxqt&TGTN$xGwoKB-cHB?y&RJpP6*r&_&p#EyLvyW9xEXeN`H^Lo9Z+oGt|*48i< z4EkW2ZcbHNjn5o%^RXR>yv~GQRn-kymhTWJgIs&fU|#~8+T^75oRz@2em6yuq>F(- z;1!7h3Q4W?^TY#+%#(Z%c+rn+2cVF6*EG%d#5d<}(CC5QQyWg7VGEofJdT*00000NkvXXu0mjfp|~p$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pin_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/pin_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..905ee2860aa2132259c0ba4c568645cbab97ebe6 GIT binary patch literal 778 zcmV+l1NHogP)CBk0FG>|9pIqW&b*)l+5;{qlg9tpgjyQ z{sT9DOf2Eb?!>HY-!_zJ6>UNujKmhXF+pAXrt|N)sgrpJ0eYsYvY02jUWpx!8 zjV2LUTKe+lg5x4yYsTSQ3Fa4j7jlY#eS}S1M>jx*3n1MvJS@EG=y2F%*_3gl9FbXVI~Z-v)M0dnoRxsE7RTzbp_L3 z{lBz&t*OG6Z+hqcmWQRR@X1E3ksNb6omVXuO9SrvfsiovW8Pyv^3+;hq?wC?-k1OZ zX96Y`0m{!RlgnWjD^# zNu~;RBXp?;NK(&WeN|KMDru+HbUJYE1coRM>B%K0J^LfT06MlIEHPfV{r~^~07*qo IM6N<$g2_2%=>Px# literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pin_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/pin_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..81026afbd7799013e30a021d77d006fe68a0c380 GIT binary patch literal 784 zcmV+r1MmEaP)2bb)r`WWL4igD1ziMnClLjPT^KHX$3M@SbPcsS>M&v~Br=bXbxl7#;mNjtyfNP2j zF9nX#%&w&@q?%PZ4o77axK855t2fpZ5L4GId_LqgHl7Xx)g*H4p8~7XkJGu>{5*U; zJ;yS$1|}2fH#b)X`};BN_hW-r3%yPUM|=A) zWwK8>_U9JLkG8d0;q?k}jtk9=jQD0csO&Rp;xe8C>+OI>-`#EPYib(S8I91bOM_;& zV945eB!jwU+%PZgo6vvkZh$y4TZnxjGSS(even{>|q7t{=k}IG!ZHJ#5!s}Nz5Qu(- zDm{A#&*LohnPKJ6Lbvig_;eZ{M3Eul=IN* zqZz6+{T>q8FK3WT0v9?vJ6{sfM*_Q&56b-W7p@si8#A@+6!fY^EC#C+vtG4;?5&3U zSPYkyba0M{^~nz?CBH#pW+Z9mec!|cttY5T^4&|^c;fAntzZ%UEx-V-W-QE2n>@$> O0000O|OrqUd_w{s0d}1VN|=W%o&U+^N;JY!(j=Szs$T3M#s=wTCjKFkES| zjJ2*4x;9PXn>KUFw0JP^-zk>h+M0M%?Y|X~7-gz_cxh@%F?>G!+}S}To5gOuj?byo zC*3kW)Ti_y5IC~}SwgNW3xt+Sme2Y|M~AD00<=a0jLX%oSF4+(@}-}C9>OWp*o+`X zMLfhSpg#ee^eiun?`LNf!Rv*a(l|3RGDLY_7AzyjB-+*-!!YCdeEx;s?+@Q&*=lof z5mGQHZYqj<0JuZ>u4&GRRXPMrx0P4p@%ZCFAP}PcYZyk2^4@xzN=Ek(T-ehDxDp}KlNq-)U$`KRCh`qQ3XR)L|tPQ6R zGs_qxN+NSj1vlNV+xacc$rwF!;lus?&b{Y*&OP^BLMes+8G;1E>@xC_q}tSq3~&Ip zH30t){E1=U0?y1{%3SsDfXwMMYyu3T`1zd+dkXxj{$?N^hX$LiD-U2o5zRjZcBWs% zeT8fm;!d&6iSmY?iM;5DER6 zqewyM@zl%JYFRoO1umZlA{1_A(&^8Kdx*#%ICj=PGc(p{G+LF}>@y%(#4l8V&v0)|MMTMczz5ChmN~L=_6fh*TUFkW;xdus^cYb(_yw+=K)DnpVZj=QWY-dF6bUHr?1cF}V5DLI^EbI#viM$<^ z(XzAUI%qpu1%P`h<;RF8bUNKrH0n@@E!$mYP`JMRMCy?3B@^t_J002ovPDHLkV1jq_P3-^x literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pin_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/pin_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..1b7457954fbefea01e518f80402328abedb39c06 GIT binary patch literal 741 zcmV*z$uCnUciV zXoOpvgl@YZoqIQRL!^f;{5a=-&pE&I@jrh?(=`0g$46Oq-%p*ADgJet(5V1}31IFg z9m142Ly|p+St&ktR(ie8H1LqfuM`>%Bv6ZW7Lf=}4i2_%0gs8~+CK>j%g>TuW^)sf znHgBy+8UFZ)=i|1x{--6yWP47wS+VoV=}OC2v|4DA0BpY%+4YfjpDG$1dG`W@7P$7 zDyio~d$-Vhb#zojIILt7iBxiaKJt5RE_}ML&!GozD+(5TzR%PGN5kVNs>`Urw^wQt zW$w8?G9oHVOW4k4p-{FgWz~bIn}>azTH)1bQ8Eo}^)5K-}>AkxC?>m6YJy z)RaG#$+-HS9+g6Mg5lge{s+iv;PeSB5|(mujgS!}=|q*?UKw9ogR->+MiAswJihYc zepv^(JtK&#wZfa#8XoLR8sZLK17#kd#4Ekz5HPND~O|+3cL%mgE`Q7?`3-V#&eb9*HIPRRo;dmfP(uAt2 zQv_p^&k|Z_u%GUjUWHEa*eGXy*lu4Czm6>i4TkTEA**~*YW`j2^k11kv^S(dU;;aSe+3u- XDmo7jm{)ff00000NkvXXu0mjf=1)|v literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e99fd843cf492bf30c9683286eb23f197e44e0 GIT binary patch literal 576 zcmV-G0>Axk7RCwBA{Qv(y10{fkk&%(X3W$q< z97`+;{z5Sb0Ijn7$-q$jm4SivGXq1<@Bjbzv8(}Vwj{zPm}b@fe!ovopE4Zj?&ki@ zz_5>nRLxKK?`QbK&d%_Gfr0H0$P0M%*#L1qQ1f1(W=~|zM^~*n@r{9@;UCC=TQ~v{ zC_2G$#R}uQk&!GoH17ll;uBX_um&b3CI(P|!oa_O|0e8+h$wKKJUQU$o;_GKgAI7* z;sRl?urM$)Gs85ieE9Hz>qlJA`fo9M4EiA<#`{*SIt`4C&Hs@!gDpmPI#jb$ZgEwi zp@M+L$t9Q8A78WPY-m`RDbVJi{}AuNF$*rudoI7aBgDh@a(id=>lXq76TYunRRB~{ zgRK5GvH^eo{89e&>62qYSuI?1ag57Jpn?1U{{4FgXxkEGjoX0u7RZ3}=g))v&(6+n z+tD|*2&OqJ*!swqFJBG=!{shEjWED0EG*3M`SWKbE&(xZ7HMN4kmh&~g9AX#M}GhQ zeGe$daQ@pjhAlwFCxG}ZdZ2M~axzFuOUJ(c_~W{zy=yKH4^J%6HHsit5d%OGF9+0M z0nC-WK)>DtVvr?&(C}|G`VTChfehdWVlJp*pqTlGME`>-{D%tz1Q-D0j{a;M3?k$J O0000nRLxKK?`QbK&d%_Gfr0H0$P0M%*#L1qQ1f1(W=~|zM^~*n@r{9@;UCC=TQ~v{ zC_2G$#R}uQk&!GoH17ll;uBX_um&b3CI(P|!oa_O|0e8+h$wKKJUQU$o;_GKgAI7* z;sRl?urM$)Gs85ieE9Hz>qlJA`fo9M4EiA<#`{*SIt`4C%|Ms!yy{=V@aNAThCe@l zVuk@!vr}$yRpFk?ukM^&atUlmXjqu(vQ?{?4pwYvd#P%{@bmk3hHsxgGce)PEX2e1 za(id=>)iqZ6IQQUb@pKKDi)yTGr+_b1JeUH0O%y;w{PD%B5N*=aXI;wTW;SAo1`VD zU9(LdDVqL?@(?%v_2WkY%n+9I=g))v&(6+n+tD|*2&OqJ*!swqFJBIeMJ_3O!Ng?z z0;u@z>C+5{B>yo)_$e9BTY9%)-LL44*%LR^k#6(`J!276NIG_b@mB)O>{9 zDEywJz00g%Z#6Y`1#u|_Gi|AVf`SZ>zcVlx>4{5SK6OW)k&}~?K}bj__QJKhRepZH z(=MMq{^9rU-$(xb{d=ETLW_aNGeGjxu3s&WzcalHkQ&=VmLl$+u7gGuS@`m z%K@Dq#>U2$42(ucAYTuNwSZU+h?PL{Kr9KwqP)>d&g&ff|DQKz**Pwk>UdBXf>I7Y z5OV=BBP0Pb{6nJuK{F$m%@#O&0x;nkGyeZO;n&8Dr64hY00RKCZ!ima3Eleu0000< KMNUMnLSTZr2v&Fi literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..85cdafcb3a592020483a5b428dbf2ec45b370886 GIT binary patch literal 745 zcmV%MjF)f*BTMGt&A=RDlc^PKbWy@=;|_@5vVLU0(X4IiwVe88?t2;Ayu z8lXK1kP!#yqIrIl9Kf*kFFHxEvAf&891OyQ)0sm9jFSHf2gk;MQ79k=AZLUp{DG^) zx`E*l4A*UhC;R)~tpMENgaW=ThKRF0)qQ;ye{(ar1^hxBV!&n-0fHbv7^oB+$Mp;~ zHMQ7!dmDno!<)ilf!UgxwGByvOeT}yy|GvU7N;2o&Z@KrjI)dH;n~xh z5J`W947JuM4F`3T^O3iqVPzvuu4J;sMTP~GiDKU`1j!; zNp(Pi8Wd-yEl?GIi6kxwR$fY{)35Q0)(i-ov?895z8UxX@!pR;hI4mClZtl3XBh#h bp8^a3|8GU~=h}S>00000NkvXXu0mjfOGH;Y literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..e122e13886a83ef6fe40ab68980978aac12a3f94 GIT binary patch literal 613 zcmV-r0-F7aP)nRLxKK?`QbK&d%_Gfr0H0$P0M%*#L1qQ1f1(W=~|zM^~*n@r{9@;UCC=TQ~v{ zC_2G$#R}uQk&!GoH17ll;uBX_um&b3CI(P|!oa_O|0e8+h$wKKJUQU$o;_GKgAI7* z;sRl?urM$)Gs85ieE9Hz>qlJA`fo9M4EiA<#`{*SIt`4C&Hs@!bAl{JcREzFQ*Lop zp`n6+#mOa?)*oN9=4@zKm?_Zap#Ko>G4KO12YMhPYud&7ufx&CcfRrksF?E*Z`Sa(X&{vXH zROf+dj`uJ)@bl--V?Zz6v;6#-;S*4Ed|aF{dU!2dw1|O`larG{NJuF5!nM0qety2w zE}uRA;rH*~NB;i(dmrd61|^_E2L^_ja!?l_gGWFYfFfQF=zI%cuH*%3x(CE>K|z9s zf1}ZVVEK#@8Y7^9WrW7iKP37eRN+5d7$Cp^g3u1+#LX@@00000NkvXXu0mjf=oui4 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..87cbb3519e05e1fe480aa4532e0a117bb0b08aa2 GIT binary patch literal 725 zcmV;`0xJE9P)nRLxKK?`QbK&d%_Gfr0H0$P0M%*#L1qQ1f1(W=~|zM^~*n@r{9@;UCC=TQ~v{ zC_2G$#R}uQk&!IeGz%~??&JWfV_fX&3f92H#KZs!P#F04?_Z4Yu3ZJLlP4QL-LnTp zvzVCJPLtQK8J>e&@XW;p5*;io49v{TFwH6-K78Q%5!bW+TZ|rqen^P%zE!JE17l!Mg+AMl!ip^*ib<~^5R-4Wtpd%3+c`t=I|feGJNttt=-WZeGk+c%Gn{rj8Tm6iJ= z|Nq|sH{j2oKgypzeR3=)tA%SWj&V5&G;qJJ=Z`xIo{W#bePt+H>#y&nt*u@6;m41S zVGInHSk9k65B5JhJG*U1-_#{QSo-ZQ<7c$Dm>;7$Cp^R1__|-pe4X00000NkvXX Hu0mjf#vxtL literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/pipette_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/pipette_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..8208f3d5f15854857f816214d669f064b47d6e35 GIT binary patch literal 692 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 RW2OKA002ovPDHLkV1j-aY?}Z8 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plug_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/plug_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..5cad9009fe942aa145c58aa627632167f85e28f9 GIT binary patch literal 804 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 B;L892 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plus_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/plus_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..ae80e5404787e993342bbdd10b4232372589c88c GIT binary patch literal 694 zcmV;n0!jUeP)hS!i@8iLi}l$PYxT?MbhF$4^l%bP+AOqpp@NuvDU;v1 zw{lmPK~jiM!1As5ovM|V)M}wxdU^6{$8>p|i-^;NN=8h#nm0Cd-WC=>9&) zvdp3HH^B3~EOO>601^@~eG_`U9^hP6AwA_6}%pf22JUTtP+(ZQx<>q^2K5CzByy$%>RYmUuWk%5d>FI z*+im}R62ziR5*#|Gb7EyK zCjQO+9Nkavdrb3#hx2~l`JU(f{WPtut@IG3NFU)|o`-dRvkP!@~D)E|;0!Rz(91_lQD7Z(>l)6rLg!vDnL;$rs7 za?dB)to6+tc#KYyMco7)F%;p@V46V`DaOEOJD$dT%M(O?{Aud`h77nGR zrKQDYwOYG+yuBC~T}T=PWEu33^)fcoLiie-z_5Q5*UP)gMNy2CNPtBI%EgeEmsi`+ zaKY9ycL$0-hRn=Ngu`JxH}|QCL?V!786jE04c|S~*Vo%jCQ~hQ1bpLqI_b~Ifj^V-?j zQEm3_o^gZjspm$c0pA4|>T;_}naculFt`O*WEzGiU#f7+S*!7L%~tJ zIFy>2nx)g}tQO13%I@x4O%)aA3lBUrjE{er@9TT;*5jETqrnId{jUH602Ky@`)tmm(f|Me07*qoM6N<$ Ef-r5EI{*Lx literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plus_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/plus_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0df77cd87f024d71e950c8ddd01ab8a0c582a6 GIT binary patch literal 758 zcmV(y<3;A2ul{mxHEBQVxkK~Au&cJ@dFf%5(_36u!WX( zDAVb*(|O+a+G!i&O-|?a-Fwcv@5~*>IR|?jgbYq_Fu+MqhST(Wzns7{<Kj)X1nj4(quK^UOZ9z?nahI#_w_Havg`*6=- zl=dFVT)AeZ!huWDOT6vcg{kS6pI%KeFgDaX7&_k8(~(N0WV$cd+odqYwYvG`5ef0} z$XMUv>eBa`fXOYt;`3iWHx(70c`DPF-`_;DrzvzbG8vMdIhZ9l^&RL3 z*#lEet8V-!3Wb7%9qtCVDL8cfrV`FmzmSvSqb2!i(Xf}zH zt`o3!bv96PMrt%n%IqJ1HD0vt=*{Jb!B8pk|J-$t9we50)1D@5@)R@ zP_UM>Ni`EV88ldkc|->?SveK$HABrp(J<6}hF<4#ZIDV(dC{6rZp63UjpU;r5>p+aC$>$D#?2o|3J>KEQ&XU7o{hvq6$99PtaD7$XG1jxc;C0Sb zm|$`+7=0aKY9{Ikqm|!twkT2WXj6wW;BS>4f74R>JN0iVU0gwm-NlNvg)K{(Z3~F2 z_$0^!bm9v7aLaT4*cl;Ud_4S#7@lAU3rKJ=Q5qpfT+0>^4T;m*2o18gMtCrRJM`%? oEMgW}81`Ti_6SMhn*RhC0OM6NA);605dZ)H07*qoM6N<$f(Ou67XSbN literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/plus_small.png b/interface/ispconfig/interface/themes/default/icons/x16/plus_small.png new file mode 100644 index 0000000000000000000000000000000000000000..58219c319b002bc7b03ff65fa0b50f52fee1e73f GIT binary patch literal 296 zcmV+@0oVSCP)Zp|hXC;<5w7-=BYffW(RO!jFGT-aq|( z^PdpQ7Y+^%hCjkAU%ov5aT6p?R4f1kYulgu-xxmJ{u(34pbUux7RDtEVr<*68NfK2 elqoj=Aiw~@;(S`r`Z`_!0000=(v literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer.png b/interface/ispconfig/interface/themes/default/icons/x16/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..a8a9098f5656702c18e523816308f70daa090341 GIT binary patch literal 736 zcmV<60w4W}P)VTVBwc<{1Qhay6vTY(VNwTmZ3v<=kdl5}hC zo7=a2+qd;RZ)r11df>dQ=@e^?2C3^MaK2itg6iOQyWw&M~X`0?ZAP_9mwdH9r zg+iI8uaaF24u|suWVu7syu0}tK3^!vT$QYP$nxM%a)C}&saX5x5V>ab*(f^Cn1jq^ z0lUM|Lp{+|#3v98ULprA5|Y|zzxRPaKh;FVp1EqJQn57}61uuHvbQJjzrkF|<#Nr^ z6?r&OEEbhaCiCF-bKv@Api@fY<;Nt7-!7m}JC7F+<+~el#0|V&r`EJqwKX{sLS(Y>A?(VB9JtmGH0t^7F@?OdL SI-#8a00001KIqEP)m|b1H&b~nimlG-E|QgJWZ3k3>=IwcG8QeV*qJL33p= zpslT~cYJ)@ABjXZlF8%>FUzvs>2x*|8N0i?Fq_TVnx{sJVg@XKaBu)R2b;|Xi^Yt! zwJ>UGgl5KN0uGnU&Y_4NMD- z7#Zoqo7ZN1vZh-YmkAh*MibRUqwo*H?QSOrDhY8K=|i>w`5K3|-`gW z?CkK~-kvTVkKexf47k_AVK6i{vL+@3pYP7UZlPRv;j+3M kwnJxps8{iv<$ee-02~N&G$oz`=Kufz07*qoM6N<$f@H&W!TLzmJXYPY1rG_!>Y%F8bNTrU0ggo2?W0L z;V{z2$KVns|=~|FfCt>89b~;fFNz6BgulyIn^Znw*?`8I4AJ^?JP|pXd2YkW?uYu-Rv$L}u3T(9XbjAsN~O@<>PKf=5`5NzjSUZ! zN_9Qs%BV5a*4A3XR1}Ix6AqtK^?8!3h9GDpIBaRy9X&AARHMGpft8*am`qj+6JnQt*jHqAZu=P+6&_6ao@Tt-E^x)oin=8m0;%c$mMd#X0z`4bbNe{ z-e1caMtCQg1Vd_L141j$yGpf9O&~W{uJ-n7v|;VAXD|=3SPZL?2+m59_Ihb4@ndiA zlbBAUw7m_Hk$-M(!qj!N^!J0w34#F6AB!fn)7RJMwj;|jmXk?SUtWfpO1a`pfN?ZR zsIwCjU1B7H(_(gJrfYO`^d4<@32%j-o*o}zWO8zH+Axekzu)iL7e(3T~Xf*m+*Y#DgTrT?qfj|e5vA@3$uh;9YB^sn*WWn;qVi8mapU($H@nU^Ff`$gU zgK?QaYcLoLr)empNCFDBw!WfJFb}Vhrh=LpfkY~9jcM9wY-|oQE^k>@puN34l&5P; z(O}Z)JWXFDyD}undkj2Z>(;y*eg#zxhZt8RtA4WF`J0@kQ$;G4|2srhGw@;nb!V(j z#$^H?Nou5?=qj`kghCg|L6wBKLy|QA9L;In-49zuc%Mzfru}vO+a0k`DAd?Chx&S% z?CrTY8JBlrxTR@-<>Lzr=Qu@C9?%u}St66k2#G}E@!glejY~is7sdR?Ib3+NhL((h z^QwX`D=Xi5o_D9a1FW)@H5_CJ4-Gx4o(TG>T$CNBTBeoN9Mm)JVWXb5Hq@%>ZTkL0 pr+tZZdcxY>T`1De#Nw9#0{{ZrXX;i$E~fwh002ovPDHLkV1lW`T&Dm4 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/printer__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..ce151474ed36ecf95dc1a4407f0adcddd672e4ad GIT binary patch literal 827 zcmV-B1H}A^P)PS8p+Ho+P!L40i=61iA}d-DLA9%hps2tWWCfw1H(q%WK`4|#5rW`lc%u-rQa9UA z+F)+}?EnAkJs&9(qZb~|ciwZJ=REIwzQYYqPvamsj_aqvfPcqAKA(3JjwJa)p-?k)7K)rX>)V4hA`l8I9^2}kq(_sC)($E{s=@@G8xQf zbH~WYh{f%8uZKb*C!ft`b$Y$Nfymg~+k;Z66vs3*G7^b`L`+OuIiwB3m9H8gyXkX0R7J{brE zM0G*nA(tzT;Z$7`ZD#tRX1ZXv+fm!yS@Bh?4e=x(lglemUQSnG8Gy;uL=FTJ;to%i z=2u`)I$^b5#rXIe^qqSQmA0MwG$rE`i9|^*$DyoDK_vu56i1ahh^CrVBHJ)JIt73D zG}?&Ff^j*ON_B^>NXHWU`}>1c}X1c zMbX3BW+UsCk)gh~_nuG`i=UqeLTpW#o$3*OuFnfus*UYA*w46!h01DbP--w-qW|A? zkc%xZzqok5%=s-^{lyzsd&Ji#k@z!#z}pl(CKi7L7y!LxdS7vxGW!4k002ovPDHLk FV1lMXb;$q# literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/printer__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/printer__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..33093aa75113a4bb729d0c3e8e99a01637f4bb14 GIT binary patch literal 788 zcmV+v1MB>WP)ARbIOa3Rr?2__u8X+nb0qaNfyAQfz5 zp;92Ywg27z>~{TTMFNO^$;-@sJMYc=zM0`hW@hjwIF7qUgByp(dsS5L^$Cgb0T$H9$X7{{7KKWs;&i!O%|u2jm4el3)yEPwGLy-I<%`84XdN652W&PgLZL9s zX0e%ZnLwk*GH;) zP$(1(io&73UZfJXbsUV1GcmMZKc~+nMS{1xNuRH7hL3YLo9!MQk&`9T=`4*aKhaHty@6o#lqI_N1`sWffejw@b~mQ&<+GWDjgM7)y_V@ zsClBNG>n=Tb~xg0p~j{r)Vkd_>HhovbqkAu*o~@~cUFz+96ncv@KM1p0R{lbiE=MJ S3glS;0000p=cq)|&qvp%y^095(8BNnXHbRI` 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 X=2m-k#|jXH00000NkvXXu0mjfd literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/puzzle__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3f9836e8681be78d2b0fa53b5061c1a0abade7 GIT binary patch literal 811 zcmV+`1JwM9P)l@KB!F(v{B4`RH)(UYF>h@42&s3*nWgv7+?K`lrRB$Cj2Ffm#ZCAO79 z#Zt=dw)^il+n*STvw1r^Z{B|2%$sj4&j8r4v&{^9F*D==Ea;`-RYI7sN|=Iyxth-M zzW^HH;`0#ud~>De(pg1Oz;PTN#2&vTuD_<^4B#G#BmV{`uXz6$c_LHr>F6`!%j;vCf|LG?ioHl7>O>;CTVJtMXv|gpiC1a zuC+qQ)+RgPSv%=$OSW@ywwI>hUY{Tc2)cs4O<{AQDoqf^EaUVpRhcwpe0tp%A38l4 zDVNKXz%U`pvI&>V1-IJ`UDxqy@ihx@n2Qa#pjHDcoOc7Nf$i;W6pO|Bs;pKkq>@lr zT9{3-@xjg`txRW{80&YkqpCDU(l^V-T(32j`OBw7rX&it+0x@5Vxw@_6L4_gi0CC# zu2s&?m^3?0gRIC9MG>V^2@aV7rm7zw~&L!Wc1ue*OB&=A;{U0dx6`Wtxfh ztqB7vUn*>+v!(|P&7oF4FQzm_>*Q$PtUM#KB=L!*#iZTq@cG(wnOI0u;-VMVxHM>#-2-kUunu^vuWaQ=w+Jm*5KBpa>DN6j&nNgX`-`9umcmz>NOg5R9_rY&#X$=J=`+}8RE p#OUv1h$2X5ED# zvKq8LSj$F9O^iQn{COaPtZ7Xp zf#t!ZrE6NK3+$?t4dCqT{N1^pxh{B;Z)VPS&pr2^@0^kTkfd!(fP=|~hO<2l4bR*6 z+(mb=95)HVBSc3U+};+A<>>T75&)|wni;9uQzv2 zRV%-o-2c6H{r7JCxnd16;VRg+Eug9@!r?GH&%?ukM=9FBL4MF0@|DJjDZ{eDeUs(# zYwcc_cIcY}xYFN+SJkUgtkhr?3p0by`ZE5hiN=lfq6A;Wc{NAXAo^ksm{ z-i%)_{{rmc#tLe`nd4~$PZGnOSs%R&{KYL-RU zEniF1DiZRkLdF*|h;7Q-%;;F{+gxs(_~V|*niqXm70=&)_0pZQFZuNn$DB9CPeU6c zweSa-U`-frxb0n)k#wFc{2a@uDN7}|sw?UyOObP{g)yVBrQv@AT*B lMP~j2JmdXMue$dF3;;=&gnoA^PE`N^002ovPDHLkV1hB3yjlPN literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/puzzle__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/puzzle__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a3efba69da632a95d48795a79347c5db762ac6c3 GIT binary patch literal 844 zcmV-S1GD^zP)&diBHGsl2%F7#QsJl6nDXg4jgF##siME94wy z>=vxAo^Uvf&mYx7)6mC6>AClBMiC6C2+H0VkBU(tMk9;)Z;Hr_F<7<*!!XcnHW3U3 zp=))MZ11&WX2<{nejE$kI(G2HaH1ozvGlXJJK5P4cU-o_+*||V07?1ZS`%$#3mD$CDT{TTP5e&ulrnV$@_w5o>@t$9LUbO4S z;Xpb6ZK0=JDlL-!n%iQB)@|=fS6+Odck0${(J$$kz0}+m8tm+WSY(1(FqXLG-j$KH zr`JA?Ei{tN5}dH(_1#{UmA9By?4MO_(ZuE)QqNdnWUWp@3XfZ9)EuxdL-b^-m&``n z=A+&{LeeTU;&Z}G3zkBH7ec4^*H<=QyHf~wZV}&F1;*r`eV9akwE&)XzlaU`E5HB= WnrV)5BE`Z00000ilB{^So=R%2-f-shzJ%I*Qub@B_14VVxw>-g}6jHl{4bEX6Ets zScDAxc6Mgx{oZ`7gfIz(LL?Xr5{~1DPNyRxu>o!Y=v)EXfRXS~=J9w)JRTPxAe+sG zsMTu0bce&?Ip{wCRi#pKiwQU+xR%rDL`lx)GsSc|m4kbUTJY_5JF?ww2}k}TNP+?T z{r;g=t9=01JJe`1KP8b}AG};HK~NTf1YxmQ_F%4!M&m2b^LH$c2X#*gX0sX5>-7SM zC6!7&gWigG@qHTz1b%_Wz)L=#x6&r!1Jjw$=R~8?2nW_!vxq=C7!0hfRtrlZUa$8B z%XlL|IUbK>y@|)v618PZEiQ$e; zZ8qBwh`uG0$?s_6t(ZEF4;lP^Kd(?IoGO*dABjYcK;p#S$zYbap332HXv^htUmOm{ zOFEr?Y&M(ra=H9zu~;Y#2E#5IjZQL|Oq*q7pgn;48~uJC=WHn! zi=S7k)eo#2NL*k$eLmlBuwMc1;r0v7pwsD$pccB@X0w@?OeWey@LfRjtOq=pH>|l7 za4{K=$As&4yYgPIrvzwWR5~0drWuRH#-Lq{z{PAiTO=jMH5v^aHcAD+5h*bMmgK9| xYNh`(%>5@DolC3L-iTLzGMOyl-+25dzyNUWM$K00+amw~002ovPDHLkV1oaTJOcm# literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/question.png b/interface/ispconfig/interface/themes/default/icons/x16/question.png new file mode 100644 index 0000000000000000000000000000000000000000..370fdde8e779004f52924dfbfbe1a48900b34ce5 GIT binary patch literal 760 zcmViUIisOh%a zs<|I?W}G>5rgO#_Kd!pyg=fy!^E~H0=beKr%Yy$2(f)M32S6SGkHAJK0tgMT&UuEI z!&_$<2g_naYXhjs8VV#cuy1fA`lV{|-np}}M0@;1M6U5kJi&5h4=?^GT>U=n!%fJ-}>-~>z4Rm!|l*$_30}dx@+fRjR<1NAHyRq5&Kf4%Q6UV@cNPb~xu>W*- zxm1x&lfv!Z1{-cXdA$kqE1KMQt+jjff^G32Wnkbjba;2hxs;ZEl z$iuTYvoP{0XH(jm1yB?WnySi)crd{=2N_rUo9*SNZ#O}#k`J=8kchbE(7+_Q?Hv^>h9C>R z8W0@f;KNnB^+|zawbnHqbIs8V#@BvsUuldr%Y;?Hjn6ORcH8&h_c4P)Zl%CAyzf+j zjIL#uv+Ux*1-#DL~?jE6I+RL0N^?DfkaGV~6u+7O+w zzGvXYZ|Mxt@G#eKDdLX_Aq2?R%C@?6-79t6k9H*6!mVdQQbVwslko12y16vFonM&B z8hGJ37^x4Iz67?`G2nL*VrT@<$q0CQE&^)mWRB7OLl}9me$4=#NCREr7gAu@Vp`%F q@S{i$#DBbC_7p+ki7_qxE5HC13pt6LfE5P-00009{MBLOEIgs6fYtR>v~v3*u!4D=s^(=3VLW^siq>hdRSa3 zl#Nyz4K;sN$=1|lYyKx`l9^2Q{YI=i@XYu7Jn#FxKZdcfF&GR67>!1KBy1<_0nkRU z;Nw>yBV2HW&HH)WpO+Dh6(N`!TPKeWA0kh=NF-9G z`!Pa|bGcm1l`ls}M?G%0`}_0Pk_fGBf!X3fTbms%E!$AmBrHWLc=9ZT<40Tr9LLp2 zWSxod^cH(pSJzhu4}RnMgsBcqqh!CO-=p05UARtNefISGg7G>^7%XhktC8S1$&%U#NskSu_|&!4P3o|!T$DE zpU?N4uhnYp9UVLRrvHpXlI%z%KIj%-L=-G6mGJdI8ata3@cVOk`YeZbhaE4XD)x;# z`WV+pKU<+7-7VlFM>R5m0>|;#y#t6BRU%q8 z12=x|oj#hSZJ(<}t75kUlzJwl7MS(5Xmlmize_|un?a+c2`2Ma9rHH^bbMMfC>0rf zP7~g|c^hI}Ch&4*X4-pbs0B824rMt7vC#^l!MbUb%^51CG+He(+=ETHchBo(T+VK{ z%b84CAg3CBJn8Oz^j8q?6KRNMD{jukaqB^r+!gTeY5>hb0+-JAVQy~rj?cH?r2_PG ztRYA#9tEako?|J zs)0N-vN(yN*epqs+vV!rd;0Xb!-IqSy8qW`SX})3^_43Z{|JX)J(Xqoaivm8({`B& za0Hek7HUZl1RHfeo=Se5qW)S@lq{`_1Xgj`{{$EStnrWb0@01<00000 LNkvXXu0mjf8Q80L literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/question_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/question_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3a779aff8b1b92e3efd08e5669c0a96e99b1e GIT binary patch literal 806 zcmV+>1KIqEP)0!j!3R7i-5pF~YGCL|i;(uFZGxOG7=aicM=#GS5KpvIjG7LpLfpa#K)AQXj4 zk(QQzpg-D~=Y7+!H#wO*@7{CXedj%aF@~a+_eh5d2qHlu2o1FGBvTjwV@@yyVAKOq zTTIQK&t!$c8<=V$3|;KAw{q~DU`~_&kBk5tAq-MtBOIc}rzbmXZS}SaOP$qZ>FM0p zPHWG!n%2X6IR_|8^A+>0>z!vuM!)t7f`IPh^;Ua>+2(fpwesPERrSTPAWuv#y`U50 z@`dK6(Rb6|@&c-&735TUd2_P-iK_l{2-lRxwO`Nl#=bF{FqSFPI<|jz$wn3SCxUb|Hn& zGg0&$^}|--fx{8RqB8_ZlwdMd><}lEH&ID#Y;VP4+SMou{DBbGy?z|n%W&gdIexm5 zcsm}2DCxk2B80<P}o z#91jc(cxb4hK!YVBC5z5ap}I+gJMH@&P-XB5Du(|h%=WLP?A%=bzcDNNW9oks^>Ss znHyt@}HAYpNTMnR%0E{=4t@)c9H~v^fpo?*k|w|FGl|G;T(KAEiWtP)l!N z-)W%vT1`_|BNte6OwI#8UIWWxV5>W{6d^>3t7ZlGJe35#qdtA|auT{az^4S>JO+Y^ kj3r!vzX2a{Q~v}Q0Qdzak6iki{5l|UqP+0`_Yc``U%&GF{P~Yz zS&JOQl%+Qq-oIny0f`f30K@MePhUL$`jwqsm~Ya`*9>Q_b1?k=_5UkKoVZx{^JB%8 zGgoi?|I7NRtJsi%=|9h>2RClt0ErXlg8%<_etr3n@!XEP(ZaF}@<5S?z*t$z$Rn~7 jn*ofYNttp300ImE0Q7^ft0V+S00000NkvXXu0mjfn$DN+ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb74c0fa3f18bdae12892258175df3f4f2d73fe GIT binary patch literal 428 zcmV;d0aN~oP)usocW{AS6T)8u$iMCrye}@DV7rn{*KpLKFyDQ4oIIIXez9wq;*nrPca8 zvvad|CkB%VA%qZTT#h)OIJ<`W7RT`;dT#rDl3Hs*Dy15OUT^5SZr4=7+x8?IUynxg z6X$o1^T6s<73`93#^VeA9AbU%IAldpl;WD3x5{N9r6lHy>_00C!*l@wWpF@@W%-Ff zSa6^W4lqJkbP)b33hW*!RV~0HFux!W1bG3|88FWLN&(t6g5C(^&mj1R1B>yX=pZYA zD>R(}aHD|QF@h>};QN2RM&QiP3CP)WN}lH-C0c8?o$ORrfrAG=`qHS?>vY`dT)z8$ ze9&%Ry)2id6*zd{Zysh$u!B`&ztuXGwte`$Sj_gC&6BFCSF6vj`TUuCURmH{Ex-VR W-Wk{FABFS)0000}M{P)0E{ATRtzcfoIjiHsoI|NQ-n+W?>!fa=i<`1K3b0DNHpln1KEX#fKu zFZ_cT!0?IJ2o#tMe}4XCVEILY3uYbv!tg{ivivU-=f__^ek}R+^D_ez$N(s21Vtez z3~=F_FTOKGcq_^RH5UNWOAOcx=q^C_!t^5_8ScJ;1oYEKj~M>5{$z;oQ!<{n^m4&} zpjwt+K!4zi##;=W43@6S47WZ5Z8One02y`cEdzsFkgoCi1xE^4POV+bpzh)V$rnI^ zlbf62%a<<rajC0YGI4VY z{&?`<6o-O>88({PB(38=yQIY5Cue8;J-=ucP~TgC00RJh8%q$mhz2VF00008Yeq2FkoW1)*z%D z#opa}cmD6vmbTjd$(Qf$z5jjh`~Uy3`FtKK7-J8KE)doT**)X^)*CEl*Ayrj>i=9(siXzlxSSgH03&N(Qb zwXbQy^IAVjK=yF}+H21b1-vc?vX28*g4gZ9J5^-rb|GbN0V;v=y98XfQ=o@~n)Lzo z!%a*kj;D6)8;k!FK(7)4-@!?B3zsGyW9-M9iQCD|C@t5+#=0cXK+8clYQMiAZk)%U zt|6VCOi3U21y!ohA)rR6de8yk!mg}iXm|`yo_)mV#ako3WRIkPM)=o(Dxn>YMiqg+c-1j}?o=FJGhE?|GqsE~#G zj2Bl|QLR=LxN2X_Fv7>A_~hUlJ&p$pBWJsYRPijRKg5!H8UFBbP!PU0O%%%@!9@}y zlT5&biHV6O!Ul^88;PUtsEKi4@_&%Qfgd4ZVA7e{kT?)n%3?7ZWiSp-YpzC@dmrm!~?RL`5Q{JS8 zz+9C|6SC8rOy(BZ!O2i1T$jsd_?VxZahj&taRZBq)yY_v1AEukwt)F_1d1|C;C2TX$9zWuSk{6uBCz*6^*V6M zKNN5nSH=ns3I*_q;w%A;(CrQ=P6S7l3T$+{K$(9OENbC7n+2)aw7!E>r*q+vq!TK} zfj@DIEH5472NoYkqoYkYyoD-E|mA`!T2wXFI# zL3mvm4tv&}paSdAQ7kY|Q-agh44oNn`j|i-VLVGOF`@Ti7 ru^J5SI(b8qzJ`MENMaD5KLQK@)#e=84Mb_800000NkvXXu0mjft$5p& literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..445b27d447d48e1ee94c51df0c8cfcf13b4476e0 GIT binary patch literal 633 zcmV-<0*3vGP)&+pIoJ#KSG=X~(+p6`3#=Xsy^J0Ir{1b`ODaV;1s5kW+=P26RSeS+NL4Z{F} zuInzp&o>f{Mw{&-)#W(^?)lhQUhL89uC8HJ2djlH;pO=FWBeS+p9z|#74im>N!4oc zJP%mU6`u*3sungRpxZbA%oW#P4+cR{|8bz(IG_>KoP&Gx{UV97Po3+qCIP}xw-uZ$rGGe|1MV4)Uqa-e2=YF{Dt%Hx# z3-CQ%H>)_aVb=`-qLKvs^5i6>QYivY)KZ7Tylslv^WgZrb88$ml) zSxrp??{HK|o14oeZnu}BCW>Q;6VCP+M&jBY0F6S{qb|S;S7U5w9W`kG=h7*F=rk z6+d|UW@o;6^BprRwXp$ijImLoX2L#UB!F)n$JxWD3ASy6!?LVUYHVypRn?Io=6=OJ z9BgiFttggQjK`Nr9ezepBDuakNyC-moM@V6Y2BvHT-DD6K>+!)?{lJQ7^NRBUgUw~2||1tqx|0xhu16n74Ujh7;g6#?5Tsd~@ z0mFf)|09CwvuSLFcV^$j*A5a$;Khc(1wO%e3waIvkbTNwVraaDPVR!{b?a9Il~PD% z=aI{+?mfs`c|dc0PT=5F)HUtTHsN#0%Tb(ahu$Z%YzHAkWmJ8GkfYC36ETtNH5@S$UvZa?M`@zg$*Wi!p=|g}40Mw^B Uo{f|QMgRZ+07*qoM6N<$f;2bf`Tzg` literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt_shred.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt_shred.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc0d8b7a025baea7327f51fa2cccb16c175814b GIT binary patch literal 526 zcmV+p0`dKcP)ieQKwpdZlol#TUvhH#?!D*q zw67Hsxg5h11mS|{gz!j+xNv{DT;`#+GT?3rs7LdE3`7{%fLK;l2}avM zov#emFbx)TVL{*&f1oHG42~>;&1RkYn6ouI26&;BX0w68zAS$_8Flns4REKoa=DGj zB=~SL>gewp%;(I)?0Y&@zhrq1!E341aWd-YW6su?1~17Z>q!!uOeWG(vG`0Z;(O?H zy9+0yZuKS1LuVc%OlpOK&le0zy;dvl_4!V!jYe%a7@BZ5Ldp8hMq0Bdc_`Pi~F QApigX07*qoM6N<$g4dhsdH?_b literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipt_text.png b/interface/ispconfig/interface/themes/default/icons/x16/receipt_text.png new file mode 100644 index 0000000000000000000000000000000000000000..b761ae03279b992a73c0a0112acd76bfff816cf3 GIT binary patch literal 500 zcmVeL7?|`AxEUq}7E%UcLX3lH2*LEb-utwrZQ9=C z<@UaF?z!i^SFS%E0|m!%mzYj)z2fR*lU7+PSPNm=N4(9WDCo2=r z?_q=QhC}#|t4Bq7Ms-LFbP4yP(KUV!sD4ru$l10X;4U`%%1OcVJRqM7@8xXE3JMZ< zo6Xp_D2kx#I-FOldp6=>J`=EF4rEylz*4CMPRJ1*!HPSu_KKW?0;;OA>6)goO*Q1E zRj&i`V*;ib5s)N_6~$sPVwGybk)JBS?qIoGMjB~41vxk^mm$n&0%nQ>KaTMp{2<(n zI|vKV6Z#JPbBl$--XY?d0yN>Q(TF$*ze2JD!-zbilkp=Fj{JxKKb=fqv)Rz%sWmSM zY*JDtoOr~iz98~=yHdM-^JN&`QL}mbvE3$S!ih)xzaP^BvO`tnuvWX^1wqtTtLcF( qx6-n^+i5?G#XI(_QQ-SmfB^uB>?JH;OAwF%0000-BW-zr6wwyn|sx2 zbv-WgI`4BRIv4;8ABzE|hn32nkGYw-E|t>T2Y?Oegu1Cz>Qo4^^4@CE{lf#f=``iD z*|0~#wn<89@wfe-?oO#xy1cuir9y$;Jdacmguy0K2n#{ZKqXFhZDB#zC7LKicuE*_ zyIpPIKt-!lp3=i>xUQ=K?RNX;8KI(e{JudnxNhSZbH(CT zI+M}aNhay(@zJ?DI*Qyu%q4PtcYpu*y;i%OU0p4IH5%8`%gg1!^FF+nmz)EY5MXMW zx+9~b=kDn+a literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..da10cf5f55804e9be962dc13935f43608712b31b GIT binary patch literal 658 zcmV;D0&V??P)U~kMDfm%s$~!sRV)`c;>pUXS8rXiS8`=MT|{!ddwZ5 ze=9;@k%)-K9S0o7dh^rM^OZ_vBFs~s&dJcZNB}7uOmf`5&gbVH+y_0yZN|LgZGlO| z@o}Tk=%Qs=w`%n|>}ndQ@i<&eB>WnZD1vR<0)308;XcXba$hz#;d&|se+&Z{=e`k% zZCL^u$ZeD`-0@7ti`!U)q4~E&f>x{L5y*(*#W*Q*{$ERuaXk@VK$5`n1rUQ`RFQ=U zP*W|W3<^ki)+fM^e*%F+LEKJ(2o`EKn@0lHu>e)K!vqkQu0Z)$8yvpY0H!XnaDp%a z!nIJK3rD&0^AK*2o`>=$4Rm#Q1g8fwq8tgFLh$^371qA>!0g90P2r6`sf)q28%e0_ zTo`p@>VuO#2x;OrkHOf~Fzo8kXW+zXW}goM?%cb1?#;r|L%Gpt_yUA!;7_Bfs_zrE z@9^U3@(%{FU%F|+&{#U%dpQZkxp%AB;DWePF2g~!D$9`wT*+o<;)-&@KfXT%s`heD zUoK`uyrS8kgb&Y3t98RDxSSWMll^A~2eYE8_L%$oE6TvYh`G17uB1{|+k0*pzxA!H srRd#-8GI{gd^3fZq7;?xZul#}0O56pLf~zGcmMzZ07*qoM6N<$g4w+|ApigX literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..4c45ca6397599fc0fd2ad0d88907a5ab805c27b2 GIT binary patch literal 677 zcmV;W0$TlvP)Ny&|8O4{i^Y#yTey}^-&K?iDTOm z334B081B;IqNqF6#3co%Bm&E_1c6K_qULjF-~VSMJzQZD7(^nl0|Ua~HQv!3V!(%L z6XoyvbC`{{7&*Iy#DzNn0izF*2!kGKSmL~{0kioY(+dR=U9SVvG$j&bLJ@s<_b_G{ zS2jLCPo0ByMnP1cK&P=WoPZk)%Jm&6#ycd&XK?HGOT^VI$#`w<9I!S zK{bDFATg@ZRUD#JD#1McMptHFO4(efmdgV(2;KExc{u+53S)8IsUKJIrg9%g);2m` z-N;UEXROBIJmVN7VK723jt{OMz4jOQ_8#SXipq{~BmV?Z`4r;`GkS4WQrDkK6O3aV z)a$aWD7c)VzizV8- zyH$N|F5BMO`K+hYSMFZ=banc?oMlqi)nuosDlo%0L~m^Kj{pMzzrVc5WDx3R00000 LNkvXXu0mjfQeZSi literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..621a264ea9ce63c46962c70219d8959400de9c47 GIT binary patch literal 597 zcmV-b0;>IqP))B=a+4wrJyI%Hq;LhDQ3^zXgd(M|jRbPXK?x`a zKJR@vZ`StaxEw2u=l1RB&2PtReA(M0!!T3~heH*-u-`zMMLvMGp3FGAM&1_`TWlf_ zQ5aGf1atMx&E0mpy`Gl&oa;?gxP?pBQWaN8{#lxdSQX z>fOTwojVR$`8>UtnbAEmLXhwK27imEaKF}SwUbVV-j+&q>$(&~kq##Dr8E#^PEgWt z*D4jI`)Cp%^esU!7z`AF2^6J8>>Ne^jbx0gOte8JLsA<6gEj6Lq!{o}B`D(t8PsY5 zeEc(r6~%Fr23a)nJa1$m#|GTpPcr~6Um;Ex#s~xx@J3A*2FYMu!e9!2B@=RHt>5n( z_VF>9Kp9=(2?E9yJ3F-BYB|M~m7>$>I19F2eBbSUvOMqQ;~At3k@d@?qq~n=TSX<5 z%cE@D^WPhdcP3D@0pq!NG?r!QtPG~7yWbj(T+$rR_?I|sHtG86$~3cCdR47{&KC-g zGV85!xp_!bIY;zkfhYKZC%O1+dATYq>-l}JcUo9ldUJnq@w-qey`JnN*S-03cJ>ps jy>0v~j0y6HzXA*Z(T;u9Do6JT00000NkvXXu0mjfWCaAc literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..d6695dc62fba9b630f0b665bf5e8c52a65bc25ee GIT binary patch literal 693 zcmV;m0!safP)l?8#K%hFqOD*t1ySrqw-uLmRWueCYQ+aMiBPeN zTGA#{Fxrew=5?>RScr%smIan+?oLFblbK8=+{jsHe)Q+Y27Jloz}?aU{2-}#sA@s#A30x*(~&QcES%;1(Oh4 zjKt7&0R?gmr4jDQK!Dc`9AcvEzeEB}(>Q^QD7;2kG9mvQNfnoe*a4CRItBz&DGWdi zR$~**1_A6)b)<9#SaWl5DVe-L6eTMn3di9ARaB=~y%xZf&*$MoIt@MX_<=QmTQZ{X zIc&OfiW8Up0_&H*zk&HrzhGc!2qK}-Y(J%AvQ`b?C)*%EVgxK;{XOJA--Cf;0Z2Yr zfkJ!xyN{AIBUUOEKnYfrpkA!*($kQ7+P`q5CjjHgiN(|5gHR$wdAz&~e-Sh~#A4wU ztffbk;j@?b-npAxeDRvzAD_M6L{xQMRg@07TrS%I&3NNfyfkjNo4cT`LM}Z4!-MC1 zj~?EBxrxxxr6qW7?9jm|7XM6e`+TskukT7h)9Ch4=<2sp$@ci5cZRA9bo55+*Nai; z?L7?O*$S|^yBnGuS9{NvuCDXjg28LD*L$41$8&-?_UM^Yt@Ha2?Ht4Bj@k#!e!m^? bTYv!oEoQIPx8j$Z00000NkvXXu0mjfBNswm literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/receipts_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/receipts_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..db78fc40dafaea193f1a884660f0c624f78f6f7e GIT binary patch literal 644 zcmV-~0(Qds7D?o%;%*nlW(x^$>q&*uv^)xpfVC8gKiH&`YdA6L_~ zP17_No9E~FUaLWm#V|2C>d%NM3M|VK{H**B_eCz3+o@JDmrUZ1VL&>LA53DIrl5e@ zM+w7ylumoPMMETo|CU71>2y2-l~6p*VQ0s=w2~gKXW|<~A~1ae!eEUj$`Auys!5bV zg9!Ed1oZIFAkY-V9W;p2pmw|6H86VyJlzU2AY6V0zJGR*NBOjhRN_7ni0)Tl0><$+ zO9q3%x=98@^eM}YGUn%J@#WVZTCJ8iNR*%uiiczO2re0r{<2=c?N@heiY?Hzn}qA) z!_>ypAJ@x;i#rHeBI}=ier!H`{9ughx~yYlZUl>1xV62$wV)D;Z@`!a{b_Vv_cQCm z#?^1zuitCjIF+4ARo;9pbr*z^vRf?TN e#;)M600RIST%M+4jrz?10000QDL6z zlIu7x%lrF>)oOKjp67F}(`a_F04Q7>dI-Oi%ZD!Fpy#~pI8r_p*aMD_8xDt0Ez8B3N<8kp?C`32c*V@I&$zy``LgCR1OmROS z9ep)wwaVL_or7Mp`RmQr)`4f5f6TkPtOgWcAcz^nO)M^+>#^7wzRok}{+{e~`n!!e zNehg@IE)pI literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report.png b/interface/ispconfig/interface/themes/default/icons/x16/report.png new file mode 100644 index 0000000000000000000000000000000000000000..449037c2746db3f00258ce05416944f4be40beb5 GIT binary patch literal 537 zcmV+!0_OdRP)P9XZ0-78^Um(aDM7-~ay%@)GPA1^^wv@b4c` z_g|og(F{mSv$2`6Z|`2P3lfu)86H0WiRl7qPKLjK|6+H+gq=H?d(+dW**Z9YT_7vL zhG76m9BjZJEG{T;cb|4}-#)MlViOV=9zOepVSth>#0CHV{>OAd^Xk>C(@RRGSlHS! z`~})1Bgu;C0w4yv09zQ;hK5c#vVT9=1>tdV3{Rf^#tZ{_W}IG_RWfG|`=Z9iNyb)I z;EPdQws*oj7<9?1JFvXoe?G{$PfI5-ZFA%rHpl>EYZkVZsD`b90Cbq?oX# z1Dr0HQ&KYF)S*LQ7x+g+Fg$(o7t;mGY>OgdAbE#a01C=4 b009O7UEmCun(eNi00000NkvXXu0mjfx-RPS literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/report_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e18b950dcbe7129b07c84b79bd9f35be1633f895 GIT binary patch literal 658 zcmV;D0&V??P)P9XZ0-78^Um(aDM7-~ay%@)GPA1^^wv@b4c` z_g|og(F{mSv$2`6Z|`2P3lfu)86H0WiRl7qPKLjK|6+H+gq=H?d(+dW**Z9YT_7vL zhG76m9BjZJEG{T;cb|4}-#)MlViOV=9zOepVSth>#0CHV{>OAd^Xk>C(@RRGSlHS! z`~})1Bgu;C0w4yv09zQ;hK5c#vVT9=1>tdV3{Rf^#tZ{_W(+StQxU`2$K2fSauX6f zHFR{qq0P(7gn_4?{Kjzkg*wBJZ{L6N^E*!AVl#xBly>*--I*ZUK{z-%n&HWlKNv3P zz4(>E#zu-^+OoZ0I5?Ctzkm6%1nz>%zkh!yPEYqx)zpN#fDw%6oO#Qz;l@XXLyx{N zJiK#<;nN>R25&cGw$o>y$p8QM?;BPZ_(w!AJbm&PEYW!52ZNQdB*U%G3=Ch893{ua zz_5P7k+bl?;5Ribdwl$O=bt~QPH$R!i{bLa4`BAUpFbJ?DJd~X=_)ZCpR?`k@8?%0 zfMP)ih^0P$Jgv`X#&QN<7UWj$)>3qG;o99X@!j9Y*H(W&K5HAu1wh9z@E}DgPQd0j sz2!dxqcOv`*VBLRsa*#Y`T`JO041^{)};jAi2wiq07*qoM6N<$f}LkH)Bpeg literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/report_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..31d6e09b2458f6cbd272b119535fb60e47c19345 GIT binary patch literal 735 zcmV<50wDc~P)|^T!CQ%gU3Zq(cxyQKG?5kH>toy?xSdw}Yl>3=IuoJ($efwm~gNDwP7#xjrh> zPE9$T#1n&I;!;-^(map4>XJMI0RZW=u$mJN{GWl@+}SzdSXht`!yyqEj7Io2Q+WnwG=B+rj?eaG za)_0vTD?6yFmO$)(?J}rP>}x!u~~#@8^XH`>>j^gnDkbhC_5y0(A)dUxwweg>1l8R zsxOeriHRY!@fkHuH&D&~LaDeh3-Ks90;atD_Z_40YIAF=blVDrEGt>kju-t;r+~vbXk7pAfqIL^hYR^wdgm#L!(Luy$V&IdU#4u zj^NwD!H(5pxzg0qk|7`@$x==fajQ_2lQ5VjFluQ=EEeL+_=t;3WBo84X0O*fDP};_ z^}arA1URvDu*-}=QzyqB`vbI3hgyvr(da(A=X1RgYU*}2pOqaQ_n75n8_TlU6vaX= zYTK?+-A RD{=q;002ovPDHLkV1fo4PSOAX literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/report_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..8565b4d7a0d435ce4f8de2a34378517e2c943729 GIT binary patch literal 585 zcmV-P0=E5$P)q$gGRCwBAWG-c900TybJ|L;jKpeQp z@SmXw&Qs9VW~g7eGVMPRp!h`bf94YAeL&0r!Ym*I9$dYe7H48IbI+bV4EOHcV@OR+ zWw`(R2ZptZQk)FGe*I!#_=gZP9XZ0-78^Um(aDM7-~ay%@)GPA1^^wv@b4c` z_g|og(F{mSv$2`6Z|`2P3lfu)86H0WiRl7qPKLjK|6+H+gq=H?d(+dW**Z9YT_7vL zhG76m9BjZJEG{T;cb|4}-#)MlViOV=9zOepVSth>#0CHV{>OAd^Xk>C(@RRGSlHS! z`~})1Bgu;C0w4yv09zQ;hK5c#vVT9=1>tdV3{Rf^#tZ{_W}IG_RWfG|`=Z9iNyb)I z;E#@gJ2f~M@KU}dGZG{43t=51~Am^|IeWQ>OaCMj+vSH z8zxMc@bf2T^xeqMXZU>nJOd*W6T`y~_ZhyudH+S~6T?klP@aVukaqX(-I*ZULD)Yc zg5l|tzi^3V00000NkvXXu0mjfCm{u9 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/report_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..46851c01339ebde840ac417a30de54cdd7fe3fa2 GIT binary patch literal 706 zcmV;z0zLhSP)J+xzX~9@5h7C&P&=Y`$jd8Hc z%gYw2yTsOx4)FPsdENQ26B2)hL0wY?2QEJLif*y#KF9q??_>Dl5`;BlclX)D6&3Ql zOG-$FBryvi&qJs^Rt*oHkHKOhw8{y1TP(|Nh&%@u+S|eJ6J(Yx}}9Wsau3L9gG1pRDIF7BJzfu{vB_`hcx3Talb1^Q4TV z|3LsLNhKTs6BN@m2hA#?oOtF|_L+`GtZoec3_(~HqOe4dd-N(G71%{toU^TS;lFa8 oSh*-zCT8&KCQV8?`cHrX0K2x8HsnYOv;Y7A07*qoM6N<$f_S+@$N&HU literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/report_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/report_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..689c34c5a9465cb0a0aea0bb07445ece5e5762ad GIT binary patch literal 630 zcmV-+0*U>JP)P9XZ0-78^Um(aDM7-~ay%@)GPA1^^wv@b4c` z_g|og(F{mSv$2`6Z|`2P3lfu)86H0WiRl7qPKLjK|6+H+gq=H?d(+dW**Z9YT_7vL zhG76m9BjZJEG{T;cb|4}-#)MlViOV=9zOepVSth>#0CHV{>OAd^Xk>C(@RRGSlHS! z`~})1Bgu;C0w4yv09zQ;hK5c#vVT9=1>tdV3{Rf^#tZ{_W(+StQxU`2$K2fSauX6f zHFR{qq0P(7gnkz0Lveb#hpMI~)CG)i+<2>+VaDT$3?L2MGCT~| zE?oJ=z{V5|2#BRVemt$uXU1{{Zyt2!(vq@K z~^a3QE$H;M~U5Q<8zsKG~Sw4_#B zG>ukiNR!;xcqZvB6`R!I9?rSnob%mpzTvXR0~}!0XAnRHwUrgXwU2oVQICR5oh+z{ z%WfK$FWr03+#E7>9ZyG(jxvV-TAWBuKp>L(W*+vZQs@kaVF7)LzzFRJiFl@7rr9j7 z7>FM{d*h_{;cbLsG3ccdd^-;$yZeqLJJM-H;&H5%dlCsex;SuEDeA(xn9JeC`|rro zhGm*qDip9VHwRZsOWiDIN#w~~S7ngVWv7sklo{J&rS^ixof zf}wjB_O(_qZF~P0w7K2T45$(qekSlC-`GTDUIShk410DleWP)&kfNae^kIJ_6hD3>7*Rw&qaP_+AR$IYuINt%NkJ4OQeuWS(;S*; zOQkF-am>wa_r9HXQ;W#zau3ga-*e7$&w0-K3eU(gCO9)9*Ib*!C-TJRQ8x$E@W7(P=O+mp`QE}BK9nY zlshKPhvC?H=6a3ci4&Q2J3@XxQaA08vx*MM#-SnD91i>m*X8Hq>4map(HCO6+39J# zdix1uzVsIXqXI4Y0|(ji(+Y#|axPYpXJYRDoyk<@?t?-EaQc zzlcdGtm52vAA@^BZL<##XPVN}5v##t@>lvp?5_kXV+2S#tpI~wK(-M9F5o;>pfG6o z-n178gnyE_9Va2sco-?TVW>V@MdyIB=wD$Q9fct^6;xGZyeT>XgE58h#BauE!C8o+ z2!V{LDqPlTzv1 zwosF@Ld5R=esr2t9Nuq}uiYA`<*i6{?JBmfiVy^INYA?w{i1xd_0=p09$@gzOua!OrfxfVSnk_J8kOm>T3*I1$Z|(smduuRLSla%s zD_7=(UY`%S#j>21XM^+7qh1oUiC-BD7rb1?32PG8^T6>LxLbR1o<8{xg9{jnFTLGi zsW?*LX}!}&$&GP(y^|9pk;QS5e=$B=^>@@BxO$nylj$fl#p?8Jx`YJ$5MTg_pGqJ{ SC)uq40000>&6d44)L{UjkQ4myA50O-q`Va|06j_2vsks!* z>B`xb;ncb9-g`Rds?|eMhxHRT0Whste3LvVRK_?vWlz34vIaD^-+Xv$nL zh~B|zj4^|%C|Ha{@I4Sfy2-SrS$6;Ncu z5-(tkWuQ>#xGoq0l57;4_G|w240Q}$*%i1o@EC~Cuqug;E^@^cFyoA*zaS!0N0nJY0VtR>!tN ze&%`xklG4@6-ZgEfEoe20s}~fmch=Hj8YGjh^f839ntw|lVr^IaD9Rkv~;NGe5oNm z<@ZBXRm5dT#0;=kEyywsn(Uk1UuJvJ)p;DD*f8{FyPNB|oy^36K3PCznc&D~HIO6; zkvLs<<{|sLjIBvVs~5U}MIs^8?Y#)27(r@k%%V4>dbyofJ9i{ZErT-%T)%LthZko2 z2mB*p6a+)UF;_{NJDE%adKC-dR?LSVX%)9SO|Iead?TN^bOs~u!XMzhRd1ZfStiR? mbbM+l+vw_`5`w;;0t^6uoK(QnJPK$40000K_nXREh}JE?g8u7lIpcV{uhPT!_)Fn~Doj5CoxCs=?aEXi2TM z*jQgQ#H6|R&UhxbiDHxJaA(fUdChmebB8_d=K!mG0{}uWM^*yY-YyA*T^3{-NJ&my zc~h`DbniWv95OTwPlrzoGlu^foRXY|L@4#iIO0vE&>0Lu011o46|(y&@mwQGv01*N zBYN=s%|Z9WI|xJ~(27NPb{&X!CyvHDrl%2#Mo~|0kHzrla{q{>ph??uE{Eq+i^!5e z7zTdk^Z2%~0EgY)P^uUe%a==X{_fSYqwQ^Mr+?c(piBtnUO#*Pa(wL7KkK((p6db^ zz856YAI0rRCKK@bd{}421G1kgYO-m94J{1Z*2>`C$Pn&8NfEe02n-3U(&h3%NpGHn zKbbVD`}Luj8Mr+j5UNUhoi>Iq1)$}PM7^$Bsa1S`%vwE5UssojK%l0yXK8sSe=GhN z>S}&}tcHMvduOr5<)RW~&0kE3y1}&)4(+y7_pMurz>33prxRrztx7Sv1ROSfEf6F40y~$W~=_>WaT(L{HD^ sLv+w=GfS#X#jI!|m5;bc%P#>20Ht{UwHVpqApigX07*qoM6N<$f_(BU_W%F@ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ruler__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/ruler__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4a9fa8e19138441638bd72a587206dcbc6c9de GIT binary patch literal 761 zcmV6Se@5LDlse4e%$#$+Z_fFCerB%|0j50-0L)l0Hvt#kO)JPX2ym?ti8qOA zHwUX9mMzWK8|6R%gPjLD8N+{>$VrZXU>^P~*Q5*&BRwk%3Q#T(PV;&uCmvrba;#hQ z1yN9W?CMeDgPSnr5%iE`wN&5 zg9=Xk^bp>BQf}nAT&9$?G=%AJpVtr12WVBG{1jwh1|dq%keei+EMF(70?K>^ znV>U9GlYvPkHSz0IHLEe1f|(yxSi;ta`EAayi^Z2kBz~YoD4pdcDxBu4BtG!`h3#B zs*#(roiQ<$^(`%XMp|3r#cej-5&@-UWWdKYkQIcIsYO6U&SC?h%U=8eLkR%_XuD8z>6S5X)#Ml=Njnsdd&JMro%x{2sz8a&bQQl=@th19YIKvq!Fl= z$-Ves39hwQ;IZoby_@GOZT0L7&AI68arUTo2X?8Fa9^kXI3yhRIPQ_^s>@temftCS rKeUtGkp-N)(o2KO^0XN7M}PqU40%7)NFIND00000NkvXXu0mjfqPko! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ruler__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/ruler__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..36d874a6d2053794cbcf0aae32ec0b2783d33a8a GIT binary patch literal 746 zcmVeQcRrUVarg<5TQ+r+9pM1wiBX+Hf@4PfK(fk=| zOf8+p8Rz}n&VA3ZMOi)G;XC)-`+eu!bGWRhNdlPhHv{m({KhzN>El-&Wg9FAt$~~l zN#Zn-#lpAa@uTLV8W8m-xKWmKz!5|7tN}vNZ7LN0@UrfRiYawyR zq-7NqyG~tg$$NYQp7L@i@i<&tcgnt+{c`^BFuWBN_!DmO`_X;2slyUec;;dxg4aV| zFh(1?reP@>#e6u7ob2p1QE&uTT1@ci+ZRsU&&^;}#ih-jBvmjm`0CR@U+=qr-rs_0 zN!4-sTa4qwlzzQD6!H|f-LPBni1v@h75-O&^fU%3)5egO#ZZ=yglOP0RiJTLMJy5p z66!CJhubn%{f2=hvx?{MwN%XE9UVoU%LS^+7_T#vVKxTb+w4GBHIW%xnK{r^m5x3A zOOWdP)|3Eu7ZsTm=vWOtsU&i#BelFtWSKBPcBHe+0n3A44J*c`#>b5*Xq;Qg1mc$0 zZc>*it-|F)^#^2u##&sVzS@#fw{4^bCd>+qE8I01hPGSho^bH9rLR3J_n#C6-0-C|kR0`u?*e;Pc6qYd+x6#$+2xjXvE$@H`L_&zm z)H@1Lg@fwqYV;nKr9Gs+&jX}?bEMWe-h5;3rG2s zllk~`>=_cej{SiEBJHhOYxj9=e0bow`o}2Ez{`n1kYwnseLmlo7!Fwo5>bvEY#Js^ z+8wI(Ivd}uNjRZli0rm+w|z^?yeWDu8t~JMUXR{dTg&k8l7tzt2hxPjl?fgFqK(3C zh^Ukk44#(8>gwxzO#0aj#-|6~@-vjS)Ut)DBKq dnUMP@zySPFRkEVBfsX(H002ovPDHLkV1n_1Vm$x= literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/safe.png b/interface/ispconfig/interface/themes/default/icons/x16/safe.png new file mode 100644 index 0000000000000000000000000000000000000000..afd0a82a06f1aa09fda572d6808594be0203f871 GIT binary patch literal 609 zcmV-n0-pVeP)eRySlEH${G}_ zSm<9!MQ9!jsiy!Q;BMpddcA&a%LihaTCMhSKA-<_ivNEfwr!(Qsk|`r z)oMkrrqd~!&E`LaE))t7oH7K<<&s`677K2oSS(^PncSL5zu!lr(Lgqvh2Zo}0yUe> zxQQSLFdPnVjofOrP%f9z?RI%qZ6b?l>L&p`O(=ncFS}K)7yGYGofE_tqL8U+yu1kh|YcRWd{ zR6;VDgxBkZ!13(_tle%?5UQ%8QmO2iIh{@;5{V#}%h6ue&n%3Sej*@GawuCin>9SG z$vhqp;_)~f4u^puEGH1L5s)O1FPF=ZWxJ3w37bvE>gpR53Pmxu!{u_pYPA~}!uC%< zU<#1_d_E7iTfyw?U6Iv`TCFB3Zxwam;9LT!{&@n4J|u+*>U9;>YE5j=vAmqY)YMtS zTP!wVvbZmjATSHF7z9QUe-N`3>%qKGF9S-?4t@n$7F*8giv(RdR z-EO9k0eY}*!KW?BXyb>sYk2x%5W&zW?v=hB*R788617JR6M;$J($dOryLcdk??Er3(cFSO zb_B}k2eR?H!(1DrzX5O50@45Gm7#|;p5Mm5K0RJ~OP1Ag((gK>nnVFfV z)oS&xTm1j%P*oLEQ&ab???$7+R#Yk#Boc{#avh08KsaF$)a!M&vR13{A%=&CQ7)HT zMv}|r5Rb6xZv{Y=1?<*>I@ zDrH&T^Yr`uh(@DuyWJLsv64Z|#z2<9HlNQ!({z$Eg0?md>GTTL*4F7;M`vdz91h*W zFt!;1gZY53 zOR!VF*xIrb>Q9W`c!br|00}qX^D99L{vs!0K-07lDW&gd=RLevxjuHY_f#N6TFeGq z-divVFRg#yHx1*%{Kh+#pXKiE?(+}G5BA?H{a9#JzF8+Sn zbX`X-mwTk%r_(7%F&qw2DwY1JbSjks;e;ZXOeP%Vcs%AL(&;n?gTc9-wA*bIi$z$L z1;WXb1Y$HAaT1Q>pxf=9Te(uHAe+si(P;2qF{?~2Sw9nSWI0@|UazajYxa0NjzXb; za5$_mjFk*xHU_c;j-5^ihGCMN6$FC@c6Z-nfB!SRn}|lE2n0-pVeG5}26KY-H=9kw zVhOCTzoe=bY}=;E2WSowQtDvU#~tYWU@1&+c<7+lvuT5eYPE*d)%z;?{Xuer?u$+Y zK61YzP(%DfAdZe4s^oxACy}^{T5TJfn?)=vTthN>Q<2#A59(q3 zLPIDthoz<4wAN@XXYt@*4{K}p=)SyD9W1w6e+h)}LDPJs)eqD3aY}*cn!|ba6qCIV zxa^Lw^`wXSOHn-h`sH!Rb+7AuJY*V!Szo!lbLRZ#s@r&Q=hmt0vh`|XV^QacM8Y{AJGXoaNyfJoy|Opt(M3xzBW9USZ6Sfq>9vx`=UNoCc{t3U|k6NwP z@g{{r0f|Hc9*+lv6TcHk^?IFuqEe|~cXzjAR%>dCk_{-Hli*28Y98U>GYH#B2=Y6xi?V>_AnmluiI$T`D#=-yxs>KyxcxE*BKV zYG8)5*nV(kL=11SbdjmlFEZ`5@&4-;&QDIB*#_>&Ou!=U?^h^N1za6X>q9EFip9kQ zdV5d9>m4*m8b98mR4U@;%spHk7ylAFS zEs4(kPw(oI_js`J3{Rksh zyxfi7mZ>T-mxqRl!9tj^vXVYld%GnIr+Eq2LqRIx0%S)7?w%nk>wS~aNUXTi=~Otf z&*x=1_;Hcq5?a+ys288$(&ZrH@#pC4zXiMNoY9q~Qb{2Lchgx_RRcl@_sPzST&NGu z#nXYQ+x;IGUz?NZteijGqpEFJtJRlGp#A0Dd>IQ$&x-qaxbQ+>?R4O$00RKL;8H5Y S@Y1vZ0000a*)f_j337vs^CgMWqxFB*+B*gwFNlGH=fgT@ml41`i>YiNjxRD`-s zS(hIRIB!&JY!mBj-n^N&^L=l=H#01eNPsbR3&2_YUu%rV;}unO5Ee|Q(@TTF;K(Za z|94YW6{%F}z8sH6Bl4`*>mirRohWrQ8il|yNiZA^$#dJbDTr7shHkfe>`t1^CbHQq zLZJ`@jvppq{eGWSFAM&*y`txh00MlN}J40;IoI ztHJLNVtM(6$QpuS7^3o;r~?P*DoFM39jMfi6e2h{FtN91hy`O5izUS4ccgbZUBYy6 zUsOTh5ayHwvWUM3Sf^u(OeW}bg28hrl|Eo~HH(><3y4InNs`Cr64vL+$bYXA0Xs~< zyIor{Gp1l_>NMu(uZy`N=6vF-#wOyo<5*i+L%??M##Q4F0b>p*ibH61!tHiYNP@&Q z$CGbQu|4<*Wu#z#xG#P2ZvDZ)J)BeNctleOO#1Tq^&{tBJXOTS#3eay*)7c8n1%R4 z?_RwPt5k8X*Q-(HXf#6QkXgrLlKAr-T={evTdz0eOuMP0_r^l)%XR}_?L4gt>$<+c zIrsnT4Oolp-t^-6>D}k`UG3TMk!4x$ReF|U@bW~jsN+2I`QcU=3d>toUt)d;FaV#( VMH}06a>M`t002ovPDHLkV1jPvKAQjl literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/screwdriver.png b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver.png new file mode 100644 index 0000000000000000000000000000000000000000..5627d45a9a7887fca864460dde221cee9bdbbcfb GIT binary patch literal 564 zcmV-40?Yl0P)TNsGos6w12vWaX-goU%ErbpPe6cymzS4;kB^UmhlhuOlarG{US7Vey}i9t zSXeln1*Xv$s4)vjTLUpS4p;sC`xoS*vXqpRXbTIAa-h(279Aj&4Ag7^q&XRI1CVAh zF|o3YjEv~0sHmlP?%e4DiL=xJ31J5O0H!%RJ3Bf)K7Q%lyLY=_ax4r)XciY2FU!x* zk4{TVTYB%_y)I;VLI!Y4Nl9gwmX=26=H@QFfB$|Lx&nL#6lDMUWn=2$Ay`~ef>kpZ ztODY_z(70>#20}01`wZNWHjE#z;Nb&N5_8L4Ll+ zjtLV$ns!P9HRIBV5(ax18LNTeu;*7*)&G@1KLf>D*8{~P7>EEX7#JFW8V>($YWfef z|{d5oHEhFEhx-kU$a?s!2(C!%<-A zbVQ*A_A)Is-EQZujj~pB;JfE?e&;*CbG~ygQwqRHct9A!X3NdZgVUyDT07YINql|m+yK_ZbrBoaZR(d_H&?Ceq~6y{9@EJU=C7bCSrqfx#q zM{RAbv81G=nL%i@!5`0R<&zBsAET5RpM#&(i01dsgGXz;HMm_Q>}hMRBtqTr7sQ zl@)wlT1q{_CqNhBxau;uTPJU6VZ*dh`JN*vvittX-ST^Y0~#ejdr?)@uIogO0>iyK z4}Uq>bRQhY_0sJVg2DF2DeiVf(r-#zXFM%wB!QgPYT-MIcPJjKrh|hMNeNPVG z1K1cX)YJp{W)GyBO{CX^epWwsxpKP$fyuy)$Ynl!z!@*-t>_49}k|^m>ox z_sA1L6-`aMZh1UG4wyW19922`I-^vo)Twke zMlOl^1SJHBej&SKK<)PS_Qq%9;~@%lWcIU5Nsb-S6xNoWI6VeU!TwTV&m|xx{170r zXN|~ZPN(JZ@Nh6rm5YzDV6qJ6tlYij;FeT@Kme=DbE*vaj&iDQj;92O+`9@KtnBG& zxIZ+sPG&~dD{2HwB+#tV?x#nZrO(&J%ofT!1JHiWSt zBm_*qg8$8vyEBeXChepCcpq73i09xpK`4L0000e*kp?s85xRz^wdkA80I}X%)rab%fQFS$H2qG!@$YO$sjK; zui4(--YG0BoQ`5Z22f)GkmhE<4*vfA%OEN$T9%TM5^Z5&Q4SP>xIhG`u@*>kGT;Uv z&0=C=Wf>V6(NR%ROYhvd(*+V|$paEX4EO;|b9Q!ibbNgL(z|!>cERLW7>Lj;E-qe{ zpPwI{mX@~k-o1NW$nt~?;Fgk-$}TM}jn2)@U3&li{VsF`_zWn>{`Jeo)WbutxTFL{ zb0`%5#bv-t1_t9#|NqB0c61mER8*Y34~$V{jd)$~pMjy6hk?OP(cfQX8c?$u1H;bk z3=Cg?0OfvTv5W;xbJ^LwBi69dCcpnr|Axb`dylu`Yifx*$XveJ2dTN_w2D^TntP)-4&);K;c z4#R+jixx33u3%tj0NUUj+|*>Vw5|@Uc@t3cYN#R?Aa(${;13oT0Bt|ZFpGiV^#6{I z|8p4_&Xh7ROazLH0p*)M7@0*F82Dc7*&}?Nf#Fy$ t1IRoE4yZylsA5)V7=krGF&qE{7yxn|n7ZE0OFjSq002ovPDHLkV1o7)2f6?N literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/screwdriver_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6eebf8db1eb2b1b17dda352f078e168d9eba75 GIT binary patch literal 720 zcmV;>0x$iEP)QM-Q^^8Ss(oGf&aO`@BZ)kIII$Yi8MlbiPcq5PymC$fGl;Cv@;fq zeUW6_ZDkCtv<7BpF+4sFxm=FCygbNcGDxLT6c-n3y7L#7DzeLvW1Um@4N~;uqFA***EEH@uo2jv}F*r3f`ZZsmX6^Zx2SJQGdCXL9>^}IyrgZCm^JNTUir)1u8yqetMVJdt#g4 zzm?#C2=`qEIOpoHTy8As>N@@nxV|m{2ij!7p_2M~^=-F%LIb=W)v`IHVHgsL#6Djr z)LmU#dh-zAr31I|+ny{(#*J zK-F%ivu>2&AM|CV3ajAidUx&cpf99T&Ag@QgjdE$aOXT=tmx>ddEVcjhEpnZE}GZF z@i^~UT0$t9Ou{0y#H@^>jcmUjJAiv=-@X!Oz(>v_N{7eTAc-WiXRv3-? zHHS6?yyre2zeli(#v)!ql7f`qcb@g|_(wi)g^is#h9l%{CT&_CznGrkES>rw!54u6 zGIXRpBsEDT{+*?cjZ{@I@%rYIKOujHjb^b};C8#w#!iy& zsMTtpH0`Qm41+O>x9WA=TUda>V1UtR1k19}>-BIr9Q)Gg^bNDwJi1{(kig3nyU^Z5 zQIvNT^ZWf?r_*_rQq3Lo5;#Fok3X9XTdmeuFc|a>4-e-`rBYVTYcA2F2Y(-EI%@Jns#M!?|j;+Jw)MN|FRT z_zq^4)@IURo2r3M6_J6Wr|S*RcSrO2f&%w#1+JM0MsvVQqx}xP09;*?E_gB-ZhJf~ zROv>sUkfBnzx8g}oS?Z;mRkFVhIZd3SOf}Fd$lVnJVOnON^CcP;MgkQ*)=k9>h;`Q ziBhA*J=#Q+Hvp?t{V8$&!xuR@D(m$k(lY)7a1TTx$DU753#36|Cm@`@!pg-NtP!*( zVOdrP*`l5V!fbFCV@TnESwW zI>+GIRLYf0CKdQG!TDC#(N5q)^P82}6LN<1}>hS0oQl6>YBcoNvD6WK;{sf#*@(2UJb`*&7GpjGN7qy z03~m4p`f(%W5}$3Vj!3a-9h9oojYHhp97I!q0ik=>svhaO>h(o&hj)acLyFP|rQugLo7V_Neh7SV53_Fd#w&k5woNNu!BL zch&5gjXRrlrcghEiSmeb>B5#1}tE)FCrCYSoX!O@6?=LSe?%H-FSyfd$+1OaG)oQN{!`P?z z={T@CqC%G>++ACHrfJ%?IMc9I#?PMbM+%6#;Mm-y06j1t?;sF4f2ejqKoSCcNl_vF zOF-rq=ph1L>k&NbCH%3AgO0)%DHl*=c@PqV-+qhS#5HuxG7_q%L<-2fdsu+|e2t;u zQN)iZNa$%y`5`O*ogiI&h!S{CH2U}1{3p2BK zpwTu`NjIUy^gI`t5&~Kf1bMg9nO!OtFNlN~L!kQcAx4Hx#7P~x;=tLxz4z4>8%K?i z6W!lf5U(PojE`TIG%X!o=)$?`rChpW^yd`Pa}~l|K56i|ip@U)3;;Nb%@~|Vu~h&7 N002ovPDHLkV1ju09*O_} literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/script__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..59b0da8cf3f687256366efc15cab32c9bc138c73 GIT binary patch literal 497 zcmV82}6{+-A?p(h7nEThS zS3u2RK`t(Jb$wnFlj8qC08C{#F$j33rA_BjQwsp<69ef5Sti7)q!h@=#U(;a7XJU~ n)4ku19^C^ne**C{fB*vkN@1WGn)TUh00000NkvXXu0mjf4UEyN literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/script__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..44b9f924868c819512756c4c5726910b477ec8bd GIT binary patch literal 647 zcmV;20(kw2P)^@RCwBAjBIXZfB_B;4hBg{NlPXs zCS3+1z`uY0p0gke{Q2|8Qh<#uq$D)72q=kDBhUhdP<6`s*t&PJjIP!NQCd2H)NuXLxwIpTWe~fMMJA6AT8{RSdU32;XIu zlw{a0AOMMlukYV8{QUV-Jv%(y8x#gCK#d^$D=q*4 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/script__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..82ad885f972f2f5d726f11b953626dded00ef803 GIT binary patch literal 543 zcmV+)0^t3LP)s592nT$nfc~%bJDEO2VbJ9Dp)KQx5;F3z(0f#l0dZ&7-M&*qD-&M%y^hl7|0U9 zg5ST05V}FBRI1kI*!Fro&&8rJSWy%>I6Xa%$Kz*KtMwLTGMOI^FQpO`nTn)Ml3;6h z_ej&UTYg8zQZc*hm5LC+?L4N)s^p4(^~W-B74~ni{Q^iFz=k9esS!YC4yX=5ZUjKg zp-Gm70MxJomR$r`i*3SnAqEe_iFqyCu}uj6y8=Z3h(1SQXk-YkANOsA&NNW=HBcd$ zgch^;d&sD~4k$wQ)w#I|J_F+xxVoGWJPB3LZ{q;5z1Ra$^)zz~ z@;6Ph+nwz$*D__owoIslJEOGkZh)FLI`|s*@>pJhs_VK7m&>Tx;qcb`eR2QO6ul_* h&@_pB0`R*40|0BVy^u|wuF?Pi002ovPDHLkV1mWx>mUFC literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/script_code.png b/interface/ispconfig/interface/themes/default/icons/x16/script_code.png new file mode 100644 index 0000000000000000000000000000000000000000..9be3cb523207f9bce0d55216310ab6d2b3e42c6f GIT binary patch literal 512 zcmV+b0{{JqP)Bepzz9_E z;K2j1?eE{ehl|5pqpPEX-vDNy0V*mgV79QZFatJuyaup9U4RTgwu1o31(IlnV!8kr z$EvETIAZ}MPm~Lg!vN-gP)e1Cx(2TP^NSY@oCs$zu>fsA4+AkSE`$c4{GZ>y;m%-r zboelXn588H8#gxtGcav}0_pz!`zSU`BY6oV4-^Bt{3pb@?P)f>4{LJ=1NTnXL~6 z9}K(m&CEC7dv6{a86O8>hGBr;?+0DiAr^~OeXrLWR#i0wEmpZ)enC;(Y?Vr-uv=B< zHWwBm98}Gm+cXVZE2)}k(!ycwY~Rb^6BIDc7VbbTEwK$fFPo(Q6g(Xu(7jqxD<(82;a7> zM{b%)`t^v}!yJvL(cL|=zPvmw2o#AxNVdPfV_(3200000 LNkvXXu0mjf1fBh- literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/scripts__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/scripts__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..199991600235b4dafba8919799f0abff39e33e2a GIT binary patch literal 681 zcmV;a0#^NrP)O zNs%;((&n($7ODi}LHvn5h!^!>T6*;0DHSgsTRd8GPz!<{Y7L&GR6PjANEHuC0}3Tk zYR!T~6Iv~sZ4!6cjc-#Elcj+U4D5U}^Ub&O-eZE12o4So!s&Fv@Are}d8AUQTI}_D zLmbD6Xk)sr{~%`bPNr#EsFUL^+=xaebi-)LaV(3=Q&U%LHd~tAsoCfAL6RgfMw@e+ zo5;&@!(~;)%>4ZGY&QFf4p}7@Ng-8LMVHHkU@&<6?aB%&l}aP;pug8o$?qi+&*=2k zLZJY%Tgi!J67HTJF#qe3&*wpMxm>+YoSmGkNp3cWAmFnk!Q0&pcUKo!hH1%@a=F|H zHWUTLrr0!t5PVFhaW)*@Zm<$G2h2aWV)Q7%lkHN%vh4{>d7P!d#LT8$5t#CLI?aj^ zirFc_o%dyY{rv}m?@UP7jr&?jK?_}dQnQ;_9nbtMPhIH`t~nGIW8NrMoj*Z;~&InaqdI=;Ie#y?!iCKUrp2 zHZJho9K#0!qm0w(Y4>ESviwbzq_x_P!q+AkcYhxxj@w_YP)*~x2CWA@m_vmMVnCr(Y0;$C zl!PR$$u>W`*~GWerb&qCzy~{T-Z%5jn;phCIf>yw0HP?u>-9nq1jOUq_6N$tdT4a-SNeZf}>X#%5KA&&m?b;eDl}amartOW;+6^xF>OOkj1?imPys zTt+3o0!h&Lo(T+j0=--wZB*ilP_x@z31~%u_S_DRX+WyI zgKTr*>h-6v_Bk--+6p`fy&@a2)qf`_=T=~oMby;IOwHg+&(C)b4w{T)vHL^)uuFhcg(!6@iC^Rp{?otyE6WheFeQ zmxA){2k6>&x>!F1fz9IF`TGz_5l3ZJb`Ds)cWyGHq|s>jN{TYIFgG_vzroUnJFwKo zV_2je-ON@w@OA9x?n22uYsOrs(D2kBF<=j}7)K~a>6!{cM9)oQKv5dPjMlJ8|QKe79{uIoU%m7K|D zp>J>yxc7W0m&-s)rP5noT;1AoC3`It48n<~f!yB@eLX!uIPSwbtyZh8;LftZ^u){> zl*0df9=<1&F9m)AZ@|5}AH$;rk-nr-LOK&LdAu)yVXUYt0wzzyZhnj+7Vr?%ZQD)y zc6#a~@O1KGUR=QUC<8b#-xZnh_8m0h4?diJa`HYREtG z0#ndzHkC)qnp$62n8I%$o=xO%17}uN_W$+v{x)^}2qAM8edz6kSdKV6JkLqeK&LC) rG>l7I(+aQQ75WX503!*aKMODb`}4SS!t`ld00000NkvXXu0mjfY&{yd literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/scripts__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/scripts__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0579621eeb5ba99947cb8a9b71b8b3b94d5aa1 GIT binary patch literal 696 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/shield__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/shield__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d1051146c2c9aa884b144fba4af4f3ec4ed076d7 GIT binary patch literal 744 zcmVP)p7E5C{-_f+&kx-?>moshhvOEJRS#HqtOU>o(G4+0UXDjL(^RtuXh-y z42Q#MjJ*UnwI~3|Zp30HlX*NBLPy&T+|MIkTeV-zL8ilT-Tb1Gn(rmkt)v0)f9b`YMe%)MS8{lgPCB!Js3b&xYSDbU4! zRkz!H3D3}MHbK++R4RhEKtvLtv!bX9afr)L1RAm|{~Qbk*!vOAz(9f%A%Y-`;dG97 zmrH_bwR%V#N@fcj%JSEWt`9MT@E6JHbWI_OmOuqLzi5#Bq~HDB-JJu&FqMCi2!cSn zgfkf^vb=Y2vC-InwzUNuUCaFZJUymZI2=jEVoNC+8qYhdereZVt^%ukvxciFzZ-De zQC+6lVgO~qe!f`Jr_Igxm%ZLI7oyR{D91S*V*wu2AK&5O&9HqzGZVn8_4RQDG;O>A zkR<6W+8@l$&Rtnvesnt=zIBy+pIBwL;nH7nX=bHvFxlbi`?YWRtA)C?`LjLKpZ) afB^uxzGdNm-c8p40000hZS}$uV8TrLe;XjZNq130oMD#_1KBN#fVHQGKZ7#DSVkE&jLE0 zONm`tlDCIRWpwJ$rBXYKM6^MUE#TG00EeJxOp`pPjifec)fU}^6{#!2~5D3BE+8)qV)FYV%l}ZIZpEpRHe_IF& z!jHw8n!`#4j$@VJu`#={vn;0!7};vI8dg?T7LgOe3(L2F{VsdG9)Bv87S(DEX3=0^ z$rh+owDTa#o1!3m^AjhTOy&jfL}hdcGcyi{PFJ>#M0*|@aJgPND3&;gdUI-S#Bv|8;Podqq128VhhzFB!)q={TmJS`f85oA=ZsF0uAn70-q#zHe7||t!g;HTd$Uhrt z=B)0n?#%4Y%uesk?kp|U@nUw?o9u-EJD_4#~vdU|^9H#RojN+c4ny}b?f z_4OU-vtyDZ_4f7k4HJh(;)(*6-|r6&4Gq1Zikhau=H_OpO;uGP7!0-y3=FhT9LLKN zxikX)nCWy{Nu^RA_|MAaawXgCb}L9RN&<#qQ z$jR;($l$yQQ4}lDhGa4cilR}g2-XG>Nq}rwPRPU|E?X4XiN#{Sv)L@pzJ+_BBY{V_ zf#V9``NG%Z5g;CqZxDxyIUQ`oVn2RXRb9Xe91;taoQf>#vhA1FYgmCeWR9f#0pr*o z>X0qYySlJ2|4Y{m*{Q_yo&(@G53Cq#aJ~5&B+8QIJE!(mzdl+5=N_mi5}TQsnvx{n z0TRy(FrvPKC%c2#DnQCi;f9*p(#?%8V8ICITwfgH^Yrw`b6)S!@=&NX#4s+GGsd#I z43%vG`*dVOhN~S-XUYCFF$+xbV&Kt;APB;7^xv+i2vm1=-fe1VxKc~8!TG21qPk$| zpsUpnE(I3fevjH}3`89P8bu;tMK|IiqOPqiOm`k8Cnx5x%c$|p^ZZP2uy%cH?Hi0~ zb?{iqI|4KcRi`H`*y8BJXB{FF_h=UL3~1*E;WV6wzYvA@`a?Rve*z2u{~lic1mX=- P00000NkvXXu0mjfk1cQT literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/shield_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/shield_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..e8c305e38ef8dfd7c966a99c8de836ca13a075e0 GIT binary patch literal 589 zcmV-T0DQM z228*rA}F!hYH?vJNwb|l(9X^_+NFpAtAK?TD~mhhI?=eA%sO8=XEF{VN$|qK=e_5i zIrnj&V^J{sQ;F0lxMvm&>{Ne4aV6TCLLke*YTB8^8pvfGL>z-%^C*b@kt zra7NXCJK)GxR9sQX_P&I0OrvKg8?rnvWGx~T=oP4>-GA#s;UZH@MfJ)njLb;WzV() z1C|DzPUjSVHzMyLK@Pd>2?V&JNZxh3-AJ?9yukTn=RRcSSR;qr&00%*Kztn8Y*v&? zr9?8B{2q_Tk88D>ijDh4QoG$gYqeUZi^bxfuIo3wUhio%8hMXzBf#f%K%~>@a3+&E zM_gi^y=}x-mEmysFdmPGnx@(Qdsw5_-3V}$Lm%FDVk^UN@YQ#4i{-KWjidl~;2FKn bs{jK4Si@pcjs$(a00000NkvXXu0mjf^8pJa literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/slash.png b/interface/ispconfig/interface/themes/default/icons/x16/slash.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb269e16fd8257fefc5b9c8940092b4b052d2e3 GIT binary patch literal 751 zcmV@|1%8q@auF;k2j%XtO0oOc^(`t z?E4AcA=EU8<}e|yBe-FoVSk0$>^s`g;c9Mg=S@{rM#@kYMdiC7T-XqVt4by_hJDZX zWKa~FZMJ(?Mn~O}B(W!xldD^aM4EooIUJVGwl=*h=*A8ASkD$d;0+UiOslgvLcv3hM_ z;5e2CK{udqZ^5nQm6e4hLHNZxoi6oHok|Ah9F2`UMGl3-{s-gZ!5c$EXYlJj=q+TK z0OQMo5JLfZ(v%xCWi`#1+S#EqKLmFl2LeH_$FtvLNy=u^swf&sQ*OZM?Cft(%#z9U z{Cx0oSJxgB9f=fWS5q>`G8U5JamC7U7EDi8icO@D2zyH2m~`6@}B$y{!?k?ctO7$Tcd zf)}aO$Bd?pK^Wbw3AL&Yci{*oXVHx<9Or8_8eJU_)Nq`UHl;L8S(fG4XGK}tfcOKt z@CT!s=Sv2L!nqID;{u&T`Y6UJsO!i;VQeeL*rzXOs7=NqSlR+{Xw{+t)xuK1@Q)iz h7f}RhXtm!03;^DY9O{lU8wvmb002ovPDHLkV1ntASpNV3 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/slash_small.png b/interface/ispconfig/interface/themes/default/icons/x16/slash_small.png new file mode 100644 index 0000000000000000000000000000000000000000..8ef5c006ca16a5ee96c667ce30de6fef8362e227 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XPI$UFhE&{2`t$$4J+o>a==fQk`LLzJ?w8_6TwC^jV1D#QWWf>31#gWT|CA{Fwz^{7!ux~oi}8h>QVum@ zFZPryxZnenlvGS~yus}tJ)NQOt~nc<@&fU7_02n!SXKO{a5tFcSFP>8JKt&ba@;~JN|MV1Nw=<)78&qol`;+08ol=&;S4c literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/socket.png b/interface/ispconfig/interface/themes/default/icons/x16/socket.png new file mode 100644 index 0000000000000000000000000000000000000000..18c6cc05c6fd36fb1f413706b6b80aa7863617a9 GIT binary patch literal 546 zcmV+-0^R+IP)!bKt^xEG2d2}~wse9ZWo89V2imuXXh2fn#8 z=brDo=bm#$n$PF3ipj8|F?y6rC6FZP0C9$&(jOd5dR|667Yc=iz<4}X{eJ&xHk-YO zL?X%G*zI<^QLR?pe!t(u&ndscXf)c3#bUW&FqoW7Ch!{qfj}}Ejpm3WYG7H`emow} zn5Ic$kk9A&>c!HBv7l*MhB%@IgTWxEs;Wi-WQjzA2UCZp(<#hmGw#FmL6&7;jA_IX z0(hS-*L8O&MY3=>47&bFwE@R*g|FK+_`9O89pZQez_x8b5j=Sep->3#Yhz~^p0+3+ z`505bODS=VsDWV^re%!`)0|$7dwAdV2wb-nxk{?U?U6$3V4IPCMa zR(s^|`Ut(=phX-Z(CKtu%H?vMHW^zNxWB*S@cIaq%0rzvq6W=o^X=y5s**|_out#p zVvvf(OIWno6oXW+KQ?Y}uPemi)u2}42=6M2a_IB<68{-x$8lbTMBIB#^yiB kLWBkwxrVgr@BAge0Cq4HRHr>-t8ijxHu!4BEP$qtr)NYFqBb*X=lD4}|s zNiKgbm&>0!-*-vQDA*2t@b3G*$NT->-(yVEgo6kR2NXg-*=!aVhKZpryuIu`q;XNKt zJP-&hBGD_uFg{y7Xti3=U@$nRswyRebUJOF<2tgTFNmTzM=_ZBpoB)FA@DpeQU@xL zNW^lc6Y6w2(Cv0D8%70|Wq}YPQjFaLtjC4vOpVg_`FtSDzi4lu-#2VqrJ`7Ojw4eP zGfn`#UJsB2Be%ip^@6VVa54m=4Qi)0Lik}P7z<+)D2k%CTAHG&U0=TsSZ@ZZRq3zh zQQL!eDwH$=^X^)cV(dkdWw}x+{rthQJf=4Z&1T&?3x&6qj%>x62}?@>c)80@NWqm; zyTZaCgL1k2HJ8h6udZHAj<5FC)+SVAmtfNz^rloS0y$*Bxs}-DW2u%lkCGjR0&t1= znVIO7wYA$fXJ_Z_MRGb_aJ`_w!Wj`hH2|8uKP82n0MDMh-nIyEg+m<29d|e!k$+d& zb^cbyF?}LL?@b(S^1^cXSTYLv_2(a0ZsN{};0O)4-+yrU^3xaLYnjvE);HcmN4@Ww z4n7(V32H9kg>)wXHdHUt`t##kg0nRB^Z;a014K=SXN()3h%}4HQM02m}JtvMe((EG#S-Yd;Qs6bqlvH_bSddG8AKdfg?8qK^eI z3xz^PFzZme-A1R=F?@6?c%FwK2tLL!Ye4t0Q#!+k>3cjLluEx?ZP4v%hA(#Z2kP5P z(8M@+`;}qFG22KRsHzGQfh;R`6pHRCwB?Q%g(ZP!v8%ZzAJBwGSw1 zsoFXWr659G$P__lHQUlz3Az#d1LD$!n_2oJbk(0Q8;!WAD2N~kg5qM3u_d;RP4jG< zcpCTaQmMrDpbdQ(3z8%)Pz+W+XhGAos3?jO4WKKN$*^F0LyqG> zx7%et%nCfu10h7B7=H%X&u1)Wa#(&m9tTBvq_cs3-}QaXrpo>WflN|NkN|qU9v}&3 zwjdUZfo=EjW(Z~*^iF+*h%b}i7{(`1RaG|(Q`Pluyx#}xcNJQ#`ai=9`mi#UVtgSf ziqgEluRZX*h~<5PPN&WGv$IoXK_9iJC+&e^W-l%V6*L-+J6V>`S60^Ng3>-X_|5k0 zp$z8LrSI2jf0G-n=5EM!%Nzxuh{Tzh?ArGBudPC1(HGMAIGYn3{rCpu!u%^u?CtNL zGXj+GlpqLSL!nUSEh+zWoYkb~O$GGt5YMy508WMk6Exv}yaWF|Pyz4Y{JBw|^Roa0 Y09+IWI4Snv%>V!Z07*qoM6N<$g5MPn7XSbN literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/socket_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/socket_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..5e972490b36ba502baf944736d876c4206459166 GIT binary patch literal 708 zcmV;#0z3VQP)l@KVU;Wcu_q15GbZS*(!w4qz0{s9{iC| z`y(L`(qtfzJk- zO}%Xs#S&R}Wzy_$I6P4k#R9!80Gg%&5&=n)!QpU#s%oe+42otUz&1Qrs}f|gS*mYr ztd9q{O9V=#k|fJYNs<~UT|o6-2D7>A4`7?2euVY)4H&sSNneRm$oo;0GMQIb-w@!nP>4af@C2@fHeq~x;(M;UJNmY#=Oqyk1Ysi{kH5o2hS}Ff zEVe|TDIefxeg=ky24Q|a0VaJbfl6LZvTW-RbGckL8l7A5`%ew__n&EBr0MCWp!`a~ z)~5#$44#ICg%uELXVb~oFP5+m=1{m*=nD6m&F14KlgZn8m3_VXp&M7UOIJrHPd<8h zKl6OqwD|rD^SRkNRwkV=y>$prC#Z3-tSa zF%pSfEfflOQ>j#L8oJqR)~nU3uj~4EbRAm2vaI=hKED=^$8)xAPi-HI#d7I%dJPM` z^nJfUZ(y3{VkVPWH4K9kgJQ8r?WB%lmlt=;*S(a%sc_GJf zz;#_3!>+)xEbu%p5lnak+-DZYiH^rlCX=A5zsYUD^ZYQ@Zfo>k5cnv;OcsE_U;tPI zJNF@xNPuk*@MU=HHr$=WcwQV`f}xnOfTn4NXy*-9t-e&5<30kez z7e!HO>+2imC#k))^@7^U*=^W0_9(+TUI)58-F#L0_S9#CTMPjpiNuA4#XFmukM6Im zTnvdcGehqLH!C;b%=OeioKT)uYP0}SI4cOkIgaDx|54ew&6R>In1=d+s~;ai0K|;n2v*^IV3*p{R1j5VSz*4+aCDo@@ETbOd|wZ$P`+B{-?uxR&MN})Ut>Ob zMGI+~N|t2>ZZYzT0=wN#*y}9?_}9q0TLBB46>PWLn-!?4D&*bWf~IM|E!?Ak`IQ1S z48zT8wfZQ>_l)XZi26SBm``4DAC_hHFawQAq|IhCf4yGwpNnnVqYDum6r0ZH^QB^% zreLxfQ4C4(kfJE^yWK9y6T>hTjW+-_Ns>tQ4AoM>Gw=jF053qVn0JwcPXzb^KB)l6 uILcK4dINYYy>{*HIDjR-xn_YM0R{jb#sgCff^BuP@qoF87z6IF$^?d^$lMZHQl+25jZ;xFE5DJCDy=*r7Bp#2akFoId>{|oZ zu8iY{3G8+Mem{Q(SY7(`Rcg1}(O4{&CaS}#!DO?BwUwWqy>Hv-O-*6qvVzs;Z?-H~ zUX*OU?Daehlc#qt1orKP4``+o7%$)BQh2*0h2>?j)oOuj^^^Py7sp32^7<7X+?>SK z==NtV@*DqUFeuOFHBVEEv9M+z+LmPn3{EPdD1zg>1cN1ZnuJ|u wK=2;TPr#ZB9qH@Pu(tzm)FBS~XZ#Uh0ADB*p$f>86#xJL07*qoM6N<$f)F;a{k^kC@C9xa~45)aWO~f8T8kY zMdTs{SDsF#QW;zbB9X|=o$WVfAb9?o|LlCQ-q3~0Z?9i%PZu%wkm$M|OC%DHL{SVo zRdl;uTTK_{B>w)Hb1}HR@)lN~ErfLK;~n{j`qeN=k!`hFqkZxJWe$|mUg9(3V5aI6B$H=cr*)WO5c;PtkqQ0M~dR4_>C=PM9}DtOof z@VOe$`1R28KG!i!PVp1%Hryqus`eEOT2td->x+qz&;Ifr8N-?|aIpWa;wGj>oJSb6 z*~^cIwFz(>2kCVBNpSr0^ZzRNm(hGWZ%3U2BFl2UR4Q!;0)a4XoSxzJ_G6ys`!Q{M znos9hV@Z-`@ZMt>k2-fL6bhMItp?a55RFFf4Tz}YTiHa4OehorMN$6xi@RG7sa!5+ z{C+>3yn!lqojEw!qW270TY+em8S8|MBlMkEJ&&}JBcw_d&~CSm&^sDED&n^N$gtWW gnvHIc;g0|V0Np`3r!mHk6951J07*qoM6N<$g2doFDF6Tf literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/sort__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..4c70bf02ab215e88b1bc079044cc53620b3f98df GIT binary patch literal 497 zcmV?O)W^Ofq#Y2SR+ys_oxvzOl0(uvUJDC9`*f20n z^JoT=Bmu>p+=492zb%}?fcz;gX&Au!{rlv|FEJcH}7W_>c{i9NWuXg*Ve}phi z>%QB43<`0}R8>vj4E&kIR;#5=CKLMS@Dho19}0!5T_$?H-emE39EQW;mI14~i!>Mv zv}iP1&fE6gwc{jr6L5g$dJQFyfr7X|oFOg|2^v?#2tn)kNs~;wkjH7i@mgB97DSwT nr@Zg&XaGG3xF7kIG@SPoy%mFegdl^Mwp@~ZXyLjp-_y!yw=CI%;tro%gYzHf!h*oxM+WtVD2aJ zX^}`I*6nr?4u@ljL}HQENXQ?v*=&dIt*u?T?DHiqD9SS-8jXg7!Qf4+)#@2iq4`{5 zwe%W4K0k!dcLMjHno5;QWo0UtdmuHNO|!*f@sL!Ev)c9>WWTIndfJQi^>?@$x@Awj z`c{=ECn3qQj83PcVwC+VZz8w#7=FJOsnlC|W^Z7^H4j<-sK%v6qXDjU)DM2|hFc`EF{;6P`alWR2PT4IK3SS)#he!YR^t_sH zGMNT?g7cZDuHA08i+W(76WP+~bgWjZfqDd9uXk}s#4gRsdqQ4tI-Mw&%L7q5T^*!S zsT8x@?M&Vv6J-%*!qzW@LL07*qoM6N<$f{+L;$N&HU literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/sort__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..0495593bca0f8cd6c0056d6074404688acc6dc5e GIT binary patch literal 565 zcmV-50?Pe~P)>==e|+GsSMooTgNV45Zf z@Pc7bLegwF99C$hJ-lKp7K;T?!6f?q_CPcmRj3N7OC%DD9Xt(Ve-LN9UawDvLZKB= z6lME~X0zG$Baw(=kCn^iY%-Z#L-&l=YPEj1+byG1=+@{w@yO@ZYSpS{uh@+d&q|={ zy7ij9B%pU8-n$i0g0_N6rP8wkK@fm=Jzrrd_YDrTBls+iBk@6jU{~-K($`t|GBpAF zR~bve-@y#y>G6o($X6_E%26!{O~Q(7>xr74Gjeee>(~a@}PFnIuU8 zoPqx)F`Z5;s;W}Y;p6)7`Sje3uk%W~TRSP{_xqt#Dm@Eeb?YM)i$%rb@hln(uIbi@ zW0YcY_){>uagcgw2c(|9q420cL<}HYh!2PWjVs~?(SX&ypF{IL`Qpd<9ynPLI0HwA zDryB?{vL6O$UUxi7RF#y`+bFDXr@3nf58BUe*z2ui-rp%W?@Zb00000NkvXXu0mjf D;hO;Y literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_alphabet.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_alphabet.png new file mode 100644 index 0000000000000000000000000000000000000000..28353f241eb9bd6df62817b20f8e755c19675aef GIT binary patch literal 588 zcmV-S0<-;zP)_K^Ua(&O0(G{MN!BpUayxlP1AY#$ap@TPH)HK(dBc!Ua43tl1kqQAL<2Ca*M@c#5Y}?;3PIa zpTQq-C__6O4!6Nz@PQBLw*r5}NeTP?p3dj9px^HkXGa4mole^U?RHyqAP}HTCL?Ra zNrK&ON2nDElF6iO8ipaZCHZ`w#^W)~W;5Bxt04}eIvI329rT1&tCiTbT1_-qb-P`P z$K$rI#X#L|w>E>(Xhfw_$xcwIR7CfBJxZlgozw6DO<( zgMqB;^*VVx9=in1$)H>=ySi=lp<1oF_M8kynoxYmmYs0D)aPGqo{)j^YMc4Hx z&wy(ZA;aO&Sg+T3b4nx(Wh()+kKs49=bH(>U;s`0gN+3L a1sDL$M`CSYoOI#<0000;eN}e}I93AO?zo#%BHn19K-54g3chZeZkQf*a|wnSmmxEBLW~UA zG8R16^ba%mFv9*fIu5NG= zg|BCb2M=W!hr{7M5D5I@1NvV>Ja|&Ve!r*l`7CI++Y;dS`zf7HD?-2DC%zSprBo^< zd*Dfe-EK#y6$x^=9F50gn$2dib}W%dh_@_D_VL%igXwMsxTV|eQY;peb*)wt-|2MF zD_X5qD%Me;Z?{{epx5hBGMOZw&nN3jr6PVb8d0%WR0$9d-d`m^{$MbWgL=KLN(csn zqDI$siHSy|sszKWpjxdelDh|`Qt9R|xE1K!u+4NjeYM9|!KoE+?;{TJ;30u#nr4J& z;ARqG!{N|cuh;nJ6pzQtUq)fW$zCRt$-5Q~ho$>&;~|lUG@s9{P$&fQv)Ai=yLkhw zX1QFF^9*%c!2{zbd;j{gZZzlMH0krXnH4^+0 ZU;xZCUw^?B6w3er002ovPDHLkV1i*-3*Z0% literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_date.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_date.png new file mode 100644 index 0000000000000000000000000000000000000000..bf49408e8a66eb7cf51c2ed2145097271ed1f5f0 GIT binary patch literal 558 zcmV+}0@3}6P)`m_PZ&0RZ_#xO0 zV@nKR8`tBVAEK(dZdNKFdcAO`s>eNbMQnOF%lQS%GIlhxxw)oHO!zFzYAZ}lYp+E` z`P>nYtQ88+51Gu#9Oqk7-Lj@-kH=@lU!7qq^CMsOAYjk zqu?o#0A*;XCD3X$Q2hR%jtyK8pz+}~NT;fro=+wh{D#pM48!liB?(T0!SoU}&~bMY z$0q(7ORC|x9RFuO4Fo&_)wLRE=ytyiL{S9I{!9Owfb`A;La|tU%jfggE|&`= zG{?d5h3I@wI?_{J%a2GT5;hED5!a)gyJWN3RJB?Kx7!V|SZt?fh&OC@nakxKStt~O za=F~~wO+4BFs+tKrBomgpyD%GmhU??G))DsI&+M*C-5L+$N=I+!pI|1p$mz;A}=%n w-FCYAP6Ns^GH7S literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_date_descending.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_date_descending.png new file mode 100644 index 0000000000000000000000000000000000000000..c33ecc9f832a38e6c2550f1299697f621e499133 GIT binary patch literal 520 zcmV+j0{8uiP)hIB;jc^8hs3h!-*WzG?C3_A!3G6Fiu6uR4P?r z&+nLH5(PKN?-4@IN8T-y$y5x(KsueSD2j4st8wgy>R!lyLYC!pyWMWkPNo|~GRAa_ z^SO@Okox_8C=!Y6PymY>=X0Iaf~INEb=|@;#&s4!uh#?jx(osTHLm-&0wx$MP*rtl z1)?Z|>nyTc;Po({PYi5Hi`c5)kNa}Deq@@vlEGg{fwxeA)@Z;WC2A~&V6{4*f$|OK zBGIDRX|*=>VlnIw1paO!w-pSI^SwUbME{iE7ZEwk7Jkc#j`-rO&0-sFTrQ~m03r}7tqFl--CbVsv0kKM*Da?z8?+;SI*^fp;DVk+x#q3;PeM)oQufZ1&1GU7X+|Hh#vC4<6c3 z_xrs+5C}YRfc|U92T!!H+wJIdItjE|EgFxkY7)`Fu|D8G0-Q4~%=pE#r|974uFs z#}i?EG8RyP&w){v1>k**JImi(ncy=9(83q?DDW-708i_KLWqDsjsO4v07*qoM6N<$ Ef;mR;(EtDd literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_number_descending.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_number_descending.png new file mode 100644 index 0000000000000000000000000000000000000000..229c0d83132e9c5aa59492ea1c41bf5b7f80d148 GIT binary patch literal 564 zcmV-40?Yl0P)^yQ;BYuNaxRw(6$%A%(H-MMg^Sd5I<3Paraw&P z!!Y}IhS%K0ZTWm&KcCN($z=3et)>}lOj~hXoBbD6DwWJ^Hv8b4E_QGe3)g4JM;*qH z_xruq=kvYs0sYsIk2*2JZnvY;=_Jr_MJf!J#s{8$Z6gNE{&%p5pn9Y1XC-WJ)3=4l+6b49>$a5AMPml3;`PWL5v2!0t^6s1cO4EEd?HIn}Z^xR`5sFq<4?JG_lt9;N$Y%-FNRU z?|VY4)dE2fz;B^Y2xM8-@KZgJ!d7tX8X6Jjw9`i+H$s2GX~(lM)|~JBkcEkIG@i9x2)6YFrUxonI|4Au-ol`X8o%`E|+7T^61uxce8_D zuLtAt7~=6bq*5uU*XwM*TCK7IUI*Ll_G$;Zt~2mc%jL57Es7!#@5cz0N`-AU8V%@n zyD%6GAel@;CX)%oBuV-n!QVlxR`X6tr_&64?T=AD??7BE7MuBe{^rWp1OG1s|32kW zKJlo4plMnRH4soD*=RH}*XuRiIV2K^(#550u-I@inal)LRRNV1h@wc?Ls~AEW;7Zl za$ixDY2XcDHcmaI6h$9hb)S}ir7&tLhZvlCpz#-$JO$U__IZnyLK z{r+cm(0>K-$P+DWw_7?Mj{?nRQv_r(nLmplPZZc}HiTYLAe~MNBi6qOUJZFy3@Vk1 zFqTRsYPZ`o7z`*J4pS@^yDDHaSg+SMgF>NTGthNi;1(lUmI--REfkAIVXRiG)M~Y; z+wD>`8l^-c;qobp^4)@yLAhMEPmIUo0@mK?L%hX6o=&H$$z<|oj;{^tUI3>ZafnBr zxDQR!LOcVmNrd$KePg*?;>{@%iR3RHV#URJ!{Kl&1%pB2$#QvlNW@2)&1Oa*5I}Or z>-COYe}LI677Mbzp=>gEWIQnL7*C9ln0KNDz6j%k@eT&K4vex@0NTsAH??wOeoh!b g6Q9_lz?T3607J?-qZI)1vj6}907*qoM6N<$f=DdwS^xk5 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sort_small.png b/interface/ispconfig/interface/themes/default/icons/x16/sort_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9f17a434d0d08b43931e70a559d776db2c5dedbd GIT binary patch literal 370 zcmV-&0ge8NP)hKoH$UAS%;w0Sk$O zh&H`1fm|UPOKEcuS2U>*7jd7KgaRpYOF_f0;Un<8jU15>XsA5WXqkD#o8K-U$B}Ij ziEWh41oG4f!;neRH>aW~2Iu@hEnd2=`+{#62Iji%as?E;r=TP0DM^wS$8p|p!iFFC ztON}4uD1Q`+lUXKMEUu;L~{MuNLaM-jO`DZ97W@Kk(HV6h*-(o6uRHEDL;< zAkTC0^M4iG@zpg_K$WKHCpJMF5JWg(!w>u~0iWJP+qU;j(>$YP%d*TM2wpwUJI8UH zkgrlz^*xHB>mq?^nyf5K@l8`V2s=;(7hTuIJD!iE|N1k=IU7wnw`b_nds+#6M3Km@8fgiS|f1me!GR!gM$}Znw#fXOw%is3WN|Hvm+zpRrS!N!~F`W~L*dOfC?Cr4g54JtxFl*=87(b2g2 zPPkpLg_XB33ajw^is_jrN1k={21<$JvDih9*r33jhRS??hvJt{uwFj^ly+~ceF8c1 z^#+0y2+{d89v>s%^#H+LfLvdO*ClaSyum(C5j)(q2IR;Kr$M<~hSH<_WnxhhU>hE;jTg1Ve^EfxLh`p^xu~CvJ zy_~QwksSFyCMcCk506EoSNMi?)%csb;GzURdge($d0KUS_j7Rg+Z>mNjRm|JQyBFaV%)yp9POnH2y4002ovPDHLkV1n^I BI-mdm literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/stamp_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/stamp_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c37036441a372afa52f1914b7626c8a97cdf2f GIT binary patch literal 774 zcmV+h1Nr=kP)24szm%r#O;uYhZv9U2UzdzE2Z=i2a5j2tjWi9K6QON^=ck zj1ESPO-;gZYpdnTn-B!|26Rhr;mWRzBzRP$;!<;SeO6}X=%0&3zuylk{F(hl$y;ARN^5H#%Oqg?{n~MI-yQI z2DlOqhdzNg;v)$Zsz6bUW8K|d1jNcf`VoL_eM79oa9a6*6xoAlZ72b8#E0Xc@%eo8 zm`{spYJ^dXr86rIcu}7RolXab!x5BTKZk^j0(7|&@oIi~Sxl^AUcU&B+a0Ok;<(M$ zNsqM4|IXzeJ5JsnhpEqw$I#DAlSZkCSa<$?FYN~g`X zTvbs~I=QI@^~;VQ*xA#v`X};plknLMY_q@nsnNibhZEDmh2CID)fX1taPhiy2E)yNJ;~HDS$t^E_NFUlQ5l8Y2>d`CcEFfuaq|BvNBU^>8!it07GZe-njdelc)+xNz*B>aoU*c_l;RFQZ9_?3HhAgk+&KL!Rz(XK|O}TLawi&p*A@Jcv*A|8jS{%laoOlIRxm^(x6rf za4auaE+;>mQ!Ct?GB`Kb++0hSuZ9(*3N{(TUO8kVwb@gl*4;)Al@=o89WPeVv%@5twZu zNOn6Uo$mEUjt#@e*jtD6r=)wEelDJe=a&Ej0GptYXWesro&W#<07*qoM6N<$f*mq@ AIsgCw literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/stamp_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/stamp_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd5bfb7982f6daec869d84c9d35ebae224b288d GIT binary patch literal 721 zcmV;?0xtcDP)Ptm&%8|SdFj;Gsuw!rEelc%p_2AP$C#D3j!r1>BZJVC9wyY zBtvhS+k@M3XLt8@zHRNHNIUSq-#PdDec$=+Ip39fCni8cV$3FtQ|Q%hR@byu6b92Y z4Z5z|6h&$7b-RZb7Z;s7S>lMNIFfXGe4G+p>1%6yL=)k}zlJ19IqM4qt_m|ubEB%N zpJ5Zor@>ifa=2i6frkNQ~1&RbM(gJH46!WC4;4>tV>L&ElFwe&UFyI13i56=Lh zgM0FyKpgSK1e_}1y!Ex;|BwK)4A}Pr>gEc}1{EjyCmfYiC@aY)AddJ#99TM?hR};9 zkEerxnsVU%jT0z0??WUK!R+iTVhh1sMdT-r_==?^H23rrD>y$hI{JVPDJyQr^*Ds% z_hxW;B!nZi4cOXNu{}SMJ4E7$KQ=d)?~OAZ9n?IP-xbC6W^8OQ5GjMjB-((Bk_Dh@ z;s8Ajs8H5$_|O3;;c&E+^Ek_9x!CKYF_}nEBGTF=D8=G%-1^f#Z*SLc%5v0SU$1wWOwl`xeZC8X?u&M&zO53n z7_C-oson1QxxBovn^j}6xQK~~npUKpexCmszXTWnJ*b&EQLme#00000NkvXXu0mjf Dt`bey literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/stamp_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/stamp_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..57c91bec159848c3e2c159733f4b2369ab79bf16 GIT binary patch literal 801 zcmV++1K#|JP)%_*`zf{ z{BJ7hoZI!f+waUN?x8yH<@@{n&gY!pxp#M*wyg~m9M7wmr7{`+=aSPo0eA3DrxTJS zsivl;PHQtW8-|94Qvc<|5l?j_uC%$C8eOf-$*HFWOX6?Aah%J`TUzp%HPBiviXtTp z8D(W$XJuvG`M2v3mS&;+`5p@gGB+EvCQCS1UY;Kn8EM$Kh+kb@g&+v&omEwJYwS?Q z!zF%s7BbPgxhGMcIO3^}#0#_##TTi?#RX0VC>ThR&6uFD&28>UlqZh(T_zK<^YYjP zf&jtcNbjz$)~~Ub;w6Jim>7h7c?Jsio}BW;5r4#JbUy-Xz|?)JprDXO^k$%+oMk45 zVf!@(sqYEE6y&r12*e#V7^Xwb=I3j`abBPa1R>+4Uaup-Ujc+~2gJEi_{&7Z3tzBX zVS}&NdV@z56}o;uzua)G_RK7BOYU$uXp*kv++5C3S63Ug1L(;=1f^05i^bxSN;Qn2 zhy*MIjN{6+`lrT@4$aAkh?;Ck>Xp+3EY7}eYISz)&Tn#O+2v%V@{;N87KEKXPu z+NZ^sxD2B%R+EsD(lcteKh6RMc$&a&w?9kF$||A}=UCzIRlp_!Ba1-rB^^|Wu}}tl zgE}r2_iG=T_l7Jr21iE^493T^7j3oD1ey=+?KSk1UI<_I`1-8VA2GS_GY-e4!O;5& zX_ve98}GD+?TiHaHz1W-y+@UlbYp>iUP`t4=7x{Ynj)K_lM=j(HqIFz>#p;RZ80$(PXDd^bgsSRB6ln- f#N&K3{s=Gt|G;A4$2<1ObtS?pogI5Ln>Af zvrJ61WoDaqzuiCm&b9_6+7G^b&+nekIrrS({Ru6-y`UwCqLrJ2Yv_NjYuX%=OVl(C zx~^O2=jV^NR95;XCnp^nIdQ~O9Z9&+(?g9ex~i-1P{5N|ZwZ1B_h!GpmYa`aqoOF3 z7_4Y&68c;&@0rmAgq1~@Kfl0IVP&ep{Zbt#o15zj^79A(yhx12VqlDw_qDZoRsPT* zA}%q!2!rw~wI@-YIO3^}Br*yV<%y%Qv0meV#6gl_;XR~CD77b1o;c#EjwHqy1B*t> z2i$It$`8e4KwOxcfHAxPDY+-7JaNQR9Z5_E17-E~muSQ^4sJ2>24ANT`8Esv%>#fd zdsE^Qh$BALfYAhuRSbJP9Ry@ZKwc)Ggl3RoP_U1^MUE7~W>ca8al|Lx&N2y3YcPKi1 z{O_E)7r^e;5uEJ`z*e{)E3yLlWf#W3PvD&6bdIzt9Tw%p?-pqSS(f{YtE#Tjh#@}E zatw$lz=xl}HfIN36-RM*$1~_L4a@2>m@5C!R5bt{KB3s@q()bUJ3DW)#GP1k1CI?I z#nzJSHP4^-kB-FytKFV!Eh)LS#IKjxZomGopC4(^#a7GgF8?9DaOR*c+{_xst;_)2 znLhfETrRWGVzH#><=I!Kr(dt-zK#t>H2pNt^j=r1YYq4IP&yAL>kj exF^?d0R{l8a+nDAy^nwZ0000V= literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star.png b/interface/ispconfig/interface/themes/default/icons/x16/star.png new file mode 100644 index 0000000000000000000000000000000000000000..353bbecb1acdd3a5e2157eb195b464b528ed7a18 GIT binary patch literal 750 zcmVj#acBTF=`Du!9^7)@?#yAliPm8^8mloEz}GI)JJ+ zcEdHdXBg}ir>27~?Wa3Y(MBJ}nq?mVr8Q0Z<*r_V^I|-4V}7Z#7kwCO7J;=k-t4q( zfJowahoR=!A9xUM>FX#L*PkB5GI??bk{k!aoylVZXU^Y91td;%tRgFP!PeI5uSjjR zJK;sp)T)`Dex2J`U&**G4D*-HL0J^Zm~H;~`*UfkLzF`Pa3~bkwN+59GL-cK6f1d9 z4F%SIWPi_P-puQ2;Q=H09^<8i03Zm&^ZCfUEIFUcTiKKxZ|hc^RoS8nxP&ps+hCh| z;n(uaM~={2tZszynrLQ5P^@(okCIl?}~1KVN% zy62~q>rce(NWiB<(C5?Q~6a-G#+%%ToPQqOJ+kXJ;BCwQ$=*2;}u4zspo2`8P@Ws3R@Hx!Bn}S73y$qY_ zARCwBKQe8+>VHkeT|9*8-*_u+EH65Q}(=(6%7QN#TF;27$D) zR-1}344m2Kx6zouD@g_WbIg0KGUQn1l~bQeVA;yFWc zAAd}~xJ#)|9O1D*j)d%kJSG%Coa2_BEHv`7+FnCaL*hKgiAJe^eGw(#;*u{E5?1(l z08^7JXsGBKFmVN&=PJ~v4iz|1@)ab0){oTy;T`}uegIhzl-ALxG1nctEjuV8g41ZK zy1t%=zUgBy5OAqIV?!bE6IMsRn#$C8P}!}Ku81DyBh7Ce5|PJL@@fj-oo z8pLHIWTCja{RZ@vUTlk23`ml`v3FeKYPpmiMA=0iLK&Kg(WaBo!qDJA=VF8c1S^7F t#lTKOee=7*(|1_1`ogu<9O9n<0{~$PE5^8FSVRB-002ovPDHLkV1lr_ctEaN$Bw5JVI~!G*Y~B8Z3xf(UM06f0N|v9%~IsUX;ei~2)r zV`D#718x49{3bKwoAhIw_Q9QdIrqLZ_q}@_xqFS^(|6$FX>7GluK2#n#Qn!Wzz>j- zK2ipF4v^(d1ou|_rS)JY1E{6tm|F!+z%-6stMiF+Q>z)|GBZBv=FGUH{olNSV3pZs zTaF1qhqI<@J76H4oar!(WdcRn*dkNeb3RZ1QYu@gyQbZ1ni-pznX6oz2sEv1je^+V z=NQAq65Sc+BnBB==C=4 z?l^elY?EYVETv+cZq%V>f0v6In)dr0cEPWt!e9lj`sH&d99amD>pFVb?!!o0EM!nE zEJkOi#_B9qS+L8pJ(rz>QcNP5iy@wzg_8IIU)yC&O+1LjV)0(u*bRCwiPb6Sw2OWV zpMN*~_32GsJl0br5w}6BKxLwpVz7GxhA6p7ee3Q+g&t)?cE5e8HGcrL;t` z5FsL`K;pC16d2h>cxu|oiBr$8t-iBa*T_+=1WvTlDV)DfKg57qqy#xb&@^U`r%H85 zd=552r?X4KDpDPl6buXuP*Fvkg4Enb1=VE=s@%ctM{DET>2TRR7B0-U2fP}(f~CSFcz10JJ^yh!Em9_!3Wi*8bdV&+JA*p@!)7A`23B2L6YFA_qpsM z6M;G|WC;fvME)RhCUXUoz9qf`NJ177ZsT{ zA!sY9JhmG!5R3TR48tUl<;@Z;g_>2BR!L`Z)LGeD&A@EtW3j@sg&>p3qShwvYTzwK zDM$2Do4vY$`B<#*@KoAJp;Oa?`2@YpdRb*|cf4eb}hqq8`v7o!Uc3)e2 z=Y_f*c8icst@9N@xdcAODTjQw%cc0oHvhi>0{|X|BHz`M$jtx%002ovPDHLkV1kAIV#)vj literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/star__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..ffadfa84c6a954fa5586957db70eb938424dc3c6 GIT binary patch literal 874 zcmV-w1C{)VP)&e_!La^OAZ@Sf*+&U4=L5*JPo&^rilveS8DDanbTbPMDxlQkzF zZ@B1K7CIZ(G$>|Sc2$GdTkl!E{L+3+dqyq34!f{e5_^IGw>_;m6Ws~3Gh=Q^f?PHR z$6Bu!ZgaU@C&N7dpc0^u`r9+MN>OovB1hVWbSyB^e`_Bi8$1=qx81nb;C1EDU6T>2 zZ%H)){|G2boSbcDGFDQgmNXrD2P{h$c`9n0n2gTORqYkLj8%x^DfF(kzeSK;usI8t zPJZo$k@xLTT2|w1ZfclHO$Dpn2DJ!Mi+Blv;SsHxB;j;=_A2+Lt%q~WMv|7rY2;jm zHysb4xS|bO?|5KiX{94G*X3YiQK7r@-dOOvj6dsc7S zT`m$qhrf68!m|WEH1%V=>$%aO)hRMe%;y&sQ3GCp36)jDq7WoZ*4Q6)iLwe2i6~)G zM@%fvlSj^=iO@h2kpQO|6op*lOqOhBJqH$p3KqQ#W{QK9WZ9-D#2SpjSj>rYvC8?z z#P^|a*^(?ynwr%qqAGT`4-LHP7#>hWPBiLyoy~4^VhqM&4j%Ew{fUaMqHoE|h8rCW+b}K=2*O5*rc%waOkT<5y~9=0T1TD66r+2kwuwO3^X{>5TN@b@ zE;l2i++wS1q!`^RHHJtVDFrnRpscdFRu;k}0}Q-tZ*3~Ec>jNGLic>&F`1yR&ePP^ ze&k}k-Da}p)C9R`fF>>!Ua?i@zmeGrqL5X_0#C!S#krtiK%cq06H-7a zwN{(c!aJS3Bt}3`Q;?G4kVr>CkTb9_KehBR_-s-V;{Bw^w@6)*t6eaNiXkg2znz_W ze3RvRPN*p6!bCpMF<}7|S&sKEe^TGol$DbVy(G1vU2%1N5i!ULj;7OkQdMGzV+63X z;+i8PiN5P*?rhh&CeZMHP%une88BVCPFjI5XeuF)utnER`zkB6GCM1Q!(xDg&4Dlc z3rKlkR%{s30iHs6QIYWYhss$c=?$IIuh$;gVnHb#*6i z9)A*?2v5!}fsQAb;xKV9{JXg4&~@VHi@S^K?6dd4H$=)*I;n&v23z( z80mVh&OP@rbH;43SY$?{5tGm7nH%d~-+!0`)oPWA$Kwo#4{WtsF@C?_%!}MA0B$y$ z)qKtXWm(qDX0sU(?{c}^aQ6E>Pn!V$bUJA~V_D3VjY7xc@h%(=%P{x`4$kvsG0(i+ zZjp>mZ=%uY76u;}V&=t}0Yy<5mSuU5$KwhF0*}DxSbj?8DJJ|^;BvWqHiH;7l}e$V z){>@>+wJzJTQae^T<#@x_?So}JcUAG6$*t8giCr{)OWAGI~I$Dvr?(}hr=O`*0fS5 z+3WQVD5z4Gw|2XojYJ|M9b*klH%V1hd#lxYRjbtkhr{6~#lK6E^kiJ3%5mJUU@-Wl z-|usi$po?~&kY!2;DDBUh2i&WS^?IE-pU=!@vta~5 zuu?FXOeO`r!wcP1V2FVOE^?5oP0(mGH2KJaKA-Q&;cy)1^LeyXDy3oYfguJCxX8h> z;_lO=K@69q14JN|&Y`g_K%|qWFR5c_+O{mADW3-JGrkpfO1kqNE3sb4X+2rtBy{ sm_(hwrPJwTEEao5m{Wf%%3lEn0O815@iXI*8~^|S07*qoM6N<$fT;Bi6i|NjtveDO0p~;?;a%8_XpkEvxp71+Z{~0`p1WSJ|C|r$_SDG&+`W~ z9w1QF4*Vu|c#NTShsWb-7>!0N61dugxhELZI^UaA6ac&X^nlp>4JIe>*oCyXxOnZb zF;UO%gP*1$Hsn7!aqiOXfTfQ%x8)kTsDaY@3(k?}I3sZE?q|#8vSn&&%AL>WiL|8Q z%0<{Ro2fZP+Nk`=CkM=ZoXN&yk8^s%i%*(gym0WdG_zBxeiL4Rf?P9U$%4V~S*Xw=FFw8g1=^YRLtIhWVD3jp8x{@ X^pRhZeCQZ!00000NkvXXu0mjfX1aF> literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/star_small.png b/interface/ispconfig/interface/themes/default/icons/x16/star_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ec965f7627d0358e423954cb9ae3e3e577d9e140 GIT binary patch literal 406 zcmV;H0crk;P)gGXSXmhuSRtYuK)e`;V}ba`?>`I-zkf3@*oOYY?*fpbe-Jf>P$5GQA0$q+7eI>t z{$;S{6*3eB(YQ2YcmZhBW+=@7aZ{HOeP#091|VA zl5~ZIMR@=H{m#J1$jtEe^|R0Wcdfkq^T*HpjJkhkaC(7>iQx=4_s_huN2Xu+{OvKr z%XgOF>BW@ct$2FfV|?(9a7L8vqbs05=bjaRx14|GX z0}Mq)MJho42QDry86f{3kSz$5`-s;7pdUe$Fp&NUjKV`eC%<_A{=Eb+D(yhxK>PsR i0LG!87brFWAiw~x>5g+wI%`Y-0000gGXSXmhuSRtYu?|+9hzWEtc17!dH`t>UV2fBybu`1R|T z?Dy~A!J3Ko0>}`cUTZEM8Rj29ekgzY_Ki3%0Bzn3r5S$z0Xo6j_wCv1mlc6RX-LXu z;WXg-O@>Ae4vvYAUP-#b!Xmt^Yz*@Y3k&bxxN(EKyStko=$hSly}-o8aE6=vXWrQ( z(=UAf_L$-8k5`|8!tb_i+a{)}s=9}Th2`>hHyGxI-SKneooKH@b1 znyS@4e)x3*NVoj^_y6Mi_wOZu$=wdf7Y5=7=mszj{k%Z20RRC80I*Dv$uMUF`v3p{ M07*qoM6N<$f)Yf_MF0Q* literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note.png new file mode 100644 index 0000000000000000000000000000000000000000..a73a7585291cde501cf836c13f2786fff91d7a7e GIT binary patch literal 467 zcmV;^0WAKBP) z2nro_)Jb<27ypL1wNpnoan?a_7rF>et}T`F#0(9u?;(U? zOJwC8%M+}Yfno_#Mk$gchB%fGMG|JS8BC{NaJYX(4d8@$JGliWTQNjIR@jnhjh;RKG;(TXmW;CIKJD3^(d7x;QVZrFp;Ux(MGKxT^7{B;nFrMG<1h%+Hid6IQ0{}K>veP$noYnvU002ov JPDHLkV1jRN!u|jN literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e152858ec5ebc7d3aa198553a07ee0ebd2934903 GIT binary patch literal 608 zcmV-m0-ybfP)mAFudHff6>7qxUz5k$3-6h{P+0i9B2 zW9H2B{ddlL^TyCo7hO2q^Ugircg}b2edM|>{%5H(Gvql$xXWAX5&3Vq-kjqAL0vUC z;XvE9-ZzgN$6%i`V8QprT&(=cA(wj+Dy7c_xR9`wjC~unZFpu`CQQ?YVc5`h9XmTk zT)#ZQ1#pXT7t0a^9FP%(Sc*vU3n|KO?^|1&`1tKJB9T-&n|*zWLwzLz3UWBz2NOB_ zNRqK6cWE*~1ck!XLZuEAA55&dGKoKI61nAwYTLU6awsx*A_tNXDLkWp2=;a$G7cjl z3Ln^k>VwI<<4PpYXFIX{yAjRW{aDeehQ+tDPl7*4R3us0s6y}6bC`ZNnAo&hQrh)Jg2I%glR9E6o zOok*ng-`ael@26(;`no-1;;z$a2gu0ssUYzlhOI_%V(rkBU^NMSQ%<>$JxD)|NZ*I z_)qP8z4!%9!>OMB`e?*qo?zu?Dwgcf urChiPUDLlVJ$+&Fu%CrpOiKK(00RKcwA}DGS%aYf0000^@RCwB?Q%z_SK@|RGvdzYAl7__k z3lgh^qK67ONku^{9@>k7h~Po*UcHF778JdRH&MLlAwj%U5PA`MkRpntv_>IPkX1;V zZcUT4`#XJ;-OUdvcyQojA2aX!-uvF{Fd+o~XDRdZtQ9bZ+w{r)BmWK6D|#Lf)>Xn2 z+8DVsk-zVG7R8hS2YxIe@bixjU4O)b^kT^4QY`?*E?n1Y!EtQZwhPO0VVWj(cAA(x z_lyeQI`PKa79=?oV~mp(X~{1XiFA6e)i&{AaRI7&^WN&}>oc@96$r2}hthpAV_u&~ z?o^Jtv`Iikqw#8auMQ$UnUUwcMf_niX}7(jxNb*49!eWDkv@^F>PKvC6p2eN@R=D&W)cJbE%b`ijPKw|5}s|KP$-a< zU(mE;X~)F{+aZCK6@l4Vf$eR?fdL|FZE(I1Yx)z90%84 z=E3BzoGz8bk)REi!u8@Idopo;f6@Y#(KS4{H)JOQZqo$x_TLiMnq+Cq5Pw> h`=BR>(*^AcFaR02^O%VOH?aT!002ovPDHLkV1ic%C`SMQ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..81021bb04e7b0dfa660216c219eaeb5c2661526c GIT binary patch literal 507 zcmVJNRCwB?Q$0%qK@gqET?k09FrAf} zPW-}@1}m-7+1S|FTErqw|k312>8#?t5uWR0zXfS|7)tkA^7(!$Y}=UJ3f1vsE` z4goih1{lV6%rCD8xEQnfLAeXAYsqjN8*JMJ%W}aqP3U&tU^%-(4PcdUvpow84#*H= zWQ8rMMw-^w-fp+x^!yAGiM3+0c{oQ?IiCQ78Y)*{MDH6(W->!6Z6ZiOr*m)}ra)6* zB+ua_YO|5;_GWa~?Gx}K+n^nZBtg_@j|K?7DqtHwks!t+73d0#@{FTM5Or1{k6#>z zSWp`Ykt96F7PJzrGz91+N{U4ZiYqXyfKMc~&0T0+-ueoN)DSD~6U@_cO>YoOxeQP! zV3IiyhZrgYQAh<3SND*cS?nLhbT&oL)Lx|`TaHkS=JVP{It}At7vO#0o3ii3aPUpP xgK53MvjK3y1l%$?crX4q9Ew-`?{)qVU;s*oz4&`<1*`x7002ovPDHLkV1i-K)FuD` literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..03123f278659ab037055bd1cb0b4bda5c342c261 GIT binary patch literal 636 zcmV-?0)zdDP)o42udKK!K$gb zMDZt5Yic&TnH|5$?xsys?7@Y{emnDi=IydfDTV*JBIDz%IxvQFblbcHe~j`{o(F`v zk#L6=wj9`dzu)s5nu&o5{8>X`>PsH^{8b*%Q=yJ)w*WLtNa<8jskm@m3CEErm&>s2 zKRDQVlLBy>blYncv^X?lj8hd|$qy1@?(8!&(|G>+B@E;2rCjdr4q7@I7_g8-bYIMv z*I?4Vt({Kkl7WHQ**g<@ZP~s069`|-sPp0`{>x^%uCV%nVwxCI0s(~HoL^(^S&&Ht zoHx_ljA&A9Xi4KC$@a~EiNa6(x5?LU4$`^xn_343y1oOKBRU!dxBowjS%cu;$k2m7lJ`vpkAIHj7Wg!*YZu zpEb`Utkot95$|EwRdG@cU1YC%PU6IZeXTLs5`UjMf1Ev7u@W~5MfGBItda0nfB^u2 WpzOffHR?M60000J%=P)q!t^Sv?~4q!9vg~O=^1${DCL&n`yM<`!F3f%r4lYL&oTINjvHWv zdC#jBgdBnWae?*ecl02oy z0&x_J3*VzAunn2mbF_$AHi_M8#!>28KrY1wZ{$`HBAa(~L*VZT#Kv7BM6p{Za15Es zZyY5ukzGcn@DnwD-9Q^ZbJ2^iU>1o;k<9TvUi7}k%9mVIS~+limYtaadm=&1kj)gK zn23yL7SX--5%4rl)hXa=V)7<5=B#X1V|G^K;sUimj0uS%}f6I&_6`` z(7>bqH+@Nzf~2%*WHe7s+G8y(coOvk%&U0EuD0qWZW`{Y&!@HyPCPomZjhE-Lh>SV zFQy-SYyQ!$<*aZL@*KQN6d8p((c=`*pt}kiN8r)ZyzigP)*lc0rGl(pLh>iV%#A3lpkOd17Hn6!kle4)& z5OH8g=48JA%nTFJY9TfuklOsVSf}tf0xn)#(GyB6ip*2z&i2Wt`Q-~(nmatKcbZL` z!mSeijr_VGK#H>)t5;{f-^a&|i^tPje4ZTCH){*^>X=MPtu-E=j~YoV!w?v_3<3?$ z^DwkFh1%^NW_BiUci%;?*Gt{^O>V*!1eB`K4MPwx1F4QmtSo24ky1k`ry!uiFilWG zXjoPSjsw`XqPC&}Y}>>1v=c$#{aS$*LdHpnD2wn}9_E-BUD|@FK*nHJnJmB@=Ub5H z=iH}Yw+2g%q!Kfa3^oELml9re*pC1M0AG=z$(9UpssI20 M07*qoM6N<$f<0s57ytkO literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_shred.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_shred.png new file mode 100644 index 0000000000000000000000000000000000000000..87674f4bb7496921ed57e5cb34310e3aa29b27ec GIT binary patch literal 592 zcmV-W0GM zH@m9|ViCIV@n+t<@0;(<&IqkF-Q;uj_k|e+}wm}vGI@y%S{MG!pzdY_*R^?g;=9jwur#|`*dWRl}LGQ?epnv+gZ&}8H zGv#1HAd)g1#!09^==!ZbqRT|nQaVs_91T%7C9t!Di2z!iZ|~b2EBP4=G@Kw}j{NcW zk63S^9z63KYc);4%8J;nRzE!8+*9}T$WIcwgZqi-1z*klOQ%ua+ta)C`k(iMOJFnZ zGVU>MBe}6*zdAV3{?d|o-e~CN!h*QJzOJ?kPQvIhF8CoTQQW{=1-bGc4{*$gA;bci exao8LCBOiK(L73&CS*PU0000|^4`2#eJk>SIKrMHPP0OT-`3*gRV0%2CD z9EmP~0g!=28SwizBRc~F8`#$W|NnvF1xzzCGD77D81Ur_S$%^Z)<= literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_small_pin.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_small_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..578964ab4219d1ea028b5a52981cada38bc517f1 GIT binary patch literal 377 zcmV-<0fzpGP)~V7TOcbR=)s9Mcl|#MlXr3XkKX_wNCaYqPYeu(%BiWocW2LL1L=dxJpkhQ zD5^n$h>UmaU}*XCdDj02OEdrPkeC0ztSsgK$CnfS|Nb=XKS&N;J%$VZ{$*hK|DTgV z&{>7S>{uqluirpxAAV)fP~!#55e&pXe;8SrnAjND*!UQjnOPaw*%%p=75RZ|F0dTI zK>YKEft3-cj)eu}bv~f2KN(nAxfnoVAUR?TU}I!tVPIln0U82yA`>&%B_J`796DphO;fG00000NkvXXu0mjf9nYL{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_text.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_note_text.png new file mode 100644 index 0000000000000000000000000000000000000000..c7637e281bb39be8ca7850dc333e0dac7c98ea76 GIT binary patch literal 548 zcmV+<0^9wGP)fA-doFB_Cq3} z5JBT3A(WI<^cs!7vC$EQQYUH(iC&_Ss3a;vw!t>*BNCB~-L)SxD1vzH`6=3b}_aB)IxhA?lo5-<6zTB35*cCP!PPU9Taa^@jk_hl5nS+;Ad? z>eiS^l;$&P68P%i=05F`UDd#ejFuC{K~GQ1j}H9iGYB!**UeiU!CV~p;=up0h0sBg zTPSnIREl`6m?&0dRG(W|T?H~3_a`FaU~)Ji*NRDV22rd5r37tm^t?8P%p)#WIKq`)(%G!-JwI2Eo7)Qqe|bPxSM-?8nlTP<#e0kq mZ+;hl{OXJs`tNgo6JP)whXn0Ka6vKv0000S+)J(^Jb3^oM0oz5W5&>>2p|@x5yGcoC;IRguRyigQDEzL8eK9sTB7T*eP&6Dk6|eHy01NtILvGFO>?smCHQhAt3z} zMnx!eyF8aju-&1$Ytdv9Bo4p?ZVE_DuPI7UJ{zS3qES-AO-< u&PB%I-9YK1h0p@d_^;Lyr+O#81sDKl`|t}w=9dZp0000s literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b8e2eae05065c5a670750c0ad7de912b7d1ac3 GIT binary patch literal 668 zcmV;N0%QG&P)YCd@6CJnojK>;dCV{j{LdrL&N47&y)?P#{RRzve>pRw z>&Otye7Su`5ZN1{3um9-(RG#Pbz0k@QN_yV5=y1}+)mGkz<;H;NhF;@qp?HKplLc( zwSih~8)IXF7*R?+VOp@ywImAy&M{gn%|IyV={^OoJ7^|tYh^EJjjHf z1dMT#FF}mW#HQr3(uGv!WowUfSBrpx*+YrkQv$Q5B2r?z7 zQXrb5caWGqsj9keAhtY+{Q6#8JGS~efz?rN|5TkMoXcqF4DZWcM9v+-(}g;EHYWz= zr{A_Kuq+rxC&|5JFFq)HP+7aF77BAU&FK!DjtpQr9__Dm_upz$z*-jCN!}rZ@cF~Y zSHsTz8k}`neXRgzu3kLw;=6l7%4QixMp*RZ@#{lY9UL}f6U*s!yjjd6x45vjG{2H{ zc|Aej!F@w2)HXz)jEY{7zvp6sRl0~C5tym{}T;6W%-(4$8Wp7hXA1W_-&^j-|5A}QEPz-^>$ z!iH=Tl5~IgW|F2$#9lh^X6DVj_vQ2E4f8w?XBq0+8Utf(=U9vUC$xRcor++BI@x-Hrt(OHw$7Iq5;4C58=gl~z7_sVxf6qhE)X_DEnZ5OSUgGQr{ znHeFBhZLHYC3Nz-$U=Z~+|L`U5CntgCJ_zmGN@81V}1P-!r}SFeE!1(9nGquj?<72 zOW#NY=!@vMJ$^@01p*2z>wQj^AZk7h`O5Wq927TDtM5Tk0%Rc~3{o6aGN?j;hQb&p ze5LJBpdT5C zSD?i&!`#oJ*+ghaVK@`WoGrJpO>_Nnn zAQllRmeSfo4aAan9&O=)+@G6MA72A|?cs1E-w0WAr2W70hwNlJ c0{APy0Fp`gX{uTQO8@`>07*qoM6N<$f;(Ff+yDRo literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3cb8b9587ab68d2dfa2fb942569b2ef50d1117 GIT binary patch literal 678 zcmV;X0$KfuP)RB8T;_9`@1kzC6llex?7@VM-FtGq3u7}V){g{+2J%|NxP zqg>v`;Gh)7ISM^umSE>Kkfi|UIGM^sAPM$#9fRB1Z3b;@XoyB%!RZ{nnMytDrL7@V z*0CFMHa|-uK!>XveTPq&R1SxN&CRC?vjkc5Zpa6EhOwTT!PfRF6vaW-PK0d~2espQ zlK^9!@D<3h9#}{ImhZ%D{AI&eoy)*?4QE_0aEj|XBQ?r|d`|XUgqei`dd`n{v%qbYP|VA;2;`#>5)^Y&ikNlMtr~`amRrVrj3aRI9xk8teDMo$ zhf4ujkM*LKNGl2F?I;&DtSr1mU_i&jqpRrZFQr4kyCwpw1R=QnGk=q4xfP_BK9z@p zH=N;#P`;w_q^61F65wqJSa)ER&@57*WX|0Fo9bmRnFTH~;_u M07*qoM6N<$g4n4%_5c6? literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..40ada63822db88db6c518b4e1f09a6c5f648cb24 GIT binary patch literal 640 zcmV-`0)PF9P)+cg8m}+fqn?1Dm{=oqcb9`+aYAnUoU8x$Na-2FA>y#iI3Hn)(melM@1Y3SDn^ zW)vt&4BWUf_eh9Ma6TP~qR{MpOm6u2)rXH3`vuS#C%T_)Plf31- z1OZNT^t41p9l>FtZuU}yLZ%YD)1PzrQ1g&E*@vqUfGdEZaeb-=#P-Gb~9ty@@di^Mfgn0!WOc`myl*RdqAu#i85jkxz3UUDHjtcA+5q z*4CK+^!McAL4Vv3MWQH+PkNGL)vyZuC9uOXWE@IpH$|7`9d%8|vLq`_8(oTfI1|Tz a0R{l0@f3WMzj$f@0000s}S6{aFL4^5wv;eBLYcqD@bXe5d}h4 z1`*xI{WqO6)4fd^b-0I_GxwZtelur8vk3?RoER360A9^&6KB>pECwmOrGbZUn))Ri z)3oT}?>0hylqcVSlgCF#>l@S4K85FQ>Zlc(Q36&JbM_ujcYh|u?KU{KOqPL z#Ib~-|R?4R? zc_d)za{;B=P$-npSxE?0=fxSake(@)Gz!{07a$aqS1cBBVE;ZuQJMS)9ZQ?y3|VWD z7w-_T$K*v$U<$S*3I9M&Qw^J=O!IaL@MjZXL@c_4obtc+U!C`;#iDIuLc0XgB=eoH zNETvB9$_3=UKU>_zh7$LAC@80^sT$jJ?u1F+xh=2;9cE?p8^a3 X*Cxj$;kvOx00000NkvXXu0mjf9IF|! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_stack.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1cb62cf9c6ca2ab040628a43207db2fceade30 GIT binary patch literal 558 zcmV+}0@3}6P)77_%-&O(G30ulTW^c3-rkr``Wld|OS*@>IeJdb**)uwnnAiG^o!kxL4=v(KQSwv!PTwA zwOZd?ZgqprnEPMm{{Bhm^fKC7IuLE`L_WWgwIxU+SbwbfA)mq1lY^a|b#`yZ`9%^V zgER2`pnO-l$>M0<_`U>+74@09P{VwbyMa>mA%GG9R)-%;b zWRo0NXTgag7JyY2+d=LQ@dX82Ss7%YZ_s8Hi8vv%*2WGXEJ0Aj1{ug?bOne_Q>l!}Tl$AP&yY69wP5D`Bhc^no<0E`8$X8wHpF4xhOO3~fY w^Y{jSk!t4f=VOhsHkS5(i7-EuAAATf0G%luHT&M@MF0Q*07*qoM6N<$f<%S%qW}N^ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_text.png b/interface/ispconfig/interface/themes/default/icons/x16/sticky_notes_text.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee1fc60abfffba341c91166acef79724dfad83f GIT binary patch literal 631 zcmV--0*L*IP)A>GcWAFoqmNIUHf;NujNDhalZWLa5kpZI1Z}b|x?Kg|58!#bn4Dx` z+$Yy-I)&)o9x@9^iQ6@M4vm(JT;>XdJdG3C0W_Pxu(&vn!NCVlYPFZ+qkH{)KGQs+G4kJUms5g?RZaLtz*e0&0kTeaPELi9jp8Q*YH!qxN z=nL7jr%99wkk5}2vWY-(?iQCDIGE=NYi1^l69`Sf5i&#(l91y{6be1$)sL??mfpTu z?bl1Cf*<8_I2I!ixKYfIfFeuNmWt**CKDfFwmqY0S78hNYiP zN`YcgY|^E;{WJ;V-14&6dH(y}tK5q(}cEAkRk&K74$v_%B3){SJr2*gsiJB$Cl72vE3Kfo)SlV39yI z0fVa5D$flD10)D=E_GaAKT)vRY$91AE+9KZ;5bgKK-VSaL)@D*=M*lsplJz^Qj5q! zC={+>GMVtmFfN(g^8(0bj|2**FPBT85JEz~|H?k8xKg=?*=z-)(G2qWYa~x1(M4RN zaI)9yL8(+?iI(+<(wzA0%jMf2*I3nz$77gIr$Cx-@M7HI#+c{4B;2Q^ZQE}|K)^Kb g;(3i;q5CPo0BwK^y*%2AH~;_u07*qoM6N<$f_SX)X8-^I literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/switch_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/switch_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..19dfc937c218bfa44b1db612da83c5a62335d545 GIT binary patch literal 652 zcmV;70(1R|P)pCb*(?qFM!eB7?V^EJ_7;tfn9yF+!N~O^2_0a8hdHg;? zp%4%1AtD#YXyOvMpjNAeTrPKlAd|@;91cU0B>r}Btl#hRgc#i-+41}R$Y!&Ap3mpe zY&IQrqux$Ofs6A9hQlE&YseQBrHf!Nh-fs**C-zhOlN1`SdVy2K%PeyOdK6`_*;@> z?zdX4dj83xEc?c%Ai>3X3KWG3lG7wPYAg;)CX;-vQmHru7M?aH@TD(faY8#*plRAz z7J>bq9U@Rw)l(pf3`v&-MED5r8&&5 zuE2=LQEmc>n+q|mtK1PHkqBb3*xK&y-ew>Wgr=z{&OiUUjt}2Q_d|8mO6O;B_Cg$Q z){Aw$S-(e`XPk?1Sro`~T^Bewd_JE5 z-@}D$9_0&Lz$SG%9b~iFLjvh^8h*bYvMh_)=F#DBC=9M>J9#-yrxTe>MyzwW99pdw z%Wl56*VAD0_5`NWDJ*L$f|{nomz-ykDFhRTB6SFKU zqTWiSB4X+ZHzR+?#pV0>Q7N)(nD^>X2AaklG89E-*;qm#kw}Qx*5-4Z30;8K>%ytP zIkb&$dl`^^zYmT%+4%=9Az&B=484cQLJenQm#}*81p>hsW`hr`Uz*?&o(hK~DWKFP z;BdGR4oA^wG*GL)L@0C`6m1lXMVNX64rPqU$?DQ*q=9t1U2w=U#m2@vcDh4k5szO* zv)RRVoe3;P(QJRg`kP1CHLH;QCeDYd%d6L(Nu*pZqh7Cr5Xv6O9nnA=(V&jN!Wgo$ z2?yClBKZU!s=@2tVU4vG*==8uSn)CTFjfd5>d`m<_+kI<^&7Fv!LZYh*%ZFOZRo96 zBDV9(=zaaX^_DWbt7+PM(ZwS}^&%A_P)FV2W<;_!3nx-JEa*=+XkuWE20luD(2x~s$C z5NJD&1C>ezY}@{IQ_pBL0v{*ohZZGuT?fmuz%)(X-&ZsmLCCT;WT(@a%*Vpz8|?0E|9l;j>xtu&lMPv|Rw0o{utZ(oLutLBXLWUr&+E-?II7(S{>ftV z{_go5;D$6W>0?zSMoNdupIQSG`095x5QOa;3lmGw#07*qo IM6N<$g7i)NjsO4v literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/switch_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/switch_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..25e3f1d9ac13ed4db8c6c956316721b4ee659141 GIT binary patch literal 687 zcmV;g0#N;lP)5X>|% zBGjfu%wj-dpoyBG)Y-IXAwc& zpU=1cx7DzO2#3QrNEiG4K1hbcA)?VJdcEEsg<=MS0Suf>8!bBYdcEj$I%qbVTz+0w ztCb7I5RrkC$uI~EP_0%&Fc|!W!0-3NX0t((B>pvUa<|*%3Nado)Q;I~Mj#O2b|@4= zwOVD>?Z-A6DhTI{$A1uvMk8q2h&xra35&%7yWP%xr1yG5mf6H@@$EZY3WaWVDwV8A zJ(COuL+tG}81sOYsqlU?nG6@wsYOLGq19?3TP$K`Wo4!U+#gqmoH#rBZ-q|Ze#k?6&{nz<*>7}1FCtNJ&d!WDB2Id`K62P#Yc~~ zy=(VQe|(-)p1t{GesB2Loa(Boz9s?!9^q5`eSNv^6`p=;VmrAiUMLixY1%^>ulytSSRVd{d!9$hN-CAw z|64ZlK;-lJU5fS5Xaq9Xbx|x9;W*A8je5r8F?<}S2Q4ZllSvE)19ZDxWxuX)IIN6% zXpoQNl=uUDP`lkmHk#V}K5j8!GMT{hCTdfNE<&LYqS2_@qu6m=d2(RRM?W7xnr9MRoSk))XUtG~tJUg4 zKS?xAY!$Y$W+ z+%BmBy>(#M+cUyVFe7ssdm!N3|IM?PHr-;R_q0wll?A4X`u-qRov;b_+ zmTwt&dF%Dwz;NQaZQCGYjN|a|KYtPYNjEF9xI%m+8HdT$k{?kSdcma+M0 z%Y-wD^HQk<(=-*uWb(13)?3{D+SPx# literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table.png b/interface/ispconfig/interface/themes/default/icons/x16/table.png new file mode 100644 index 0000000000000000000000000000000000000000..9e18958e3a5c09d9b91ff0b9608190519d9567d8 GIT binary patch literal 521 zcmV+k0`~ohP)R^) zS=nl}1Wy4v1A_$zxP5+(riGD8CUJ3pAAFl=7&FXDj~iG9!1U;-WpGn0V$OBr`ZAvf zGt7ntQG*YIe7S5HBpnCWg@SEBIWTB8n?DTP;bF@lS1MsPlZor=hlij6vw?yBW>Bb9 zECZ*j3%9h!R|EZ_aCwwPg7q+EBiBb6F#=P~Ikb7JD|cIc_;=}Bst zCKxZqmH^vkPFNO$Y1%y7ZvI_w_Gp*(K(N#>O=2@Kf?zC4FsCt`RRG2aZzLQ79xnqI z4>E{00Y6Ie%nQL%(=dqT4tSPh=$GoSi}m(49+qumyoWdIVtd=*Tram|JrFE43w>B4P`$(=j+D1F3x8-PVqP-;c$W73a*{ zWr7hbHN*gq0WcJacnp>_4I`@Bsb6O@5R72k2JV1OgN&|w4E(Z;ciF7hfM>^`*=%kx zP{U!5K{}ViVMW26w{_$y7KXaYIK&yjItKP12H8TvV<7u{NbzgD{~W-X(*t-q{|(`_ z#@`JFL!r+0+Y4o+3*Y%QcA@lT4T)}o<0l93a9%@2ijB~p)#?_5PsL(q`*N!rqvONS zegJ((6d1g3@hh-zRKbUj`U$#GDp5(2aDRW*-6?zCRwS9n+=IMxt~DAU(I|q${YcKf zL~T9sf&^6c@{T|t_+PJQaPnH@>XnclzgI*h^~zpfctZH^-8{N@(0}p13-MbFQNA_+0000C#NN&-)ilj_Cla~87xnFliJMf{ zG%#Ka&j5zO%+PfPO*42lto*m$>Pe3tgwRq|(}=-@1;KDH!OJwmg+72W!W#(}0nZY^ zl~W9&O^7Ey@yrXMrJAY|-7s%#6xs<_QLIS;Hd97GNq5)UwWZ|GHs^xbk0j(%X3xT+Ur9#2lUq>VN7~O$GD3;@xdOn6yJr0}4j&kk^suf+L ztHmOfWf_n96>DSr_S>rRU4Pkrf=KJINt+l6-$N#O2A~QyzN_$(%^u1@CTh%a y-K`PFnI7h6lC4&qQ68fhr{Mp|3yS7H0R{lOu3ACF$cMWC0000W`YqcQA7cQ0nlf+8w|qnIL^uPZoaU9yw3+mON*;&P%E%w@Hv$-7+B0^gkmv$ zp3miw=Z5aVK{#e+JWb_t*-$+6kFl`-G+ zz_+C@N8f(>(VqBsT`Lx|;@A)JXyrlnsFAtlkrs0W%sqX_A`NSlN8zsk0{~@SbtETQ RR5<_u002ovPDHLkV1h2mJDmUk literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/table__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..bce8b907080aa4def2e25e4393796a3fb38d5055 GIT binary patch literal 634 zcmV-=0)_pFP)}i89x4>SP-09?={Ck< z44aA+G>}k}ot<%JcUu{QC|!7Y=N;bXd4Ds@klT}!=K%C#W8X4mjHU04jErwYeQRRk zD)kwIki~Eg;9LaZ`vQz{nR%3d*K0kc3tOPH)MJcrp)3f7cMv=+37pCTLJ-+VqzHI2 z2b|w0pxTu9@jIDip|q5F9`PfC>9WAK#45PE8cvhpbB;6JvbmzBhXiMPB&Fzv(o)a! z5E39D@T)&@b5DerR{c`s3|}^AUI(F`K6_3S{P<3g_ra5 z!CFMaltyW(rwlX#U~hlFMvyC&FlgKB^{ZkLN~5$PL1eH-P^?rmf|Oz4t>fqfG6w{$ zR;z=+&SW%#Lb;6n*(`3%jUoTz11z4wqut|B+JJ!nLEu!Y8iA2aA}^2eqWT6$jvvPC z%=6&l|4OjavNVFrGo$#zKBFt1MBT3g9>>tsX?*LgU!=`Oql4h1>uLmx-yNifLemwt z0_$kFb}EZ~bh%cei9`YqcQvAUM#tMa=nmrjbUs+~V==^@aS##%bvL=hwCzhV(@g)* z<7uA!bbad;%li7jb#%3AxpAOfOcjf;(fH=wFetS&rG=2#%03u>> U|5}_wwg3PC07*qoM6N<$g0Mv&xBvhE literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table_delete.png b/interface/ispconfig/interface/themes/default/icons/x16/table_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..9a7fa99d7ef70f94479ca618a9cba061f930564e GIT binary patch literal 634 zcmV-=0)_pFP)1AZap_2Yg?`^EiA6(GICb{>Q;NTeC;OI%VJrq4|<6G|ZgV@UkFrby%ZB3J-X` z0o*z#m5}3^O@%0*b;>}vuI9B2UVW4}W&DI!s)ZG=^-=OCn)_Vc$Bkn|DEq*=fWUPT z5I_-#&vo1zIUerS+T6s&R4QD*USFsD1X!mGn$4!h?!ZAsaQP5mZ*Qw=hr7CvjK#3A zvjaMDnBCoo_4g~96U)nQr6OR1KL~)ap`ozio9StcEiNK5KCb5cl_*Zy_Cr$T1A>-8 zo8Voss0boGJ!nQE$j#5=l4apXt%mE9lY#T-==mp^4D?2$v5(+vBJrD`P{5UJ7A9@y zd!>TR%1UsH%H_P?Ch-3v_^`L92n=1vR4#{a^*X*1)rHknl{Y}=awna>JFvE9{gdF# z;9yAbes>om$z-^;sVmWFl)ErhoS3lms^jb<*eaD2fv>tlXVU6Qd(HW*Q*ETZ=!Rk7 z@vzgXK@N!j_Z@IP>v*o2snqQQrWx<_G5OVM*>{|$jB$jbSKXuz^b{3}+AjeH09UI= UYBnx0TL1t607*qoM6N<$g7}p)9RL6T literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/table_delete_column.png b/interface/ispconfig/interface/themes/default/icons/x16/table_delete_column.png new file mode 100644 index 0000000000000000000000000000000000000000..87685aa657d06dd43676d3b7eb6cb42fde20e5d7 GIT binary patch literal 661 zcmV;G0&4w!GZ_DqeZHatW-RHv# z*47?URc*$=#bO}~I1YzxQ#xSGO)e{aMoB$;_b-BU(!gR&aX48hSeRDu$>6xHDWXxN z4Se_s+`Go5kn+7Q28n*sNdsnCirqE%yw4H!w_ul>-o!gW(OeR1ho(D7UlN2o2-0;3 zEDIe1NCNif6i=>R_Rji!cNf=VF>n86dt3BJKsssAZnqV32YiwsH4Ny5f}BPf7#YD< zF6ZqjsGoEl0y5|$0A{DAyosfwBWRP8-hOLm2h?x52JIdLm*7{ih+rUqQaX*{a2TaZ z1>+kVs2v}72t>b2Fl3r$9|1)?62bWBC}JxsDChICUI~RTACG$mr1J=z0fPL&0aTw4 z=c7?1GZ~zkCUSzR*=or?r-witB%nK(nV69KOfu=6eSULOR$crmy#zyzdcBW;Vy|3A zsaAt2UfZoyO4fq7haZOF5s*$2R1ObSzu%8{TD?0ENH`fu?<(F^o56EH?MsFtTr#mmhu8^&9T@PNPwUe80dskr(7k>WQ1c vzXb5w1m*-&_7(8B+b8uR|8mZo{{@had>hA%G!} zJ!abbO_X9D?n4&Sa9el~}H=?*~@&?VSDJTwHCMn}=C z*D-r{-kNs`+hG04KqZelj+|Dj)k83wPFurit%i-Y^)m#lcTYy{)kHaO2-H6WJIBX{ zz;ztt9(=OzuOl7nZ|vQ^+PHQq&Lx;mrEIsa2M3tTWbD33Q;EmppvI}G@&cTO@AnXt zDiuSZ%yj6RL{sVRS9(oYG2!a+7i?t!G)r6!j z4QVBmG>O^W*%{}}c30CLqz@i5lYHOzeiJ6z)a>jifD_n%l_tl=<|2%-uE*o!)BANl znwgoPHR3S_AvYtR0nPb<>;MO^zjMOg{rHECp^z*G9bMh1UUZ$1O!Wk0^){&JK4LwYZ-Vx z@D!VsiccW*0fBDYb_)SjDw)K|&Q37f#_)wmH_g2S^;&HY!K!5;7K>qfG)NBa_@V~`%g#;D$6p4aPTsP_vTlHH+R(%*89PYnGs(wy#Al-*nZplh4c mOULB?Ao*oig%FKD0t^5%QD*y?1+aMl0000$)2`thGX_1DF z>}L1vTW8*8YoH!7FwD-&dtbiayj|_($_k<=LK2#$m8hJ?Xz|M!9D)!cSF3MKPY(rBsT4fdRjnjPZ(1Itj1Y#BGJ*(0Rk@c^;>FEV2z+1D6E$7eVW!jQ_xoB% z0*rMfp8>;NJD0(YDNC*0Iv-cw!+Y65i53(yyGUm;cPgzG+dlAMp3A-DrLpj}q z)0spuOOD8e5+L^fGT$y7W&XInj(ddyTJ1Ih67W1vGnj*!?{DxRNm+yl0!jI=3L#N1 zA4f!on!CF(0t>jVrYFoC4=!q|KDtC)#rR(zUyXm`J)ZAlDwk8wg3=`cg9Vs}#)wZp zB3v*%gg^fvASVweBz!wW>4YTaEUgJN$UZyZGbErJ%n>Mo*nw}mcvd{A`pV7@=4WT| zrCKHCGq5ZRIdY%|J~oE^PKN}@MmP{)2Y1uJX0u869m1k({aUNV2(;(*($a_8*4F1_ zsIu4FGnhjR&A_*T%hS`U-)uB+eP#xg?QO+8ZkmQBLkv0K_-@;%(!0R1 zQLn4Ydm_Vd=F8 AI{*Lx literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7dc076ed47240262e4ba35ca7ed953392aa665 GIT binary patch literal 743 zcmV?P)dJ@jB7eq{N9E;=>l z8mN(CIpfTona-JUO(@6}*>X@cDeuHO-ycf4B4B=oh?ADGHdzshpT6WMx1(%s!1Vf>^eno+{An<u7L=GxTX%+LG!a6FZQGCK>C1aw`O{LI134THRqq%16$ zrcLoD3t?m8+!i?0G?mGC2rQs!lALAcajHaeb7L8Cm3v=3yWe}qYjndvGC$va78Du@ z_*sB?XdCe|?O;zphxPRrOmcEMX2Vb|H09aE9HpATB-v*N+(QDgpE*odz;j@z8m^RY zb?5!#<2Y1WiZ{c<#9V;hABE^yjNxR;hh$C;7Ut$;nK`UA0d~OSlS%po@HfuREXii$j;$w~CgOpJ`J zynY*xw_K<$c<|UMi|e6REFg;w4(fxzn5xnrXL%xq4|R=ING}5?YDy9&)q1}J4d-jB zo;_M=^)rW$cpmQkxpvxNio*4?FaD&U`-uXH{?vi-&oia<#|jgbyU}s`#Q@dXrFca} ziyVz6HgkDIaqFdI+r?e#{ikkoZZz7#2Opt`@g@47K;X>18xG_HbottYkw`}*7Q=4= Z1_0gD literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..f55b16ca5f32cd8e9fc25cec4c2889d65eb9fb8f GIT binary patch literal 763 zcmVJNRCwBqlTAoeQ547j_r3Xep@j9ypwL?#KU~-?{ga`(tCUZ5st6gbdJ7iQU;x*XAY|hEW)- zdN?%nY&W~_j*i~=E5P$SR7G)8i&peBp~A9kn5ISDhGCjcWVvNoxOb!sdM-z}f*Qwh z@OZt@G>w>4fMK;)31DztH3E8Sea_g?{rSk&u(hm$0XpC?vnsrTaC|zEfRZ*awPK@) zSV*p!&ZY{^gWpmRtsXD-9x*3FF<{+em9s zh)u5-iW~m{SGuWUkwTZca_P#Vt%1_SG&V^IwGq>z zNFy_u#~shPlhOD9bK!92p4{`z_d9o@+*??H=XnU0q9{2^htS{pq;;F%I8IPZ+@GF) z)KB-F`T1Kv1wx?^Ov8{{L5?2QO$gz^bp?e7$8}}qy$}L-vj<^YmZAn~s;VL!iJ;Tz zC@u*wRwfYz!<`zA;>?IHYv;!N%xCy4JIGN%GP8?FG2alR+TU$N?3mAr?2F$#!98+YzdYrh@{#&n|^nc?sre$Fy9+%G!g+T%u3os9j z5idV@I2tzLZhnVNPNoJ0tcHu+enHGJsyV2VeRjY-B%o@{VM_tufz>c@JAFXzm)F*C zc6=O*tE+=snzJdUFdYJZ%QQ}fzCXboqb*^ z7GDQL747!6#vD%146FulVsupQSE^NiyG zXh;XV3Y7}Jmdm)2%>tQBfTKSfZal4>32Vip6KcJ+I=6-%Byreg5Ct<(TOa_#wamjbu{}HcfM| P00000NkvXXu0mjfkoPnA literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..b5a6db580388e1f3facd14a149181988be3db8ae GIT binary patch literal 762 zcmVqOmQ6Z) zJ39Ke(tUMc;LxgHoN`UcqjyES;N?O6Was> z;e^hcO2k|wV@0URXN(vN4#2c;s`-fPf6b4*UNpH}2t}h%8GtOyf|YcT=F>hJBtzD8 zsH(yIZ`3pcvu%YiSyM0)NlPFANfN}YX0kJt0*@`#Ojk|%t>@~}cT^)Q3d%}KU`|eA zt-T!;K3^pVAU$L+0wyYQW$0hyP#5B8E{H=3ucEa$&NZuS)!yl8_yYly*4LwYc(_?4 z9cl)E7*ym)xLmg#R~mMrxiF5NqfWFG#kuA@;}ez^7tz+$1&^xYSyk1Lm2~JE7@V*H zQ^6qHw+;te>j%G|->oc-U}>@^*4fdytFqzx>t7a&pUrN1bic9T=TIV#KH!=3 z&sS7idqK?4cW(BxoOcCIdHP42dT$&EzMOTw{rK52q9>F0=uSx_kXl^@Ek2KV0fB9T s5xIC)c)GHN+mD7#A8F3`y8RJg0HddJ3#Lo|(f|Me07*qoM6N<$g4oDfPXGV_ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..00fe7b69c969ed4b5668526227bbbe9e16bf81ed GIT binary patch literal 719 zcmV;=0x1^nvdh?Ltb$7fKeoY+bpj;?jj1MG)8GPB$WM3KenTN)&XXh_(%crlpB#Al5`k z(_&CNlbL((c+O0s6$N|XaB|Pw^XLEWozZSiOu%(rG(yv~1eI-AUwkp@Ll8nVn(eno zM((d?`uh0zrC$PpKme9$dP_x)?&U2g&KHQDoL8V;Qb>@(D0d~NVT3A3bn?;1K_5JLuk3f6g zmfn1g#|JQxep2im8oHKGrf% z^2)``C_aiL3+Q5vgJU6Ju27&iPI|p$CWCA>gN~D(7{uZBil|^XF}#PLy?*-2F_#KTb{iUmm6n=3t)nd_3}meR)N$046zZ z(gt8?;EUf#+2ZN_FRlb{LAm>AaGG)q9U=S_U;r^LZ%Q;Pnl1nU002ovPDHLkV1h}> BRpbBw literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tables_stacks.png b/interface/ispconfig/interface/themes/default/icons/x16/tables_stacks.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e400d119f0ecbdb516314c4cd78e4541e9d689 GIT binary patch literal 580 zcmV-K0=xZ*P)VQ4q(!Z+#kKgH3x- zss#^1<1Y|Odn^GjEiE4GQTziu_0mH@+IsQctKgv*5j^)I^i~SBR3Z}mkrD%o!Ge_{ zn6TO1_uh8qZH#M+n08>89kToR%DQ~Pb4h?T3*gbWg9CgzQ7|-7WFi=whI-f4qa`2`*91J;J)u$ zz(1S&WC%sQ1^kb>SNaGE&}cM-flp0}ZC@-o~2BqgWTjo$HXa;zmaCi)+ zay+>wY<)IDdyU1`>52Haq?rMVdXE5-0ZauPtbdO%)YX7KtkX>zPkRgkS7YjyA# z4#Id60yvWQ2rVFrSNrUCte|8ez&~*;l=#?XH%>Fl)Q&Zyo106Mh6FNzg;flelCa2y}e6j zzg{o=+Spj3Th1KbLnS8Q*mYeLD;0ZPD3xqIH;?4=ud0%fj`Zy^OGGPpLH^s{&o%z?R?}_t1JHL>BRx0yg}L1yuL2Zl6H>Y0t^5&DO}=q SXX1DO0000_3aTLeTy}NhI7Ok@l}f$`!^87c2ZOr5xOkI0H!=ctmkacbK@~0* zi@ryrqx0+OG^8^b@Veb_+Uo`M11mTj(8LHHc!)4o06+Hk!6FC@tz@{za7|%Z9(X)H z9xoIM)B`xy*$FvGQmkh4-vF`f}jQq#^bjb zhDosv;Nu93PZ0jOw+CfKsfn(^B0L$3O=9`46-CLg^(?}&EKUc5bNPI}4kqah2DlN8 z-p0~Zm>5xP3FP5aCr9n?rvRH3Su-G z;o8(xK>i0NfKLZLedFCn~1zV|CD@Gh0AC13^v0S{Jj@zu=C(`+>eO2Bbl4g~HZ zoW$q7`FU*(KCG_(H#ElC-w(E)o)b8tOG^t2(-frDW&?3->>kcLk=@w%xP@>t)1i)7 zdwb6x6~&N*<pP2nfo_5_p$?%Aq6{d$!l@mjpLRNIXlrZb?e>%M_V(Mt&dwL~ l$@F3?E9tk!M=JdhU;w#2FL1JGOFjSq002ovPDHLkV1mWoKve($ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/tag__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..c02a8f63a26d193f0d70f668c96b12d88d5f3fee GIT binary patch literal 795 zcmV+$1LXXPP)L%<1A+Vc}K)Z-Uf?S1U zgafZiWlfpi9?#iM&$~HO8b0vndCzm+-}CXlF9lnSRx06SO%0TrOu#Y>Ff0oU@hF*0 zb_BOrV7pB-snrRq70T>(VC8a1W5!r4X6dM{?MVeF)SbS*Cgyl$C6rn$AWsh_U{Mq; z_Z*I%(eZH@4~3w}XoT{jBEUG%$INEf!3b=0rNJpGf8k1g=vQ z^`1@xA4S-9AK|6tWr$1CrpOpH!Y$q1E!h5$BuOE9JBzR&*dDlCj}{gdw!uVlg#xa1 zb+uya379a&(6&yXHGpXOrp-pg3BI{b1wVBd4#Xve&71q+KUx_5or7 zZMPc8#AIX^wU=yGgqtP(Lj>0ilS)mZ)_aj-yl$rCMR2|vo$qPYPW+XIT(Wl zL9jn*Y8wCS^MTLrha#&L%8QBs_klc9T@6Qs0y`cfj1|D&?QNiqMnYMYz-I(?B+T=U z!Il5Ne;bwLOnuHj=;-V+9tPhFqgDX4dI; z-z5m*1DOOaK-f8iFt@b@k}MxcIR=Sv`|xl(mOmrQvY$$15$1X4NO$*WC=>#MJoFE( zO+YmG9%jCUCIsF&gIDZV_NjOn&*XIX_KvbF8!MZXB#_WVmUe&-&jOuS7cN=pN-L*5 z%LlU)m)SLj@W$q5LfNun67fPf!Y*g%GSYJ_mARq>PC>*bqDX`b5x(@IuWy85m;_jn zE4OuZiZ2d|BtG+T5k zIi#JMnu2XEkg3t0I)~XW@-c(m-Rb&{j{Di!*@tDLvJ3{e*?F()yvb`Z9WOMm20y{O zw>`i_7eQ^v!2yGM90P(}nw$I1aon`4x%t7q2~Hc-;{Ou8H<)9f%%EDKH6#O9t`32g z3WH7;rParDWoS~Rd=n~Ex~aIhRBJX@eD!#S%3Q9VNFd;Kw=Uc%vE^UZ(i?%Lwr&d?(A{jB(BOy1%q^i#aqRdv%!$V0hkBcJ~9Fa1c5yd5k?2_bAKQ71_MP_61Yb(2f{q>c|0?d zs8lMX2XLad7fKu_8g;rx0iK8M1w_%t*J@+Y+1Z!B@idyk8>0iOUJu6%2B}yek+@A! z)F-+Nd>Uc)3Btej_Mk3`e?_iABRm(2&7u8|qA2F*P8MOFXBPs27v*xf113@^m2fi} zok!~uOcrkf~XQ8ki1;{RFmbZDs8%E6}sP4gzt2@EHQXi9}+hQVFOwn1n{Fh3lbE zz?{#govW)^hd+e|86QCe_F&Ml5GOx$R;q4j+RyVyzi>dH~8h_S!_!f}=ja@Z8I8lBGbm^TnJC@tzR z83sy;k~cZ2W8}|K^0CrlG0Uyi0e*Y?OJ!%LfH|JL*yc)9ZOah}e*_o+K@%S$6iOT{ P00000NkvXXu0mjf+GR-e literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag__pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/tag__pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..e158a2d8c03ada1be370a399ec984774ad0d1b0e GIT binary patch literal 848 zcmV-W1F!svP)6bJK_dG4iFXsYON-l_Z%|mZZ~&eXv2Pfx|*7oiXu)l@M44DN)YX5%vNy3x!!~ z`7K|UDah3Bw%c=VPE4T({+xUN=lq`YoaY?s14SJO1Sqnq)pspw^~cM{UjT`3u5=iM z3}6_Bmp~v0M>`q*jd5lgpln}BNn(}7@`>ZPX~M$#*x`1&lglzQYrO`Ay4Bd2N6&Cv zd1_tV{R*q~w$tfM<2XoK3%gvd8;hmZ)=Cm!kS@O(2!+ z0g+_$-(9dlLZJ`}s;l#{;hi*1kI=*M@em#t2a>QPaQGgM7?-B|9LstZ@#^(^NIX~t zBYn@ogCLPeEQTwUl?7OOCngvnIce_^(1^eZZM9xsBUS7L)$SW$sw#%$6XiU-K_Y>R zMk9ecaP6>{qrEW8vMCP@hMJ!{m5Vic;Bs4gM(kcBmBP*pf)L^qZ3tHt$r5EA)_)T zWcyzDR?%&a7Sp1w%r#C^6Hm2w%ir#4-?~A*I!<-Wh@v^rAPFmiabt(jN!n zpor>n^RiPkIc~dO&+oQ{*6@KZ&+*)Sozki{IyWYTr5xp^oPU{F^_N6&M68yaAr%LS(FpbjSz z3D@0SxW`Xx0EZjtRWpx!aLjH=5!6Mu>FwlkVzaoT0*^Mm1sw(vRe0P_Zmp8yvrkot; z2nM^cbseS*w;sk9LdfsGBg?YhHmhl%v8ftnvl-6z^>xS0-^Um7#5p>KA<3i?q$@W* z33;PhQkPTz^Vo;!es~_et@tfN&mHNLHLy4 z?-RK%<1yn``#Iq>4=Uk7A$kFh!Xv@p?N~gXY8!)Ex_UmY%hS_y@onkLqf(yO1`5DZ zatT1uznB67VW!dREyFIFo(vA&if59bY`CtIUhgGb)r+z6MLZNrKg&odHg<{{vmX4Ky59o ztUORE2t6{kLw#XY)qafI=p?8uC=2vjri(s13HorF)2}ie+qy6_vyvl8kz$^|qKe`N xWqw}9_%?cDQL3(K<)bLhF)$DB(j56CzyJw^M|1_hUt$0N002ovPDHLkV1oS`UXB0& literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tag_label.png b/interface/ispconfig/interface/themes/default/icons/x16/tag_label.png new file mode 100644 index 0000000000000000000000000000000000000000..200a5fd3410083eb463885c05e4cac87471a679e GIT binary patch literal 760 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 DqvCkH literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tags__minus.png b/interface/ispconfig/interface/themes/default/icons/x16/tags__minus.png new file mode 100644 index 0000000000000000000000000000000000000000..a46edab9e34fef2bb1b15bf40be570cca0c98eaf GIT binary patch literal 737 zcmV<70v`Q|P)OkgM)*C z9fsN17}$WAg_V_og@r{0sKyCN{d1s&o0*uHz#Nd}EO-o8{qyIKQ*%_*3=oGAh-;QD z%K#dRqKFBbPN2!Ee}4aVZUk!n`|lrvQA9*B$fJM%{1F3EX+U`}2C{uwuxb7c)ZCex zI{oLbUkuF5%nYZOE$aoz{r&q_qdqLG3E4$V=$e21{_WBZ)co!HcZR<}KLRx|FarHt zICJLmqM)ECWETNl$;gDHS?|}+pRPUG+0#CK`N9BF_z#F#fdQH`Y0`?)@bE}JPEN3) zFcij9rnVP{8iQO?wqE=uq1%?4Vy7pV6(3sAHDlJ4$_ zuU@}qU}6LY4N#Ggpddp`b@iIg!opB?V6=fWGXQPn2D&JzwKa#4k#Ud2lP9-C9zJAX zaLvtCcge}g{{S@Z&Z}4dKLKg4qM|jIo;>;g;LV%=kKVoe|MbI$|KEV(AvHC*S#fb{ z(-ajMRsp@f926Ts%?xi|zt#XI8m}X3*7Ul^$8VV0*cc$d%?)-D2tTW;Vz{wv*<-dJ zKRz-4`SSxF@C*!RLD9(|rlrO3m!Dq?7(hM}l9G31WMyU7OrAUeXfT7As3^lc9-hbP z!NIcVX=dS~MPLJ%ftVMFIicy}znqzwGM}uh8OTL8AtA+efS^?u@quCNZ})> z3s`|z5{N~h2K)mhI!qUH zhz|ICK2Q_|!QeQ~FCLG#x8}P5n$jB^)osJWvsl0-EWw{hz?x>?dKEReZw>q(9M^Kz zVwo9OUcRT*YPYcIJk}>si44PNn)Uh)vXOAq_x6?(s=per0Hg1Ach{6k<<`Q~rS_45 zAv;g>Q_lFj;ueG9G3)ceNxj}U+uv_u8Agf?N(uTNQ5QZX5((sJLbJ_xsPSLlZgG7b zhv(PVUU55aH@C|$oR?)eAG&J0yR9S>k+^NOmhqO&~9{g_SNL)>j_axVWE*QFkUakCk>K9LqSN>$5$yzRD7`^Y0%yb zIpG5E+4)xa;7hgUo5&?_&j^17q;rDnvzzZD536I;I*=97F4@9RzVrmTx z+NU8iyA@hZ#S3*sMTKIT_M3x5m1c8=$Lk&A6SLdxR(CfyKib&b^q;ZxXch>C5l~uw z?#q)Nr?Rq600f;xC{mP}Ojq%Kj3M=B9-6bd(7f()0S*UzxRDICp=Zc;^WodLuiM*x zGkH5Pm$bB0BJE3j@giwR8jR?ws;);xNBbK@L`Fh^(fI6cMTJg)w~&}gT`U&Em4=3E zxc^1a?6BK`e8Q&5Nl0o9T?f@Z8+gqzw}a{YFHBi12VIsI9F=>`|Jg7vGPM z15xmTfmERYRw7a0fG)(u#xBLl<#Jnldn+~uDU#(QA(|&wW@hFVr>EiH2tge}#iEXo z9G{k!k*w9$Y$G1YM^&m!tcy`$C>kXQ`24?`AYhIP5Rq}SBAHA|%Va5Dmuqgv>HL5- oFFE=^W&&cVefRpm;N!Tx&QzG literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tags__plus.png b/interface/ispconfig/interface/themes/default/icons/x16/tags__plus.png new file mode 100644 index 0000000000000000000000000000000000000000..02c222409fc4b5b1b7296ba347305a7bd54427a6 GIT binary patch literal 791 zcmV+y1L*vTP)x^q%{&qkAOXRt)xdGw zD&!Qz@xNoi2Q14*C$u>C5A$qUmJ3=cDlX9pgE;B&96{3sBz7?+I%mt0w6h7tN+be# z<>hwTs3OZI{2a#pDDZy|x0qN$acfP@ML`rnrBcC5kH<~-6h&Ecx~!}@J`wx3Sd^r~ zGbo;!odpGZL=iC9bA5OB&4%LQiugpBl40Y->qJ2)I#*ZMH60EEB}NcxJWy+U`>jTc zWnZFB7d4$vBw|7~CeB6i);7Dnb1D>yiYZZxf?AjB_KC{Ma=k{gAd$7R^C+h6WvN&Y zgl%08$A!Se#IMRo)a&(du%+d$v%1=%#Vd_ZRO@!vVZmP14ss~o-s5t$jr;w;GI%sd zG9)L%euu-`T3=tP!E2*pz^cdJJK@Hl*JnsEZcdXjyHrF4P-L^MF0@*Y1<`J3e4I?< zcUMD$_uc3y`4R{a-{d6u77UUZT-RRB@*SFNB+!%E2iH;nt{8x}@G;=`KiX1KVox<1 zp{T0rezVQCcL_$NtuWd_-avU=bOXQ_!|x#kgTNS#kHx8}KZ^nJ#n{OkgM)*C z9fsN17}$WAg_V_og@r{0sKyCN{d1s&o0*uHz#Nd}EO-o8{qyIKQ*%_*3=oGAh-;QD z%K#dRqKFBbPN2!Ee}4aVZUk!n`|lrvQA9*B$fJM%{1F3EX+U`}2C{uwuxb7c)ZCex zI(^}jzYNim3=F52E$aoz{r&q_qdqLG3E4$V=$e21{_WBZ)SPkp3&V_C-x=oK|HZ%v z^mF0NnahiUf})UJ1au`M6Ov}VUq64k_GD*I3)=jcVe8e`3{t;7F{G++GUQB}w4yXT zJaXG-9)`cbfP=Z{*RNlYKm=;m2WqyNQC&U7b?J466VHDzSV?m+tn^T1Nbl}m*_e_N zQFoh#;qvG23_pG_Go*tIojNs(k&$sP6G-#VpFi!U0X6%szQb_--CqV9S#E}%k?IVI z&CRQ8laj(Sj(kCJQF?E0HqgSoK)ttFfST=>bazkeJM)U+2{SK)hbAw>A{TLnnCj{^ zorQ&=u{&O&xG1T$H3w+(9yWINTOijn%NrYiSha22oxYS%4@QQ63@zru4B^GaYg_X2 zLb4BkVL0>pH-n`VC&P{ib%xm5+B{%P>|$nSz6DAT=XdR5U;#Sg=9|~A8EryBijS;W z)9V@^zhP=)WAM7?tUwpBz+DtpTAB~Ec^5m-=1cqbF@P{EIvK>Yv>5*K^J@W3_mPm4 zydxtkE4ya$=s2aN#n`2#jefs=ec|i< s``3YDzd=zCrT;+jUq(u^GeCd=0LgJP$ubZ{WB>pF07*qoM6N<$f@rvF3jhEB literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick.png b/interface/ispconfig/interface/themes/default/icons/x16/tick.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf42c882a6e1e0a829e990d80893839dc145e35 GIT binary patch literal 640 zcmV-`0)PF9P)5_l64E?JKDEj zJ`mm?GfIX%Ge5In7{)a1ecTY>M6$S&zI5fN$j;jRejyGxjbi&Baz2Sb-XZqK)AGyMs`Vw_&AK)^dnr?x_OJq}BAcClY z5nhCU_0__n`W7G1xN@H&i2}X&Q80Z_$H+tXnpJe1@CQ zP%Ipc3&v}3F47(e*J?GGrs+y_vAw&EJHhMdth6Ja&*SFnyI5XX1~XV#FkXXWGUT9b z+xUEG9>q!#xt$zhqz`AiMxiJQrZ->URrw7XQUiu%1O?+Y0JSM@_g}-((h}x}XK*qy zf+r&nUHENz0gnsQKnSj=LS5#-py6zlwUUwjdLObZ!{_ti>Chwi6d%^>KX7j|3)aE- zzkn-?n1*1y9ems_6{~VsM*91>`_-nduHOPWu@4IwwR%-BUW3`+Ta^t7L??X&r@mcw z;nZRpIMNC;X6t5A-w@1!0doqrMyD#DimMJ~I*AdazHm5({c{Vk2G!NY>ME<-Q-X10 zAi_il&q0g_VN@EI`sIv2*&g>N+QM>|5)?)DFKSq8^{Tb1ZLpslUSxB~*>KrC197Fh zxgzM5dN7PMjv~dw<=!?Po&t8Uj1?@Pz;^gfiL1<6+BA?nCsqEDV39?QtIk>WM}PqU X8gD*;Zn-LF00000NkvXXu0mjfwggkd literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick_circle_frame.png b/interface/ispconfig/interface/themes/default/icons/x16/tick_circle_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe467b751046418f22aea200e095c9f25a5228c GIT binary patch literal 933 zcmV;W16urvP)Mb9 z(q@oQv;uKKCkDeRvOppbgJh0bJ}jBZ5)-3K=7*8Z4`xf2`AIa(o^zh(ocBHN%eAz$fa5suJgGUKKB%rD)*jL2b$Rs|tSS-8S+S=NSi;K&X$)vU*iXyyTudBPe`he-%q3jtJTV`Qq$br?6BMI9ml+#m=Ih@=kdtRGeB?9Bf5SGL^!~$WSPRSS-*@+VMds3v+XG=(zbcB60-xV=fdHZn7~gGtkR& z46eiz?PIR7C6EhE%n;&0 zrLF=#->jQynZZ9!=e6F3{05lf1&}g0>~MdoiER&SfK6*+N#;tumKhbg^WqAg-JJs53TjrW(Qf<#C(AqGbYAJBmbgKMHW&_vlN|Z; z#JbGP%-rnkY`fLEb?4Ee-!@iN?JD_SqhVs=@0qTypKnb~J-I{0HKHiWYnonW1_Gfc z3@lQ50X@ZELQP|&|Be6Yqf{e7y7J8G>gpm3iU<*lZv+?s3J;!e|I%#300000NkvXX Hu0mjfdm6m_ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick_shield.png b/interface/ispconfig/interface/themes/default/icons/x16/tick_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..8889996c9406f1c737a61d8ba647b1ef03094bc6 GIT binary patch literal 801 zcmV++1K#|JP)2_OSB~U0d zptKlJiIhT7qo8;&cmRzjPA100i(HM~0*0 zy3%wOOCP_z4HJ$Ib|9sf(7FHe=}Tvs*qZK@8L=bdz~CcQAJs`JH@$7Jp~~IpDsh%O zZB^w>E{~V)y)k0xGkqBbW&=;@_RfnP-D5vKwG$B1SmSY2+g%mmaM%dfmem~R32&ZW zo*AY_`qhTE+VSa$Us(fH*95*mxY69PN6e3b7`x z;jzCLOMxX6mlUg%iDZkYYC%a#C~P^|K89cir> ziYPNCYmn6cL?Szh`={>0@At!3{~pbD4_~KFSN9^VR2e;ZnoWk>nE=OtjmS8h(Hiu+uNY& z`xuk`3amv{eIPcs(*m<@&2K8KbkDRAxN=(@x-=c#R2IZVLjMjYO~z|- zqEvs%*?4b$Yf%O77D|m8&&I>j*XZ9=BsqmJ>A{q?idE{!*o=Yc@GTw0ib`BZExN4d zkJT{)WimF8-}rz{j3S`#)2%pFg0k9y0ZWM8W{2^y=qQ90*YJ@3x&-6shX^I}GR$C` fDnwcJp8x{@JXSyGR4P3y00000NkvXXu0mjf{N!+O literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick_small.png b/interface/ispconfig/interface/themes/default/icons/x16/tick_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a110aef9330c6e9089dfb18544d1a46d65d9fa92 GIT binary patch literal 283 zcmV+$0p$LPP)r|rbf13~o0CF{;I zeE(Mibj=Rp4EXV{=Jdj2XJrEwj6pPr&+z~M4x(cLY}2dX43E2Sv@ozT)-Z^%?!Xtu hjH5}JasvPY3;^T3N38C(J0t)A002ovPDHLkV1ipCc|`yK literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tick_small_circle.png b/interface/ispconfig/interface/themes/default/icons/x16/tick_small_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..b49be4d9cacde67c312412de92617d042ffef098 GIT binary patch literal 329 zcmV-P0k-~$P)q$gGRCwBA{Qv(y10{fofkH6w2C$$D zFfJ8kU|?nR0y1NOSRRNU0`U@t-~YG$kA6+q0EYhzUVLo4ZMIrg$~^2mT%Ue?);oIb znAWFXpFy(Q2z%kzzZg?RW93h8KJnbSeTONMFM#J`;5~hiIB{X{)1s2973}S5Cuo=KOnv^Lw b03g5sL77}{cJ&VM00000NkvXXu0mjfz$uf+ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket.png new file mode 100644 index 0000000000000000000000000000000000000000..ab11ce288ec713f49fbd15d47bc4e01533b25963 GIT binary patch literal 730 zcmV<00ww*4P)RCwBqQ(Z{YQ4~M_kG176H&>KI zFV&o}s74Si%UG619}q<5mLLc|_!6eAWh(<8qKH1wzaN9>v3fHpi#}g8hht(JXdi|Z z?4b`*m$tS2|M#wQowKbpyYS=ObME<_bM8Ioau=(%fl3rXM5sgoB|;EE5O|aV@F)eI zUkd=c5dDPGKq8Rlj7TazT;J+JxfS(|>4ysiFj7K`kJPtzkjNO6Iomr> zx3bLt6Tqktvb*f0)Gq({2CQrvkHFo|PKv7r&o})mKt5(EDR)Y30so66nNpxchFd)! zJQeO6ZFpXYewMicIL@UzJ>k=*D-SSxwfm56Z4Z7 zW#zy%XL&t#<{|2@XWJ;tWPi>1_ABA>WUJ;PtF<|Bxvt!aSIi)H`$j=1TAwHPJ?(mD zJ8*PQf>}Ad5={;Y$8n%tqK8W->@FmB^Bn(*jrg;dA&|NTVI(vTT%&z6U|Czx!PY-G zWVrL7&nd@a)8uSjE?lU!pT_+?{1?N$!=K@KAe7N_vFY{z>@ctJ<>@s(bN*_#TCIlI z&nV>R4REIV&{_OQ_Xplj4EGFuns;Q`LuwJriVE}x9oFSd;g5j?lUAc{C)y1N9U>c% zh0q{W2!V0AnN2QYDRbDcQoUxCPPDxJD))|jiI1X9PDA_;o%|AD03@<^K=d>&<^TWy M07*qoM6N<$g1cKxj{pDw literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..37df09ea960c16a0dc92bb39014c404174901137 GIT binary patch literal 824 zcmV-81IPS{P)X1H2V5c(x0&Y7?u4H(`9Ydbb@Aq zk|JTw)^uO@z4!KB=f@)Lz{A6P&ig#)y!Rdf1Vm2q9>`5qfRGddNfMYzATW~zu@{#$ z7=sMUS~-pbnnu7dED*doIT@e#2NsDN<*A@O7!4bQ zf@Rpu^EIvQjLQyrdSg32r|_Lu4PfI?Aci@XcbPKMi*vw_&H7yMtgDN~QGx3R{$~)2 zyJ!paRGZb@?-#QyunY~IeG?rehP!RJo`&zK)-#Aj4AK@|X`#Fec2FvnFf=seH$gsN zX*clCDQmb-;d^O+8E^nfgcw~(E!E<7+LyZW!oIT~QTc*jG3|Ml5%ZLkOKHH&9Irj(^1~d?Z5$&9#Nq z48y$S#k^LC5s$^$mDlbxI)B+gAP@jS5dKjEI5;#6O7B_T&8i<=KoB(R^LR#GPA3pF z&E!;EH8wit{l99x&LQG3xK&-CpAscV^Rss(U~v`Bm+%vi=}Ft^fu84IGfw7baePLA zpTznXg`cLywiy~;{Ft^yorxbA9(9YvBDqczBmZET+KKPE1Pz6U056OhJ7x@i8i{z) zJ)oz3-X*a_wgpbV5ju703dt8IzyezP;?bc1T@T+{$X?qFf1aih(;p*`RBLk!H6D)} zq*!dYc(#6QR^sS+KkpqkkI&fpKF@@Nisa&`aOgI6TM$h*t!$$hV{3X`_^G0lZPy)> zR*vTsh3qKKM_|Y>B$DFCACr1HPEy=y5ogtx@>+7)K#CDL`P1VOa0vB0eei8~YSCo< zzBq;R!5BgOA7iC4`{t|@96fENyuCLc^BeF-fB^tbubbhO%ilNv0000 C<#pfy literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..2eec043c449c1dce367f857904084fe5bb781de2 GIT binary patch literal 817 zcmV-11J3-3P)w=Q50Qs?mQg5sA-mE z`5qq$+KVtNf-Eg93_>xL6#Gd(q)%u_eHQ44ebkQ;7#d}c!3aePh7^^g z`JC}}&$-jSqnXlU!(wsH-fQiB?!G!~i1fq=WF%Rjm-LV%Ml695ON>QQ`UIh0sH)xN zazRlzgiygWVd}w9+$%nT^h4qJOIS#he4(_djX06c2^*8FwlE1P`-Ab1u&6>!&Ma+e z6$?|yDsO3}^I@&?x&i(j7B0letTJnh;`{+^Y;|P;kGr~5iXzJI{hvV;bxFxCw>H~t zFIUB?3RNh0*gMviS9QOc@<*s{-`@ z11r@X*<|1XqB$3-c{i+$i}O?Nu9`3|E)F)EZG95v;fuDa+!C7N*+v6Rd^*3<+ORP9 zTl|Y7LO#Q8E5O`*H<~JQu5zJv)BP}8>m0*5Pb;jl-gV6WDHdW0PUj%vk6pw2fohx4 z?C8`?9oV+(XoxCw=LLtJ07kohQD0Gb!`sIf2BV37 zU1^gE=fjwp8T}-|;nCUIiABe_kI^%14;MJDXa-a?Kqfu4WtS?l(~{~Klh!Bklzq_G zUD6*A66^PMdH_$Klw)%F0}OtF7S55WDA2L$M}z2nH~wby+w7gVsPI{n$>i=Xd;6l{ z_NjLNon|j){309KB+}2;!BamESzh)xc*qH4lBjKgk%3o7-&lbC$ vN^VpbVrVfg5E$I7lE|gqjf~;#PXPu1#T}EPH9{X000000NkvXXu0mjfj)#LX literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..dd03d933642da64c677d89273bb806357f688d0a GIT binary patch literal 763 zcmVJNRCwBaQ*B67Q5b&jM{P}I(n9;J=;NRLkfi$AhiJ3V2&^C~ z(8zGMG}m^|IqN-}+FIHR5AQwaeV^xj?z!g*5D|qLDR4B)1hOQ9B#D?M5HU-lxCzU- zh(XHONH7=#RV6?v1CbL8(l^45id-n%l?+RS2}yY;>}_3`GjP2vvM4r|XF>js4X{j@ z7-e}U?QNZO&I3h`j!s->^2v(=uzZ*Zr3Z?tl@9gi6mZ)tFbDU0dl|-AtZ)CHKq^kj zFLo&HBkpHmGGoA~3U{7->?(2IY{z;w_F0z_NF|iy+s?Nt{#g&0&1M)K9Sw_+05H`D z{B_DM^(fev{g*%xz)T1&D5+6eeKVfWR8F*5EZ}y#7oCV&19Ul0SE7r@kpi52u&hpL znfvjFypXL{D+~+_fV|28ZFRPDgtAAt|5luzoJI&aT<%n^&wBqQFXTNr1<+D+s)|zj zkdrxAMr=m%p^7WrS7*L^KoA5FMKNqOBCpix;hLk^j`jYS$=NZ(%g-Q8)WP1eNdp}DHqq5C@1pZI!wO#8(f>Z1tZvMqfl+R3pu_B8qZek4)+Ty)V% ztUdv5@6H&Co$$sAg!!TleON~F3%oEwV|8im;Hx*rdk>yFC?TN+U7Q{oDvN59CcLG` zZ6#ZxzxOSd3*`E{!?4$~c4%F^cF2;N?9^y9;Q!?VeY_DaoH=$8f22MSVaZJ{moHiX z4{&(lHpU literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/ticket_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/ticket_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..b35c58e9e68a2a48b2769fa7b79e3f34f229be7e GIT binary patch literal 904 zcmV;319$w1P)p zQ902&6)%^^qdz2KS1f2W91sB^2i8~; zEI>f8oXGCmb#?`V8YlU7-pst2H*L9cj++qxY%H_e58bfaU2Eo_heq!kk|7ELc!7t& z^I@clBUCa)sZ&)Ik|cvM1$--zGb}rMLA}|WK!z~gqb}a5(l9pNcr) z`G##hL2NQ(35&Pp6-eLOprx&Jdr)%WfpgW@9+QXIgZ1kl^Mwqu?y$c-YapFM%DwA8jT1IU~dBbGN*c^wkcl100f7Oh1>0h)oKM)N?m18fZTkIC1(xVVJE(kX3P#6*B zB}>N8=JpShW8$LGSbqs7lN}*LMxv&s20=kVdLm+fUli?LzJaQ`#rJ7gxGb}zRawRB zZQ;vsrQ{Z(6Hno}`?_Ag)9HlE<$~yKLH>@kO)^tTN&id_paP?0S)P-=EAQCX&UOR@ zPQ>uA)yO}%9y8JkK~2+xM8_uLcvk8b#@J2GS#QgM^r+FqXRpgCI`Z{%2la^q&-4Fq zZ?i9sWi87f`5G9bpmK%Cewx3%Gw6MbJxlLtw$gqC3&Bk2PcRa^v@OZI2%TWLi8 zkiO>BLA4a|3u_u%B_UCXGf|Q#^hb!cOcsXzh@gbh`LPK5Rrsfjpr8*530=y}HVYKY zv<&~GHRs&Nd++;pUZ*xoJ8*dJz2`p9Irp9;fe_12-vtGkDv+{LU|9x{1qP92nB5r8 zMenCP?+^q5IF10NJTM~Bkh&diSLQ-~+D=%*R7lD@QPXNgOvnA+&>(ZYJQMW$<6#|B z@s!UyRnyu*7iOW*)ZT&n3^DVH0IY8+Lg}Hxi6&T<5KY;|y zqAxO8+8p-YAerZZryM+ZJ7Fy`-)+Nq7T(jYC6GWU(HCE8vH0g_L9JGU)9DO~kO1(U z7sTh3)puI(Ue+oB0YFU%HI&p^TD;$^6SNIqOv zXK7xT`$JwvtyT**n+>FqN@%Sst|F9wf#;*lQszWL$kB4M<<`9GU-B|$>kQCbYpkY} zJ{QR%SBjp5_Qx&Zt*NJPM21*@dqm;xx0hL?5yL!V;0p7oiyfPe8R(aOzmt;%@$ zX3p2r?323Wzx(~>(d$9B=i{`v{*LOsJK|!~^aaLTpU(?&B%9A2zk;oL(icCsZNfPY z6T{=vvZUy^fiByixCSZ=E>B|=`j(u;O~;Bewl=yZ9fF7%D&+w@k3m};$IY^Bx2 z?1Yez1j=uOD6K?kX^RR-MGA-uNJw0eP^#pf79H@E##HB(ABp^XbBc*|= zP$v*t951$&M3(LR8+&(cXQyu*+9D8)_GxC``@XmDeNV#%PH8@;iZ2(+^7EoCo0mLr zPeLm>Xec`}Bmrg!RDC*g0wzj9AA24&QSh7WS5x4o0I;v^y^l|P(sST5a6M2im$9<7 z6_rW_i}M96;o#- z!5fx}DNHsyT@XSKDlVTdN#WWhx2t=-?l*DTXRxvYGsfx$^|9pyDyA@pCbEb6DA+!Eb7)dLrgCG(I%^mzA)xm#Ct%t1q3h4$=K1r}tP-&-R_GbRkG_>Rsm;d7R4K>3=Xv@!zPbYl0)Lg5o8O z;xzxbl<2y9>)HiRO4iZ6v01h7cr2A48Xg;?iG59XOJo0&_^V1&0?W2bC;M++8Rv{E z4KXnIXWDiuCspiKytq9AP-cA53YZlo7VAk@ zaajlL4=y`&oyszBu(_!-?6@{45u(vZZeyd^%^D^N-IlkHitZl&H-orI zC?P=D7UHO8<`h}U79k5f$|I4x@c?gI`5F?m#g>)8;y(fm0PinEGREEjJ^%m!07*qo IM6N<$f^7zwX#fBK literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/trophy_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/trophy_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..4331f6cb56089d0144773376f93bcfdc3811272d GIT binary patch literal 963 zcmV;!13dhRP)~H#fLJNYHVZKv3i3`Hx$RV-*%fj|q4~tZASX0w=NJ+aJ$g6!wlbPu)wqLxbt$!X+t_XD!rfccvDjnw65r zdASDe^9Y;pNu`!GN-a)-m9lw8i-ml#yJx+{uHaLfmFU8m5K-6Eo788s%F@K-UuslM zeb0;fMod9BP4-!0K|Q??S9fuJz!-TY5O^%qWTBKZ&U?2=n4XKLPmP6VxcwZj>Nu4U z5k~qyjv{>i5ysH{`)|j;HW?%9dNwwS7Ut&TOB0jx^S9hv-^n%%sM&`G;MUH-ESDe; z_Yv?>f`h^CN~TgNPbAd2!T!*;_O(nBr%#@pFO{pWpBtQdkAn~BN~@lB^v^8P0Hl-C zz}PG&DhoK40rx5wCsFyx3inFm99A!EI--^gBlz-gQ;?tg8Dp>3Y_XfbKWSjt%atnc zm;bahlAT^(*HBAmum7O>1g7fW^kyXgzPZ_}1-sMkfBv~n|Ala}gPEpI?q&HrRLiuH z^LB` z7wYTlaZK5RIBTw5Do!k{p>6PQ?!x5ZU&BO_z7zq(Bpwu%zrP75`UZl*29F26=4QCv zZcea?%*qNhz7zXz>;T*QE)s{1&Qxz)KCF*_F)F|^7mp}=b_vn+&*A&60!p2&9oi=! l%X;d{v1;V#n84lh5;C%I?Do*&>L_f(VK)BEIN@hz|>bpzq!u6d!cKiim7sWh+!+ z-HR8}?r!bovQ21fHk7UO?>VBdW+hd=%J-L=AMy3Psl z+8gieH|llNwl+~Im%%Iog-H15^u-_Dd}Jul`Q&4hQ>FF%&vaXJ!c6ih#kF)iw z7t0J23l|r@nmC$#`ks}g3;yC-w&DT>K>($~9+(M~?}5PqzcLW&O^%I4hb~=S&bV0N zSb|(%UoUuy8-@Pi*j=GOXf)p27ZhyUhG{mS)l2B<6yWm+XxS{}l>~bJ!Y{dWuJ{RW z>O#3;Eo+{AzB7e?Qbno=ha}oeYYMamD%UB1NvaWK`OjdTkTm7dD(zj3VVG z**`Q&asN|}gZMXRzx=><91OZmtX9GB(-I2r*4@>^P1a%>qPH+%NVF?kh8fgjYOk3G&P0c2?dcc6+U_s9ij$p z^VPj~hq#MiSdBMZc+Lg8T?BZ@S8gF)I`h+C^TZ#)aMv}+e^2-(2)_?h#s)tEw$}sm bHvt9!CAnRGEIVrV00000NkvXXu0mjfN3hRQ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/trophy_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/trophy_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..9c6b03dceee56d32e952223933c4b8ed1c6c7038 GIT binary patch literal 887 zcmV--1Bm>IP)_T!`5M^10B*_gjmnC`zUhfF{I>N2dfr0MG-QOS13$A=< zh|Mi7X4LFbrhQA#j&La4-`m=@S+;E(mSv(+&Y`7QhDViAvw7IqbO7g8Z*9OwkpstAl29Zaj+FrJH2hHH^= zXrAoLqvh90MXZl~jYcR6*>d4126oEP)hPqhHP@rXyuq z5bu5T#r>6X8KuR)u#n3^& zd4S4Q@jn-fv7B^zAtwl;gK@cnYzkUM);ia&7i|(gv08}2k_jP80K3UQ1z3#b1lrxA zrd2h@6)GCSW8v>NJQ;fBopPp8TX@4TplK@Pat5m!dDtW#HAC=NEj)K_^!HdK zmOkbm$6+=F#W2i$iFoXEd^)y^em|^+Uhe6+udhWE1nM~LUF2}>#&qVFp-ba5e!gX< zIrZ!)o|*@K<9BQzppyWd{X9jO;{0s<&y6;_!?Duc;wTl8NX^V-&z!w6VRss@U%2($ zb+yQEd}(0djVmJ~0q%CEO%t(7Mcy-X>i85#IOZY3XRgF84YfUY^88=OP=H;GUIQa~U95)x`f6_r201AS?wKDB-70|6e2`T$6Ms3-y{g#ZBw z0#ytSBwQRXwv~YE*f?<<@5PRHJ7bDk6*1bQozXepcg}q03>o@XavEjq%4_zvf^G*Y z7N})IDjKNK4BKl1L}4g9Wn#D;D0-Y^-s3>V9?AU_?0chLejf^<9zuh$Doh?a~^v}ax>78uX?$;z(1Th9N|Kbee23!D&N ze|K`7UMOHL_Zrzu25f=ALlm67aBoETo15xt4(;pSoSsTNpfg3gktr@uYBHKp7+KHD zHSnG#d?F^5%4QgoJpxN-i#9X$qS@BoA-f#--l-5x1QSB42Jw+M1i~j`TAS-+(=3?+ z%XAY%_l7Qg+|zsHqi2tXeW}S0EWJ0}`h^u?~d4th=I22mjy+me=E6(pOQ;d$q(^m(>kGTIXuj(SBhzKY9 zk46#R|A=j)?fSsQGnQ?WmiAQvafPw*`1GCO@p09!97_abHCZpCEn9+A0qFmg<^-y) z7yAaUT$rGQ3Jo!I`(Z*iN_}THdyn7jbdS97%crk(xG}KY3Hrw z+wsaxU%<3-`3lcqS^_cx8)5P`%a7evf>m6%)BNcEqW`BZ%_vkydH<{H@b6sr&S2gA z?Z&?ZU#$jK)Zli{zJnVhqY+x>Z=trf7KAhQ2mV6RRpzZ!ARSnNv0q2SRS-c~bV1nS zQ%@kD_z>=x8l%lEEeJL=z~}R!!slUiE{6<%6Mg0b=#?BWUy<=maXZJ&2(ZMhPL%z4 u8qxISFy6b?vgY|jUcwC2e=u`@3orm<_D>DOvmXKg0000df literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/tux.png b/interface/ispconfig/interface/themes/default/icons/x16/tux.png new file mode 100644 index 0000000000000000000000000000000000000000..bbefe2ec455c42b2c8e8435582cc11a8434495ca GIT binary patch literal 696 zcmV;p0!RIcP)a8B{-MRO+d-q3;Nq=BQ5k|pUEm)WqMHu)e1HsCoBnZl&D2fWC zaQI+^Ypcj~qlqjN+KQ~b2pMEyMH{Ql+1>s2yE7NkMta~2=N!)coZtD~5&$KI!t?Ad z$MG3K5aJfgx?{!872ITuZRI#lqksTdtyb{7RJQ~`I$^U_K{Co%zhNU}Spi{>7Y)dA z2T(yWOq>p(RuxZ;w1ML7gxm{mzWemI`nN(<|yr*`feZQuYV#H)Ari z1=G>vINi|>i=~44z?}aDs8rU})cijABZaAtpP*_$DD;f_AnVU~YcQ}?MFF~@lnxDf zyNq(_WL&)Po|mVtd(wFiQob0&DT1hhg-xfS-QxYqH-fm1@dyFt8i e#x0i4_uw}&{+U-AleQoL0000l0ldN literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user.png b/interface/ispconfig/interface/themes/default/icons/x16/user.png new file mode 100644 index 0000000000000000000000000000000000000000..79f35ccbdad44489dbf07d1bf688c411aa3b612c GIT binary patch literal 741 zcmVz1iyEv%?$mbQ(# zwJpuiQJP8?X_`#S8b+U_G6=ziYB!xPAcq{)ZJ0bECH@ zYx#`n8^Wzn^J!4>=q^bltNO15ry?0ecSLkjpT@vlid!jk)Fjf7&)q_V5zGs#3N%6* zbW~7Hg=&P0&~Y(|g>$hC9FL?;ttzPDZbpZu9OLb33^e2;FNTGJxScp1&q4M+y2ntQ z?C(=hpU$3~`Thx0eHwi0x`q+!d5k@|0_WHe%sG3e-s^MM`xM-ig!VcIA7H}X1ot~L zg=MLB4w-Q;Bi!!u2|I+Qb;0{{4Q53YX6+4_aXena{nmt*!YG7ua~`qc>o=?@U?rOU znS7%>klzi*muXnbM6i@4FR@s^8vTjDgy&%J?w?`u>NYMDFa_2%0SQ(qJE<3=<8Bzo zfdU60e*y(^$RF%r$kl)p7=7tlCDa$+J7w>}DU(O#~fk>pYuRvHi1E9^msg{tLeV XM&GIRvfA7%00000NkvXXu0mjf&%8>| literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_add.png b/interface/ispconfig/interface/themes/default/icons/x16/user_add.png new file mode 100644 index 0000000000000000000000000000000000000000..deae99bcff9815d8530a920e754d743700ddd5fb GIT binary patch literal 746 zcmVR5;6} zkbg*1Q547RkCGx=+ZrJV#zL@SQK$qJV#CSW)Px1IG~1R7@Ce7&_JfOHMV?!rlp(uU_DLu%oT329{ zvd}^m>Zu}~l!lF)$vj*+!9ivWYi3=6E`B>+7|Su$tH+R~2!#ne6eorwU&M#{7<<90 zO$iMuFlR;n2z>v9nKwp!?XQQ|aSfBtZ^J)10wQ zP}rH=KSJQ4N-!Ms3A?4X%~8iSR-zylzlSXd_?|M%f3%_Vax4V#xlec^^VT&5JP8rX z6}RO@h&}Lqo`s_<751_e20DK|@e2`2FToK$y2KTlwyhFyPdYY*B{>w4$%B}fnn&9d zQ0xQp-T@b00q1)Ft+NxwMg`RMry#!}42Vk(RW1t-$ePmK0V@&mp4&IBO>%w~~-qNFem8*NKi5C3*h;eH{=}2kRqEdNlF-|c6B{jNg1xE|{xZ_qq=T?P)vCi#|P&Xm-dkucwL z3)87{8iWe96huvPHfK`KOdC2Z({T6vJ9pwDx$D4>d(Pqff6w7Lmj{5i6;ZyPPpPN; zroaW=6d#@oL2Fa53F~$Su10(RG%K0p3VTuP3?Z=nBA8z$uq+XLUL^QrC74`bU|!e| zr>hK{)%Q!vdmIO5Z3JIvaOyjOX`X@c8-ua03`Q&)f&%p*{(A$q`ZTTjk%q_T7>v^J zu!R-a9fFLScYlKkNBP_Cob=9m9JLVoC-?c{)eOtMnh7qNN{ejy2sM{pS^mgFHJm@(buuM4>=<5Vr$&Kzw{B?uPr; z(1Yf=#g)zADkWnx=MR%ykl| z3Ui42k+O2{bCn)01-s5Sxp|z{G2di&KT(_M6;$EI zDL57JFf}cw4bP1P$pgTRKH$0@h|~aA>j`qZ2*kU5t2EVD5#~@VNhqx{vz8ethDD-=+1vnemftUBA zF;N!Q%PBB5B=KLB#QO(CHe?;R+-C8M?ppDW>R$5`cCPq@YpusFRTaH1i9Kv;l<>I( Ze*oTy+;kdDB`N>_002ovPDHLkV1l3CM+g7_ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_delete.png b/interface/ispconfig/interface/themes/default/icons/x16/user_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..acbb5630e51a12a1cd30ea799d659b309e7041cd GIT binary patch literal 767 zcmV!wMF|0iq|AK>&MHw6~-ksQ9RtH+=$?!G=zinz|BNIO*d}XYdmm2K>Qw%i9j?X9SgRBJn4W5%uAclWG_T7f?M4s9q5$`w5b| z31S}-Tq~-?NahjDw3mU5cfqF5z)+g+pPplGDyLv1f8WAnTQ+Xiw;{fhcBLH^j|gI# z2~IT;7{m9#PQ$2>16f?4#0x*vLFksSJ~;)W1wO>uQ-rAG1{C+&5Zw%%))Pc(2_k9< z`smoi)Pkk!SK)SAcOy>0d#x(Rl;b_GP?XFE#P>r%M^9Kn>j@#I>kHsrS$qYvKE>lwZZUsXcw4nFNHZZ~?%71a&2u7&aV|47ZvJKBUVO{)!ekB`ACp}1 xSnjsa#jtYM{A~v!cV^R$X2;lcpKyd7^}lwPp>~q=QF{OY002ovPDHLkV1lJ{Vb%Zu literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_edit.png b/interface/ispconfig/interface/themes/default/icons/x16/user_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..c1974cda745278a404b9e29fa91e0503a84accb1 GIT binary patch literal 833 zcmV-H1HSx;P)wKwNApj*j?`*x8fjj}+T^cdNV;=~VOf{An4CI`(Q%x}`$a=uBQ`IcOG~+O zhFmpv$jQAVt#pVn<-FwXyxzC#)@;^BTYr4EXV3Qe?Ah}?KRp0?|HEG!QT7K}`6R>T z0?GlfNd&N5h)SxRamGIduGtwfO1+4h$^b)DXu0o8M7BEtF^>B+6kDUTT?1tl0&27( zTPtN#enUj2hcV)v4ROVeu()d=+i@S-%91h3XQQ_&2GLH&h;==J>*q}oafY~7o8YOx zW1up~WKKQv35z{tnCiF(G50p)FLR-gi@=FATO4h+zckVifX~k}G4#+4;u7niZGj@H zRkx!55oQOPpc>+6Y1FM1A`bW&7GI~k7+8?J0DewkUh)LOJkrdTe3;U(*Zgc$Er)&@ zD+5(f%bInl-ZwzNw#9d8%I4~~7EHgs3zhUKHpaRkt%*?UWMg-Zz7eUOc8t^s*~Buq zNnU77^3>6u=K_U{g-umARHHXA*H6dCx-dv81Ap`v`JB`FJi0MFsY3lE z5Gw;{eLz-+019a$Hq}BXzXU@)LB-NA6Y>hD8BxCLDcvPn`&N6q`mxc}yMb~sKo@Ed zDbOI5^9}?Dhz0FQMoKPVwk00IILo!IfS6^eQMBJdKtv5PI+Tbj;^0Fo6JmY=Cj0!M zlv6P`lmJPo4+6tWG2fYveukB1DzkD{lX z41Nw7E`C*@hclIfDYh$GCw<#Tk~h)}QkWS=$Gv&wY2h|l6&7Q)uMmBi&Zxg?1_yGk z;>5+4_M6eEhsL=ygB_>Q-+`#k4z^f-l|x?d%y)UiW7wGPG|s;O<^@R5;6} zlU-<1VHn33^g%H_Q)k_G9ovjfnFiK+H+Wv4;+`mU!eP_1WYT1cBMG4+b^?L6?AK< zB&!jFQPqM`i@@k4u(!!^rBRBL3hHN70i&#iOH+^0u48x?v*GiYACKJzT+r-=qk+oz zUpus;svxs4gSf1jroEXH?t1wdY3Aof0-iGMy6$K8JD3_XyAT<+1dUmit6yK(! zNF_M9n(Bm#E9}vQx7n3q{&nCY)~18Vynj^W_e>bi@1BCANxml61a_7c$XmJMZk?*# z;GcZLxX)MuKlTCU=6xU;ncBCjL?Amju!Wp&&M@$uZ9p#m5yGvf5Ue8*EJF}(aLDzJ zAlPvPBtx=PWAE0I3CKlubR6lS2?)Vw;GM(ZEgZ6)VF+v#S+fswc_vu$Vh-L#8KE%#xl>f)!T)$#yRmO>TTOvB+HZ zV8!UbBF$h)Z%6VHiyt@rn*}fK8xy1uKWEQR=pEqAk+P7{#x6 x&>pVMG)#i!=x;v%@<9vjT^KNkD*ncQ;SaYr!-X7+DklH{002ovPDHLkV1noBEY$!2 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_go.png b/interface/ispconfig/interface/themes/default/icons/x16/user_go.png new file mode 100644 index 0000000000000000000000000000000000000000..0468cf08f3760dc13e44aed69f4f15cedc93b503 GIT binary patch literal 793 zcmV+!1LpjRP)a8r-1c`3+>owstQ*9I-_ekzW(ohmYMY`{P6ZeF5{f*M765oC3mgQisOM;QQbX@ggAS2KgDM2gcqZA9XdZ>iF!~Vl<60PAsYul3 zdO@$k{dkx0EmyGNDt9}0CpW25-SK_A4lC2`W(<=`JkE57@PX&*6@@GQDqw`DDAt^o zq{Ey(Out`(COaJJ>@YJM^^2KrxFq*RzAhRU<&M8e2tg%w*9#|$0B%$xx&b3n#4 zkf!uOYO^O28&82>e-b(E7tlIZg-q>P1XbD?eadJSW`T2LeMI1S3A7{YkWT@r!zKv( zO-N}zjVBW|c%-j32i0RzNc%F;I4prs$%aP>#pqIKVL?pfIIhp@vQS;GLtGb-&KrG^L94A_pU%f6M3**AM

    gJ6i>thi*In%G< z11qR?nZ<5fV+Cs0?EF;*rjKIYInQ$Ka$^8kIXfoF@SaV-aWlw~zZ}ip35JN+^=tnJ XxNVQ!&Csrn00000NkvXXu0mjfj)-I{ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_gray.png b/interface/ispconfig/interface/themes/default/icons/x16/user_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd539e9cb04111e950ac9b0cce82676f12f67d4 GIT binary patch literal 706 zcmV;z0zLhSP)%zf?XuhjnHwp)vDVV-Nit=+l<1e_j@md!Ei+v5AT8J`SE{vdFuew{g2kYyx=h3 z4xieMNJl*eP72^_-v!pJyZ=`JAM1)mw9ObhdlWZSJ22`#g1!y`+|mPJoz{^J0U@Ip zqqZgtkkAd&ArfvtoH-0%$6gp(_f$3noIl=(%W5IUuV^sBo`C&WBd!{oVQoJMrfnxi z`p#^x2^duFTU~s97sdAz`2P9<<{$Or>$7WEm>ok@v;XI(hZnch1SA}-?@Du%ST1C- z@^Ol2n(j;UQ@G<16>3&!ll!(xrPAzppcCc7J*<9tO11JKgUNwTh{fV3qSNQLtqV{p zl?^JDic_oANTpKf>FL455JRQWXy~0zr{ni=;uWj`kl?0ZFnEhM@}^`m39HqLY&MHb zCIgengyG>~csw3-cXwB0GT9)3Y_0-G@Dj_iNT<^<7z{8Pjj-G8$mMd#=ku^wEYNDT zu-R;gMx$`M-4(f9-d6=I3^o5=o*hIu90td6)Z}nDKqjN(GYkW-*9(`+1;5{qVlIle z{VnAxU@_8CDZRK(4T(g8f=DH5<}3B~_974nARdoX*pHVS=7PdX74Z47KQtd|`sH*w zq1WrFkyk7hqy71*_%rE`uC6XDL`7wi;nuvu(zLIhbZjEe_=@yhBIB183I%xaA+i=F o63H90*)04vGrr7ApigX07*qoM6N<$f`O4mr~m)} literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/user_green.png b/interface/ispconfig/interface/themes/default/icons/x16/user_green.png new file mode 100644 index 0000000000000000000000000000000000000000..30383c2de517fd22945a87b0528d2821ec4d49ce GIT binary patch literal 722 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 XHe4|Dt4X literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/vcard_add.png b/interface/ispconfig/interface/themes/default/icons/x16/vcard_add.png new file mode 100644 index 0000000000000000000000000000000000000000..2a68453811f26444e2d04da5713c9c757dc999c0 GIT binary patch literal 661 zcmV;G0&4wR5;6} zlgmp~VHCiBGxv_KMl&C2qkCXb}Wq zf!ZRmAV?dcl3`5C9`u^&j*R%u>z&8;KPY{YWGtbfuK$a=ExUB}iH8 zEPs4~N^jt-Zswr3g){Ci_UZ~2!Wmr0Ma#WbhXyeU7+*w?FH!AkTK)!xHA(%V`3nWCtofZB~;xy1Wp zclf$8!*6>HJGqJf=sC(o!*&OC`_`CUEJs$9bD*XGd(Ea)E&#^XnS(ZgInMBG4q?C+}4skYc8sQWiIn=|m_d^&hoje?QvJHqv zqa+duDl02#Y;2^Yq$CGiSe?h^a1&_01i;l(w|V?-kc=Ef7eagphr`W62s%1C9HCH1 z#bU9%U$?rx%&ZwAVonn5xl8}}1&XvnG^ef{ySYZA*K@tzyT7lq^#o0|ZG4^&6PlhR v_HFfsW4GsQ^m_V%%Rnix4h+5;FoS;pMlVc!y2FYE00000NkvXXu0mjf;fN;k literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/vcard_delete.png b/interface/ispconfig/interface/themes/default/icons/x16/vcard_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..b194b971b398c3d81cdb3daefe3fc4c5ba959eaa GIT binary patch literal 651 zcmV;60(AX}P)#u+p-Y`QM29X# z5S}9c5Y@7+BwJFTy>-o9T}AP^yYJ2Wb+BDs>L55U%nZzY=R3oUp|$2H;^T;NWB|3Y zvN8%>1@Jr%tu>zKRj7#kWB=+iBb`pWEiEl3z`=c#{QudKpGYJ`X|2twswy7FgrdF8 z#`pJVX9r(v568pj8EW`JBobkCauYjW#NI7p=N(?$j36SWI@q=E+auicCzdRW#jK4U zn*+dc940Q+;(68Ou>eE_RSE!{whLVB?clOsG4uH=3DYbmPEAc!EN^gda1TI4_KIDP zkC~GwwLwEu6S3j|xm+F^_5h;MXt{fdbp?Y>Yk}7ASzf9>a=(hy1pTz{ESD4GPbToi zUn8p)5(v_D?Jm;XyU(DbevA3_0A4V_u{J;Xtvroh7N{lr_9?AvF}iMyP#r$U?%X8F zndca7OBl&yQg?TESIlSIHibf=OnLrJl!5Cb)c$-2%hS*tU`?GN_F-Y4fn`}_G8sal z5S^W!)Ya9M0cF*qracTp_x3Mv`~+%q9VH^kcs$-CBJ}t78?&>sI+aRQUSD$%`^y{Z zU)`p#`x_hB-ZF6;1FmtHZ=4?P822~UkDUs+O8HW3XI&OoO>y%2zH!)ho*6zpx|2)a lGQ~I}re4d+k;eSjU9UZ+4 z90QP2;y4ac$|Wv@_#^)I2TCfH$_D}g6<{%&x%_W&E|0}xLUSBPb-Uf%j0$Yy8`JSu zIJqCV%4?_y)^fz#Pbd`P^79OaX=7w<3^T{$(;h0T?8^6sNPyezP`j= zwjWIh@oP9Qd7EC1rcL85DIsd_W@^d=?=OJ*&@}nP1cmEP;0x{~GgM8_i-!vgGKoIQ zgH=4y>X`a$v%;^l>PHd)EBy@BisRqBhpB-cbj7B)WEI}h$^`~%ie~AWEJgZDDXY{m zXHAOb1ZuV$&E1Qy>LAwWBXp0#$cJ8}qm%SCE&!ZA+%SI&!!WQc3u`h#f!T>~QwwJD z4lX^9+q;1x=L>;DHyCK|#x)0!NF<0xqYMuZlQ-P2qCDiuU8_Gh+~hpQQ;Y9Yg04!_ZE%SemW!igKchx4WJa+_9IUqH2;IpT3(}`$+Aj z_Rhbl@sAabH~F)5Rh8PVnjntbie%Fhr;c9#IQTC){{(bKa?t*>JG%e?002ovPDHLk FV1hfYVB7!z literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall.png b/interface/ispconfig/interface/themes/default/icons/x16/wall.png new file mode 100644 index 0000000000000000000000000000000000000000..ecb897188bd16bd0dc82f8145b4e3a35ce1fb519 GIT binary patch literal 547 zcmV+;0^I$HP);Vtb)pe+^d+T*=sdIflUQ3jtaM3GCSwFT_#dq zTHD#$S#Gsj?}NF!tRk14!e?gRU1KIUF0iGAg>?!KeT*?7;M5(k0g=@m&e)K^JfM%l zQHsV(tzwS$nBq3seMZLv!83c lJA%K+D_2JTyUuR{3;=sJ{nIy;L23X1002ovPDHLkV1hE{{4W3i literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall__arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/wall__arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..643a5450c842aee902d9ef343c869d2eb153d1bc GIT binary patch literal 675 zcmV;U0$lxxP)7^ zB;C?BpmOJ_r(;Q`;g2hMYlWTi|d zvwKt*2R!1@)I=CNxlCt1@dbvBuv4>7XYVu`jb39m*2)M=$FY~G8+pXSAqShBn7GfO zjXqu19RpfbgYI*(sz#VT;9zZ_kAuc%)5}>KR7w^2gMOgJBArg7vQ>ir(11PWcDJ#d zOQTd&5%dK*F9M(CQ03*QoPc2%5Kw?Dhiy+oP~DKDM|-&)d>QiaF`HGv%cM6Jw|fLd zQ4t9I+Pb1D2;#W~IkGkGo%b!>BGy@UQPqrGV`FY9@5Cw^(f2se*v(KmA zSQdSHuRgp**V4Y#yZURmPL9EBm`mRtJZ>@!GwrtUobsOn3;@y;CU}4|4E6v3002ov JPDHLkV1glXGkO33 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall__exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/wall__exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..88b771628fdaf7c22f65b3bd8e583eb6400cdf2c GIT binary patch literal 712 zcmV;(0yq7MP)je`lJk`u%aXz}?x| zd2?pwt!a5CRJA|ORw0_E!II_SR{*Dqzqu1C{80Yk6rOw{8vjyh$dl(Gl1%-iSvl^O;X@WPm)HeldMh*Y)~~*DvHuHkj-VGxSLrn%b3#9#L7S`MOKJKKE-U1N~YlL_5ynZkw^ro-6Xue4twly z_c9D)57khQawjUdD*a)KBVhmgF@;1x#v*H zAT-@T4uZ(Of=R6-$g+%dI)j?G^Gw>#iM9l9rwF&J4P8DFW&OQ9Zq<^5TwzQ4x{QRh z3R==(`OhC0AxRQSY?sJV6x{9t{5>IDy806RVhD!z4)OIhtI0TZp>QTV6sosv#oER; zdIyf#%*C%D80d#UWlT*?;psgu0)Y+~ya|p&h_IXBuzm_vRqM*6)2K1NynwDA9}<}l zc=P%eb_y$K>m)YkIMYpw!0N=<7;U^DR+$3cI5lW^#;-Y#I|RO+?B#I&!b3>khH>B! zhoTw^8&|j|BO|^ePO`=NEJID*hLU<^&j^RzhS0J>ts}bx-p;*-8!-}QK=I<6$~9=EMtc*2q9tFGy*J9HG!nDo$4hq zBJu096Q?mOAWk~HyWgGe-8=gP#u%O=f+%L+@pF3MUvk|Y*bn2p!1}?#cecO(jrlfL z4D?}~R}tIoHhlGM6ey5v;Vw_2g#ze3PN29I!#wFXq_`5~+YJ!uIrnOYVT4bO5nxNk zt)sy0nMOaK+Z92a5jXd?_da$yo#9}r7j+a1vlwM|^%v%g(-HQ5W#torhXkcG5^$Oh zXeP><4rg>M!aN{B;K*hDs2qSst%2-#7U+u5bsderHDo8of>=E6;mFicyS6c&$@edU zTqbDBYDryy>$*sy0#z*rwl7IL4z=`h=m#R#p-#RESQE0!XTwPN1k19K&;M`TvMuDP z5@|bN=`e>8k``{R&b8wp$g9D(>$ZcGlH+}Q&<;=gL;Pby$tl6}G))WZnIwgqrNxC( zq|LM6*O;1_8?yA*9dye-k&qK$o;S?zS5NN;pz>j;u0!|mQKU6LiZRlaFEkit^BfXicdF(jPDd&)M?v{R*DsrbiQ z0Lcb}ugeOYd>5&^iunAO`Zbi|2zMuO|7t&?QGxvEAU=S7%{WmyalAKVDl@sfhQmEa zo0@}3f+~E6K+2w&m_pyF)37>&n4EkPV#p-0#-lJ@nIwTfRM*xE&?a0dK zdT#&^fwvXc2dPnA{i@%&Ld^|E5oz%odmPk1rd5xfp`PyVz`d-hzj^pwK4Z68X(Nh}PO zp^_AIMsPD;eEAzpxTpzHPIzL$+yq<_j%raeO?&TH1R)$VcEcKT1O^vmFm^RAC1!q9TckV$KVQ7DF0#UE!D__P5i8>Eq_!xvgL8E#;pWpvg zjsPzN3{?^OsFEM|r@qFpG4{#I%asTHet)_#+vNtL;RPIK%JwD_(TIcHOQoI?7;tNv z=4epcDm0&ywN=VAzk?Zon?Mx`x%Gk#TJ;tJp#ZSQBA3gdwOdDE&TqH5Tn5%FIn;L) zgnYsALJ$fBZ9$4lOVD*49@HR7QQKR^qqrc&PfugJ2n|T{XKmJoAkn=s$^I|MvVvgn zAaz-h5!A$KoF;Ek^jEPkjNw)%32Q7l&J2E*vY+h^bT(MNp{SSXg&o_4MhRx9jtMXEXsKWo$qhlN4O2V}2$rvw3KSO&_pz~KZ zRuPPYxy(2o>xRw(u>H5h#@DL_yR@3hxK|yJjpkEboZRVqSX<1BO=5|98slCT&?|*K zxTL%g*>s~*jDhTaA=TFZPZ k|JYCG!&c^f&OZVS0P?N??S?-BPyhe`07*qoM6N<$f+;7=9RL6T literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall_disable.png b/interface/ispconfig/interface/themes/default/icons/x16/wall_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..f7317d3cb0ebd32cd792095981176edc61b9a690 GIT binary patch literal 415 zcmV;Q0bu@#P)SvMx2H_2pYzF~$L zmLXl&Ep`za1c45xH29BD@CFS+$Sh9Vwv|lN%)oi~egBjxK8w?)X%KEu(T0NGtx-CQ z6VLN>K@e)Bd7huJ^8vq~;QO?yD#OYH=W!V#fa|wEYd-BJ8T;q!Dy3St$3;;|i((y{UxBvhE002ov JPDHLkV1nH0v*7>$ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wall_small.png b/interface/ispconfig/interface/themes/default/icons/x16/wall_small.png new file mode 100644 index 0000000000000000000000000000000000000000..54930c4e5db6fc36251fe8d2c24600605291c40b GIT binary patch literal 420 zcmV;V0bBlwP)bzK8U_{f313=$&341x?lp5yfb1OIm&D+e>#gS(GDS+izw{qNtu z!NSk(-ek~GmS^B+_^yNBfcG5tc5mJPjF*F-|LWDN4ELYj`NGb__L=$rUxo*V?=XDe zXMBR+fRF4-mU^~QFqGM`pd^JY&`rtzkn88!)pK!!%r(+RYit#*KRQ=Dk?Jk`SXVhD9m;5-aQ62H8qB1 zb2g}<8^DO1l%-i%x`CAbR|d8}Uw{}(y1D%4&xdN91`N%-K(PS;0R{jHF_#zMDN_vq O0000&;S%Mye5V-Z|A_GYL z?)h`Z_zn2SaQ6J2LtsTfn&HLwUknnQYz#0yNFJ{NKmRcpt4bI#z-<2U;5-8||JKzT z_+9W5=*P3S4j8}s`G-M_9U=wfGr;&iv4jCiI{5mR!B|7ultF;;9|MS1k=6lY7#}2$ zZU7^4QVwEcocZ@ZrXm<%W@I?K?iXr0U>y2+fnoyy0t^6L26>`k+u#fU0000u8vaIloJC{!H{9XeDI@{V`#br{!?jmFO9ia7K;erX)c}959793?B g08{w)+xR2E0M8`T_}vFJ9smFU07*qoM6N<$f(h5qO8@`> literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wallet_arrow.png b/interface/ispconfig/interface/themes/default/icons/x16/wallet_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6a24de7540ddc0006663d8453d16175963ca826e GIT binary patch literal 638 zcmV-^0)hRBP)JVBB%5Wm;t!Zo zWo#A27M30=xQz|P`QsvG2SHCB++p}H_&>PrB2o|;b^~E22d)PPg5c)C91LRZHs{zb zwG+CwNtz~U;`^nrPN`Gb3xO|R@;vYJyg!)dc{oT2IABPRuP`u%G@TRwiB(AagyeDu z9uhb2+)voHy)Qx(MX0I@S(fp7Zn~+!X*54tmIYnc_az7f0ZK_wRV;VzFpqes;E{ z;CBLkuGMPT*eH@;rN9>&M+B))c!qJyOJCmcS3fq@Gc8j6u30fU24oI3*?Jxp`39-l}Tdag%T zk91-)m&4oleYkpe6xnA6JSv{7FJtexTjW`w)D`OZn+m{&Gv5lgMtV=KQ~_;I7kj#Z zg-02q@AXII#gBNk-+2ez%Wc`ng$2QQv(EA zyJ1-tOw()$+}x}}QIuvyLBQJDCx|==w=w@)fdg)3pRw1941UzK>x4NyyzQ_J{&Rsum0eFfwu! z@pzaNF^rB5p}z;%Ct;dBSO??~CrjNS@WK`ni3Bw>5BWeByqy|EQFJ9c$*81Gex0#G zC;p;B777gNY6zFM zLLnUtw?4Kuacgs^q5lvK(I0TJ!6A@H8roVK8fq#WByve3LYzYT(5qg(AKu&ZzCxOr z5DqK&Y?eIvqXMJwwMANp^eS0kYN}j5t1Y! zm&+j#2;lN8)n#CIx-WHIN3+=+*}&m&z%Wd-+iftMLSwXp6<}BQ9H(rU9tQ$QK7>G$}G#Xqdn?$}5q<5vnGB!Jv@EVeZ0e&Xa< zy`IFwZ<+Y8k-yQfD;xkv)KOITfxQvAVgYCi|Nb|A3NQfP!PmOfnH#+T0000< KMNUMnLSTaU)8#z? literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wallet_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/wallet_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..ba27aa17239f35f99667729c0e712eefaa1efbab GIT binary patch literal 633 zcmV-<0*3vGP)}v>34kPsIj72Fd0js)GbcP!M=+LFgC~l#mz+9R&519qQttK!~t}7HPYTp-Wmw ztZnYhy0bg~_VwN@XoZR54<5Xk_rC9a-|u}-pp;@SC1Q_7hR+HR1dOnGe3#fX6Mu_T zxdV!L=hfc0>$=+_BuPRhlYypbc>R2|roi)Si;m-AWKX*#mI&N4&KT_p-kq!y;8 z-v4E7A?u_?5$O#Aelk5!fP5s6{?s+}b)7GyVKP#Wq51~;cJUkV?8VLrehV-FA8hv= To62(;00000NkvXXu0mjf;1nY2 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wallet_plus.png b/interface/ispconfig/interface/themes/default/icons/x16/wallet_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f25be79d081e6b6ec57d166a544bf55e64351d0d GIT binary patch literal 607 zcmV-l0-*hgP)Ip^aFr7jLD#D0&g}(ElL%2dq#$DCAaz;=x-%ddQ)dQVVuLR;3?^L=RFE zt=W7uo7s=?ok_8^)KKXQGtAD;^S;mX%sZM80!ImkBZl$png&fnp4Qp_#9Bmt(g>vj zf$WW2_p+Ynbwud84%@b2nkEXbX4(w=p#76`jz*)=F+nUAgXj5hT^ACklK}>Os|bPs zzV9Chtkvpp9H(8;FtEP9frw7T1@eCwNbo@tDwQfi(m6P2qSb1tJ$ZAPOgcL^JG;wZ ze*(E~Hk&9GH%apVrl)5xHg*N2Qc1B$CX@I>!{AA(h>wv9PXE+#_k99PA}Nj?Poi9MFhBq1FKM4XbBi%pY%$jb znPinY7@fF-V!}g&DDEAp)Cmj?okcE}Aw~?t!)f%N0(uhE2g{ec@@oUpbT1F#1P&OP z`siXAXKGPQemSXR>}_{Wni-X@(v2@v0S!-k?9rRo&+m7C<#}OyWU99Mub%iNu(s5~ z0|PvKyYQl*N}RiW!Tj*@ovlv9VZCe|8SV95Xg002ovPDHLkV1l$y4FdoG literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wand.png b/interface/ispconfig/interface/themes/default/icons/x16/wand.png new file mode 100644 index 0000000000000000000000000000000000000000..4747dcae4ca5d5d57a2b4b5352ce82e1b4402397 GIT binary patch literal 597 zcmV-b0;>IqP)!Til9uBiJSyQCuU_U+pbK+M3xfCc>e&A{;SBZDp*8$F#QFZj0MO3{K?RxYm({YZy+7&8moM@#%^FJInpz59 zGq8aCi{}4WpzYD1u)Oz}arUOY|ACqrCY6v zFpy9H(B{S8zWryr_k?kA`wWQYl9Cen?c2BiynOlcXHiknCRSEf206)}AOn0^R&2pA z0EFklY%VA$kl(p;Cs;F(FA59?29N=S07&zLoSdBhy1KeQfb7>W30_`a1}P~ih7B_r z!I%k$=1J-4>GB5;9)#PB5>7yWU%7?H=A@(~44a7oV9jxHapY@`ii#pjvl2*icz8Hj znn4Nq9}vG~Vq$WK2AB>Ia|1Ca5OaVM6cmHvjs>a*6!_q53?k%!SQv;sfOrQGgEH

    LgbZ9b79@~d zJqC6XFKJhxvo(?6sf7?>ef;__+||`ZI~)!+5D3JSN@br^Dur?tD-_U?BOmt_5cGE2 z*-M z3X=c9CXGw-eYvSZ{mmPq zv6TezFKjRvXauvzRvQMOs^!}9mGkAQIb4ZzJ8tFq0Je8-uW*7&)QDcMr-Q*@78ZBq z7eky^RZqF+VE+63%FGwvN^ZVPEiXL`6R#$`Tsr++*j9kLrO{{@%n?)>suWd%D%$$4 zK*<%Y@2BfrJg;aQ_R25bH{u#0*#cI>;qVgX2ZApu50xvt#x0S;eQg$0o{0YV4e2G{ iOV-stjBETK0R{k%r)ZjQ+D?oB0000 zOX!m3D@`N%kOWyoAl1q*vC@<>!U7WmUrPF-2-3@!)|V)PV)Q|mNKRP=6ZWAY3}0|E zEJ!3xq-~k*^}5~No^wS@(*u9bJ?Ea^|9PHs9#T?B;A$m+z5q4`D+kz}CVd)FJ<$k2 zT#(k*k*NZMbMj!i-|zp80_I^G{5Mu(0L#muXIZFTT?J1(4(@rc2IhaN4P#&O@_9a5 zA&TNBJUT5C(0Lox@H{-xAH8XyGhHuu)j;8BG+NQ$-~Y6|y}d^egd>bBX>)XjK_!7X z90B)7>x&eYC2bZPOoZSsJUl!++1S|FhX!K|t#_+IiUN$W81w`~V76Mti2*xY!17JO zV31pf3v0Qpuk(UE@5n(X3wzhI*Wo3LI5a^4?o;jqZg%oB6>^EJ4+xtX)sY`oj;4z%1(?@S~TuwTbh0|U8iAX^PkBCMqi zrlzJQ&ThB!xw@&?gFEm6_l8ifc?|6J!H$E%vkeUmqF%3$CbQrh9hAQb`d=;5*)>2E zDER!2fNTfYR9|1uIUEitZAUM;o~}Jzq)?<~sj^NM2?;nu8;ic6Y&*EFu8wm$of7=4 zgXj_hsnlej%D-~07c{!#`E)JBfkACDkl@T=77L=j3ff-7I9xBR0PDYvk?6wzyMQ5a32d#nOXn<002ovPDHLkV1hYdcCP>c literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wand_minus.png b/interface/ispconfig/interface/themes/default/icons/x16/wand_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..6c14df9b9c9df232aefb3e7d0e0e2462df30e5fc GIT binary patch literal 665 zcmV;K0%rY*P)VP#D0!Y-wtdsn}KV z-~z+B9*hU|(u;WTP=tsV33OY8qV!Tqh0;L<4@D5ci#_=V53UETItq(WE3C&Nl&xct zqL(39JXi{@>AIv%h~KMiY|{=O{NBqW@ArM*``S?Fy%a3o0O01q8jJ&A>PYudKr-q+ zfNpg6(&sPpd~y5Cv3kA!8v**!GK`FN2Vi#>IEI0Rb{i_X4sx|N4b@+6e)HShSxr;@ zrfGh{qhBWsj68-VO@qhWr8_)X$^K`}4MbK|)t}8~pCl5AjA0lT=!wbU>@CoYBrl} zU-r(nk`M0IfF}2~-G2$QFOXjD{GeW}t(z!ADjtusKA%rh6lGP{_2jk74QMDJ(b%M+ zftk~-mdWf?sr19Af8|&##^!Q4O_pWF`xq=nwV=BPx8)Q9-+#YDyN#q1FjU4a2pF$2JF2sqD z-;sO-6sceaaU*`@BSJo0-A2c@>b-Nu9{~mc5rr5s42jE&00000NkvXXu0mjfUlcJ_ literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wand_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/wand_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..a10900c9269f73e3cc81c7c591a3c283f5a57e89 GIT binary patch literal 706 zcmV;z0zLhSP)`Tg!W_Z(JJ#n5^NFjZnZ)O&z^MO#f9F)Akj zCAHP}fBaNw{jgZRe`RIm7Xj5kH*#WQ6Ifk^Nv%f9#s)qs3PKU71d*S5>sX(8PWzIueGKu@9qnE7WDf-Kj9zvF7xzXqI4SGDD(NrpRL{(6jSzVrYK6k<=7h5qVTiv zCoCfYRYp9{FDyma@NMrOxvQ(o5C{a4p-?DVO5xFHa5fUb*HiSxuO^X`fEZ3!?(FQ` zmZ@J_U0sbLNir*dTRVwC>=Hu$?sPi2$z+nLEs4PgHyE0mo6E1%*7oqeKK_QW* z#Kj%*LE->Wa_=&`%VS~gy~$=;fpc^2Z0Gp)yvL8})Cc~&ALsr3AD-uZk8rtFz{9(MsRer>8Gzc8`qWDDG%8GPy>A_{xn#kuLzL6ikwY-h3W0RYi0)(TLS}gC+8#`I4gKx*20% z=;(5pM$Sj5Pf_sNboH@?k9_?v(EtwTa=GrQsi`-^!^1vJ)2@hRnS>?Wc? z|GO$l65JmGnBPDV4uwLCcDsF&3?d@0x747j64pWizRU)^em|R^p1~a|e{q4J_jLr$Yu@?{_mh91b}c4C*kg zjq6<+6brDFF`!*7;JD!M@1da~W-^&_G*9Te&+CB+BfSjLcq1N+RYN!i9ef-mI9P5e*QZc=7jxlPfw3bU=eO6e@Bge`1-vY=F(cfehldbO{9?3 zYL#QLSP|Zht_t8*#VBRd4chN_n3pCN=Jam@^pU!Q!F}C6Lpn`rB%Rv%PIce}JT;MX zzuFj$9OOTNP`(4K#pCh6{Gv$Jq)Ji+e~mj5b)b%Qq!*IFPc4Gwt3=|0 T!(X?)00000NkvXXu0mjfPncZ& literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..f2af4380f098c646a623c18a1d7b5ad2c3d0d3c6 GIT binary patch literal 687 zcmV;g0#N;lP)S-hK2^1{`c=6ie{ijAzohI(CFx>FilM@Qv(Bo zQjoZ%r6pLNMOauE&iVWIF9Q}}5fl^@E+;4F7#tkb_xkng&8DWN&xC}8q=9n(Su3JOXCT^ji7*RStPKY#vYz=wbT{>=%rfHx^A z(Z|%(BnoJNv8t+S`Rv)V+dh5z#K!XU=~D(~W@b=8foT|KVPOH$j6iW_pdk!jzItb{Q2|M^7He2jvqgM?A^O}ufUSuzkg={ItOGMI2@1y(g$dOxRsTaD-RD3&`@Ru z0|P_pQ>RX!@9ys2_Tj^a^(?qN{{R1fKOolX=xA?`k56cN`SK+jRO&kr-v_#G7dt!q zD;6A@{W&=~4cpt>>$9_SYJlu3K$mSqRs-@TIE`S@94IU-V%5>nRbNz8+yeC8RiM~L zTrOon(;O@-D`(%@+L>Eal-v9E?VAg%tgIVwY5w~4D+2=`A0GoKF-b^Bgg805%sPGg z%71HX+bL2~QX%s4@(jQzV-OP)!<|Z?281~~yDhwQ>F$3!JBPWzBpoIxDajxpAizKn z01XItbaY*EXFKSMLH+&w_)48CXC9!otD~s;a7B8e|YM0BRKC<>d{H zj*be`)YLLHFfb?uiCbD)g5_C+goGGOO-;d^zkmNSU;!3EK|$eia&nHr!9jhmU%%cA zRR0X9PZ}uqp9Q4(&!0aGc!0EwjI>FA|AZ|kPMll@a=M_Ppfu2>fxmwJ`p)$8=T8QF z`1kMMoIneBladmBOifLqfCd-?y<0we_UyJ#pFXj%Jbn5U9Eh;MgkcsI77)z{6lVq+ z!tmwGXNGChrWMVfKVL0BKhNj*@#Dwdy?gfxEcyNWcLtzyK(>Ly0VyDTfCh+LSy{RA z@bCZ)Wo9riFqA%Z>h$^U?(S_LK73fug3IIo|Nr*`Vy%vj_V)Prgr=7-U$Q}^z60@n zpzC(Av$MZq!J*lolatf1y}i9YJ3FTa$i4z}*+yxv0#LMqQ{p#UQ0E_srWyPV&}g28J(4=}nG{fnoiEBWIa`AsKFHXzDj@ z+QQhZti&Z3FP_^DOhBvNzkkp02NeJRCDl$Gxy5k%%sl^wM)W2mk-)jahb< z+qE_hl-F2*iRXxxmNX+U3?2a4r=bS?LBqd6^!JD7FWv0>%J~2FwJCp&O;`>x03g5s X$X8^(Ils0B00000NkvXXu0mjfS1FHm literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench_exclamation.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..c85cf6de5a60eb37b42a4364c4f3394b2f233818 GIT binary patch literal 889 zcmV-<1BU#GP)XFKSMLH+&w_)48CXC9!otD~s;a7B8e|YM0BRKC<>d{H zj*be`)YLLHFfb?uiCbD)g5_C+goGGOO-;d^zkmNSU;!3EK|$eia&nHr!9jhmU%%cA zRR0X9PZ}uqp9Q4(&!0aGc!0EwjI>FA|AZ|kPMll@a=M_Ppfu2>fxmwJ`p)$8=T8QF z`1kMMoIneBladmBOifLqfCd-?y<0we_UyJ#pFXj%Jbn5U9Eh;MgkcsI77)z{6lVq+ z!tmwGXNGChrWMVfKVL0BKhNj*@#Dwdy?gfxEcyNWcLtzyK(>Ly0VyDTfCh+LSy{RA z@bCZ)Wo9riFqA%Z>h$^U?(S_LK73fug3IIo|Nr*`Vy%vj_V)PrgeGV6rzUphf0U1& zVY#|^JvplTv%g{n5-3iGddD9abw-_?oz1zqxi#9VKW-Kze3Z8Fo~a|xzxlep z#_!ITZ<#;7dC$tgg2m=QVPO%A*4DPN!oq?Up!cqpBt7^mAmOgb!NDiaFYchJ`)7}9 zXZhF73=Cfxn9wu_%gV|*c6Robm6etBzJ2@VLRs>YE&u*928c*IszoNOVi1wERs-?> z{$XGNVuS%e%^@l(YVKWKlX6Q-i>5w$^yq}2)BCk5^55;b1@*KT{(j~MCSiu}UtaLD zaVcv3`O9Gc8_9q$ZEZc@2@__f78mEtyLt2aA$7%{YkV9&F#^+AD8GcR>a+K!8MbaI zWq9-R1_P^*gepiJ7-@_k1H$$6jQplfT@aU>o4VxU#q+zqefzdbO5`0dg)&&MbBX9P zFh3P$V|v5j?bFS`#qybfhv%m-D+iB0NS+Cp$_!`EUKX8}7PI{1$zz8)T2&&BOYIK|-2e3Fv}k7GUBzqNOFx2n>SXFKSMLH+&w_)48CXC9!otD~s;a7B8e|YM0BRKC<>d{H zj*be`)YLLHFfb?uiCbD)g5_C+goGGOO-;d^zkmNSU;!3EK|$eia&nHr!9jhmU%%cA zRR0X9PZ}uqp9Q4(&!0aGc!0EwjI>FA|AZ|kPMll@a=M_Ppfu2>fxmwJ`p)$8=T8QF z`1kMMoIneBladmBOifLqfCd-?y<0we_UyJ#pFXj%Jbn5U9Eh;MgkcsI77)z{6lVq+ z!tmwGXNGChrWMVfKVL0BKhNj*@#Dwdy?gfxEcyNWcLtzyK(>Ly0VyDTfCh+LSy{RA z@bCZ)Wo9riFqA%Z>h$^U?(S_LK73fug3IIo|Nr*`Vy%vj_V)Prgr=7-U$Q}^z60@n zpzC(Av$MZq!J*lolatf1y}i9YJ3FTa$i4z}*+yhFAa8=B5sT(PVPO%A*4DPN!oq?U zp!cq-{`$314=ttwfZqO#ZU9hou&k_{eQRrHZc$Ng@7uR;E~xzey&(n^&^Wxxf}}Y_ zMMcf6vvWdfK|$u!M~@zzU}a@pn*h}OpMhZ}&^BWX*D^4ig&7d0t*z(X-#33TmZEFECUx8SI3<@um9WGIW6Ph;79|CivzJ35Q_k@5D@bNF)t8v z12HEMvjZ_JC?ddl4d_%KV2-l|hQR}%%_l&43W)!p;ooTVAE>&&009O7)v_4$Je**> P00000NkvXXu0mjfx^hnu literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench_pencil.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench_pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..564d981b1ca46ce9e98b5640a05704b82e489955 GIT binary patch literal 824 zcmV-81IPS{P)XFKSMLH+&w_)48CXC9!otD~s;a7B8e|YM0BRKC<>d{H zj*be`)YLLHFfb?uiCbD)g5_C+goGGOO-;d^zkmNSU;!3EK|$eia&nHr!9jhmU%%cA zRR0X9PZ}uqp9Q4(&!0aGc!0EwjI>FA|AZ|kPMll@a=M_Ppfu2>fxmwJ`p)$8=T8QF z`1kMMoIneBladmBOifLqfCd-?y<0we_UyJ#pFXj%Jbn5U9Eh;MgkcsI77)z{6lVq+ z!tmwGXNGChrWMVfKVL0BKhNj*@#Dwdy?gfxEcyNWcLtzyK(>Ly0VyDTfCh+LSy{RA z@bCZ)Wo9riFqA%Z>h$^U?(S_LK73fug3IIo|Nr*`Vy%vj_V)Prgr=7-U$Q}^zPmCp z@vQjr#p=WV|3_GGX!hsi51#D$-A$L~43?cy4NJ zcCTcd(#o z4wjXbvu|zf%q=R)?S1?9%>^x$KO1tQo`N-h`^r$Zc8T`u$nu|EYD1`+S`^ z9QpbA8Rmd&g&Gj%?CiGi(xtoq?d%-piin7W*%}EktgL6i(A-(X;NtDT!N9@60dY3a zfN)1g*CjV@Jo|5N@3a_baySG7$*?312HQQGlTOQD=VuHFvr;f1MmSbA)Nr_ zDIop>#W$0@8Moej#xVEb`Ts|N{NG4&Aa#EM0t^7tHc5%_2X)Z^0000L$|EsfBqF zfPwHh)qGDJ;?_6jDdluBiZ)mmPv*Bgus!#pH*lgT9dX_ZO^ zMx#-@L?RK`N3zXkbD37F&9hj{PyK%XdyMyDo(6paO_F(@heJe@nySfiIy;8O#=iEE z){~NwG}vizC=}u(!C(*$LpU6kV*zDV)r}&fF{>O2SRD6JPft%vAP|V9Jsyv^#NB1? zf~IMrDYQ$G1lHI8Kxb#?{odYQU0vP1qS4XOFDol6OQMtGIKXyDHE|Dn7FmP@DLFYg z1qy`%Nu|IrnVRwOiRreswhybTt8eLp1{Vb362j2hYPVNZR5tm1zStcXhgiVwMr1PC z5`94OWw~6QX}8-S*VNQD;&~Q38{~^)|HsJYB>-*!dY|NCwK_Swxw*yG&`|#b$NLdF zAq;Yj3FN2fCQC%P!h%q}zQKbeD%p~jrp@eE;f15b?drst^%rob+(c^x4^HC%yW7)G8ySiRj ztE;cQoSAVA;pcp{xw*L=bzTNgDC@>*BEhNB)9h^jH`n$<0T;x_$G6VU`-R-x{Jyxj zxI1W0K^#RSBUFeZ2qhu`niNyV7fuSO34xSQ&{*xW!JwgV2W~u1>=5u#2#b0u_}%OM jNr4Zh$tx$T`zOEv-FZU5=UcH-00000NkvXXu0mjfqi=RK literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x16/wrench_screwdriver.png b/interface/ispconfig/interface/themes/default/icons/x16/wrench_screwdriver.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e384b033e3bddc9cf7db40f15e16e39b461e80 GIT binary patch literal 913 zcmV;C18)3@P)k4IHlSg4PVj#g_lh20K^!=zLyZ6c9KhI}c5L{_O( zb>-#d2F#?Ekal->VP|KDkO^c_QL@C2j%OdIrl$Kz>KIIh85ZpC?_VPVrlqB&$0a2t zeN|OehKPuWT0*qj?cj2`!0mPiq0K8RE6r0X6N}M5AvQL)uDiSYk<;nqFpmngv9U2Z zF)_h!Y-}`Gtycc(>gpty%cbxtMXk=d>U3^{R;x{Bvsu#W>btk*<}8+xk&!Xx$?9)z zZcdubX1|EVV&P-tNH&`to|2N16A}^vEEW?Kii@(Dnb~jc?d_kowzh^S_|KBd<+Tm@ z`K7T&qc^mo;@nM>sd;T}jdOUthxo~4GDiaf0@hf8fq{Uj0*Avn2KN1zu&Yau+SDW& zZfLOSMWR1@E?4I(7V9_&3LNag!NGpx2uLmvizP|d)6#PXUv%2@a&trDtX4X~=ab#` zc+4Io%`+H&Uls~7F^!XCO-zhDv$eJTeocSx)4xvVNaXyyalp2Z~}khvzZ zdyo{x9mhXCGrP01yLWrH_mG1G6w%{&C=ZnwMIkB%6B3M?luBu#u_{(#Vl-uZBq|~x zzBQ%91eH=SA*N!9K@IT%27{VVq6P#{@I2rMcgM2to%b()>~b8&L`Y_v&bv;st2!805JiN?h;^#lFEp@m6%k^aY(4&u@IdtO0Y4u+m z+7Yv2ExH-CK$Kr9S4zEoeVH9y+y1%jgSC72^gMs5*zf;e09Hg(6FMeO{PD=CC(lkz zIIdoe9RuYGeAESw14>n^rh$Y6`8<8^Z!2`JUBBwXEnDuJEB40!3E&|WjgCHY)jnnv@jP~IdZ)bcg*Er>&h+2@eR1u>23VqE zttU;MymZ_dr_VCuaVVC-^QsRck!lu}Z%*)vT(J?RsZHf5RL!w5?|EQZi5)dj4 zuaIYRx``<(pJe!iw}QW%djS)6 zb`!6!ry$T&C@>}!x3vE^!q$27*>vm8_-OcO*eGnkL@`b`ctyO;q5qX8L6dUXRxq_U^_BXvERO5~K#hfo3x1Oo^VjH;XP_M!!7VMxoB->W8^Po{9CP$i%4 zMT>cF!F)g?K*NWD>H!*1LJ&nPfTR`xt`bBkb`j7?Ko=o<5wZwnz^fTrzxXabe(iNU z5p2i7w(WuHg&{lNe2do?-$e+ux37viwHM1FWDxpA=m$a&O;E)^C|OETheB$E8H8Sh zUPAWblZjd!^WXzCpK%)HTn@*!aU5r$mh*WUr<}m(UoIh&s3(KZenR>Y_9FBUvXhWL z1QfW4BT&+StQSaMs6iVVDIkd=UJXwaAw*-0UvvkKo(j@M`}^QL*jIm+~Daggp7&C7=j{#qHFo%#9w-u`nEO-g(AgL ziPjOrNj|xP?s>Ohp^-qNd(i@{Uq4FQQAbiNmnjyCm`zRit6${rx7~=1B8|p4Ey6BM z$b~%nu-MyR&~ki*GCK@|H?FKp)fciky2J-UQf7>C4=`jLN09>LX*NscW z7GJ2F?9AuL0D?~ivGaJh;_T!P=6m8v^$W~k^X6xfd-1Q-Yrz(Oa1!a@&y0YA?k`J#M%2vt^as1nWIcSB)oQbBy#;(sZ`@+BSHg!X;v4bM521HRQ1eIsX(a& z6`OJpu+jDSQ?Zc$$aC*fXm>6b$Ne;&&peuaM@2iL$d5)w&GU~>rJ6>k(;U&*NV07x zhOQxwjqiC>3Pt*|`{~SNd3*o$$!Cp0_1O@T!km^R&1-4#)0c0}L+bs;C8F1CXqpR0^Q7&xl+3 byte)YGv3SnbZ5BL00000NkvXXu0mjf<&ua5 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x32/state_error.png b/interface/ispconfig/interface/themes/default/icons/x32/state_error.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a291171e35cfac828da05a7ba72458bdb00e52 GIT binary patch literal 2212 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 KMNUMnLSTX)CrQl! literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x32/state_ok.png b/interface/ispconfig/interface/themes/default/icons/x32/state_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..ab86df2f5872b0126a27b09d5e711db515d4e301 GIT binary patch literal 1518 zcmV$Tmw2iCFe=4e6OSa}o((1hRv0i6W?5DkW?(Fkfx{6~!vgNc6; zC5G@INVhRiL?9THASxn4Kv>z6o23QT0UKjX+O6B#ZgXGFYjfD|uLdQae(Yen|Zdk(Ob5=A&IRc?BFll!3yBb!Gr zcTKow09zSRgeK}MU9=%PQUurwf zb+kaV@d6(ef2RxnLELeG%}W%%kye&2DtA;Lt3{U)MZ$<m*$>mF z$+$ZXu&pBsAEG|*;xb2dO*Oh%6bZzz|J*M)qc?-g0FcFy%_*W0fA8?IZ?PKlh6A`nWNfYg>E5=1dZcB=RTYfnjz)@mK+I|h73HM>nfJ4d{f^Z z#)N;LD0_?99IrAq8^p-Vf&5(S{CH@fcxo9@$QhH*`&OBws<9G1va)iXOU9tGJ{%1n#<@f@BuZfxWJI|9=c`a>#OFdstUq5#Pk>h zo=3Jl2am1v`0ZollGbNqR}cj|)0E!h$;vgauFL+Ttqutz29>F(?W)2B^*ku0kT?k; zZyTcR9mO1nVEnsl;{ZUc9}$yy*1EO)-3@c8D1s0UomvMpra^}WffrygS@B}|0)NK1 zl#-vR~(ooG0z1`sjApdy9DOE|Qq7TvapTYQKG&(BY2H;Z2b0D#1IDid z0D%1i!K1dbjblsP!?MQNp(a&0=?Dy$MuO*fXhcJj=s0aOB8m=BfkNad_EsDQ$xFJ^ zvn;_QlLLc_-w*%*_T`+X?-Z$+@Z>nBYepUtdK{^|9R=cW$efI`tO;GD6I7ruaUyn? z?T1vzyK^!!gFhA>9dx{3003l`n>=wJDkjaE;2br3IQsNn2%HErXNJo4fpQcgD0YVfDmZx$==qSihLd!Yt?O*n*X3&7UH4nzG+5Z~wHz#We UggAPbj{pDw07*qoM6N<$f})Gi!vFvP literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x32/state_unknown.png b/interface/ispconfig/interface/themes/default/icons/x32/state_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..47694461fc97bcfb8f5d0b8fa900369a7b120d3c GIT binary patch literal 2832 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 RP-6f9002ovPDHLkV1jFGhMxcc literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x64/network.png b/interface/ispconfig/interface/themes/default/icons/x64/network.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c20744e5962e6fcf8b5d408aeb37394fdd828f GIT binary patch literal 7481 zcmV-99me8`P)&K_m+Ea{Ty+=RWb?^UWUd+de{7*Wd+2!29qh0yyvvoXi3H5cVT# zK}7oDb?_dGcNf5&#q$ivDTDzYP~j`k&G&j~o^#-Ztleh(iSPM_uibpp*1zE4!TD>! z-=U-Ej#gs+UbkiTcGIZSN)53Qln5Sh9*W8`%xi{uy*e0I&x{NE*SP8)oZJsAgM3S_ z@>>9aZ{z*YWCrr0v+L6!l|YF$4)Jder#iC9WG@App`;zrC#Fy;)*jy?&#&9tTO_pfdnPI9O@ywawJC`@|HzDrlfdBRX1%T}BAHN>)cb2t1JU^4sZAY|H&5c*} zh>b!iAu{TD#&5a(mho~C0wRJE&{`28AdW453aaK(-mS1ojypUJRQ@#BNd z@h1zcg{-5~3Lw{I}$5WlDgnln&svXfv3`wNXN`XKc zYYy&ilUJ5|zj}e$Zp{9<7I|rzl#aae&l}@rv`nzTAHE>xHSO4-a|ME+|X;k>+UBC8~KYHS^Q#ZxkjG1o2 z&Z(5?c0{jjNMl1}6hker}pu4|MP2GQ8ljSm1qsa`NZy|KhPX z=qw>k4DHmA#tLJah%O<()fP7Mig97lIz;Yg7DvQJan0@yiyH;wqDGV;&HQ-bd2@YU>!~HOI~l`0T^yx#7^Bhd=sn zU-Rv$A%8LZUeW{p%SVsDck{wZnzUk!5t3MAB8^glN2sjFIdIMePcTrs27oQj7taGv zuX6b68D_gN>%)pPR(KEAH*W15-pe)u&I{fJR+!Ym3%n2S5e>b_Fgq2qYc^xH6LH0C z#_8oTn|Z~)xs1<0eERT59^Ct5Kl-}a|M?9A@E1o$Z}{XFPQG178lx1E)=h z`Km;4IBLhX;0a#9w&Z>M*&(-H)8qJZPHZ%S5AkALQ{^>zT~if-EkqoxSTWU#+0!<( zGecycs)R{Z1CYgEAgU%jP!(!0+C3 z_TS{28)S)TRG303wVm>BiJ78u7^A>>tOKP$i9%FRcS?jbRygm;OUL2;J;sv|3x;{k z+0}wUUSVrTe=6b1oh|xP5k?D}L(BQiF~={AS=+1_OsYm7cxE~Y2X?jTWQH$3vCPtD z$+?xBljlcR;N02O{h#{U=DYssExq4<*#JCwt~&I&M;70vMKDI8v_hLE-~rZ46PRFJ zIoe8vNbX(Z{_c75HU*|TF-8ls-H4sjG1hv9xuu;M4$QYeU_GxnaX#mf;~T6EEApbo zi$^>dqc9>&D%;Rv$+x9b96dW?mNYQIYL`E^!ODJnk zuT|5I6<>XJ$QPbm<=OK&Rv?LlE%2T5L{W$dgS@7wER)J}%eB)SJv-u=b0ds`^-;;0 zAD85%#R0|`mX|l=ub&*ew`X4I=b}1W%fNXm2bJ@T%Z8@vFea5_Gq+T=<5hb)yz!=47J4yj z!Fw;#gSq#@eIb6vUaQt9j|>=pXqMIU0=FD zQcZEfkQj|tfeJlPd5R&`TRN7hBe(xvtueIHY3J`rPq$I*0X;ulM_iKD12u~sN8 ztdDCd=fT1Hu;!L)r+Dq5KEM8nI*q5!~88TUN8iUP7oqcjXA4(9{wY)ncHU(@3s z-?oci{rEA;+M$h5S00Z*^FG_e`7AMv#|0kHD8_lkx%KKg;4_y6fU|a&w_*Kj9q1>C zG&7xus~1}A-qAt{tPCn@7i8`~x_OS%D>=XQnNxiA_>jm5-BbtNFQ5>dgVDrMR3)k@ z2|u+sVfSo{YZuy_TAC0=!YD7%5(4jfUi0d!rugAE?Be|&Kf!2XNfV8=4sQg9LU~VV z9oOycP}P>FpB>(t=%l*Q01D+mVZjTp+27;)UcZY^K5&-Dp4mWYP_|K_ z-ZPxIOBPEm34kCiQ3{;h&i1rGViePzh}}CfX4(-udogRniVuGB1b02OgmVF?oihpI zVQI5!3ZQI**^mej;zybo#)YFQYhHb2muD`FFrrx9thnatX@2w{Ebwa|JIUgDMJJ1} z-r?&&U!I^k4`0*c(B2Loy6-fP9$zPk6jd3@NlL(IVRcOBvH{RayjBV;f+Ae7bDmLA zGZl3}D&kFtW*C*0y|W1)`obb>gOZt+rnCay;YH9! z*xA;!Qp4Gmg7X^%b?u0?qO=wfA3zof43-#-zI5^H(f}lS97j>VmI4uBQd++4>K?P5 zm_K`9kt{W2siAg02$#wOVZCcDly#^Gbuvvo;%{YzN`!VAatEV@o&AJs7BbRUaphbB zc%C>pB8?35(=q2aDr)cXUPvP$*21K4JbNLhtQ)-9r&s`P+b-)D(7)PY!uGJFn7H5rao8nWA6N`CFZ&@okTIr zYf1;l&KHa(4sl>2g;>A`g{Z7!tKjHt$Vh!CFycJ)Ix$mOM4F|fS+XfcKXKU}phP{m zXRcl5PGj9gSs*lJTaUL6S3mco0^45jT=gilwr)GnWye&4BJ>KiQk0eBdvBXzekS3= z4=gh&JL+t)|M9cTuXbaAo?75&t0g|A%9pLRCsE7oro+o7$f}P z>voc55qCYZPRl4t3oC<~jgjU2M#b9Da%DfG1WW_w#T{km!puA8aL#R4lReOD#k4X* znkB?(%ImL5K6fcQUl4%zeplP?oR0ovX1Yzc+iL27fm5IJgiy1$)@_gNm;fk&cB=8p zGZ;IrS?F@(o{afk%)4&uvp%-`-!HFW6nLfZBHJ?^Cz`J>mF%BOnk+B8w&j7&h3b>D z4(ENdK_jrAQi}dmOdLn-UFdSfj*i_kll<`u0q}w)v8(&>A0C}<{nGMuJ1z18S5?oG zvYy~>Zo88cDndpJ8ljUav{Lj^%}rOfxcxwzynwY)$yZNLc=YsyEE5zaG&&mh74aa7 z^BXlc?rGCYHRGbj)xq$pcGQ&(pf^nuJWb3A`N_WdHgh{W=(J5P(HGxx&^-LIJOJQ( zZ;X!ZoKF92XTQtzOdAu28o;(UAkRHI*UY*{3AB>XB*`L0J61fqT=DS9oQ>S_;K>Qc zE>v_gO{7hrO(TtpRCpg)Lli7-6wLP`iZXauT{_CzQr8Y=!*4}OKtf+(@6I-Fy>*`5 z^KC}8X06m@Y5W^6WaEo^0Kinj`*+N=zJE08C|lQ*c|oLQJIgah(Ao!3JfUZ&E#rwW zoH(?pIqQX64^1Q1^Qo_`QG10kU_FQt*vi->Fhr2vf)UTD)sk!H6P`RZfM)-ICKPC_ zhjC%4E6ddjZLV5q(T+8zS0)q^(VuOTwbQ2(%?r9eyhL;Kb^DVu4=E z*Uo25N=u}J!plp`%4UTKyk=jQ*B|PG2&c}ESss+AIAKS>OWf|#>UMtSKfN{m%8Ru~ zU$Qmk#ut8Zp`U$sSx$Ama|{P#1Rv;0g2soCE=O81sT|hB?%9;v4)*x^;)D~+IqfvY zOHEZP+Oft0RkIOti_UE2sPQNVJGzQ~JEoTiw;q_{=(!PPIilY&+=Hmy#FTI_w3@#2S&D__*Umu!v#yyIs-@vjfv@s|I3;>1}tHinFc z69kXeftIucv12_Tn(Owq*}Eg*Yo~HXlbSS%nms~+&Wuu|v7#tFUIp1&JCERr6!a3s z6|)h0r&D%xHCii{Hwy$9O)L)_S>=HzS6LrdTrm@~XEsAchITt+y4S&FGx$+I>Aq8Yl z;uy5%;1w~mQ!z?wvR2Aew?#JH_unzMR$ludb_aeP+Sd% z*++l-qyJIc^31~AG}FB{-EKy-WuQ_l%w!zc)#lW4!I9JBK!=)bT@X$}>~P|+&XF2L zC)IdhbL?2!u+-kOe<9)eg*N@J!DA_F&$-Qlm0?93DS92l{<)O7eujx7I-M51UW?xB zG!H-cl51TfL19yHP9}LbAC(B?@qvIu(Pv(B*&Pz5% zUmSqm4=AoUlv0&DfW6>%1GD6X-go_hLqGYRcmJ@-TD=oz*Qv@1Th~|{c`=wW!=2o-0u- z06m~ZUZ|aWckOxiPrUQ{_guYa@7mfXWl>?B!&`^(0CW z*x71K6ji_&{0hifkh4_v2B$t;d4KwnhQ2fawVT7sUc}D>Q$PliQkEuex2C@5-EV!< z-@oJ5TguAHXq@935n~j*W>3mnZs-zgVSQ|Q^lZt~%a&moej{wH3(1VNmPmOtp2}L3 z7p%9`){_`T7Aw}ro;cPd?G7uegYlpI!KXj<@O=+Hh&DAwmB1tbz#4EC2nCP{Qz*7-+&|5JB={mBz2{^9rC@f~}wT3FD&M!TRG zM^^FBi3#V1jJ-uKKhw^mrtEJOOgnJ1?py0K#5QxVu_4@A>&^hfbltxtt}!2-j5q(ljbuD@0Bu2 zC2?eqJpRnlrN!mNJKp%38xP-p!%gj(nH{CG3`aHRhc!k+mMB`0CXN)b37zJs+5Ave zE|jxvXs|{S#8TCCfLdw9aN_(^Pn>z?^Y{GqmmYuQsiS34SE}7s&bbNR1*5|#fH9sN zr7Fg&?gee+C28SASQUMsetexUl0xhn=2b1P>_d&=vMghUa`}ZF>uAo1?*rW9LqM`JtzuIDYih zv!g*iscLJByqJ_lRn*oN;ETra5wH&a0_Y_ov&qQ^3qSt!H{byPD_^#>zM}xO2|flI zX%qfPD0h3Mls87ZRx3>e2FH$`dgA=K;{r(kuckbG?tG}z)YxmPE>UgCi=a9M% zJ3b*)h`m?T&bz9rCZpkG^TN{Rg|nxZ&YU@Q;oS1l`uZd2#1dE6j5id%dC~-=O)kei> z8b@(#Ts|(&pE-45X>DcW$!@omPW9TYZYOIcS)9hPiIs?0@3ED&`J^oJ@npQQJ|1ms z3`fJkWRj03wYAozSzI~i%Br@d5-CMdDv?4&3WNzxM!*1A#mg$NiT4E}FUbFw=K%o* zho@-%acl({C`9NYQi({WL~0SKl&DHXMWR$?B5jf+isCq`j8TPmZctXWh!*i4QA%*m z`>L#bF)4jnRNi~7y$R;8k5!xcsMkEtR1W6EyB>-VWL@T9~(n@Qs z#Y8#)pag53*GhS%lvPSO3EpHyq!OVDGfp8eLBgyH41uAD3_U(?46hsGFZ*uLmvzsO zKlVP?fUva`Ccsc216n{!giJ&-gtP%7CNNthO0*IQI0QH#RFb?XWkqlZHUJQGhad&P z@QDbygjvoJ#)Q|l3=cQ&y$s`DHUJF>9+(*ia=5f~NWIEp87(C=sbZwuFzrTz7v(0N6V0)4$>YKYh!4pIa7? zgJ=R>8U)k)h9T55HK4plfmhy(@_wtsfMbhco*PwTq!p+M&9SZbZEaHfrjBp=#>w@E z{=MJzhWBq>$kyyhGt}QYZ?<)Lzdi8b9taHrJ1+J7D}Hc|oK9PLKZwU8(eQ=U2?l00000NkvXXu0mjf D685nK literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/icons/x64/server.png b/interface/ispconfig/interface/themes/default/icons/x64/server.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca269358209e2703c97a65c446dcca142b386f0 GIT binary patch literal 7475 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 IBfww{0BZFy)c^nh literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/images/favicon.ico b/interface/ispconfig/interface/themes/default/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..da6257c84cce5c550eb7118581ed2a22f15af248 GIT binary patch literal 1406 zcmeH_Sxl5y6vzL!*4AoOwAHFiof!oc0gFpZTWqzpwSq7+ezSbczOW1o%Py^e~16f{eD0E{?}MuUc#$a^LYMz22)d$ z7$5%!KA#sQE*Bb`n^9C;46o0JM~@%lVP_}qKX`yUckklH&6{X!YQmL<2GrHp!|m}v zrPe^fCqi#B!)nWb&R|5MMhjbJ7Sd>KO}D|4oC1?22?jc&H=0mTScIHhC$e)KI3rg= z#wj3?aZqdZ6srTT)aJCS6`2}$1QVPtLWSEH0NPGsPnQG@E+wMSS zmK`cygVxroC@pm%pBP`fc!~c00eHPWJbUKFlP6En+1Z7A_wJ*;{cqg5bsN{NT}Mkx zE1HS9j#%Ap4^~!INUvoqEiGYjaS;m(3z(mu$K2c;W@l$HGc$wf>1on&3X_wQn3$L# zJ;yONHipsBQH+d?V0d^KLqkIt92~^JzyNXdqpz&ND@k=3d0w8wG85%;ak?x27%!La5<1xDJA}dmp9B@3*d-M17dhFF z!6K39P(;P2`$eK)@mc2nVw-sDh7#x6V6pgMR3$4ptP4A>Ik|4f!Kf%n*k;BqBpmws zx8pSzC1GK);ZbJBOnG*?LRD;d_@0QpD$6RyK5!Hy{k$h4A~HU5pJey1Cr^EQI4&+S JKK@pF^hrcPRCt`NQ9%;JAP7`MN6oW3o$3ES)P@)^W!vNu4-78Lt{}gj zk2iDXz`garRYLC)mNhiHwyxK$qxA;WO<-hw5vi3@Yu!7-dWKQXc@3Q9DnYVRG|Q4X zNPWDW&1DSrAb$uPqVMNLZ6nl#~B)ev~xfsdLiBu4JZRKl9CoSYlI9B8SMh z4k3?_a*Q0Kl37bYrU(|(-2?$a9s1vupo`$Cb5cM1iK(^YGIh^TF(AhH4XC35Dt};j zAUO?a(LXp7y<+H2rl@}hir!!wVK^8cfjg%4?|_y|Tk;#j7GPYikS=EdAh-j-2croR U_6me1^#A|>07*qoM6N<$g13W%hX4Qo literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/images/header_logo.png b/interface/ispconfig/interface/themes/default/images/header_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce00716f5dd296951d525b7a3ea9ebbdb2286025 GIT binary patch literal 2452 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 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/images/screen_bg.png b/interface/ispconfig/interface/themes/default/images/screen_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9679f4e1251516b3d02c46f54abcd40d793f37aa GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^j6fW~!3HF69GAZhq*#ibJVQ8upoSx*1IXtr@Q5sC zVBi)4Va7{$>;3=*6-!(rN`mv#O3D+9QW<;`lZ*0mQ&Tb%72Gn5Qp@v;vWpc=^bB69 zsh0v3i-8n77o{eaWaj57gkEaktF(=ug_}Q6yH8(dm oHZ?XNxV53J@8c8+2T>*lnN2JiIuA38fQlJBUHx3vIVCg!07?Hi00000 literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/licences.txt b/interface/ispconfig/interface/themes/default/licences.txt new file mode 100644 index 000000000..5a50cbb39 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/licences.txt @@ -0,0 +1,8 @@ +Theme created by Martin Henne (red-ray.de) + +based on: + +Templates: http://www.yaml.de +Web-Forms: http://www.sprawsm.com/uni-form/ +Icons: http://www.pinvoke.com and http://www.randomjabber.com/static/sizcons +Know-How: http://particletree.com/features/rediscovering-the-button-element diff --git a/interface/ispconfig/interface/themes/default/templates/form.tpl.htm b/interface/ispconfig/interface/themes/default/templates/form.tpl.htm new file mode 100644 index 000000000..429bfd9f2 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/form.tpl.htm @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/templates/listpage.tpl.htm b/interface/ispconfig/interface/themes/default/templates/listpage.tpl.htm new file mode 100644 index 000000000..429bfd9f2 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/listpage.tpl.htm @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/templates/main.tpl.htm b/interface/ispconfig/interface/themes/default/templates/main.tpl.htm new file mode 100644 index 000000000..475cd976f --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/main.tpl.htm @@ -0,0 +1,111 @@ + + + + <tmpl_var name="app_title"> <tmpl_var name="app_version"> + "/> + + + + + + + + + + + + +
    +
    + + + + + +
    + +
    +
    +
     
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
     
    + +
    + +
    + +
    + + diff --git a/interface/ispconfig/interface/themes/default/templates/module.tpl.htm b/interface/ispconfig/interface/themes/default/templates/module.tpl.htm new file mode 100644 index 000000000..36cdd09c7 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/module.tpl.htm @@ -0,0 +1,37 @@ + +   + + + + + +
    + + + + + + + + +
     
    + + + + + + + + +
    + +
    +
    +
    +
    +
    +
    + + +   + \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/templates/module_tree.tpl.htm b/interface/ispconfig/interface/themes/default/templates/module_tree.tpl.htm new file mode 100644 index 000000000..b0895789a --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/module_tree.tpl.htm @@ -0,0 +1,38 @@ + +   + + + + + + +
    + + + + + + + + +
     
    + + + + + + + + +
    + +
    +
    +
    +
    +
    +
    + + +   + \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/templates/sidenav.tpl.htm b/interface/ispconfig/interface/themes/default/templates/sidenav.tpl.htm new file mode 100644 index 000000000..4626d369e --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/sidenav.tpl.htm @@ -0,0 +1,24 @@ + diff --git a/interface/ispconfig/interface/themes/default/templates/tabbed_form.tpl.htm b/interface/ispconfig/interface/themes/default/templates/tabbed_form.tpl.htm new file mode 100644 index 000000000..0e31bc056 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/tabbed_form.tpl.htm @@ -0,0 +1,28 @@ + +

    +
    +
    +
      + + +
    • + +
    • +
      +
      +
    +
    +
    + + +

    +
    + +

    ERROR

    +
    + + +
    + + + diff --git a/interface/ispconfig/interface/themes/default/templates/topnav.tpl.htm b/interface/ispconfig/interface/themes/default/templates/topnav.tpl.htm new file mode 100644 index 000000000..025b9bc90 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/templates/topnav.tpl.htm @@ -0,0 +1,9 @@ +
      + + +
    • + +
    • +
      +
      +
    diff --git a/interface/ispconfig/interface/themes/default/yaml/!important.txt b/interface/ispconfig/interface/themes/default/yaml/!important.txt new file mode 100644 index 000000000..dfdf80dda --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/!important.txt @@ -0,0 +1,4 @@ +DON'T EDIT ANYTHING INSIDE THIS DIRECTORY! + +This theme is based on YAML V3.0.6, Build: 080609 (http://www.yaml.de/) +CSS-Styles can be changed in the /themes/default/css/ directory diff --git a/interface/ispconfig/interface/themes/default/yaml/core/base.css b/interface/ispconfig/interface/themes/default/yaml/core/base.css new file mode 100644 index 000000000..632248e2f --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/base.css @@ -0,0 +1,229 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) YAML core stylesheet + * (de) YAML Basis-Stylesheet + * + * Don't make any changes in this file! + * Your changes should be placed in any css-file in your own stylesheet folder. + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media all +{ + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section browser reset + * @see http://www.yaml.de/en/documentation/css-components/base-stylesheet.html + */ + + /* (en) Global reset of paddings and margins for all HTML elements */ + /* (de) Globales Zurücksetzen der Innen- und Außenabstände für alle HTML-Elemente */ + * { margin:0; padding: 0; } + + /* (en) Correction: margin/padding reset caused too small select boxes. */ + /* (de) Korrektur: Das Zurücksetzen der Abstände verursacht zu kleine Selectboxen. */ + option { padding-left: 0.4em; } + + /** + * (en) Global fix of the Italics bugs in IE 5.x and IE 6 + * (de) Globale Korrektur des Italics Bugs des IE 5.x und IE 6 + * + * @bugfix + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + * html body * { overflow:visible; } + * html iframe, * html frame { overflow:auto; } + * html frameset { overflow:hidden; } + + /* (en) Forcing vertical scrollbars in Netscape, Firefox and Safari browsers */ + /* (de) Erzwingen vertikaler Scrollbalken in Netscape, Firefox und Safari Browsern */ + html { height: 100%; margin-bottom: 1px; } + body { + /* (en) Fix for rounding errors when scaling font sizes in older versions of Opera browser */ + /* (de) Beseitigung von Rundungsfehler beim Skalieren von Schriftgrößen in älteren Opera Versionen */ + font-size: 100.01%; + + /* (en) Standard values for colors and text alignment */ + /* (de) Vorgabe der Standardfarben und Textausrichtung */ + color: #000; + background: #fff; + text-align: left; + } + + /* (en) Clear borders for
    and elements */ + /* (de) Rahmen für
    und Elemente löschen */ + fieldset, img { border: 0 solid; } + + /* (en) new standard values for lists, blockquote and cite */ + /* (de) Neue Standardwerte für Listen & Zitate */ + ul, ol, dl { margin: 0 0 1em 1em } + li { margin-left: 1.5em; line-height: 1.5em; } + + dt { font-weight: bold; } + dd { margin: 0 0 1em 2em; } + + blockquote { margin: 0 0 1em 1.5em; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section base layout | Basis Layout + * @see http://www.yaml.de/en/documentation/css-components/base-stylesheet.html + * + * |-------------------------------| + * | #header | + * |-------------------------------| + * | #col1 | #col3 | #col2 | + * | 200 px | flexible | 200px | + * |-------------------------------| + * | #footer | + * |-------------------------------| + */ + + #header { position:relative; } + + /* (en) Text Alignment for #topnav content */ + /* (de) Textausrichtung für #topnav Inhalte */ + #topnav { text-align: right; } + + /* (en) Absolute positioning only within #header */ + /* (de) Absolute Positionierung erfolgt nur innerhalb von #header */ + #header #topnav { + position:absolute; + top: 10px; + right: 10px; + } + + /* (en) Backup for correct positioning */ + /* (de) Absicherung korrekte Positionierung */ + #header, #nav, #main, #footer { clear:both; } + + /* (en/de) Standard: 200 Pixel */ + #col1 { float: left; width: 200px } + /* (en/de) Standard: 200 Pixel */ + #col2 { float:right; width: 200px } + /* (en) Standard: center column with flexible width */ + /* (de) Standard: Flexible mittlere Spalte */ + #col3 { width:auto; margin: 0 200px } + + /* (en) Preparation for absolute positioning within content columns */ + /* (de) Vorbereitung für absolute Positionierungen innerhalb der Inhaltsspalten */ + #col1_content, #col2_content, #col3_content { position:relative; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section generic classes for layout switching | Generische Klassen zur Layoutumschaltung + * @see http://www.yaml.de/en/documentation/css-components/base-stylesheet.html + * + * .hidecol1 -> 2-column-layout (using #col2 and #col3) + * .hidecol2 -> 2-column-layout (using #col1 and #col3) + * .hideboth -> single-column-layout (using #col3) + */ + + .hideboth #col3 { margin-left: 0; margin-right: 0; } + .hidecol1 #col3 { margin-left: 0; margin-right: 200px; } + .hidecol2 #col3 { margin-left: 200px; margin-right: 0; } + + .hideboth #col1, .hideboth #col2, .hidecol1 #col1, .hidecol2 #col2 { display:none; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section clearing methods + * @see http://yaml.de/en/documentation/basics/general.html + */ + + /* (en) clearfix method for clearing floats */ + /* (de) Clearfix-Methode zum Clearen der Float-Umgebungen */ + .clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + + /* (en) essential for Safari browser !! */ + /* (de) Diese Angabe benötigt der Safari-Browser zwingend !! */ + .clearfix { display: block; } + + /* (en) overflow method for clearing floats */ + /* (de) Overflow-Methode zum Clearen der Float-Umgebungen */ + .floatbox { overflow:hidden; } + + /* (en) IE-Clearing: Only used in Internet Explorer, switched on in iehacks.css */ + /* (de) IE-Clearing: Benötigt nur der Internet Explorer und über iehacks.css zugeschaltet */ + #ie_clearing { display: none; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section subtemplates + * @see http://www.yaml.de/en/documentation/practice/subtemplates.html + */ + + .subcolumns { width: 100%; overflow:hidden; } + + /* (en) alternative class for optional support of old Mozilla/Netscape browers */ + /* (de) Alternative Klasse zur optionalen Unterstützung alter Mozilla/Netscape-Brower */ + .subcolumns_oldgecko { width: 100%; float:left; } + + .c50l, .c25l, .c33l, .c38l, .c66l, .c75l, .c62l {float: left; } + .c50r, .c25r, .c33r, .c38r, .c66r, .c75r, .c62r {float: right; margin-left: -5px; } + + .c25l, .c25r { width: 25%; } + .c33l, .c33r { width: 33.333%; } + .c50l, .c50r { width: 50%; } + .c66l, .c66r { width: 66.666%; } + .c75l, .c75r { width: 75%; } + .c38l, .c38r { width: 38.2%; } + .c62l, .c62r { width: 61.8%; } + + .subc { padding: 0 0.5em; } + .subcl { padding: 0 1em 0 0; } + .subcr { padding: 0 0 0 1em; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section hidden elements | Versteckte Elemente + * @see http://www.yaml.de/en/documentation/basics/skip-links.html + * + * (en) skip links and hidden content + * (de) Skip-Links und versteckte Inhalte + */ + + /* (en) classes for invisible elements in the base layout */ + /* (de) Klassen für unsichtbare Elemente im Basislayout */ + .skip, .hideme, .print { + position: absolute; + top: -1000em; + left: -1000em; + height: 1px; + width: 1px; + } + + /* (en) make skip links visible when using tab navigation */ + /* (de) Skip-Links für Tab-Navigation sichtbar schalten */ + .skip:focus, .skip:active { + position: static; + top: 0; + left: 0; + height: auto; + width: auto; + } +} diff --git a/interface/ispconfig/interface/themes/default/yaml/core/iehacks.css b/interface/ispconfig/interface/themes/default/yaml/core/iehacks.css new file mode 100644 index 000000000..85445964d --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/iehacks.css @@ -0,0 +1,310 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) YAML core stylesheet - structure-independent bugfixes of IE/Win CSS-bugs + * (de) YAML Basis-Stylesheet - Strukturunabhängige Bugfixes von CSS-Bugs des IE/Win + * + * Don't make any changes in this file! + * Your changes should be added to a separate patch-file. + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + * @appdef yaml + */ + +@media all +{ + /** + * (en) Debugging: When you see a green background, IE is getting this stylesheet + * (de) Fehlersuche: Hintergrund leuchtet grün, wenn das Stylesheet korrekt geladen wurde + * + * @debug + * @app-yaml-default disabled + */ + + /* body { background: #0f0; background-image: none; } */ + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Forcing vertical scrollbars is not needed in IE (only for Firefox/Netscape/Safari) + * (de) Erzwingen vertikaler Scrollbalken im IE nicht benötigt (nur im Firefox/Netscape/Safari) + * + * @workaround + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + + html { height: auto; margin-bottom:0; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Fixes IE5.x and IE6 overflow behavior of textarea and input elements elements + * (de) Korrigiert das fehlerhafte overflow-Verhalten von textarea und input-Elementen + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid no + */ + + * html textarea { overflow:scroll; overflow-x: hidden; } + * html input { overflow: hidden; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Stability fixes with 'position:relative' + * (de) Stabilitätsverbesserungen durch 'position:relative' + * + * @bugfix + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + + body { position:relative; } /* Essential in IE7 for correct layout scaling ... */ + * html body { position:static; } /* ... but not for IE5.x and IE6 */ + #main { position: relative; } /* helpful for several problems in older IE versions*/ + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Clearfix Method for containing floats in IE + * (de) Clearfix-Anpassung für diverse IE-Versionen + * + * @workaround + * @see http://www.456bereastreet.com/archive/200603/new_clearing_method_needed_for_ie7/#comment28 + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + + + .clearfix { display: inline-block; } /* ... especial for IE7 */ + .clearfix { display: block; } /* ... für IE5,IE6,IE7 */ + * html .clearfix { height: 1%; } /* ... für IE5 + IE6/Win | hasLayout aktivieren */ + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Adjustment of .floatbox class for IE + * (de) Anpassung der .floatbox-Klasse für IE + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + * html .floatbox { width:100%; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Special class for oversized content element + * (de) Spezielle Klasse für übergroße Inhaltselemente + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + .slidebox { + position:relative; + margin-right: -1000px; + height: 1%; + } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en): Bugfix for partially displayed column separators + * (de): Bugfix für unvollständige Darstellung der Spalteninhalte / Spaltentrenner + * + * @bugfix + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + * html #col1, + * html #col2, + * html #col3 { position:relative; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Preventing several css bugs by forcing "hasLayout" + * (de) Vermeidung verschiedenster Bugs durch Erzwingen von "hasLayout" + * + * @workaround + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid no + */ + + body { height: 1%; } + #page_margins, #page, #header, #nav, #main, #footer { zoom:1; } /* IE6 & IE7 */ + #page_margins, #page { height: 1%; } /* IE 5.x */ + * html #header, * html #nav, * html #main, * html #footer { width: 100%; } /* IE 5.x & IE6 */ + * html #header, * html #nav, * html #main, * html #footer { wid\th: auto; } /* IE 6 */ + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * Disappearing List-Background Bug + * @see http://www.positioniseverything.net/explorer/ie-listbug.html + * + * @bugfix + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + * html ul, * html ol, * html dl { position: relative; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * List-Numbering Bug + * + * @bugfix + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + body ol li { display:list-item; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * (en) Workaround for 'collapsing margin at #col3' when using CSS-property clear + * Left margin of #col3 collapses when using clear:both in 1-3-2 (or 2-3-1) layout and right column is the + * longest and left column is the shortest one. For IE6 and IE7 a special workaround was developed + * in YAML. + * + * (de) Workaround für 'kollabierenden Margin an #col3' bei Verwendung der CSS-Eigenschaft clear + * Der linke Margin von #col3 kollabiert bei der Verwendung von clear:both im 1-3-2 (oder 2-3-1) Layout + * wenn gleichzeitig die rechte Spalte die kürzeste und die rechte die Längste ist. Im IE6 und IE7 lässt + * sich der Bug durch eine speziell für YAML entwickelten Workaround umgehen. + * + * @workaround + * @affected IE 5.x/Win, IE6, IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid no + */ + + #ie_clearing { + /* (en) Only a small help for debugging */ + /* (de) Nur eine kleine Hilfe zur Fehlersuche */ + position:static; + + /* (en) Make container visible in IE */ + /* (de) Container sichtbar machen im IE */ + display:block; + + /* (en) No fix possible in IE5.x, normal clearing used instead */ + /* (de) Kein Fix im IE5.x möglich, daher normales Clearing */ + \clear:both; + + /* (en) forcing clearing-like behavior with a simple oversized container in IE6 & IE7*/ + /* (de) IE-Clearing mit 100%-DIV für IE6 bzw. übergroßem Container im IE7 */ + width: 100%; + font-size:0px; + margin: -2px 0 -1em 1px; + } + + * html #ie_clearing { margin: -2px 0 -1em 0; } + #col3_content {margin-bottom:-2px; } + + /* (en) avoid horizontal scrollbars in IE7 in borderless layouts because of negative margins */ + /* (de) Vermeidung horizontaler Scrollbalken bei randabfallenden Layouts im IE7 */ + html { margin-right: 1px; } + * html { margin-right: 0 } + + + /* (en) Bugfix: Essential for IE7 */ + /* (de) Bugfix: Notwendig im IE7 */ + #col3 { position:relative; z-index: -1; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * IE/Win Guillotine Bug + * @see http://www.positioniseverything.net/explorer/guillotine.html + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + * html body a, * html body a:hover { background-color: transparent; } + +} + +@media screen, projection +{ + /** + * (en) IE-Adjustments for content columns and subtemplates + * (de) IE-Anpassung für Spaltencontainer und Subtemplates + * + * Doubled Float-Margin Bug + * @see http://positioniseverything.net/explorer/doubled-margin.html + * + * @bugfix + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + + #col1, #col2 { display:inline; } + + .c50l, .c25l, .c33l, .c38l, .c66l, .c75l, .c62l, + .c50r, .c25r, .c33r, .c38r, .c66r, .c75r, .c62r { display:inline; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * Internet Explorer and the Expanding Box Problem + * @see http://www.positioniseverything.net/explorer/expandingboxbug.html + * + * @workaround + * @affected IE 5.x/Win, IE6 + * @css-for IE 5.x/Win, IE6 + * @valid yes + */ + + * html #col1_content, + * html #col2_content, + * html #col3_content { word-wrap: break-word; } + + * html .subcolumns .subc, + * html .subcolumns .subcl, + * html .subcolumns .subcr { word-wrap: break-word; overflow:hidden; } +} + +@media print +{ + /** + * (en) Avoid unneeded page breaks of #col3 content in print layout. + * (de) Vermeiden von unnötigen Seitenumbrüchen beim Ausdruck der Spalte #col3. + * + * @bugfix + * @affected IE7 + * @css-for IE 5.x/Win, IE6, IE7 + * @valid yes + */ + + #col3 { height: 1%; } +} diff --git a/interface/ispconfig/interface/themes/default/yaml/core/print_base.css b/interface/ispconfig/interface/themes/default/yaml/core/print_base.css new file mode 100644 index 000000000..54c6a3969 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/print_base.css @@ -0,0 +1,120 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) YAML core stylesheet - print layout + * (de) YAML Core-Stylesheet - Druck Layout + * + * Don't make any changes in this file! + * Your changes should be added to 'print_xyz_draft.css' drafts from 'yaml/print/' folder. + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media print +{ + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section layout preparation + * @see http://www.yaml.de/en/documentation/css-components/layout-for-print-media.html + */ + + /* (en) Preparing base layout for print */ + /* (de) Basislayout für Druck aufbereiten */ + body, #page_margins, #page, #main { margin:0; padding: 0; border: 0; } + #page_margins, #page { width: 100% !important; min-width:0; max-width: none; } + #header { height: auto; } + + /* (en) Hide unneeded container of the screenlayout in print layout */ + /* (de) Für den Druck nicht benötigte Container des Layouts abschalten */ + #topnav, #nav, #search, #footer { display: none; } + + /* (en) Linearising subtemplates */ + /* (de) Linearisierung der Subtemplates */ + .c25l, .c33l, .c38l, .c50l, .c62l, .c66l, .c75l, + .c25r, .c33r, .c38r, .c50r, .c62r, .c66r, .c75r { + width: 100%; margin:0; float:none; overflow:visible; display:table; + } + .subc, .subcl, .subcr { margin: 0; padding: 0; } + + /* (en) make .print class visible */ + /* (de) .print-Klasse sichtbar schalten */ + .print { position: static; top: 0; left: 0; height: auto; width: auto; } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section content preparation + * @see http://www.yaml.de/en/documentation/css-components/layout-for-print-media.html + */ + + /* (en) Change font to serif */ + /* (de) Zeichensatz auf Serifen umstellen */ + body * { font-family: "Times New Roman", Times, serif; } + code, pre { font-family:"Courier New", Courier, mono; } + body { font-size: 12pt; } + + /* (en) Avoid page breaks right after headings */ + /* (de) Vermeidung von Seitenumbrüchen direkt nach einer Überschrift */ + h1,h2,h3,h4,h5,h6 { page-break-after:avoid; } + + /* (en) Format acronyms and abbreviations for print*/ + /* (de) Auszeichnung von Abkürzungen */ + abbr[title]:after, + acronym[title]:after { content: '(' attr(title) ')'; } + + /* (en) Disable background graphics of links */ + /* (de) Abschalten evlt. vorhandener Hintergrundgrafiken zur Linkkennzeichnung */ + #page a[href^="http:"], + #page a[href^="https:"] { padding-left: 0; background-image: none; } + + /* (en) Enable URL output in print layout */ + /* (de) Sichtbare Auszeichnung der URLs von Links */ + a[href]:after { + content:" "; + color:#444; + background:inherit; + font-style:italic; + } + + /* (en) Preparation for optional column labels */ + /* (de) Vorbereitung für optionale Spaltenauszeichnung */ + #col1_content:before, #col2_content:before, #col3_content:before { + content: ""; + color:#888; + background:inherit; + display:block; + font-weight:bold; + font-size:1.5em; + } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section browser fixes for print layouts + * @see http://www.yaml.de/en/documentation/css-components/layout-for-print-media.html + */ + + /** + * (en) overflow:hidden Bug in print layouts + * (de) overflow:hidden Bug in Drucklayouts + * + * @bugfix + * @since 3.0 + * @affected FF2.0, IE7 + * @css-for all browsers + * @valid yes + */ + + .floatbox, + .subcolumns, + .subcolums_oldgecko { overflow:visible; display: table; } +} diff --git a/interface/ispconfig/interface/themes/default/yaml/core/slim_base.css b/interface/ispconfig/interface/themes/default/yaml/core/slim_base.css new file mode 100644 index 000000000..ef205e1d7 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/slim_base.css @@ -0,0 +1,50 @@ +@charset "UTF-8"; +/* "Yet Another Multicolumn Layout" v3.0.6 (c) by Dirk Jesse (http://www.yaml.de) +* $Revision: 202 $ $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ */ +@media all { +*{margin:0;padding:0} +option{padding-left:.4em} +* html body *{overflow:visible} +* html iframe,* html frame{overflow:auto} +* html frameset{overflow:hidden} +html{height:100%;margin-bottom:1px} +body{font-size:100.01%;color:#000;background:#fff;text-align:left} +fieldset,img{border:0 solid} +ul,ol,dl{margin:0 0 1em 1em} +li{margin-left:1.5em;line-height:1.5em} +dt{font-weight:700} +dd{margin:0 0 1em 2em} +blockquote{margin:0 0 1em 1.5em} +#header{position:relative} +#topnav{text-align:right} +#header #topnav{position:absolute;top:10px;right:10px} +#header,#nav,#main,#footer{clear:both} +#col1{float:left;width:200px} +#col2{float:right;width:200px} +#col3{width:auto;margin:0 200px} +#col1_content,#col2_content,#col3_content{position:relative} +.hideboth #col3{margin-left:0;margin-right:0} +.hidecol1 #col3{margin-left:0;margin-right:200px} +.hidecol2 #col3{margin-left:200px;margin-right:0} +.hideboth #col1,.hideboth #col2,.hidecol1 #col1,.hidecol2 #col2{display:none} +.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden} +.clearfix{display:block} +.floatbox{overflow:hidden} +#ie_clearing{display:none} +.subcolumns{width:100%;overflow:hidden} +.subcolumns_oldgecko{width:100%;float:left} +.c50l,.c25l,.c33l,.c38l,.c66l,.c75l,.c62l{float:left} +.c50r,.c25r,.c33r,.c38r,.c66r,.c75r,.c62r{float:right;margin-left:-5px} +.c25l,.c25r{width:25%} +.c33l,.c33r{width:33.333%} +.c50l,.c50r{width:50%} +.c66l,.c66r{width:66.666%} +.c75l,.c75r{width:75%} +.c38l,.c38r{width:38.2%} +.c62l,.c62r{width:61.8%} +.subc{padding:0 .5em} +.subcl{padding:0 1em 0 0} +.subcr{padding:0 0 0 1em} +.skip,.hideme,.print{position:absolute;top:-1000em;left:-1000em;height:1px;width:1px} +.skip:focus,.skip:active{position:static;top:0;left:0;height:auto;width:auto} +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/core/slim_iehacks.css b/interface/ispconfig/interface/themes/default/yaml/core/slim_iehacks.css new file mode 100644 index 000000000..0b46deb4e --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/slim_iehacks.css @@ -0,0 +1,36 @@ +@charset UTF-8; +/* "Yet Another Multicolumn Layout" v3.0.6 (c) by Dirk Jesse (http://www.yaml.de) +* $Revision: 202 $ $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ */ +@media all { +html{height:auto;margin-bottom:0;margin-right:1px} +* html textarea{overflow:scroll;overflow-x:hidden} +* html input{overflow:hidden} +body{position:relative;height:1%} +* html body{position:static} +#main{position:relative} +.clearfix{display:inline-block} +.clearfix{display:block} +* html .clearfix{height:1%} +* html .floatbox{width:100%} +.slidebox{position:relative;margin-right:-1000px;height:1%} +* html #col1,* html #col2,* html #col3{position:relative} +#page_margins,#page,#header,#nav,#main,#footer{zoom:1} +#page_margins,#page{height:1%} +* html #header,* html #nav,* html #main,* html #footer{width:100%;wid\th:auto} +* html ul,* html ol,* html dl{position:relative} +body ol li{display:list-item} +#ie_clearing{position:static;display:block;\clear:both;width:100%;font-size:0;margin:-2px 0 -1em 1px} +* html #ie_clearing{margin:-2px 0 -1em} +#col3_content{margin-bottom:-2px} +* html{margin-right:0} +#col3{position:relative;z-index:-1} +* html body a,* html body a:hover{background-color:transparent} +} +@media screen,projection { +#col1,#col2,.c50l,.c25l,.c33l,.c38l,.c66l,.c75l,.c62l,.c50r,.c25r,.c33r,.c38r,.c66r,.c75r,.c62r{display:inline} +* html #col1_content,* html #col2_content,* html #col3_content{word-wrap:break-word} +* html .subcolumns .subc,* html .subcolumns .subcl,* html .subcolumns .subcr{word-wrap:break-word;overflow:hidden} +} +@media print { +#col3{height:1%} +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/core/slim_print_base.css b/interface/ispconfig/interface/themes/default/yaml/core/slim_print_base.css new file mode 100644 index 000000000..42a5d5b06 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/core/slim_print_base.css @@ -0,0 +1,21 @@ +@charset "UTF-8"; +/* "Yet Another Multicolumn Layout" v3.0.6 (c) by Dirk Jesse (http://www.yaml.de) +* $Revision: 202 $ $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ */ +@media print { +body,#page_margins,#page,#main{border:0;margin:0;padding:0} +#page_margins,#page{width:100%!important;min-width:0;max-width:none} +#header{height:auto} +#topnav,#nav,#search,#footer{display:none} +.c25l,.c33l,.c38l,.c50l,.c62l,.c66l,.c75l,.c25r,.c33r,.c38r,.c50r,.c62r,.c66r,.c75r{width:100%;float:none;overflow:visible;display:table;margin:0} +.subc,.subcl,.subcr{margin:0;padding:0} +.print{position:static;top:0;left:0;height:auto;width:auto} +body *{font-family:"Times New Roman", Times, serif} +code,pre{font-family:"Courier New", Courier, mono} +body{font-size:12pt} +h1,h2,h3,h4,h5,h6{page-break-after:avoid} +abbr[title]:after,acronym[title]:after{content:'(' attr(title) ')'} +#page a[href^="http:"],#page a[href^="https:"]{padding-left:0;background-image:none} +a[href]:after{content:" ";color:#444;background:inherit;font-style:italic} +#col1_content:before,#col2_content:before,#col3_content:before{content:"";color:#888;background:inherit;display:block;font-weight:700;font-size:1.5em} +.floatbox,.subcolumns,.subcolums_oldgecko{overflow:visible;display:table} +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/debug/debug.css b/interface/ispconfig/interface/themes/default/yaml/debug/debug.css new file mode 100644 index 000000000..0c4269b13 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/debug/debug.css @@ -0,0 +1,157 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) YAML debugging stylesheet + * (de) YAML Stylesheet zur Fehlersuche + * + * Don't make any changes in this file! + * Your changes should be placed in any css-file in your own stylesheet folder. + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 43 $ + * @lastmodified $Date: 2007-06-11 16:09:28 +0200 (Mo, 11 Jun 2007) $ + */ + +@media all +{ + /*------------------------------------------------------------------------------------------------------*/ + + /** + * @section layout preparation for debugging + * @see http://www.yaml.de/en/documentation/practice/drafting-and-debugging.html + */ + + /* Adding debugging background */ + body { background: transparent url(images/grid_pattern.png) top left no-repeat !important; } + + /* CSS-Warning, if core stylesheet 'iehacks.css' is missing in the layout */ + *:first-child+html #ie_clearing { display:block; } + * html #ie_clearing { display:block; } + + #ie_clearing { + width: 500px; + font-size: 25px; + position:absolute; + top: -2px; + left:0px; + background: url("images/warning_iehacks.gif") top left no-repeat; + } + + /** + * @section pixel grid + */ + + .bg_grid { + background-image:url(images/grid_pattern.png) !important; + background-repeat:no-repeat; + background-position:top left !important; + } + + /** + * @section transparency + */ + + .transOFF { -moz-opacity: 1.0; opacity: 1.0; filter: alpha(Opacity=100);} + .trans50, + .transON { -moz-opacity: 0.5; opacity: 0.5; filter: alpha(Opacity=50);} + .trans25 { -moz-opacity: 0.25; opacity: 0.25; filter: alpha(Opacity=25);} + .trans75 { -moz-opacity: 0.75; opacity: 0.75; filter: alpha(Opacity=75);} + + /** + * @section colors + */ + + .bg_red { background-color: #f00 !important;} + .bg_blue { background-color: #00f !important;} + .bg_green { background-color: #0f0 !important;} + + /** + * @visualize semantic structure + * + * Many thanks to Tomas Caspers for some ideas + */ + + div[id] { padding: 0 !important; margin: 2px; border: 1px #000 solid !important; } + div[id]:before { + display:block; + color: #fff; + background: #800; + padding: 2px; + font: bold .8em "Lucida console", monospace; + content: "[div #"attr(id)"]"; + } + + div[class="floatbox"] { background: #f4f4f4; } + div[class="floatbox"]:before { + display:block; + color: #fff; + background: #66a; + padding: 2px; + font: bold .8em "Lucida console", monospace; + content: "[div ."attr(class)"]"; + } + + div[class="subcolumns"] { background: #f8f8f8; } + div[class="subcolumns"]:before { + display:block; + color: #fff; + background: #444; + padding: 2px; + font: bold .8em "Lucida console", monospace; + content: "[div ."attr(class)"]"; + } + + div[class="subcolumns"] > div:before { + display:block; + color: #fff; + background: #080; + padding: 2px; + font: bold .8em "Lucida console", monospace; + content: "[div ."attr(class)"]"; + } + + div[class="subc"], div[class="subcl"], div[class="subcr"] { background: #eee; } + div[class="subc"]:before, div[class="subcl"]:before, div[class="subcr"]:before { + display:block; + color: #fff; + background: #6a6; + padding: 2px; + font: bold .8em "Lucida console", monospace; + content: "[div ."attr(class)"]"; + } + + h1:before { content: "[h1] "; } + h2:before { content: "[h2] "; } + h3:before { content: "[h3] "; } + h4:before { content: "[h4] "; } + h5:before { content: "[h5] "; } + h6:before { content: "[h6] "; } + + a:hover:before { content: " ( href='" attr(href) "' ) "; } + a:hover:after { content: " [ title='"attr(title)"' ] "; } + + img:after { content:" ( alt='" attr(alt)"' ) "; } + + address, blockquote, dl, fieldset, form, h1, h2, h3, h4, ol, p, pre, ul { + border: 1px dotted #888; + margin: 2px; + padding: 2px; + display: block; + } + + /** + * @visualize inline elements + * + * Many thanks to Tomas Caspers for some ideas + */ + + abbr, acronym { background: #d9eaff; } + q, cite, dfn, kbd { background: #ffe3f6; } + /* :lang(de), :lang(en), :lang(fr), :lang(es) { background: #d9efaa !important; } */ +} diff --git a/interface/ispconfig/interface/themes/default/yaml/debug/images/grid_pattern.png b/interface/ispconfig/interface/themes/default/yaml/debug/images/grid_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..55e65e477c61a692d8d9c9cafd4cd986097897db GIT binary patch literal 29833 zcmeFZ2UL??ur?ZuV!?m~Y!R>_f&z+w(osYN1QZCpBi#T}q(cxv1rwU+E4yN0SOL01cB_5H5L`Ub<4=y+T6;> z+~SyosOT{ZOLGI`yZR7_9X3qfP(gn5fFQnS{;Jetl%JHj9Nms%a#y`kv@cJy9^bh~ z^6~MgPjt5{_lk*ag};w{41N9_^_1@Rx!qp7I=2rVkAChR^Vq9)wcjzuw7mrXrJk7A zAvByi7nakwy<*4ifEyQYbE9@AU1iwY=U(%+x_^*e#BJ9p3&@@wId_g*5l&J-mRtk` z&Yq~)UIwACYo*!&sgMq-IDhmJiDv9-kU9nGAw`At%ga(bP_z&chv!%0AtKi)P+_l6 z%R?f!LbU7jbO#`}*dW@>u3uUqsIa9VM+%6V-*GyM$d`~~`}H4RgBbBcQX3V$#30J& zA+!ckZ+Rh|Y>@L3N(MI|nfZ{4hCNi-kR7`r=WjpuV1aCPglNA%dD0H@FbG0>eO5_e z=4|?&VOFqGLD>R@r+CHO)ON7l+peU<&Tytd;^0|Y9-S>Z!6NKc_Cbd^-MDD_<~~9o zkuT}M)6Nm>8mQA78hDjNsMNi z+-jsr6={R_Hpr$C$%90WVwL7B$ZI1O^`h|8r=h{YPRX}d)pTl=oQZ~2S`|u!yUQ*D zYxsq}vd^d7I5phFw=VTneVo4;ceK%W=R@7DFFxXH`BbDe`qmR~C3FjwS!oAu@4NT> zTJY03&bSj#uKKdPV`?GY`P_SM6)M!r4aqbSqHui4mZ+fzU6f+pqikLA84rQX7MoYL zo!J3J8M*g2+LES(3F47V5R`$0?>z`a^V%tPh1wk9njH|xwMaMC%q#Hu%0uTWD34Zd z>#C$$)8=`2_0-#{t9!2Qx`R4usm+r5;OZIA`b>IOZH_h(dajDwMxL)MsM)I!1=NBT zG%Gqg!Yj{|xb56}<^7KRI>)h(DRjM*Pd?vqFvw%+c;$_)`@Byb`|z0d_6ez%+&3=B zc_|!2+@PNowA{k`Nd0=zOaAu|&IfCrCE^$S+_G;Aw(ZUnElj+0E7lM5b zM20k3<{lAz$`du*lww4K^$`-SIbShyX#2&tch9p|zqy)q`P|M|dUaVRQg^3RAIVfq zg%&?q&}+=H-MY_BtYRn6R@7u>MZx88mUU;N@B}p*=%f zLzMcjIj0+`i$cp~+4te#r2!?V*gynjmw8GAo+ZiSA|XE`Le?)BbQ)4uz!T_~f2sD#RS3PQfQhQ{FlKI^v@IK+?{( zfD}Y>*sXDSxV&K!f8wKL!$flh;aC?H!V^lBH#gtNipJiK%+eYtsXj)fcR0uH+;LM_ zil>bm_uJE1^`D&XvlhQ5&=-3PCMQMlie8kwsFWi&=Vu_iec<)IrBG{`ox^7m0_R-3 zdT6IuKC{5%xo#F-&{sE24hRfTPPvhCJ4JlFlqY>6AuPUBtXO5$jrvNBB(plRxS>zO zwydZk@zYY$W73nsa?*wIEb;s|`ES_GHFB<}g{3jI7pD~`>`f??c_ot)-fs9N za|ZnZos@q#bEuONmySlFoplU#4;tpbOMf%@s`Qm}k@GWx;C9%fPt+;&s`M^axt6qi zihMo64WX05&hO>}MmY?X8}~GJUK~L0uVZ;@93~&qDsFhtu+YkV?y>h1sRwoJfkNyd z@apdOrGt{z3->ho9ag)Acmga!mI^>Fs6Xnnj?k^erw zPWFv?xRyt+sOw469g+j78IpivqA-L$al7KCwqO$4x)inxk|tJw`yK4O%^lqK#;9pzSNG>}ED*7tJ6CBMv&5t`p)ma&2W^b@cJNSNmS;B39>fOb-b3=s>nUh|W+=Sii z4&e(w5Pbg_l2eec^n$zZ%NO^qCLfo6g*F^B{9+(noA}PmJD-EWfBOg1oENFv zRM>W*uf~rksGjLy-JWfzuVheO|D={TASL{4{lv$dTHK3Ep;Hm0iG5Z3`hC%Ho>EF| z^vYjKQ%!iY1@777b`8*NJL{=PnJQ4=g=R%!WK$-T0@GbePdiAPx@lI{KB&y2Fde5t z>>BcL9`EXy(2!N;Q0dLnS@8^m3(-CCN~gsg45V}IJkw=21b<{+TOQQqmz$LGw(w4) zL5soYmmaooHR^!mz%PN+X0T7#Tv)GS?!>~P7>*;b{tT|z9W7cIQ!Y?YqMz`gp`Kq@ zAy#2tVMT#wvZXsur(?;ic@pkevdHxngHtQP6NEmL;SdxEX^a6ze^p{N2QQrdBzbfx zU=^v6CWE{;Q3Gv(61JbDMt2mpVdz@~736%{&yI^z*D#h5!=`N6U_3Cyv(W0#CoQho z502t@_Tm{}eAxR>9aHBqiOkHeZcj*%vm zOF+e5a!%ocF?RGp>np?A#;0NaVa_h>%U#;IXtd+7UPG@5jrmm39_#)VF_QN%e+hqs z`fP#qY&LFazfyrxa0Z_ia?E;6fcUCawx&3=I5@pf-L!Dhp)}9Y06z*3ztqq@Uur*d zfYgo&=N0TOopUh9zr!!|9_V(lWF|D!6@Rj2o=hu|Ezz16nYi*vwEGc8SdG}#Io0KA zQehi8*W4wJr}S`dB)(kmp%LBY6Xa9p3G*BezbwSd`&rnMFuIl?+IXk&bofDHG_fxI z-~kSoCCqq7L-XtAsKD94SLH~jIKo)P_~8s(byYP(*$2Ce7c}P;S0^fMyKL#FVtQ$0 z2c3?&o*@}6XD!G#C9J+W{OT2HEA;i;n%+e=9Kf4f4X;RFfk3jJJFVV+1-?I~cSBAZ z0&!r1Kv3=w$TA81Jqm%?oQFWhv>_0_*AU1-b6>4@*C7z&Scz*_6zs5HyIt-47Q&`T z2MOW&?jo=6q|s7@9b4VzepNf^M6`r93)Y&OMG~vaw5IB)k}8o@jy<_m0BO_A$!?ut zv#fI~kS(37Qqp6HDkyc=-o3gNs2Y*ezB}wpIFDU8>ew(#7 zcBsE-+&VelTxnUZH5Visp^{^erko}5aL?5p$9D#~PVIjsj5fw5bnX|QA^6V?$7>$Q z5?(az=3q?Z+f$FJs+v+2PSrB&DoD2Mr?!jXB5mJf>i!++$j~YL}vnuV$7#cQ= z;N9<+>tz43V>J(F&S*~HvMvSkV9kjvy`KjVl}nngy7qX&z{+Mc=W=kSc6IW%H=(Q5fR9S zaY;F`cc$P@%>4X2R=LL?i6$nh*euHy?R4GF_9DbwrkJ?m7aYtgs;LwgHy+4QKGiHf zWqddF;;;=uWz^i&Sj82lXNFL7Or)<_F+D_)qAGUBW+q;!L%3)7i`Ig%k=be-K1zt{ zV9(4a!vrQl!aT?6n+0o*y>+=RETc`UkBXMVPUaQq*R3RkJM?`rWZX$fI%T{(yRF?v zqz@{A%O{zEZyE*jzjhTi#@t6lINx{Zui`f=wRzhT=Y8&3oYX<-*B177(;C87o!)rT z$qFu11h9>>JyTWm)3>JX1rs>6#k^RW=E&8?Q|cm zoVehfl%%AfP;x*zMdwXP2#-IbKxc{loF{pKQ|06{lygU(Fh@8UPxV-ilTR2`p+L>{7Jl(jv$ne<;e`lw%((Re;twib` zJ3WJA(^_s7uDlPuu%riJq*rF|dn;=tNsANu?XKA^tru_FX@HZ&XE%);FIN(M6dyEK z6wJj^=b+JTr}yRQVcTGBZp%R%t=gxB#1;5SJ#M+cGKY9X2!6D0|1h&g4C!)gZA`L2 z^4QSucIu<^kA&B7+Zm6ta**`I-Zh`iC@~qR9!@ncH2Y}Nz1FZ-MbLI~4&Q?#yg!*z z(sP^9scBI*m`SRgT_wAHoZe=3aOR{qwZPi6u!Df>!Xl2O)s~)IvgQNbPQB7d5?BNW zr>>4vVBV{?x>$<1eUA&R$mnEoj3ue}q)#dzxOAtQvuOEh@!Ujtm#y5YO!8;P;q8kU z#^+=1r;#*?4wK6|&^)4cM6j^2Mqcu8xNNz4-Tg=14nY`7F0MBJfb@J~v!dE6@%_t= zh4Btou)yQ&!iq{vN!i)DEwQPCcN$+`IPAEnprE+&2sU?`+0o!*fmI`eYifFJuv4y8 zT)bv;h8Af&qdbaijjX(%UWI;5N=iC%*`g^^M^iL)WnsJ*{DswN-=VIQ+Fb4WsN&Um`HI3v0=S)Stde=l_5!@RQ+_g`O>)t z9BLaC!vwI*WQ0#XNvgr&>uh}F87+VREA9fmzOS~2@$MI}`eJRF&5Ty`J;0`Fb}tW& z&PAh@)h`q#1Cw1_`)U|&-=llsZE{wY878^Lu+gQ$xA2UTb-GFC`6=m3`h*%+KW?tA zyR#&vOLYg|k0+<}nwhM;4eju6%>Vi^NL#wz5e9Qp(qy?%X@Wybr=_tyd*&7&FAMfk z|2Za@JMP1W@I_l$4O&){j74^m#HGP0ZOiQ8Aj5EBtJ6mHnbJ%AcAxYKuG8+@Rn^o| z52JZWNbsA2yDGO=y9;(If(rtdi<_!GsZIBUCo)RKP?dXtkDjRPFV19qOL$zX=mYSE zD>;n~yN_N@ykyYXok8jDO16jQn3@Pao353b@lw2ypP%(7PZ-H!vTJy_A@4NPf;SOC z=Uyq1F^VDm1ZSFU$t?EY#h7*6_1<-8~s zF<3?~HDSIL?7_k@gFFi0*lcmg<>3bBo=)Y!;1!#3v$CYoS1(Uycq8HG?{;F^b7P{S zi18uWr=@Fii7+Mkxt>g&9%T*xclrcJ+rjr2+ROWoz@Zawri^5e9jPpY_I%6wtZd4B zssjR8&7)d=XZc7}GQoa%cRol;z+e=jsn?&EG^~&m>fXNSKsc-v6i>0AADilHit2%z zy*BCVt(16`y^AW)W%1J}@TknUZae1L5@m~yyKZl7t%*x8+ztOifARF2&<;#flriwc zx#cI{zv%FfT^Ns`=lRHQEEfQ_AS2PPK3M(QN7j8vk)hi#sb*jPhQ?wsT<_Gya|>(X zF~0LNH8spKp|h7$VNT~Cd=5*tO8H0=>>r@Iyw80`cC8(+_q!p+yz#-FikP9=W) z$bTwKzu}F#BI?R*-J>*9dC!mT-UH2@_+Ma_hB<>f}W{A*f3{2 zoAY#KLfOo-lye}IeZrxRLmQ^}StJ-ECV+{ogj6EsNx{Mkhk0&|2G*?%xwd^Wqd6My z!y7@{2EqWq2YGo++zVdIbBzAE068!@uZ%K-m|V>KFH4i%w$cZTMYZW|1DnP)nVLVxI zdHEBFdm(eSO((J~Ze}JYC8?rQM}WrzM}yl`vfgcF%(X?jj}MqgDLwh;z>rR_;gj?7 z-Z}8!GBvGRTlP6J%b2oA8VC_4RTfXOo*yP{S4v$nHuz$THGdzbx-iSUjhkzHv3EYm z`WdT_iFD<%M90XYzw;@2;a4R#<8E%y?aotr|Ha7VMC4t~}> zOUHy=Uv}`D05H+s63R;>;V@aK-`+Y|Y@P(Xnsxe^I}J5}F^%N7H&eq%n6#zy#op63 zB8RaFoNJ(88waqXvef`dFEmC;h{dQ17*8(_E!yYkI&yM!-~f^^x$Nf5?P$s<0gD)2 zC~l;IC$1^2ayi9cB&mf=UXEb+5~nf9(x;j zTvy(o8g*lpw5mGw^eF}bg85jLKE?eq{i<4C;KP!$TOvZgO2{^zuSrHPzR278r~@HD zq!$3o%4^7i5$+;C-g$;DF-Qrs%G_bydifHMyM#n7l_LsUxT?m;U8kOsmu`FP)s z;R`PTQF}jg&r!7$kv?}2{=kXupD2Htj7Y$tM436J%Oahbxo7G);x*%gh4Uu%7_EjF zk@Vl1L3bPnnEEq+C|qQ>?A=CKW)H7n!+?*={7Gm=?MLy{%&J{y!OPf*##F>jhBRBZ zkh!I%H#BfNgn`g?%vkJEAsO7B55+#-`4mbT?*vuV!tFjk0oHnS`{rA{5=v;@dHS9l zwCaph94Q%;~FY0;d-bK2Dm zpVG~&sN_MXsH{VNS(vs>SL8^$A5rRvufDS|SvCRKJO@7b%XFl)` zNi%|eq((xJkj)=~pR*Pz=2B3q(-t~Y^ zas48!oKdjz{J9ht%%DZWj*UgHo_~q4F=QkN=dad${dyOg@$K!IMei@B&<)jmefqpG zgV(41Aucy1m{Z>imo_#u{c_{OH*ORQ0bi&axfD@VJ&@skLd?dJ=+GG|eubUyBQHbt zrT^B==2G0evbo#4QbtspDGym7ls_pNLtj78_MlsTVy~P3c3mr2szSpbf7`%&Ugr~b zSdm{Yl9v!H7uW`{_9F166r@OE=A{aIJJOlW-F_ED=Lp?hz?ynD9%L=>h4+Pi3CUhixthwd&I}lN_lGO`zh|a`|V^tbAe}?b-&t9GfB_awmO;+aYHq; zuNlCHobW5~J^0_PM&uk0MaHcFf(@?{L}>_LJ}_&M-vQ9EN?k6+PNDC||B~9bQxelf zNqa!3&;&C8Fhy{%gP43PGr-3nu~W?***ShVm*SrA#@kLP7k=_uH>9`OutR)Y6UDt@ zAdb2$&oZWItlrVn>!xv;M&+%|UzC+%Wo7l69Z0+#qdPl%pVZmbcBc=q?g_{*2kpO@ zh%IN0K0U>zlKnQZCd9n#Q$@-yN_VsTm6)SK*UMmiuO7TUwDJGNjG*K%^$tql;z1@7 z*w!}x0U&oCGj&Yc{FA(oe>1A<_U0ANc)>Cde#N}QmGdV*w6&cDF!EGhImct3W0MKM zlYpDqdX~Hvuj#R2Q_;jaU%HkwjpkMIH z0zg<;EY=dFv6s5eV;m@vB3-f@cDX~*3?04hSF-LxL3&d#fnLLz)#VdM$yv{$Bk&Jf zBgnQ&HlTGMxM4lb!eRv>hE0@j2^)vQOMA%R?7G+6Gf+wqbrt@i@4K6{%=wR8-`fIM zW;`*9A&r03NJ!Oov6*C5?D`Q@&VU=)2L5jGz+`rx2vPh{t^SMy3`f13ej9b9j zZeop}yk-IHHNfNGa)B-Yk?d3vH2#Qx?|%%K4s z9N3&1VZG~x2MyPWZ%AQQ`(r09hA36!|fZlb==AH7O9@FC{4liaPuKl;m6*}( zzw0h}9e!00()Q=~rjL|N7xzwN-{0N(Cx^Srb8OF2MuTwbU%mC8u+HYsHWo;%1BB0Y zFCw`CTGuxcacA>!yC{|ANw<93!>qX&)A(0MNQK?P28MW5*}@Yr=^o*U0Xk!1B=pVVXy`kt*#UmXlcVfGHn|Jv%voW zvy>XaUku25DHR78-|(DdY5lk_j6bd3D$g{ig_Ap~qL2*<*?)2qu1gwiM6CR`XD#0Kj+2|j;e=4sV z`j8O|Ik*Xme+1wD37B2}wUgNj^6iVnh}bLGyqnzml67(ok`pe9YE<+@vs{YF@IS=i zgWd4V6y=(=;I+tLsA@=Dy%o1j(gFHg4U*f&^Kipm0X(QDdpG?rQ!a?ZpQ2y|ZB|gv zJ7?IWh9C5o@jsS-$ZNcB^T1vfdkwx7yKE-ASLk+JcNxRiJ&`bN-G`e8GnXQavm&KZ zWo!z$I>b^QoH8%=f(OM@@s>yX#&uk!4s)_~bTacFP&XnFkH;?Ax1Ma>Q8oR$CcKx6R$ zqLXUJf&2K<{)aq}lou)8XbJ`&ao-0N5|VYkv1uMyt!Tb-^nv8`=n3zJtMH1qJ2qEx zAGTHp-qaCOf_ffcq}9JIz%tpoHlur+3`ir70?+uBCo=u2X^!7#OygLtgA*5(&enx^LF;&2A(_@wgI4(IssX zWt_f=!4m<^iC(abl8p$5^hws2!zLI%-h7Zre&5BN$RQ{53P=XAI-%e8K4B$7cDz)V ze#Qf&O?{VhDRf-rnsRleH5~f+AJ%VcASq)Zwwq`%vkG{2jngZJ(B$`+=XVhtty!=H zA4H-<&?23&X|>W6g%R{bo|iu|uZN(hvZVcRDD;AR_#3*-z}6jJvPcU z!Eui$4P5*8;24!wC3s02rNnYr^23W*jt3^`a#n~y+pQX1Ah_HEQPasx1cbm}@=2S@ zC&W*v=YdH@OZ9VmveKlp=hJMz=UK5gqJff2Kq)8=s}y@uhV+a~LNtvdMI4!51h7b$ z<{*Y?#(nh7MGmEO|AOCbTwGnXWNY*!J!75Ygu-AqT4p%ud#hNgN^^lFai^A2&}`#6 zC93AFpcLg;>lY3WK#IegI+Z)H*b~MhO}Q?Fm3(3MAE)A)nGtl>-B)4EKUSq4S&xdP z&>U(XT{?icOfWpKzDCy!%taj14FZe|v+l1RC4y>F#TdpXLpjS1ltSQ_(pAx4%Rsh{ zE|d8+jY9-JAv(TW@xD@<)G~54Ecuo}5^%(pPvTdZMwKOOfhRYDX6`B+D}i;YCg!Oi z@ep5=+T5y?{fGwS>c?R2@g7H4)!Q@JXfau3t>iSp+PP0$05%zv&^cq5W`y-X*;8>6~A2~8c&EQmwUc3d!)l$d0 zN7T|e0mi?Asg<#7BtI>+i}RLV_wTqa&8knlZ*QMrU2s`oK=B-tO96xw2bMBc-v)p3 z-FO!oXs8@E&i!SU6s(KzLjxvbwE~-i@pH@cy~sDCKno!-&Qs83GwlkAqD!o zAADoW7^LTo9ST<*>76s&*L}c3G_s=ogaqGAc(_a}$I8e-XK)S(@LV1>)0{UBrnkr{ z20B2K*qYk|VgS@B0c9^y1k(6L{I>7TvC8W`0*Q*vdUvE)p@t`S0Ww9$FU%zZ?)D)F zMWqy?oa<-?s~#E5$u^zRFjcbEsIlV|sJa1aLjsFNwr&(%lrKSj!(F}@ONfby-F7+3 zZK80K*fq%*5*)m{gmn`-k$GM9v`j{yrRNNZO^=jX=82 zLq549#%1jUPNc|#pM&Ya&=DW@Hfg5dNs_SbHtz0>4@^fw<2W8@OnwWc7#;YF&!rUs zsNCsBnBCVbgd;w{mS_SFW?KHvCqK;oRC-!yJ_XC+T2^^d%EEA~NisN1;pqJyKFFrY z2j^2aV8=Rgj;9;P@-vN2A1IZJw5sHAjhNF}CzvFF4NXj#nz)gCg;++iY81J-ojHLb z;h+=c4~YGEUm5IBAHpnbkxpaD2~~m$PF8q1-nJ1cs!XA(?pT%7ZXtlPS_Jh?sEv>T z4ci=BC}ZO__l}Y6w(_UkG^JrbA%`NbZ9Mn^Rcid5L=wg%eb;iSj^|I9O~T#!b6ucr znASSz+TyBQyd`y7;>yqAD|8B$DMKxU09%hFjZBT-mh?<#Ytz~-r*Z_8=HOAV9T~8t z0?A@$tX9hm=J;XNKBbmp5<2-5E0$x7W6l2wB|kKhRkZXbaF~@_bia~`Lt%X2*&GGE zz~m&8-i%gjp1yhf%j}DMU&_7+sO~pwO*g6aV=>E54t!ICrqm85Fs=X-;gPCbv6vG2 zaozxZf)Zpoj1&~H@()fa3I{$&1it4DPh^M{v?ZH%_hn(pr&iD^sr#6I-#)HM@8GU%|&7rvp~@Uzh)E1=c-(@vz4-7z4SmXX;|hUl#wD@KBrgOdQ&Qc ze6iGfE-OaIF!if6Q(mSP8-brWh@BI1{QqwtRU10K+i|oR z211OJhqwHSHo$RjB}mpcwLeXd*uhnF3#@9R`f%6=4tUr>d34V7hNq&TwKJ)4@aj-% z+n2%yev02vPZ;xxv*3}?B)k`Hih@tkXQ^#1+;hltt>?Vx#?6GoUj!tDy*tPXl>0qnKF*qqQ_r{qBLddM%>*fGbylvYxlUN_;9OVLA6m?N4hn3F}lzJw7lm;&15` ztk|_U5YE{xA8(alQ}FS(`%1|Knod z(XSaT-Hj%O_d2{HaiI9XEd8zc01(o0!JCYSDTuEvp2vTVUPan{L7>wIeO zI!r3am)RSjFx)Y=n-J}z=+l9{EBG>6YreU?DwFKLz9(&TNRj-khJDn4WkB&n;<2b5 z9;FmIsrMOw@w`I>0@w?+)KQmb?0(jLvWIJ_&J3ew-H)g_y_|wEe}z@B4vxizo;Yd% zNcW#OtXg~c3zhhO+c5~0|zWa;@Mhu6_O`UX!wF~`-VN_-NO> zQxicTFF$fY+*K&8{Lm>0{%o7tsUObt`7&bIR%mwW^lvmm(am|;WyBcB%-Q-oo?`EInpob(KRuZ*?Qq{>&49u@B6{7Z(dSK;9J0~b3NH)X+lrjbrf(;lLbj!sXEI5*FAk) zqc|U{A~Gj0VxCVCcod+cEUfd-^;1M5 z9AJjH(O6u3*phFYo zph8lSa!nmy8E4@&z$>ud|B)FhLT(Sqh7GugO&^Pmd@4bjnY zdewK%slQf|muJGF9{yaXx+*;{Up;CUgj~2AS?8v^nZ1I{X;80rO z9bXF37u^po*{~-DhL%a?|8a=B+ZQ(6VH!3HM&gRU zKXC$=|Mk;AMrx{&(GF#;SlEr}p9nG5wrk~ul5st6;Ij&)H&?xKZPtFUI~%5Owq&J4 z0FVi3Vyc2dfP2o%r>F}&IPqy9;=)PW&de0}5dcx=N{K6OKrS2ogMWHrnj*z3R$z5m ztibjv+#(5N+A^0Dc4*moPgi-^U+VVbHP`G9<~Chf6g=$wEKtkEzCBfC?OnwtF=Uyf zXnt-d9$$htCSmk07CX%dYpE;F=w{9J#_Cs{j8`dL8B4M4y0<;!@IWeY$?pxbkWFSQ zvSLelOHr95AbaO%b|Z`b4cU*O%$FV!D;&9zP4N{VrDVsg(%n>)hVw|+Q6B~MGPQJq}sP~)ct;QacXfG$ik8Jty zfnog3gC9YYoJwdHX<^>+4NWb5=+u=6J<$aq=!gzHvx3Yd&DpNqQO%0Yl-;`sWL+++ zODyu&OJ*gX#42fi0t$)r?;#IVZHvN2v}#T8QRE0}QW_oboUN)+V9p8XD}jiWxV9Z^ z6*G|ek?RYaY#K-ykw{eDevn%MLiDbPdyaLjEWC+)1NQKyqqojS?%c-rMd^HG?m5iz z8#8Dso^*=Ykq602!n^innuRs4@cowQbce#5dL11^0vagWNOc+%Y!u?X$GBP+IDtf*t&ws74D>d;B4 zex9W#Q<%l5^St@0ASxD^?{e%hrSGZ}z*lzPoR{aMM&HRJlw^pv5{}&Nn|I_mfF=7Z z&%8^3xULb0GTG-=WbEA5P+mOn>cLfyUu*CSk+4G=iBHZlB`pgg4w_m%X`sw47O6*U zQn`_jkQHQn=?4gY;I9k<5_u!*xAFDQBe3oNwYo_rgKWYV6RqYlt%Rfu@t`<9Rk_hR zKtRv+9_NqIn>1~R;qK>|NRGc5^!a{@1Fusqlc18C_q=uRial4c!m3m*Pu((z)jz5i z(Xb^+tPj;|^=OU^1j)F`9K>8L}tLI^lNe{>FTRO%jpx1eo5XnNOl3 z3gjpQ>%`n4->BG(5=nPAuwiFF*8EG!3wTA@`ddXx2NEb2_!_%!vg9@Jul^3;x9c-sD3QNKF3WZV;C z96+DzXQ2J82|(kOKV%Fk;dvD8GAPqsfUnP?fHkzR2!m+&kS7uVeJhbl)M?t0*IJdR zmTZOLgrC{Kg6Mhw5%tuvaGz44ZYyHzjQ-d-nKIwYGeX-BGNb?_)hu6u+L_V7 zVH?>`+k~$AeJ2MhK~`;idc|7Wt!&4bcO<2qP42Z0S|hEf=K*9n(d!nLj> zFxGdVwiSFU5|lQk<`K0$sPl@&zf|eS9?oy~1iPJ8kP@^6P$bSCfM|Ek_~GSJt)M&y zjXacCG?8p=?N=ujSpco}TOlff_713{F2x=rtL8S;B?#*@@co8_DT4OxcZC4r&b}ns zU4YeANg!1N5X1l^Yc6uPygHW2sopOcrrGHg_Z(_culmA5ZZ~95!T6e6>r|=oIxBgk zou$fHMY0jOY8^?N0ieZIx4EhKUw57%mm-FW`(E5B?(&3_LV#4dD^g6=rarU@q=CD+ z$*#~KNhag&ulfyuf>H>Tb=Bza$PNJ*y=nD{Ahkj+F=s(g@S7k4rHknfg$&w2L;Ps20Rm1w%7yupjgN>+6b6AwPQd8Ha9@p%#VwE{j02$A5Ke`D$ z8iiRB<8Oj;n^lymJF;fmR;bPttnb(Q37SDR|HeAg0LblctbR0Vy?_!a|Bwk}#1AYr z91~7|Y<^(LcE-^BTY()Q__2MUCX-JF>LU|8eZFu0c?`xD2?Y8Smcsz0as$7azX{nF z1pSZrMjd7RStU7EH(vl78E>9ee+C-HFXy$H+PcXsZ=$FQraTG>hPYu9%P7yM@|l_$ zw22LWT2L2B&(ncx5&T=gaxN^4yw71>xL>#(hz{CVf%q-x%+O9v%e8m2YleoK@9o=ow! zaq_ou zWa3{v2!;ZNj83!E@9Y!VUAo@^rm}Mo@L(*5SFCOsLIIgrsbZ4eGLyZ@00J)tmMV-Y znHPlaXYX5{uwow0unzrpbOagT3W=f6+O*b@tI`}Dc^v68u+C!Jj!O5b-SlJr3V_Pj?CAmu_f#NS`+;#hhAFKj7C5n} zo*lsJhQXVdiUT~lfu4`@OQY)`VExUD*<72WhXCiQrj_t(6af&~RXjj*Z0^e&=XtpV z#&xmWH~UVlZ{b+6ChTq4sSBzrKoofKqE#woUteWD91hLz4loz|xnjdEa4FKN`hZk4 zY~)!JrFu&tMcBnOWjR2sftvNA#Q{HjqTRG?bjImqq;>pmH z4>3KIcX8-Zurm2bTpN%Gx)9jM*UFCloQ5RB3gSfwr5fdSwHfj*Kay|lt8Q{-v#f$& zl)_q-jMd1J#&Q!=8c<}oW8gCE36Do}2opZG`g(bJMXy~pX-j;)26QGo+}wwM(U}yg z_6r{HPb?}JnexUlx~?`7GhH6VU-Zqr^I=~MgL&Dq0W^d4(C(t{F(1n%qdMZgiF0Ve z1`DJK3k#iPmeOtwl;GT-%%uQ@ zSRlRlKx7TO6{$@Y0p!jvzdTvC`wDU;-dFwyUS#q)LF4la)p$j#m-{8=j)!0Z& zoX<|Hs_Z;xxfii5EeoLg%z3&`Q;6m9H@(NHy{RX%FC9|{LYA5+*yB#%!{_qY%Ny!K z@34{JbAHu<96q11wRh^m8g@GS=GpebNKgsel@UH|ghaPk`G@}wE)Zbh z*CN-*c{y|74NJ`(O+aXb6andajk^O&$9;q8kNYGVsNB#z6~QZy9C9aPW0sA&KZ%nX zCx{pL`EeB~o4V7psqC{KO*|Hs${Q)UD{#wa6NWGcuMC%q-oIYc)e$OgT7|?Sq=Pu$ zO(-sqk6K}*TnRcO*3O3g#?R9KF=P1o!fPOd>P+zDT)>;yrGp|>+5kqKTp`w$grCm= z%AffF*++GQGbYyp;(=CehMYe91$=dH1Ju-8f8d+vEuXpEa{L0~;5PyvkT98rA~ob{ zbp*!vN+GxwV7;d(uKl1iQulQw*8pC0;S7_g*4D5<2>k|4U?DL~dCDFXnuj0gbVHPX zXQ=C0syb*(3ON$xiD*aEN6xrAmsd0ak4?@fl|e{2(^MEawgyVRct4=7vQqou5On;T z$Rvtoa&B>j;+C82&7V+!BKyIih#|1*+Gi;YHaQ---x&I+(<>|kZR+}Jg76W`fb*M- zB%e9d^Xd4?bznrPIS+vb_|P{Lc~uSMYX!q4fZuKQeVzg6r9v-2Q*PKE$Xr5(Oi7vHD>MF5D~ zpD{0X4=r)s37z1|^7i-+wiT6`a>+-qj6pxZ*utPj>A66Pvxg3lr;rN*;1r(nnPiby z1@|y%n8*E8i3Nn!mQ$M=t$SXXgnL@I__L{(s!hcgD~GcY0gGQ&sxn=+19p|R-zfA% z36E4tjVTh{ZZJNY`wyOdh zRD_c2R#&Z({Z!hCDImL$R!{1;HTf(#w2i9*_g(k05bX#(fEW$Wmf=v1uv7$vKK~p! znr(icZOo*8K3-VB$2ToQA9xP4<|wc&U|+@&HKjRdOdY=$W)AR+!eKe86;mr&+7U>MolDIRsGg6nlW$!d|Pp1Ef(G3GB;npnkp7 zm^^1{8Wn%QwCX5s$<ZH;c8POcQ*oX_12%oc-K~5)?vnbtlf<|0i>uAv5m-L}nnH8}Zhz8DlBGf9IZ; z1;=`-Vd*tZ+=pcQx-t`K5szJAYx4|0Fsm{pVEiH|6jV0+06cY_y=`+C_swYWRH{QBgvX zO<9MQ@cFy1mHsF@2S{=HKtGV3n-#HGtqZE#=O-LFSB`L$ug#{aS-H<`?|$bM6*rf!O+fpR+NdspK|jdKLUb4=lHEdhwdUuu^BgSQJL z+}{JM@_#J#2hY;FfAjS3I!pHbfM5hKKbl)NJikNUe<0xZFa2+=?!UO*e{m4NW6WRs zCQKIJfubYzsr0zN=ZO%3o9ZGUa#^Q4vz5nOfi^6F3o%)z|@RtbCixzxXX zMCczZO!pJHsZk|_;s|^kOd_%DE@Fnm$Nzc>aF?KSdIm@j*;MD>7TL&B(+9VMwQHN- z=?MLUlbk7}kd}@hGYM~KXu9vK0dl5y^wjC^osXdN`df1RkZkTe$8>NgAR;v@ zW+MScBh7UMKi*MJ_z!{rk$D>uhfd1N8}fu_0|w+2%f&f1*XK1h7eFB`-@UCVwvfeRFz$(o_6Nl>M#A_b=_|sY$Mh;^Q)W z!Jr|?d7cFHpE)@>uwV3_sfvD#Ie!wfiGTCQ;|2WU?A54IyNx7Mz6oB z1dO)%8x(Ybzley?P{_?KrBE)hn|ys?06-SMpK7S|4q zZPBnBOW*O!dOQ4jKOZ?m0h5kuC0#{Dox#{0Fl7e_7}_ryK|gP5QpjB8CUyno287}Y zNKvv4eaf@5qoa;%JHPykyPC(LhU&Z*zs@wie#s9827zwS@%Cj+S3(7tn+2Y6bN0ng zjo~RgeN}1?53+wO9*zG93iTbSDy{ibA4W_|)@JK+4C+5~P;RmyFQxJv^dxSwr~XyY zanKCfo`FwO!{2pqsGjcc!S`l>X*AKWf{HM~?@fGO#p|F7b!h6pD&P1X*-wK4Wn6sx zn7zDHYuME* z(;uuge=lgN`K9ybo0EU01NiPgHl_~z*Z5Jfpnra1yh;+cOb{V z9e47-BL~3Ln|~4R{>8`vUx02w1qxt&6C~1@bmDKL6^;-}DZrRb&Gk8hdcna$%WHE1 z0FM`d`HE?Oo`O-wLoW6)EjyKKfw_>N%SjDPI{|f?_P^!qXYwgLJY>^V7nZ($qM0A> z&}sp7B~YmYLjg?w9AcD#6!cMieKl1j$BP)Iy z$6_Sdv63Jh=CFV{D7-e^?L0XSsN{?voZ_r6WN$qKrgbjaggja3yqH zSOyb71nzx)_!FaGgAdIqa*c~#v->O`#%uMZS)7r3Y$iU$jB`3!XnAmdz8c|*VZ(Y^=JFP8A!Nai=LiH~Da9zH;Lshau9C5T;gm?Ts*)S^4Jj=42Cu zz)-Kih0K*p^&0r&8HbsdC(K<}2N+46n5}1t*#7;b6|EE9l(FD~HmW^s#`gP9cUgXZ zEAES(qDW4mxj$F$@9$rl>o6Q_eqDXC&K;ct_2UU1!ckDxlRrY@(^{j%Y&V|aQgb4e?2pZLhhvCB#p zrT#S*8a2K+u4GdNL>a$GNx$=hZ+QAr{>zNgKw5r}$uE<644#4AA20Z6s1=v7FD~tQ zUH{2VwaNO3q>V`_FO8sAL65vc4AESAkxgSRzzDx3dDnFg4vJQ!ALE)%jC zcJ`6x0{9S)k|kVyh%F7hgFld6{M4(qnaUvG7X55h!uEZuy=!0C$cyUh3v-?66?$HF z-PqVzQ;tlf(HNFa2;mxtu z>disC4^~@=x)e;Bb{BuH&`PP^*AV`VQ&N7Xv5xITQiWMYdR9sIFy+q}1bOTunJ?Kc zKBxab?VWo}Q)d{)SsFTxie!ik>nICOoq;h|gdo!*%mTsCY{VH-Ko$Zh1Uf8S* z6Sp#MBA1a2hR9Xy5b1S7mWI0vQ)VfxY*1jd9H7PCd-j%_AnlU;e;-0oTD%^({bh~W7JK3B`weFhww$D8=q99=rRubfgSe?g{w_*8Qj zebPis&;b|Fq%9T6^6>sF@=w3s-n`~Ku-;AR$ZXsbPv3&@sByERBOMpPdJocj$~B?% z3K?X|Uf5X-RyX2z7K2sT=Kt0?F)ju{RjL_b*TDeauS2U#u7_w%Z`FX!m>_GTu{1nH z5W-ZKo+7uYW+y5hjvX*xAVv=|bCmNkx!q6Wp>Sx1NY__Ub4G!iyKQoFPtpo#j<*o(dGBNOFR;KbLlj-CzJayHHM6TA1mz4CI zQAxlG9IZzOb(TaF&&!&K*{_e54DhHtvo++D`wIl2Fmq6xrzeA4rMfaYBo3@NEn~@$ zJwKRoE5UH-N^&_y{w+|@Ay>kj$^z8PWP;-?9tE|;cgS?^quU${y47oRF_V(ON?1*! zgYOJ3W*qns5=N1t>9W4Bfp1TUemm_Vh?Nx9Q>zuL;Y*~dCY}~G2;xF2;^=uq!*G#- zZ$o^r8ByQ^F)v^~l*i}t<;%Nm624Q&s-73YnFm76&EIj>L7Us_Ht?h;fx-kW5++`* zpa(#DP&y4wbrK0NUZiua^gsiXq02=awd~qGAG|?s>#ehIm_B&${Id!jPE0a1Wyu7fuFrWp(FM;0D?ClCZdu`z9CY zC}?v`RD+fZzB?6yDpr)m>wW#}-pGlq{Qw&fw(a@7#b*@isjcKl(x)_ba_FYOUWHq) z>~sDO3wMWw``-|p|3&i1KV$K$oD;`YDaQJJ>1U-lefparmvapZ-}~DD>vzr0{%ZmO z*6b>sQK7`@{(vnbovQX~Fpr=S%!!|CC3{>A59=oBQ1?SCzDYyj5YaFLYC>9|6rqDu zQ6fsmSGq5IA=2z%Gj(9C7%LU31+KKkS~#=d=>EgkC5#cg$1|!yKM$1ln`XqtNPTvU zTr%F(#qgs$XnXJ?@wQ0&#(Hve8e3ATpKGmdt5!=DGrx{flo&JC#Wmc*WHFts>Lwa% zZjaQIC2ulJ8V*NY8v*FM-aSc%qiKd}h*W)Z zV`FT8nM+YCB$tH3P&yyuw)&ObciK9{m^6;)$H3cGhuj*tToI!5_1$H>>VHFwJz#5V znRl*cxbur1Y(UcVP)lQ@Pl0jl{KEW!oH#VZ(K-#`D9b(wtEjBR?ZxV8IV2L+d*$cz zkAw?e!VH$$+S-O(UdrG+j=0ZeSIOR3ySfygTj%WOOs@b93>Xyv4_^=x4tj>c2`50$05uOmUO7M_!HN+4gHZTC`Pcp*cK;B80FVd! z{>}Z{2}FhE+IIs(O3B;@mliw2_YFmcO~yP}j$an?%EO8KRMYuYSNqReXk_x?$E%N4 zj_S_nzP?=HrDt+p{raH4!8`8J)=^TlnudPYQbc@7$=q_+4azNY+{J|3w43y3#?{2s z)F{2ZcR=tE|1!|zt=u_(Dm?X zV@Gf2a~{9@MNi)!{X;KD28Un2dNcO+{ksp%&pr)&Y@Pf(AQ+t+Uzk{&emwhS{?D&# z|JnG~_G4yw_1F6LcQ8G{k}c&$A(wT`*$;PHQBh1{F|mQ!dk1|m^aH=4vM(KD#Za?v ztm@Ckoe^?9`x|v$lJo;!6x%t##b#J#9)7ex$40@m&fLy}NBR3IiV zHe9`kp?X2LwUD+bX!&E$ol4a3iM-`rgcR10jBzH+;u4?}V@C)ploS|xS;Uveq>S!V zVIx9fnUn7omZ!hb^J)Z{T_&2F9V14){gDbyGTR3Z*}qAO`+F|_4i({g$nxPuDSAc)x)98_S)e_A-YZ*cYfLzfvJ|f~Sf2za_bV$6LXU8_m zZmwBku<6qIv8r&CfCwVlN(2CjhAZ2^rH9d?@nYJ!)if(zUo?PlZgLfhsu|!CLW%-l zA~@qO6-h0@zA(U>-E~hy#(?7mk=|555ZQspRESl@LoztRRH=wQN|&}cDB%HN71hd72<&#pKwf3Lt|~~PF?F@5&yJgo6u}3$WZ}i%5_H2vMr_~D*8sExrg646 zhE;ssLA>nYgg?H7mHQ_dfL>K!9_){wZXACXm&dhj@}d_t8ads$byaU~?0niw&%V7)kFZflieVw0dIT;*C?|W=1ASBEj;(aMWJ^T@L_gd_GZ2sAO2Eo=r z8ZnQ07L*@{LsF)cZ`~-VzYOE01ZYe6SLmlM?5{!&;g(a2JMazRy19X+I+Nx&8!V1D zhG4TmQ6@G<^NG(It_g^a>F}V)z5JRt5iMR{p)0J=*;lRtQiF1;jlB&6I@i#g6s&;J zRI-|=7KIRzOBY2D=MEHQN%h?LY`vmXz9CFQb*MPcMSQ0JoWn4Q(KjGvUbOX!*A5%V z##XhR?*D4g#0N?8%1eTKTFAX+?%gzwMSSpTm=|^Onrg&3N_#8HRJBb)DfjbK=zmL3 zmXdw3L*ri;5AQPnXxd!|CI?$%cWf~J95e}l$mwz?l}d=8sUt?=IOwz`kmMD z)6Wx>sWlB82;o~we{M$+GVlcV0p<`GH>%B5;X#|uLokGZGH7EBit+vpf@eGA203Jh z?#f$eL7TaJLwVJcFr6N@}Kxz!V^aX#c0Du0UlXQH(cR6I~vm|RZp!8)4 z(nL8S-A{g|b#$0dVA-Rtt{R#jNeiaQ@x3E~wvLM}AWI$rK;)g3PZZHUZ{SNFv#slp zC(ZopZbBhHp!A1!X7ph*%9Q-UGQXA-JGpi2ID6etk8BOi+yRsGt0p=d;!yX#^vAF_ z8kSUz78$jmNnDxqW2;a7`uEVY?$EqDLjlCBLEG8wJlck}sLb z$HI8nXOY6Q&M*dY4eNh+Jj3o(={|W_y)wseW1%$vJnr%vrOpLBK0+#uQ?G2=(UZe+ zeKP%4D`Jjl$E54eaK`U*%Pm(#Palwq@x-5qt=RQWG0&k8nWk&2yR?CduUm5mIp4=- zEo2gEsey`SP3M}7Z{J)ziJN`E%JDSl)eI?gpN))k(Tl9rFF10__C+o> zI6^1&;UO<6BmpqT8dP<`L50E#zNn0vo*ATZSclBF1|Si_{E8;r9jz_kLM1XuVICU^qd0_Z%JRTUZVWngSp>%Vd_*0`w46If__Vtg3`4rZJz>Vr(9}b{oNSz z>cM13Iw$`g+w4h7RaU3=GqvIHp5|nAWV|%Gl+@fx9MO{~F7VK74ZXg*B%P=7{hq;yXzV8jxl_=un$L9~|D~4u++4!DsA^{>pT@Up&q?jiF=|tPamGvj zmFxG}9P5-~+(C_wA&y3^mV)kR)Cnx_oL!H}NKW4i&-6w)4OYVe~_ilNDYs8yjFhU^=;|WrYyuQu|Pxgjp zyRN94zWU|CgS58AGgs#WX9BNTu%1=WaahT#9?%d?PI(LCmsqtUog7^8Et~dzwZ)uX>+qd|`vID^K&z zG4=LPp}f~}*H2t~Zu{!8Pf~$anf>(-J%9xb|F_0fsYYRpk&#A?ap~Mq8J*O-g?o9F?AnE+Ly}i|*2=WypM+68hsY$Z1wl z<$}j8&j))p&}^AG9$t1s!%*Cu%gCi}aY5rhZk+x1t*ntmYU7PAc+dJ^hp3>ZZk%`h>~>bD~jw z?420y{+|=yJNLWTGB8KA;yC8BaO1d4BTUJ*Ux%$rJts+N+l(b^r@^Y84bX zd%ElA+o5ePnz^---t}v4@?^v-;r8ZG*JhqS2WF=nV`m|YHU(M2`C&HB|0LzcT-jmjoNRD z(#=oUM@-ZwCmPTb4M~Xy#}myr6HUk{S-C_>OPY)y&5E69!=~BsY4-DpmPp!RWYQU2 z(h+nLiIn6XlLTEs{WHNQ2H}T81dtFxWYG(4q9HK}{_{zfiINx5$-g0QM~vSNCnX2c xlY`mGWPWn!eDbCI-a$PruWae0!drg-l5!A$9|BFVp`lBB%C#q!D0-r?h?uCn>) z>)?Ns?6JP|_4U@<-S*qzA^8LW00000EC2ui0Pp~y000F45XecZy*TU5yZ>M)j$~<` zXsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1C5*Jv)E&?F*ZKs2J*tZxtqP!Za&m}cm9 zsf4k5ol2O^iNTdkuX7siHymv5`y~x}dI@QNhHMUkdWVc^T#8)=jgwkskO2dfnooF_ z0eqXGMxBrea~4;pqN_Fpo(8HD1O{KRthX+Smy)P?URAikE{~877E^*~!pkU@ii8ye zzR7aT)*+6vWAe+~}~f2m}D_fx|cG ziUWC&s!14-z)iy{1Z)Wuh0si#O8%^)TD_9B_ZJ)oJFdl zvnY0U6UlpUG5a*@r0`jU{m>q3)Mo{JRL1B^pmwGOOgaBSu&Ln;Flrv3ri z3}g*;2PLQ~tD7kciQ76@y!!_2Gt4X0e5nrX+@SMXH^1S|({&6Do?D!=H|#O9(YL!0 ze_Y&ZMVWe2?S+-7`WNM&iC)MS)B8xa{8!BXeJ{w@)&|q{m(fbenbjGA9|%Yfcwi}r zi7n#20-*{GzVY1!87es81RPno--aHrCm3lKz5`;5aG+=civx;NVOu>-Wgks2zTwew z06Zuo00QnP9Xi8JAYeN5y+TEW4h^u>kgfri%zg$YNdZ_!N|;J`ST*#adTMnr3qo#P zu%vE58n;-7wY4K6al17jfB*r|i3$R1L8pO%JBr7q1mdM>U@7V4mB5{M29Q|;e0DMB zk=@{wUoy6om`^k?YMB}VjD~t5AOuXQL6OmbMJJfvSrFnplfD%|sG_dG)rfx$Wy_@n zaoS@SdTQlBsIxK}0EgYMscC3UUNYwYtHudg53xjsn&<~K4l)y~&ITB51=&7hQ>-~H z%BV5Jo|{6raHzs7XUKu24xkMj=V2wSb>+tWh5;){R&VB ztt!Oz*cHKbbzVj|$*0kl8RZ2kqj*)juL>0!&?lnJCgiHF6>ybiQN`XlN6Z2QJHosD zO^UFb84<^>MQ;rdDlY~=tl5Yw_t@UR-O$OUD%|Ra0iVk)ObN9?()zLn#Rd@Fp`JWd zXe>DUxzVi>5mU=G4fE0Pv0sr}w7M9?WZ~9ub}_GYR*9$Qy}yh~iN1}RLn}ND3lK5| zgyV^pl~^%Xs0BNdc&lki#qn?dBQ(#9HO(VW(D3GVPc>=TH>H}lHNPL(D>kwGuRe zPYv+`(g?*e3ZM>YynDl9vP6LgFrWYhSO5kYpnyXp?si}x-yMe3lQ@}t;Xq22CXB9{1gT*wE0en5>P+} zceuj>=+6+`s}%sU2t*VAChmwZcwj67_6*`AQ7PHG#2gyH04ln%0F1x`u}*P2TH!@@ zAmc))Vjx4{y(AVAavwUbqX0J=vV)C40CB=sGdYgTc@2w!iojJp;$1>)#-YFg4C%%m zu7Z0pG*=o#*gXjtZBgkX0ptX+xB0~oRrI^0COJt(2C$-EaATY)N5(zy8B1{LL*Qd9 z@IairFm+bpQUx|iOCGYKm$qozF4aY|&1nX3Nb4ixXt+dA-~@-w)Zi6GVMIJ7fDioR z7qv=AyQQhnO3!NG1OV5oWV$kjQ>0}95V;CcJ~C7kI~)N12Y~RU5*u}C$QX@dMpdP; zcNSnKCkx=oTkM4YR%u|T1ip7d+yTIO5et$ZCw8z*A_pBdlV~Tc=7%3T?xTC`sI}5* zK99=aXE2n&^(1G~3>+YzIizSfro=sC;E_?8pcy=3mdknpi3Qq>A?zp>wmTev0Sv&O zKxozwS{>`CFKrm&g17=QZt83pdm?KzBT|8Yb%-0aR@O%L#h0RBeLU$~vT9hV`;>5w zA{(JP88yl-E-zxMY>V)iXi1e>#R-h@9~h0sNW2(P5^u9+m3)!Hf)Z?`n2O<5FNoD~ z=A~XKBqc8(c|?Ea@~*;s87wK;vn=UvWzXVCF`RI04kNvqyYdCly#=HIQ$cXXH@q$|6BsWi`I(xxGHMQbG!{n#J4E7e zHw5!NgDuP|i0?SJndME5BS8j$iyD@&b7d4}iFJ}r05cki#U5w}QGpNBGQ@Rq!=2&^ zvMSEhF&*9x*Ek^6FzgG2ftVB7IeMuCB* zRSrS_h&*D82LM%vfR+&>!%WJ>5$SsqmZrYEz}pNMc_dYcMFW0{K@1+C(@+_m=tgGZ z6Ps|-0LD|IGq9wNFy{dZSh9?y>0Y>T)yF)RSwRgu+z*_oKboV`2KMWbw*^}OPxeJ2 zG|JvC7TW`mVxL(|rR)pL8O1dnbOnsY&Is>#&l%1Ra=YEK6R)_7Vcyc1s|~kEwjiO% z9>A=d(`pstxl!V#X;G*9S{59eEy-qg6E!?+V~r1t)lBhAxyOs{be06!zES%Wz5!MD z8hPziwGjz5L{!Hx-NWR#26&BUUjww^As@4Y8};I4$2hbq&j7QTw=dN`JD~eAq8G&f ztwL=J!e%*-H4ts*TaQNE+5awO3bL)eq<7ritF9Tr$xLFJRy)ssVk**u6ytp>yWi-u z%8%#mJW|5rtpx{H7cE^k$X(m&@nAT3uy)>$2bAFmu#( zL^LRbpOHA%aXc_*S4j973{e%NG#3%~gi(Ms)MkZGz-#oUg-U=+*yn{&a8aq?d14p^ sN_B=>5QJ(71+Hg8Z5Re>7Ke0Lhjw^}c$kNJxQBe$hkp2nb{GKwJL;h=rvLx| literal 0 HcmV?d00001 diff --git a/interface/ispconfig/interface/themes/default/yaml/navigation/nav_vlist.css b/interface/ispconfig/interface/themes/default/yaml/navigation/nav_vlist.css new file mode 100644 index 000000000..af2f7e890 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/navigation/nav_vlist.css @@ -0,0 +1,109 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Vertical list navigation "vlist" + * (de) Vertikale Navigationsliste "vlist" + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media all +{ + #submenu { + width: 100%; + overflow: hidden; + margin: 2.4em 0 1.5em 0; + list-style-type: none; + border-top: 2px #ddd solid; + border-bottom: 2px #ddd solid; + } + + #submenu ul { list-style-type: none; margin:0; padding: 0; } + #submenu li { float:left; width: 100%; margin:0; padding: 0; } + + #submenu a, + #submenu strong { + display:block; + width: 90%; + padding: 3px 0px 3px 10%; + text-decoration: none; + background-color:#fff; + color: #444; + border-bottom: 1px #eee solid; + } + + /* Menu Title */ + #submenu li#title { + width: 90%; + padding: 3px 0px 3px 10%; + font-weight: bold; + color: #444; + background-color: #fff; + border-bottom: 4px #888 solid; + } + + #submenu li span { + display:block; + width: 90%; + padding: 3px 0px 3px 10%; + font-weight: bold; + border-bottom: 1px #ddd solid; + } + + /* Level 1 */ + #submenu li#active, + #submenu li strong { + width: 90%; + padding: 3px 0px 3px 10%; + font-weight: bold; + color: #fff; + background-color:#aab; + border-bottom: 1px #eee solid; + } + + #submenu li a { width: 90%; padding-left: 10%; background-color:#fff; color: #444; } + #submenu li a:focus, + #submenu li a:hover, + #submenu li a:active { background-color:#f63; color: #fff; } + + /* Level 2 */ + #submenu li ul li a, + #submenu li ul li#active, + #submenu li ul li strong, + #submenu li ul li span { width: 80%; padding-left: 20%; } + + #submenu li ul li a { background-color:#f8f8f8; color: #666; } + #submenu li ul li a:focus, + #submenu li ul li a:hover, + #submenu li ul li a:active { background-color:#f63; color: #fff; } + + /* Level 3 */ + #submenu li ul li ul li a, + #submenu li ul li ul li#active, + #submenu li ul li ul li strong, + #submenu li ul li ul li span { width: 70%; padding-left: 30%; } + + #submenu li ul li ul li a { background-color:#fcfcfc; color: #888; } + #submenu li ul li ul li a:focus, + #submenu li ul li ul li a:hover, + #submenu li ul li ul li a:active { background-color:#f63; color: #fff; } + + /* Level 4 */ + #submenu li ul li ul li ul li a, + #submenu li ul li ul li ul li#active, + #submenu li ul li ul li ul li strong, + #submenu li ul li ul li ul li span { width: 60%; padding-left: 40%; } + + #submenu li ul li ul li ul li a { background-color:#ffffff; color: #aaa; } + #submenu li ul li ul li ul li a:focus, + #submenu li ul li ul li ul li a:hover, + #submenu li ul li ul li ul li a:active { background-color:#f63; color: #fff; } +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/patches/patch_layout_draft.css b/interface/ispconfig/interface/themes/default/yaml/patches/patch_layout_draft.css new file mode 100644 index 000000000..83e835357 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/patches/patch_layout_draft.css @@ -0,0 +1,29 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Example of a patch stylesheet for the Internet Explorer + * (de) Beispiel für ein Anpassungs-Stylesheet für den Internet Explorer + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* Layout independent adjustments | Layout-unabhängige Anpassungen ----------------------------------- */ +@import url(/yaml/core/iehacks.css); + +/* Box model adjustments for vlist navigation | Box-Modell-Anpassungen für vlist-Navigation */ +/* @import url(/yaml/patches/patch_nav_vlist.css); */ + +/* Layout-dependent adjustments | Layout-abhängige Anpassungen --------------------------------------- */ +@media screen, projection +{ + /* add your adjustments here | Fügen Sie Ihre Anpassungen hier ein */ + +} diff --git a/interface/ispconfig/interface/themes/default/yaml/patches/patch_nav_vlist.css b/interface/ispconfig/interface/themes/default/yaml/patches/patch_nav_vlist.css new file mode 100644 index 000000000..21041be29 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/patches/patch_nav_vlist.css @@ -0,0 +1,61 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) IE adjustment stylesheet for YAML vlist navigation + * Import this file within the IE-patch-file if needed in your layout + * + * (de) IE Anpassungs-Stylesheet für YAML vlist-Navigation + * Einbindung ins Layout erfolgt über den Import innerhalb des IE-Anspassungs-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media screen, projection +{ + /** + * Box Model Bug + * (en) Adjustment of width values for list elements of the menu in IE 5.x/Win. + * Note: If IE6 is running in quirks mode, it also needs 100% values! + * + * (de) Korrektur der Breitenangaben der Listenelemente des Submenüs im IE 5.x/Win. + * Hinweis: Befindet sich der IE6 im Quirks Mode, so benötigt er ebenfalls 100%-Werte ! + * + * @bugfix + * @affected IE 5.x/Win (IE6 in Quirks-Mode) + * @css-for IE 5.x/Win, IE6 + * @valid no + */ + + /* level 1 */ + * html #submenu li a, + * html #submenu li strong, + * html #submenu li span, + * html #submenu li#title, + * html #submenu li#active { width: 100%; w\idth: 90%; } + + /* level 2 */ + * html #submenu li ul li a, + * html #submenu li ul li strong, + * html #submenu li ul li span, + * html #submenu li ul li#active { width: 100%; w\idth: 80%; } + + /* level 3 */ + * html #submenu li ul li ul li a, + * html #submenu li ul li ul li strong, + * html #submenu li ul li ul li span, + * html #submenu li ul li ul li#active { width: 100%; w\idth: 70%; } + + /* level 4 */ + * html #submenu li ul li ul li ul li a, + * html #submenu li ul li ul li ul li strong, + * html #submenu li ul li ul li ul li span, + * html #submenu li ul li ul li ul li#active { width: 100%; w\idth: 60%; } +} diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_003_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_003_draft.css new file mode 100644 index 000000000..29c6df629 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_003_draft.css @@ -0,0 +1,32 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - 0 +** #col2 - 0 +** #col3 - x +*/ + +@media print +{ + #col1 { display:none; } + #col2 { display:none; } + + #col3, #col3_content { width: 100%; margin:0; padding: 0; border:0; } +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_020_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_020_draft.css new file mode 100644 index 000000000..885b0b991 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_020_draft.css @@ -0,0 +1,31 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - 0 +** #col2 - x +** #col3 - 0 +*/ +@media print +{ + #col1 { display:none; } + #col3 { display:none; } + + #col2, #col2_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_023_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_023_draft.css new file mode 100644 index 000000000..a80bb0875 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_023_draft.css @@ -0,0 +1,40 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - 0 +** #col2 - x +** #col3 - x +*/ + +@media print +{ + #col1 { display:none; } + + #col2, #col2_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col2_content { page-break-after:always; } + + #col3, #col3_content {width: 100%; margin:0; padding: 0; border:0; } + + /* Optional Column Labels | Optionale Spaltenauszeichnung + #col2_content:before { content:" [ left | middle | right column ]"; } + #col3_content:before { content:" [ left | middle | right column ]"; } + */ +} + diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_100_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_100_draft.css new file mode 100644 index 000000000..99f29b4f1 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_100_draft.css @@ -0,0 +1,31 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - x +** #col2 - 0 +** #col3 - 0 +*/ +@media print +{ + #col1, #col1_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + + #col2 { display:none; } + #col3 { display:none; } +} diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_103_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_103_draft.css new file mode 100644 index 000000000..983e61a4a --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_103_draft.css @@ -0,0 +1,38 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - x +** #col2 - 0 +** #col3 - x +*/ +@media print +{ + #col1, #col1_content {float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col1_content {page-break-after:always; } + + #col2 { display:none; } + + #col3, #col3_content { width: 100%; margin:0; padding: 0; border:0; } + + /* Optional Column Labels | Optionale Spaltenauszeichnung + #col1_content:before { content:" [ left | middle | right column ]"; } + #col3_content:before { content:" [ left | middle | right column ]"; } + */ +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_120_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_120_draft.css new file mode 100644 index 000000000..43f095060 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_120_draft.css @@ -0,0 +1,39 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - x +** #col2 - x +** #col3 - 0 +*/ +@media print +{ + #col1, #col1_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col1_content { page-break-after:always; } + + #col2, #col2_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col2_content { page-break-after:always; } + + #col3 { display:none; } + + /* Optional Column Labels | Optionale Spaltenauszeichnung + #col1_content:before { content:" [ left | middle | right column ]"; } + #col2_content:before { content:" [ left | middle | right column ]"; } + */ +} diff --git a/interface/ispconfig/interface/themes/default/yaml/print/print_123_draft.css b/interface/ispconfig/interface/themes/default/yaml/print/print_123_draft.css new file mode 100644 index 000000000..d2586db76 --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/print/print_123_draft.css @@ -0,0 +1,40 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) print stylesheet + * (de) Druck-Stylesheet + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +/* import print base styles | Basisformatierung für Drucklayout einbinden */ +@import url(../core/print_base.css); + +/* #col1 - x +** #col2 - x +** #col3 - x +*/ +@media print +{ + #col1, #col1_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col1_content { page-break-after:always; } + + #col2, #col2_content { float:none; width: 100%; margin: 0; padding: 0; border: 0; } + #col2_content { page-break-after:always; } + + #col3, #col3_content { width: 100%; margin:0; padding: 0; border:0; } + + /* Optional Column Labels | Optionale Spaltenauszeichnung + #col1_content:before { content:" [ left | middle | right column ]"; } + #col2_content:before { content:" [ left | middle | right column ]"; } + #col3_content:before { content:" [ left | middle | right column ]"; } + */ +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/screen/basemod_draft.css b/interface/ispconfig/interface/themes/default/yaml/screen/basemod_draft.css new file mode 100644 index 000000000..c738ee0ed --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/screen/basemod_draft.css @@ -0,0 +1,70 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Template for designing a screen layout + * (de) Gestaltungsvorlage für die Erstellung eines Screenlayouts + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + */ + +@media screen, projection +{ + /*------------------------------------------------------------------------------------------------------*/ + + /** + * Design of the Basic Layout | Gestaltung des YAML Basis-Layouts + * + * @section layout-basics + */ + + /* Page margins and background | Randbereiche & Seitenhintergrund */ + body { } + + /* Layout: Width, Background, Border | Layout: Breite, Hintergrund, Rahmen */ + #page_margins { } + #page{ } + + /* Design of the Main Layout Elements | Gestaltung der Hauptelemente des Layouts */ + #header { } + #topnav { } + + #main { } + + #footer { } + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * Formatting of the Content Area | Formatierung der Inhaltsbereichs + * + * @section layout-main + */ + + #col1 { } + #col1_content { } + + #col2 { } + #col2_content { } + + #col3 { } + #col3_content { } + + + /*------------------------------------------------------------------------------------------------------*/ + + /** + * Design of Additional Layout Elements | Gestaltung weiterer Layoutelemente + * + * @section layout-misc + */ + + +} \ No newline at end of file diff --git a/interface/ispconfig/interface/themes/default/yaml/screen/content_default.css b/interface/ispconfig/interface/themes/default/yaml/screen/content_default.css new file mode 100644 index 000000000..5742599df --- /dev/null +++ b/interface/ispconfig/interface/themes/default/yaml/screen/content_default.css @@ -0,0 +1,170 @@ +@charset "UTF-8"; +/** + * "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework + * + * (en) Uniform design of standard content elements + * (de) Einheitliche Standardformatierungen für die wichtigten Inhalts-Elemente + * + * @copyright Copyright 2005-2008, Dirk Jesse + * @license CC-A 2.0 (http://creativecommons.org/licenses/by/2.0/), + * YAML-C (http://www.yaml.de/en/license/license-conditions.html) + * @link http://www.yaml.de + * @package yaml + * @version 3.0.6 + * @revision $Revision: 202 $ + * @lastmodified $Date: 2008-06-07 14:29:18 +0200 (Sa, 07 Jun 2008) $ + * @appdef yaml + */ + +@media all +{ + /** + * Fonts + * (en) font-family and font-size selection for headings and standard text elements + * (de) Zeichensatz und Schriftgrößen für Überschriften und übliche Text-Elemente + * + * @section content-fonts + */ + + /* (en) reset font size for all elements to standard (16 Pixel) */ + /* (de) Alle Schriftgrößen auf Standardgröße (16 Pixel) zurücksetzen */ + html * { font-size: 100.01%; } + + /* (en) reset monospaced elements to font size 16px in Gecko browsers */ + /* (de) Schriftgröße von monospaced Elemente auf 16 Pixel setzen */ + textarea, pre, tt, code { + font-family:"Courier New", Courier, monospace; + } + + /* (en) base layout gets standard font size 12px */ + /* (de) Basis-Layout erhält Standardschriftgröße von 12 Pixeln */ + body { + font-family: 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; + font-size: 75.00%; + } + + h1,h2,h3,h4,h5,h6 { font-weight:bold; margin: 0 0 0.25em 0; } + h1 { font-size: 200% } /* 24px */ + h2 { font-size: 166.67% } /* 20px */ + h3 { font-size: 150% } /* 18px */ + h4 { font-size: 133.33% } /* 16px */ + h5 { font-size: 116.67% } /* 14px */ + h6 { font-size: 116.67%; font-style:italic; } /* 14px */ + + p { line-height: 1.5em; margin: 0 0 1em 0; } + + /* ### Lists | Listen #### */ + + ul, ol, dl { line-height: 1.5em; margin: 0 0 1em 1em; } + li { margin-left: 1.5em; line-height: 1.5em; } + + dt { font-weight: bold; } + dd { margin: 0 0 1em 2em; } + + /* ### text formatting | Textauszeichnung ### */ + + cite, blockquote { font-style:italic; } + blockquote { margin: 0 0 1em 1.5em; } + + strong,b { font-weight: bold; } + em,i { font-style:italic; } + + pre, code { font-family: monospace; font-size: 1.1em; } + + acronym, abbr { + letter-spacing: .07em; + border-bottom: .1em dashed #c00; + cursor: help; + } + + /** + * Generic Content Classes + * (en) standard classes for positioning and highlighting + * (de) Standardklassen zur Positionierung und Hervorhebung + * + * @section content-generic-classes + */ + + .note { background: #dfd; padding: 1em; border-top: 1px #bdb dotted; border-bottom: 1px #bdb dotted; } + .important { background: #ffd; padding: 1em; border-top: 1px #ddb dotted; border-bottom: 1px #ddb dotted; } + .warning { background: #fdd; padding: 1em; border-top: 1px #dbb dotted; border-bottom: 1px #dbb dotted; } + + .float_left { float: left; display:inline; margin-right: 1em; margin-bottom: 0.15em; } + .float_right { float: right; display:inline; margin-left: 1em; margin-bottom: 0.15em; } + .center { text-align:center; margin: 0.5em auto; } + + /** + * External Links + * + * (en) Formatting of hyperlinks + * (de) Gestaltung von Hyperlinks + * + */ + + a { color: #900; text-decoration:none; } + a:focus, + a:hover, + a:active { background-color: #fee; text-decoration:underline; } + + #topnav a { color: #aac; font-weight: bold; background:transparent; text-decoration:none; } + #topnav a:focus, + #topnav a:hover, + #topnav a:active{ text-decoration:underline; background-color: transparent; } + + #footer a { color: #aac; background:transparent; font-weight: bold; } + #footer a:focus, + #footer a:hover, + #footer a:active { color: #fff; background-color: transparent; text-decoration:underline; } + + /** + * (en) Emphasizing external Hyperlinks via CSS + * (de) Hervorhebung externer Hyperlinks mit CSS + * + * @section content-external-links + * @app-yaml-default disabled + */ + + /* + #main a[href^="http://www.my-domain.com"], + #main a[href^="https://www.my-domain.com"] + { + padding-left: 12px; + background-image: url('your_image.gif'); + background-repeat: no-repeat; + background-position: 0 0.45em; + } + */ + + /** + * Tables | Tabellen + * (en) Generic classes for table-width and design definition + * (de) Generische Klassen für die Tabellenbreite und Gestaltungsvorschriften für Tabellen + * + * @section content-tables + */ + + table { width: auto; border-collapse:collapse; margin-bottom: 0.5em; } + table.full { width: 100%; } + table.fixed { table-layout:fixed; } + + th,td { padding: 0.5em; } + thead th { background: #444; color: #fff; } + tbody th { background: #ccc; color: #333; } + tbody th.sub { background: #ddd; color: #333; } + + /** + * Miscellaneous | Sonstiges + * + * @section content-misc + */ + + hr { + color: #fff; + background:transparent; + margin: 0 0 0.5em 0; + padding: 0 0 0.5em 0; + border:0; + border-bottom: 1px #000 solid; + } +} + diff --git a/interface/ispconfig/interface/web/tools/form/user_settings.tform.php b/interface/ispconfig/interface/web/tools/form/user_settings.tform.php new file mode 100644 index 000000000..516031a18 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/form/user_settings.tform.php @@ -0,0 +1,144 @@ + 0 id must match with id of current user +$form['auth_preset']['userid'] = 0; +//* 0 = default groupid of the user, > 0 id must match with groupid of current user +$form['auth_preset']['groupid'] = 0; + +//** Permissions are: r = read, i = insert, u = update, d = delete +$form['auth_preset']['perm_user'] = 'riud'; +$form['auth_preset']['perm_group'] = 'riud'; +$form['auth_preset']['perm_other'] = ''; + +//* Languages +$language_list = array(); +$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); +while ($file = @readdir ($handle)) { + if ($file != '.' && $file != '..') { + if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') { + $tmp = substr($file, 0, 2); + $language_list[$tmp] = $tmp; + } + } +} + +$form['tabs']['users'] = array ( + 'title' => 'Settings', + 'width' => 80, + 'template' => 'templates/user_settings.htm', + 'fields' => array ( + ################################## + # Beginn Datenbankfelder + ################################## + 'passwort' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'PASSWORD', + 'encryption'=> 'CRYPT', + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => '', + 'separator' => '', + 'width' => '15', + 'maxlength' => '100', + 'rows' => '', + 'cols' => '' + ), + 'language' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'language_is_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-z]{2}$/i', + 'errmsg'=> 'language_regex_mismatch'), + ), + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $language_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '2', + 'rows' => '', + 'cols' => '' + ) + ################################## + # ENDE Datenbankfelder + ################################## + ) +); + + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/web/tools/index.php b/interface/ispconfig/interface/web/tools/index.php new file mode 100644 index 000000000..641221baa --- /dev/null +++ b/interface/ispconfig/interface/web/tools/index.php @@ -0,0 +1,50 @@ +auth->check_module_permissions('tools'); + +echo '

    '.$app->lng('Hosting Panel Tools').'

    '; + +?> diff --git a/interface/ispconfig/interface/web/tools/lib/lang/bg.lng b/interface/ispconfig/interface/web/tools/lib/lang/bg.lng new file mode 100644 index 000000000..3373fe1cd --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/bg.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/bg_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/bg_usersettings.lng new file mode 100644 index 000000000..e4bc3af39 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/bg_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/br.lng b/interface/ispconfig/interface/web/tools/lib/lang/br.lng new file mode 100644 index 000000000..0ea96868b --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/br.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/br_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/br_usersettings.lng new file mode 100644 index 000000000..ad7432df7 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/br_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/de.lng b/interface/ispconfig/interface/web/tools/lib/lang/de.lng new file mode 100644 index 000000000..296bf1fad --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/de.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/de_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/de_usersettings.lng new file mode 100644 index 000000000..2adc8210d --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/de_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/en.lng b/interface/ispconfig/interface/web/tools/lib/lang/en.lng new file mode 100644 index 000000000..53af1714e --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/en.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/en_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/en_usersettings.lng new file mode 100644 index 000000000..bfe487113 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/en_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/es.lng b/interface/ispconfig/interface/web/tools/lib/lang/es.lng new file mode 100644 index 000000000..ba82e68be --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/es.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/es_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/es_usersettings.lng new file mode 100644 index 000000000..12f52063d --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/es_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/fi.lng b/interface/ispconfig/interface/web/tools/lib/lang/fi.lng new file mode 100644 index 000000000..c629aa106 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/fi.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/fi_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/fi_usersettings.lng new file mode 100644 index 000000000..16ec5cf1a --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/fi_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/fr.lng b/interface/ispconfig/interface/web/tools/lib/lang/fr.lng new file mode 100644 index 000000000..5e72e4fa6 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/fr.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/fr_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/fr_usersettings.lng new file mode 100644 index 000000000..22e1d0ec5 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/fr_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/hu.lng b/interface/ispconfig/interface/web/tools/lib/lang/hu.lng new file mode 100644 index 000000000..f66f91206 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/hu.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/hu_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/hu_usersettings.lng new file mode 100644 index 000000000..89dc62835 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/hu_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/it.lng b/interface/ispconfig/interface/web/tools/lib/lang/it.lng new file mode 100644 index 000000000..12f312c72 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/it.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/it_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/it_usersettings.lng new file mode 100644 index 000000000..95bf88af3 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/it_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ja.lng b/interface/ispconfig/interface/web/tools/lib/lang/ja.lng new file mode 100644 index 000000000..e9c01668f --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ja.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ja_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/ja_usersettings.lng new file mode 100644 index 000000000..a838f9de0 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ja_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/nl.lng b/interface/ispconfig/interface/web/tools/lib/lang/nl.lng new file mode 100644 index 000000000..5bf2ae7a7 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/nl.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/nl_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/nl_usersettings.lng new file mode 100644 index 000000000..cf0fc7160 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/nl_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/pl.lng b/interface/ispconfig/interface/web/tools/lib/lang/pl.lng new file mode 100644 index 000000000..adc0178fe --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/pl.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/pl_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/pl_usersettings.lng new file mode 100644 index 000000000..f8d76658a --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/pl_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/pt.lng b/interface/ispconfig/interface/web/tools/lib/lang/pt.lng new file mode 100644 index 000000000..292274fa4 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/pt.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/pt_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/pt_usersettings.lng new file mode 100644 index 000000000..999611e94 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/pt_usersettings.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ro.lng b/interface/ispconfig/interface/web/tools/lib/lang/ro.lng new file mode 100644 index 000000000..a4d5765fe --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ro.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ro_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/ro_usersettings.lng new file mode 100644 index 000000000..1e48a56cc --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ro_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ru.lng b/interface/ispconfig/interface/web/tools/lib/lang/ru.lng new file mode 100644 index 000000000..084bbb83f --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ru.lng @@ -0,0 +1,7 @@ + + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/ru_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/ru_usersettings.lng new file mode 100644 index 000000000..a097b7b28 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/ru_usersettings.lng @@ -0,0 +1,9 @@ + + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/se.lng b/interface/ispconfig/interface/web/tools/lib/lang/se.lng new file mode 100644 index 000000000..bea9c7867 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/se.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/se_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/se_usersettings.lng new file mode 100644 index 000000000..5485f52a4 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/se_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/sk.lng b/interface/ispconfig/interface/web/tools/lib/lang/sk.lng new file mode 100644 index 000000000..f44162974 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/sk.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/sk_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/sk_usersettings.lng new file mode 100644 index 000000000..194b23339 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/sk_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/tr.lng b/interface/ispconfig/interface/web/tools/lib/lang/tr.lng new file mode 100644 index 000000000..32bfc8328 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/tr.lng @@ -0,0 +1,6 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/lang/tr_usersettings.lng b/interface/ispconfig/interface/web/tools/lib/lang/tr_usersettings.lng new file mode 100644 index 000000000..d9efacca7 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/lang/tr_usersettings.lng @@ -0,0 +1,8 @@ + diff --git a/interface/ispconfig/interface/web/tools/lib/menu.d/statistics.menu.php b/interface/ispconfig/interface/web/tools/lib/menu.d/statistics.menu.php new file mode 100644 index 000000000..6fdcf1b96 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/menu.d/statistics.menu.php @@ -0,0 +1,25 @@ + 'Other page', + 'target' => 'content', + 'link' => 'http://www.google.de'); + +$items[] = array( 'title' => 'Mailqueue', + 'target' => 'content', + 'link' => 'tools/mailqueue.php'); + + +$module['nav'][] = array( 'title' => 'System Info', + 'open' => 1, + 'items' => $items); + + +*/ + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/web/tools/lib/module.conf.php b/interface/ispconfig/interface/web/tools/lib/module.conf.php new file mode 100644 index 000000000..36165d39e --- /dev/null +++ b/interface/ispconfig/interface/web/tools/lib/module.conf.php @@ -0,0 +1,38 @@ + 'Password and Language', + 'target' => 'content', + 'link' => 'tools/user_settings.php'); + + +$module['nav'][] = array( 'title' => 'User Settings', + 'open' => 1, + 'items' => $items); + + +$menu_dir = ISPC_WEB_PATH.'/tools/lib/menu.d'; + +if (is_dir($menu_dir)) { + if ($dh = opendir($menu_dir)) { + //** Go trough all files in the menu dir + while (($file = readdir($dh)) !== false) { + if($file != '.' && $file != '..' && substr($file,-9,9) == '.menu.php') { + include_once($menu_dir.'/'.$file); + } + } + } +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/interface/web/tools/templates/user_settings.htm b/interface/ispconfig/interface/web/tools/templates/user_settings.htm new file mode 100644 index 000000000..658b94faf --- /dev/null +++ b/interface/ispconfig/interface/web/tools/templates/user_settings.htm @@ -0,0 +1,36 @@ +

    +

    + +
    + +
    +
    +
    + + +
    +
    +

    {tmpl_var name='password_strength_txt'}

    +
    +

     

    +
    +
    + + +
    +
    + + +
    + + + +
    + + +
    +
    + +
    diff --git a/interface/ispconfig/interface/web/tools/user_settings.php b/interface/ispconfig/interface/web/tools/user_settings.php new file mode 100644 index 000000000..d705cea24 --- /dev/null +++ b/interface/ispconfig/interface/web/tools/user_settings.php @@ -0,0 +1,97 @@ +auth->check_module_permissions('tools'); + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onLoad() { + global $app, $conf, $tform_def_file; + + // Loading template classes and initialize template + if(!is_object($app->tpl)) $app->uses('tpl'); + if(!is_object($app->tform)) $app->uses('tform'); + + $app->tpl->newTemplate("tabbed_form.tpl.htm"); + + // Load table definition from file + $app->tform->loadFormDef($tform_def_file); + + // Importing ID + $this->id = $_SESSION['s']['user']['userid']; + $_POST['id'] = $_SESSION['s']['user']['userid']; + + if(count($_POST) > 1) { + $this->dataRecord = $_POST; + $this->onSubmit(); + } else { + $this->onShow(); + } + } + + function onInsert() { + die('No inserts allowed.'); + } + + function onBeforeUpdate() { + global $app, $conf; + + if($_POST['passwort'] != $_POST['passwort2']) { + $app->tform->errorMessage = $app->tform->lng('password_mismatch'); + } + $_SESSION['s']['user']['language'] = $_POST['language']; + $_SESSION['s']['language'] = $_POST['language']; + } + + +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/ispconfig/nbproject/project.properties b/interface/ispconfig/nbproject/project.properties new file mode 100644 index 000000000..70b7f0fee --- /dev/null +++ b/interface/ispconfig/nbproject/project.properties @@ -0,0 +1,8 @@ +auxiliary.org-netbeans-modules-html-editor-lib.default-html-public-id=HTML5 +include.path=${php.global.include.path} +php.version=PHP_53 +source.encoding=UTF-8 +src.dir=. +tags.asp=false +tags.short=true +web.root=. diff --git a/interface/ispconfig/nbproject/project.xml b/interface/ispconfig/nbproject/project.xml new file mode 100644 index 000000000..2316b2d6c --- /dev/null +++ b/interface/ispconfig/nbproject/project.xml @@ -0,0 +1,9 @@ + + + org.netbeans.modules.php.project + + + web_ispconfig + + + diff --git a/interface/ispconfig/server/conf/apache_apps.vhost.master b/interface/ispconfig/server/conf/apache_apps.vhost.master new file mode 100644 index 000000000..ccfcbea04 --- /dev/null +++ b/interface/ispconfig/server/conf/apache_apps.vhost.master @@ -0,0 +1,42 @@ + +###################################################### +# This virtual host contains the configuration +# for the ISPConfig apps vhost +###################################################### + +{vhost_port_listen} Listen {apps_vhost_port} +NameVirtualHost *:{apps_vhost_port} + + + ServerAdmin webmaster@localhost + {apps_vhost_servername} + + + DocumentRoot {apps_vhost_dir} + SuexecUserGroup ispapps ispapps + + Options Indexes FollowSymLinks MultiViews +ExecCGI + AllowOverride AuthConfig Indexes Limit Options FileInfo + AddHandler fcgid-script .php + FCGIWrapper {apps_vhost_basedir}/php-fcgi-scripts/apps/.php-fcgi-starter .php + Order allow,deny + Allow from all + + + + + DocumentRoot {apps_vhost_dir} + AddType application/x-httpd-php .php + + Options FollowSymLinks + AllowOverride None + Order allow,deny + Allow from all + + + + ServerSignature Off + + + + diff --git a/interface/ispconfig/server/conf/apache_ispconfig.conf.master b/interface/ispconfig/server/conf/apache_ispconfig.conf.master new file mode 100644 index 000000000..7a7179c7f --- /dev/null +++ b/interface/ispconfig/server/conf/apache_ispconfig.conf.master @@ -0,0 +1,43 @@ + +################################################ +# ISPConfig Logfile configuration for vlogger +################################################ + +LogFormat "%v %h %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig +CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" -d \"/etc/vlogger-dbi.conf\" /var/log/ispconfig/httpd" combined_ispconfig + + + AllowOverride None + Order Deny,Allow + Deny from all + + +# Do not allow access to the root file system of the server for security reasons + + AllowOverride None + Order Deny,Allow + Deny from all + + +# Except of the following directories that contain website scripts + + Order allow,deny + Allow from all + + + + Order allow,deny + Allow from all + + + + Order allow,deny + Allow from all + + + + +NameVirtualHost {tmpl_var name="ip_address"}:80 +NameVirtualHost {tmpl_var name="ip_address"}:443 + + diff --git a/interface/ispconfig/server/conf/autoresponder.master b/interface/ispconfig/server/conf/autoresponder.master new file mode 100644 index 000000000..0126c998d --- /dev/null +++ b/interface/ispconfig/server/conf/autoresponder.master @@ -0,0 +1,23 @@ +`test -f {vmail_mailbox_base}/mailfilters/$HOST/$USER/.vacation.msg && exit 1 || exit 0` +if ($RETURNCODE==1) +{ + { + if (!/^List-Unsubscribe:.*/:h ) + { + if (!/^X-Spam-Flag: YES/:h ) + { + NOW=time + if ({start_date} lt $NOW && {end_date} gt $NOW) + { + RESPOND="{vmail_mailbox_base}/mailfilters/$HOST/$USER/.vacation.msg" + RESPONDDB="{vmail_mailbox_base}/mailfilters/$HOST/$USER/.vacation.lst" + + # The following must be one contiguous line + cc "| mailbot -t $RESPOND -d $RESPONDDB -c 'UTF-8' -D 1 \ + -A 'From: $RECIPIENT' -s 'Auto Response: from $RECIPIENT' \ + /usr/sbin/sendmail -t -f ''" + } + } + } + } +} \ No newline at end of file diff --git a/interface/ispconfig/server/conf/bash.bashrc.master b/interface/ispconfig/server/conf/bash.bashrc.master new file mode 100644 index 000000000..edcaf7dc5 --- /dev/null +++ b/interface/ispconfig/server/conf/bash.bashrc.master @@ -0,0 +1,65 @@ + + +## Hack for Jailkit User to change back to the logged in user ## +if [ -n "$LOGNAME" ]; then + if [ "$LOGNAME" != $USER ]; then + export HOME=$LOGNAME + export USER=$LOGNAME + export USERNAME=$LOGNAME + cd $HOME + fi +fi + +## Change machine hostname to site domain ## +export HOSTNAME= + + + + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(lesspipe)" + + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in +xterm-color) + PS1='\[\033[01;32m\]$USER@$HOSTNAME\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' + ;; +*) + PS1='$USER@$HOSTNAME:\w\$ ' + ;; +esac + + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"' + ;; +*) + ;; +esac + + +# enable color support of ls and also add handy aliases +if [ "$TERM" != "dumb" ]; then + eval "`dircolors -b`" + alias ls='ls --color=auto' + #alias dir='ls --color=auto --format=vertical' + #alias vdir='ls --color=auto --format=long' +fi + +# some more ls aliases +#alias ll='ls -l' +#alias la='ls -A' +#alias l='ls -CF' + + diff --git a/interface/ispconfig/server/conf/bastille-firewall.cfg.master b/interface/ispconfig/server/conf/bastille-firewall.cfg.master new file mode 100644 index 000000000..b9658c986 --- /dev/null +++ b/interface/ispconfig/server/conf/bastille-firewall.cfg.master @@ -0,0 +1,320 @@ +# +# /etc/bastille-firewall.cfg +# +# Configuration file for both 2.2/ipchains and 2.4/netfilter scripts +# +# $Source: /cvsroot/bastille-linux/dev/working_tree/Bastille/bastille-firewall.cfg,v $ +# Modified by: $Author: peterw $ +# $Date: 2002/01/04 13:34:18 $ +# $Revision: 1.7 $ +# +# Copyright (C) 1999-2001 Peter Watkins +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Thanks to David Ranch, Brad A, Don G, and others for their suggestions + +# the configuration values should be whitespace-delimited lists of +# appropriate values, e.g. +# TCP_PUBLIC_SERVICES="80 smtp ssh" +# lists Web (port 80), SMTP mail, and Secure Shell ports +# +# This script is suitable for workstations or simple NAT firewalls; +# you may want to add more "output" restrictions for serious servers + +# 0) DNS servers (Linux 2.2/ipchains only) +# You must list your DNS servers here so that +# the firewall will allow them to service your lookup requests +# +# List of DNS servers/networks to allow "domain" responses from +# This _could_ be nameservers as a list of /32 entries +#DNS_SERVERS="a.b.c.d/32 e.f.g.h/32" +# If you are running a caching nameserver, you'll need to allow from +# "0.0.0.0/0" so named can query any arbitrary nameserver +# (To enable a caching nameserver, you will also probably need to +# add "domain" to the TCP and UDP public service lists.) +#DNS_SERVERS="0.0.0.0/0" +# +# To have the DNS servers parsed from /etc/resolv.conf at runtime, +# as normal workstations will want, make this variable empty +#DNS_SERVERS="" +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +DNS_SERVERS="{DNS_SERVERS}" + + +# 1) define your interfaces (all systems) +# Note a "+" acts as a wildcard, e.g. ppp+ would match any PPP +# interface +# +# list internal/trusted interfaces +# traffic from these interfaces will be allowed +# through the firewall, no restrictions +#TRUSTED_IFACES="lo" # MINIMAL/SAFEST +# +# list external/untrusted interfaces +#PUBLIC_IFACES="eth+ ppp+ slip+" # SAFEST +# +# list internal/partially-trusted interfaces +# e.g. if this acts as a NAT/IP Masq server and you +# don't want clients on those interfaces having +# full network access to services running on this +# server (as the TRUSTED_IFACES allows) +#INTERNAL_IFACES="" # SAFEST +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +TRUSTED_IFACES="lo" # MINIMAL/SAFEST +PUBLIC_IFACES="eth+ ppp+ slip+ venet+" # SAFEST +INTERNAL_IFACES="" # SAFEST + + +# 2) services for which we want to log access attempts to syslog (all systems) +# Note this only audits connection attempts from public interfaces +# +# Also see item 12, LOG_FAILURES +# +#TCP_AUDIT_SERVICES="telnet ftp imap pop3 finger sunrpc exec login linuxconf ssh" +# anyone probing for BackOrifice? +#UDP_AUDIT_SERVICES="31337" +# how about ICMP? +#ICMP_AUDIT_TYPES="" +#ICMP_AUDIT_TYPES="echo-request" # ping/MS tracert +# +# To enable auditing, you must have syslog configured to log "kern" +# messages of "info" level; typically you'd do this with a line in +# syslog.conf like +# kern.info /var/log/messages +# though the Bastille port monitor will normally want these messages +# logged to a named pipe instead, and the Bastille script normally +# configures syslog for "kern.*" which catches these messages +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +#TCP_AUDIT_SERVICES="telnet ftp imap pop3 finger sunrpc exec login linuxconf ssh" +#UDP_AUDIT_SERVICES="31337" +#ICMP_AUDIT_TYPES="" + + +# 3) services we allow connections to (all systems) +# +# FTP note: +# To allow your machine to service "passive" FTP clients, +# you will need to make allowances for the passive data +# ports; Bastille users should read README.FTP for more +# information +# +# "public" interfaces: +# TCP services that "public" hosts should be allowed to connect to +#TCP_PUBLIC_SERVICES="" # MINIMAL/SAFEST +# +# UDP services that "public" hosts should be allowed to connect to +#UDP_PUBLIC_SERVICES="" # MINIMAL/SAFEST +# +# "internal" interfaces: +# (NB: you will need to repeat the "public" services if you want +# to allow "internal" hosts to reach those services, too.) +# TCP services that internal clients can connect to +#TCP_INTERNAL_SERVICES="" # MINIMAL/SAFEST +# +# UDP services that internal clients can connect to +#UDP_INTERNAL_SERVICES="" # MINIMAL/SAFEST +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +TCP_PUBLIC_SERVICES="{tmpl_var name="TCP_PUBLIC_SERVICES"}" # MINIMAL/SAFEST +UDP_PUBLIC_SERVICES="{tmpl_var name="UDP_PUBLIC_SERVICES"}" # MINIMAL/SAFEST +TCP_INTERNAL_SERVICES="" # MINIMAL/SAFEST +UDP_INTERNAL_SERVICES="" # MINIMAL/SAFEST + +# 4) passive/active FTP (Linux 2.2/ipchains only) +# FTP is a firewall nightmare; if you allow "normal" FTP connections, +# you must be careful to block any TCP services that are listening +# on high ports; it's safer to require your FTP clients to use +# "passive" mode. +# +# Note this will also force clients on machines +# that use this one for NAT/IP Masquerading to use passive mode +# for connections that go through this server (e.g. from the +# internal network to public Internet machines +# +# For more information about FTP, see the Bastille README.FTP doc +# +#FORCE_PASV_FTP="N" +#FORCE_PASV_FTP="Y" # SAFEST +# +FORCE_PASV_FTP="Y" # SAFEST + + +# 5) Services to explicitly block. (Linux 2.2/ipchains only) +# See FTP note above +# Note that ranges of ports are specified with colons, and you +# can specify an open range by using only one number, e.g. +# 1024: means ports >= 1024 and :6000 means ports <= 6000 +# +# TCP services on high ports that should be blocked if not forcing passive FTP +# This should include X (6000:6010) and anything else revealed by 'netstat -an' +# (this does not matter unless you're not forcing "passive" FTP) +#TCP_BLOCKED_SERVICES="6000:6020" +# +# UDP services to block: this should be UDP services on high ports. +# Your only vulnerability from public interfaces are the DNS and +# NTP servers/networks (those with 0.0.0.0 for DNS servers should +# obviously be very careful here!) +#UDP_BLOCKED_SERVICES="2049" +# +# types of ICMP packets to allow +#ICMP_ALLOWED_TYPES="destination-unreachable" # MINIMAL/SAFEST +# the following allows you to ping/traceroute outbound +#ICMP_ALLOWED_TYPES="destination-unreachable echo-reply time-exceeded" +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +TCP_BLOCKED_SERVICES="6000:6020" +UDP_BLOCKED_SERVICES="2049" +ICMP_ALLOWED_TYPES="destination-unreachable echo-reply time-exceeded echo-request" + + +# 6) Source Address Verification (all Linux systems) +# This helps prevent "IP Spoofing" attacks +# +ENABLE_SRC_ADDR_VERIFY="Y" # SAFEST + + +# 7) IP Masquerading / NAT. (all systems) +# List your internal/masq'ed networks here +# +# Also see item 4, FORCE_PASV_FTP, as that setting affects +# clients using IP Masquerading through this machine +# +# Set this variable if you're using IP Masq / NAT for a local network +#IP_MASQ_NETWORK="" # DISABLE/SAFEST +#IP_MASQ_NETWORK="10.0.0.0/8" # example +#IP_MASQ_NETWORK="192.168.0.0/16" # example +# +# Have lots of masq hosts? uncomment the following six lines +# and list the hosts/networks in /etc/firewall-masqhosts +# the script assumes any address without a "/" netmask afterwards +# is an individual address (netmask /255.255.255.255): +#if [ -f /etc/firewall-masqhosts ]; then +# echo "Reading list of masq hosts from /etc/firewall-masqhosts" +# # Read the file, but use 'awk' to strip comments +# # Note the sed bracket phrase includes a space and tab char +# IP_MASQ_NETWORK=`cat /etc/firewall-masqhosts | awk -F\# '/\// {print $1; next} /[0-9]/ {print $1"/32"}' |sed 's:[ ]*::g'` +#fi +# +# Masq modules +# NB: The script will prepend "ip_masq_" to each module name +#IP_MASQ_MODULES="cuseeme ftp irc quake raudio vdolive" # ALL (?) +#IP_MASQ_MODULES="ftp raudio vdolive" # RECOMMENDED +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +IP_MASQ_NETWORK="" # DISABLE/SAFEST +IP_MASQ_MODULES="ftp raudio vdolive" # RECOMMENDED + + +# 8) How to react to disallowed packets (all systems) +# whether to "REJECT" or "DROP" disallowed packets; if you're running any +# public services, you probably ought to use "REJECT"; if in serious stealth +# mode, choose "DROP" so simple probes don't know if there's anything out there +# NOTE: disallowed ICMP packets are discarded with "DROP", as +# it would not make sense to "reject" the packet if you're +# trying to disallow ping/traceroute +# NOTE: the scripts that set up the filter rules will interpret these +# keywords as needed, e.g. "DROP" becomes "DENY" for Linux 2.2/ipchains +# +REJECT_METHOD="DROP" + + +# 9) DHCP (Linux 2.2/ipchains only) +# In case your server needs to get a DHCP address from some other +# machine (e.g. cable modem) +#DHCP_IFACES="eth0" # example, to allow you to query on eth0 +#DHCP_IFACES="" # DISABLED +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +DHCP_IFACES="" # DISABLED + + +# 10) NTP servers (Linux 2.2/ipchains only) +# more UDP fun. List IP addresses or network space of NTP servers +# +#NTP_SERVERS="" # DISABLE NTP QUERIES / SAFEST +#NTP_SERVERS="a.b.c.d/32 e.f.g.h/32" # example, to allow querying 2 servers +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +NTP_SERVERS="" # DISABLE NTP QUERIES / SAFEST + + +# 11) more ICMP. (Linux 2.2/ipchains only) +# Control the outbound ICMP to make yourself invisible to +# traceroute probes +# +#ICMP_OUTBOUND_DISABLED_TYPES="destination-unreachable time-exceeded" +# +# Please make sure variable assignments are on single lines; do NOT +# use the "\" continuation character (so Bastille can change the +# values if it is run more than once) +ICMP_OUTBOUND_DISABLED_TYPES="destination-unreachable time-exceeded" + + +# 12) Logging (all systems) +# With this enabled, ipchains will log all blocked packets. +# ** this could generate huge logs ** +# This is primarily intended for the port mointoring system; +# also note that you probably do not want to "AUDIT" any services +# that you are not allowing, as doing so would mean duplicate +# logging +LOG_FAILURES="N" # do not log blocked packets + +# 13) Block fragmented packets (all systems) +# There's no good reason to allow these +#ALLOW_FRAGMENTS="N" # safest +ALLOW_FRAGMENTS="Y" # old behavior + +# 14) Prevent SMB broadcasts from leaking out NAT setup (all systems) +# Windows machines will poll teh net with SMB broadcasts, +# basically advertising their existence. Most folks agree +# that this traffic should be dropped +#DROP_SMB_NAT_BCAST="N" # allow them (are you sure?) +DROP_SMB_NAT_BCAST="Y" # drop those packets + +# 15) Log level (iptables/netfilter/Linux 2.4 only) +# Control what level of logging is used when the firewall logs +# information. Default is warning (4). Lowest priority is +# debug (7); highest is emergency (0). To prevent syslog +# from copying iptables error messages to the console, set +# this to 6 (7 would also work, but 6 is recommended) +# You can also stop syslogd/klogd from printing kernel +# messages to the console by issuing the command +# setterm -msg off +#IP_LOG_LEVEL=6 # level used in 2.2/ipchains +IP_LOG_LEVEL=4 # iptables/netfilter default + +# 16) Always attempt to use stateful features for inbound connections +# Always using state will allow the firewall to reject invalid +# packets sent to otherwise open TCP services, e.g. XMAS, NULL +# and SIN/FYN scans. The downside to choosing this behavior is that +# services may become unreachable if the packet filter's state +# table becomes full. +IP_ALWAYS_USE_STATE="N" # default, ensures services remain available +#IP_ALWAYS_USE_STATE="Y" # disallow invalid packets \ No newline at end of file diff --git a/interface/ispconfig/server/conf/bind_named.conf.local.master b/interface/ispconfig/server/conf/bind_named.conf.local.master new file mode 100644 index 000000000..764730d09 --- /dev/null +++ b/interface/ispconfig/server/conf/bind_named.conf.local.master @@ -0,0 +1,9 @@ + + + +zone "" { + type master; + file ""; +}; + + diff --git a/interface/ispconfig/server/conf/bind_pri.domain.master b/interface/ispconfig/server/conf/bind_pri.domain.master new file mode 100644 index 000000000..faa42f3d7 --- /dev/null +++ b/interface/ispconfig/server/conf/bind_pri.domain.master @@ -0,0 +1,48 @@ +$TTL {tmpl_var name='ttl'} +@ IN SOA {tmpl_var name='ns'} {tmpl_var name='mbox'} ( + {tmpl_var name='serial'} ; serial, todays date + todays serial # + {tmpl_var name='refresh'} ; refresh, seconds + {tmpl_var name='retry'} ; retry, seconds + {tmpl_var name='expire'} ; expire, seconds + {tmpl_var name='ttl'} ) ; minimum, seconds +; + + + +{tmpl_var name='name'} NS {tmpl_var name='data'} + + +{tmpl_var name='name'} A {tmpl_var name='data'} + + +{tmpl_var name='name'} AAAA {tmpl_var name='data'} + + +{tmpl_var name='name'} CNAME {tmpl_var name='data'} + + +{tmpl_var name='name'} CNAME {tmpl_var name='data'} + + +{tmpl_var name='name'} HINFO {tmpl_var name='data'} + + +{tmpl_var name='name'} MX {tmpl_var name='aux'} {tmpl_var name='data'} + + +{tmpl_var name='name'} NAPTR {tmpl_var name='data'} + + +{tmpl_var name='name'} PTR {tmpl_var name='data'} + + +{tmpl_var name='name'} RP {tmpl_var name='data'} + + +{tmpl_var name='name'} SRV 0 {tmpl_var name='data'} + + +{tmpl_var name='name'} TXT {tmpl_var name='data'} + + + diff --git a/interface/ispconfig/server/conf/debian_network_interfaces.master b/interface/ispconfig/server/conf/debian_network_interfaces.master new file mode 100644 index 000000000..08c713691 --- /dev/null +++ b/interface/ispconfig/server/conf/debian_network_interfaces.master @@ -0,0 +1,27 @@ +# This file describes the network interfaces available on your system +# and how to activate them. For more information, see interfaces(5). + +# The loopback network interface +auto lo +iface lo inet loopback + +# The primary network interface +auto eth0 +iface eth0 inet static + address + netmask + network + broadcast + gateway + + + +auto eth0: +iface eth0: inet static + address + netmask + network + broadcast + gateway + + diff --git a/interface/ispconfig/server/conf/error/br/400.html b/interface/ispconfig/server/conf/error/br/400.html new file mode 100644 index 000000000..7edd410d3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/400.html @@ -0,0 +1,63 @@ + + + +ERROR 400 - Requisição ruim! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    Você usou uma sintaxe inválida.

    +

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/401.html b/interface/ispconfig/server/conf/error/br/401.html new file mode 100644 index 000000000..b0fc2215d --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/401.html @@ -0,0 +1,61 @@ + + + + ERRO 401 - Não autorizado! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    O endereço requisitado necessita de autorização para acesso.

    +

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/403.html b/interface/ispconfig/server/conf/error/br/403.html new file mode 100644 index 000000000..574830c76 --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/403.html @@ -0,0 +1,61 @@ + + + + ERRO 403 - Acesso negado! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    Não foi permitido o seu acesso ao endereço especificado.

    +

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/404.html b/interface/ispconfig/server/conf/error/br/404.html new file mode 100644 index 000000000..0d00ccef2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/404.html @@ -0,0 +1,61 @@ + + + + ERRO 404 - Arquivo não encontrado! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    O endereço requisitado não foi encontrado neste servidor.

    +

    Se tiver qualquer dúvida extra sobre este erro cheque por atualizações neste endereço ou contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/405.html b/interface/ispconfig/server/conf/error/br/405.html new file mode 100644 index 000000000..e05d56cf3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/405.html @@ -0,0 +1,61 @@ + + + + ERRO 405 - Método não permitido! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    O método utilizado não é permitido.

    +

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/500.html b/interface/ispconfig/server/conf/error/br/500.html new file mode 100644 index 000000000..7a24b5113 --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/500.html @@ -0,0 +1,61 @@ + + + + ERRO 500 - Erro interno do servidor! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    O erro no endereço requisitado foi causado por uma Requisição interna do servidor inválida.

    +

    Se está mensagem se repetir muitas vezes contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/br/503.html b/interface/ispconfig/server/conf/error/br/503.html new file mode 100644 index 000000000..ff7b5e88b --- /dev/null +++ b/interface/ispconfig/server/conf/error/br/503.html @@ -0,0 +1,61 @@ + + + + ERRO 503 - Serviço Indisponível! + + + + + +
    + +
    +

    O seguinte erro ocorreu:

    +

    O serviço não está disponível no momento por uma sobrecarga temporária ou processo de manutenção. Por favor tente mais tarde

    +

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/400.html b/interface/ispconfig/server/conf/error/cz/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/401.html b/interface/ispconfig/server/conf/error/cz/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/403.html b/interface/ispconfig/server/conf/error/cz/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/404.html b/interface/ispconfig/server/conf/error/cz/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/405.html b/interface/ispconfig/server/conf/error/cz/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/500.html b/interface/ispconfig/server/conf/error/cz/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/cz/503.html b/interface/ispconfig/server/conf/error/cz/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/cz/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/400.html b/interface/ispconfig/server/conf/error/de/400.html new file mode 100644 index 000000000..cb223c85a --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/400.html @@ -0,0 +1,61 @@ + + + + FEHLER 400 - Ungültige Anforderung! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Sie verwenden eine ungültige Anforderung.

    +

    Bei Problemen wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/401.html b/interface/ispconfig/server/conf/error/de/401.html new file mode 100644 index 000000000..f01cc1e60 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/401.html @@ -0,0 +1,61 @@ + + + + FEHLER 401 - Zugriff verweigert! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Der Anmeldeversuch ist fehlgeschlagen, vermutlich, weil ein ungültiger Benutzername oder ein ungültiges Kennwort verwendet wurde.

    +

    Bei weiteren Problemen wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/403.html b/interface/ispconfig/server/conf/error/de/403.html new file mode 100644 index 000000000..e01e62614 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/403.html @@ -0,0 +1,61 @@ + + + + FEHLER 403 - Unzulässig! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Sie besitzen nicht die erforderlichen Rechte, die angegebene URL zu öffnen.

    +

    Bei weiteren Problemen wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/404.html b/interface/ispconfig/server/conf/error/de/404.html new file mode 100644 index 000000000..cfc5009d6 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/404.html @@ -0,0 +1,61 @@ + + + + FEHLER 404 - Nicht gefunden! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Die angegebene URL wurde auf diesem Server nicht gefunden.

    +

    Bitte überprüfen Sie die Schreibweise der URL oder wenden Sie sich an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/405.html b/interface/ispconfig/server/conf/error/de/405.html new file mode 100644 index 000000000..c59dd5b2c --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/405.html @@ -0,0 +1,61 @@ + + + + FEHLER 405 - Methode unzulässig! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Für Zugriff auf diese Seite verwendetes HTTP-Verb ist nicht zulässig, Methode unzulässig.

    +

    Bei Problemen wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/500.html b/interface/ispconfig/server/conf/error/de/500.html new file mode 100644 index 000000000..55b4f4f96 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/500.html @@ -0,0 +1,61 @@ + + + + FEHLER 500 - Interner Serverfehler! + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Beim Aufruf der angegebenen URL ist ein interner Serverfehler aufgetreten.

    +

    Sollten Sie diese Fehlermeldung öfter erhalten, wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/de/503.html b/interface/ispconfig/server/conf/error/de/503.html new file mode 100644 index 000000000..ca12cd6c7 --- /dev/null +++ b/interface/ispconfig/server/conf/error/de/503.html @@ -0,0 +1,62 @@ + + + + FEHLER 503 - Dienst nicht verfügbar! + + + + + + +
    + +
    +

    Folgender Fehler ist aufgetreten:

    +

    Der Dienst ist momentan überlastet. Bitte versuchen Sie es später noch einmal.

    +

    Sollten Sie diese Fehlermeldung öfter erhalten, wenden Sie sich bitte an den Webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/400.html b/interface/ispconfig/server/conf/error/en/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/401.html b/interface/ispconfig/server/conf/error/en/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/403.html b/interface/ispconfig/server/conf/error/en/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/404.html b/interface/ispconfig/server/conf/error/en/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/405.html b/interface/ispconfig/server/conf/error/en/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/500.html b/interface/ispconfig/server/conf/error/en/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/en/503.html b/interface/ispconfig/server/conf/error/en/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/en/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/400.html b/interface/ispconfig/server/conf/error/es/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/401.html b/interface/ispconfig/server/conf/error/es/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/403.html b/interface/ispconfig/server/conf/error/es/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/404.html b/interface/ispconfig/server/conf/error/es/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/405.html b/interface/ispconfig/server/conf/error/es/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/500.html b/interface/ispconfig/server/conf/error/es/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/es/503.html b/interface/ispconfig/server/conf/error/es/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/es/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/400.html b/interface/ispconfig/server/conf/error/fi/400.html new file mode 100644 index 000000000..aa667fa3f --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/400.html @@ -0,0 +1,61 @@ + + + + Virhe 400 - Virheellinen pyyntö! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Olet käyttänyt virheellistä kirjoitusasua.

    +

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/401.html b/interface/ispconfig/server/conf/error/fi/401.html new file mode 100644 index 000000000..6846fa4fc --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/401.html @@ -0,0 +1,61 @@ + + + + Virhe 401 - Ei sallittu! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Tämä URL-osoite tarvitsee tunnistaumisen.

    +

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/403.html b/interface/ispconfig/server/conf/error/fi/403.html new file mode 100644 index 000000000..156785eae --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/403.html @@ -0,0 +1,61 @@ + + + + Virhe 403 - Kielletty! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Sinulle ei ole sallittu pääsy pyytämääsi URL-osoitteeseen.

    +

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/404.html b/interface/ispconfig/server/conf/error/fi/404.html new file mode 100644 index 000000000..79742a2c8 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/404.html @@ -0,0 +1,61 @@ + + + + Virhe 404 - Kohdetta ei löydy! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Pyytämääsi URL-osoitetta ei löydy tältä palvelimelta.

    +

    Tarkista osoite tai ota yhteyttä ylläpitoon.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/405.html b/interface/ispconfig/server/conf/error/fi/405.html new file mode 100644 index 000000000..8194b2470 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/405.html @@ -0,0 +1,61 @@ + + + + Virhe 405 - Metodi ei ole sallittu! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Käyttämäsi metodi ei ole sallittu.

    +

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/500.html b/interface/ispconfig/server/conf/error/fi/500.html new file mode 100644 index 000000000..21c7ab5bd --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/500.html @@ -0,0 +1,61 @@ + + + + Virhe 500 - Palvelimen sisäinen virhe! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Pyydetty URL-osoite aiheutti palvelimen sisäisen virheen.

    +

    Jos saat tämän virheen toistuvasti, ota yhteyttä ylläpitoon.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fi/503.html b/interface/ispconfig/server/conf/error/fi/503.html new file mode 100644 index 000000000..fa1281362 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fi/503.html @@ -0,0 +1,61 @@ + + + + Virhe 503 - Palvelu tavoittamattomissa! + + + + + +
    + +
    +

    Seuraava virhe tapahtui:

    +

    Palvelu ei ole tavoitettavissa hetkellisen ylikuormituksen tai huoltotoimenpiteiden vuoksi. Yritä myöhemmin uudelleen.

    +

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/400.html b/interface/ispconfig/server/conf/error/fr/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/401.html b/interface/ispconfig/server/conf/error/fr/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/403.html b/interface/ispconfig/server/conf/error/fr/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/404.html b/interface/ispconfig/server/conf/error/fr/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/405.html b/interface/ispconfig/server/conf/error/fr/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/500.html b/interface/ispconfig/server/conf/error/fr/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/fr/503.html b/interface/ispconfig/server/conf/error/fr/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/fr/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/400.html b/interface/ispconfig/server/conf/error/gr/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/401.html b/interface/ispconfig/server/conf/error/gr/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/403.html b/interface/ispconfig/server/conf/error/gr/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/404.html b/interface/ispconfig/server/conf/error/gr/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/405.html b/interface/ispconfig/server/conf/error/gr/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/500.html b/interface/ispconfig/server/conf/error/gr/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/gr/503.html b/interface/ispconfig/server/conf/error/gr/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/gr/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/400.html b/interface/ispconfig/server/conf/error/hu/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/401.html b/interface/ispconfig/server/conf/error/hu/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/403.html b/interface/ispconfig/server/conf/error/hu/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/404.html b/interface/ispconfig/server/conf/error/hu/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/405.html b/interface/ispconfig/server/conf/error/hu/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/500.html b/interface/ispconfig/server/conf/error/hu/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/hu/503.html b/interface/ispconfig/server/conf/error/hu/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/hu/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/400.html b/interface/ispconfig/server/conf/error/it/400.html new file mode 100644 index 000000000..be1f24625 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Sintassi non corretta! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    Hai usato una sintassi non corretta.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/401.html b/interface/ispconfig/server/conf/error/it/401.html new file mode 100644 index 000000000..b7e2d7ce7 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Autorizzazione richiesta! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    Autorizzazione necessaria per accedere all'indirizzo richiesto.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/403.html b/interface/ispconfig/server/conf/error/it/403.html new file mode 100644 index 000000000..662c379ac --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Accesso Negato! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    Non si possiedono i permessi per accedere all'indirizzo richiesto.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/404.html b/interface/ispconfig/server/conf/error/it/404.html new file mode 100644 index 000000000..a4b5634c2 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Non trovato! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    L'indirizzo richiesto non è stato trovato in questo server.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/405.html b/interface/ispconfig/server/conf/error/it/405.html new file mode 100644 index 000000000..40cb8e695 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Metodo non consentito! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    Il metodo usato non è consentito.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/500.html b/interface/ispconfig/server/conf/error/it/500.html new file mode 100644 index 000000000..cbb0b33a8 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Errore Interno del Server! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    L'indirizzo richiesto ha causato un errore interno del server.

    +

    Se questo messaggio si ripete, contattare il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/it/503.html b/interface/ispconfig/server/conf/error/it/503.html new file mode 100644 index 000000000..7268ab502 --- /dev/null +++ b/interface/ispconfig/server/conf/error/it/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Servizio non disponibile! + + + + + +
    + +
    +

    Si è verificato il seguente errore:

    +

    Il sistema è momentaneamente non disponibile per sovraccaricato o manutenzione. Riprova più tardi.

    +

    Contatta il webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/400.html b/interface/ispconfig/server/conf/error/nl/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/401.html b/interface/ispconfig/server/conf/error/nl/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/403.html b/interface/ispconfig/server/conf/error/nl/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/404.html b/interface/ispconfig/server/conf/error/nl/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/405.html b/interface/ispconfig/server/conf/error/nl/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/500.html b/interface/ispconfig/server/conf/error/nl/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/nl/503.html b/interface/ispconfig/server/conf/error/nl/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/nl/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/400.html b/interface/ispconfig/server/conf/error/pl/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/401.html b/interface/ispconfig/server/conf/error/pl/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/403.html b/interface/ispconfig/server/conf/error/pl/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/404.html b/interface/ispconfig/server/conf/error/pl/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/405.html b/interface/ispconfig/server/conf/error/pl/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/500.html b/interface/ispconfig/server/conf/error/pl/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/pl/503.html b/interface/ispconfig/server/conf/error/pl/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/pl/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/400.html b/interface/ispconfig/server/conf/error/se/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/401.html b/interface/ispconfig/server/conf/error/se/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/403.html b/interface/ispconfig/server/conf/error/se/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/404.html b/interface/ispconfig/server/conf/error/se/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/405.html b/interface/ispconfig/server/conf/error/se/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/500.html b/interface/ispconfig/server/conf/error/se/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/se/503.html b/interface/ispconfig/server/conf/error/se/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/se/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/400.html b/interface/ispconfig/server/conf/error/si/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/401.html b/interface/ispconfig/server/conf/error/si/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/403.html b/interface/ispconfig/server/conf/error/si/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/404.html b/interface/ispconfig/server/conf/error/si/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/405.html b/interface/ispconfig/server/conf/error/si/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/500.html b/interface/ispconfig/server/conf/error/si/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/si/503.html b/interface/ispconfig/server/conf/error/si/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/si/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/400.html b/interface/ispconfig/server/conf/error/sr/400.html new file mode 100644 index 000000000..f83ae5892 --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/400.html @@ -0,0 +1,61 @@ + + + + ERROR 400 - Bad Request! + + + + + +
    + +
    +

    The following error occurred:

    +

    You have used invalid syntax.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/401.html b/interface/ispconfig/server/conf/error/sr/401.html new file mode 100644 index 000000000..49c7b4780 --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/401.html @@ -0,0 +1,61 @@ + + + + ERROR 401 - Unauthorized! + + + + + +
    + +
    +

    The following error occurred:

    +

    The URL requested requires authorisation.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/403.html b/interface/ispconfig/server/conf/error/sr/403.html new file mode 100644 index 000000000..12934ce6d --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/403.html @@ -0,0 +1,61 @@ + + + + ERROR 403 - Forbidden! + + + + + +
    + +
    +

    The following error occurred:

    +

    You are not permitted to access the requested URL.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/404.html b/interface/ispconfig/server/conf/error/sr/404.html new file mode 100644 index 000000000..fb17b2ac3 --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/404.html @@ -0,0 +1,61 @@ + + + + ERROR 404 - Not Found! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL was not found on this server.

    +

    Please check the URL or contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/405.html b/interface/ispconfig/server/conf/error/sr/405.html new file mode 100644 index 000000000..e5f66a8fb --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/405.html @@ -0,0 +1,61 @@ + + + + ERROR 405 - Method Not Allowed! + + + + + +
    + +
    +

    The following error occurred:

    +

    The method used is not permitted.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/500.html b/interface/ispconfig/server/conf/error/sr/500.html new file mode 100644 index 000000000..4413bf56a --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/500.html @@ -0,0 +1,61 @@ + + + + ERROR 500 - Internal Server Error! + + + + + +
    + +
    +

    The following error occurred:

    +

    The requested URL caused an internal server error.

    +

    If you get this message repeatedly please contact the webmaster.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/error/sr/503.html b/interface/ispconfig/server/conf/error/sr/503.html new file mode 100644 index 000000000..983ce2637 --- /dev/null +++ b/interface/ispconfig/server/conf/error/sr/503.html @@ -0,0 +1,61 @@ + + + + ERROR 503 - Service Unavailable! + + + + + +
    + +
    +

    The following error occurred:

    +

    The Service is not available at the moment due to a temporary overloading or maintenance of the server. Please try again later.

    +

    Please contact the webmaster with any queries.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/gentoo_network_interfaces.master b/interface/ispconfig/server/conf/gentoo_network_interfaces.master new file mode 100644 index 000000000..cca4f08a8 --- /dev/null +++ b/interface/ispconfig/server/conf/gentoo_network_interfaces.master @@ -0,0 +1,13 @@ +# This file describes the network interfaces available on your system +# and how to activate them. For more information, see interfaces(5). + +config_eth0=( + " netmask broadcast " + + + " netmask broadcast " + + +); + +routes_eth0=( "default via " ) diff --git a/interface/ispconfig/server/conf/getmail.conf.master b/interface/ispconfig/server/conf/getmail.conf.master new file mode 100644 index 000000000..2f48d76b3 --- /dev/null +++ b/interface/ispconfig/server/conf/getmail.conf.master @@ -0,0 +1,16 @@ +[options] +# message_log = /var/log/getmail.log +message_log_syslog = 1 +delete = {DELETE} + +[retriever] +type = {TYPE} +server = {SERVER} +username = {USERNAME} +password = {PASSWORD} + +[destination] +type = MDA_external +path = /usr/sbin/sendmail +arguments = ("-i", "-bm", "{DESTINATION}") +unixfrom = true \ No newline at end of file diff --git a/interface/ispconfig/server/conf/index/.htaccess b/interface/ispconfig/server/conf/index/.htaccess new file mode 100644 index 000000000..e69de29bb diff --git a/interface/ispconfig/server/conf/index/favicon.ico b/interface/ispconfig/server/conf/index/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..da6257c84cce5c550eb7118581ed2a22f15af248 GIT binary patch literal 1406 zcmeH_Sxl5y6vzL!*4AoOwAHFiof!oc0gFpZTWqzpwSq7+ezSbczOW1o%Py^e~16f{eD0E{?}MuUc#$a^LYMz22)d$ z7$5%!KA#sQE*Bb`n^9C;46o0JM~@%lVP_}qKX`yUckklH&6{X!YQmL<2GrHp!|m}v zrPe^fCqi#B!)nWb&R|5MMhjbJ7Sd>KO}D|4oC1?22?jc&H=0mTScIHhC$e)KI3rg= z#wj3?aZqdZ6srTT)aJCS6`2}$1QVPtLWSEH0NPGsPnQG@E+wMSS zmK`cygVxroC@pm%pBP`fc!~c00eHPWJbUKFlP6En+1Z7A_wJ*;{cqg5bsN{NT}Mkx zE1HS9j#%Ap4^~!INUvoqEiGYjaS;m(3z(mu$K2c;W@l$HGc$wf>1on&3X_wQn3$L# zJ;yONHipsBQH+d?V0d^KLqkIt92~^JzyNXdqpz&ND@k=3d0w8wG85%;ak?x27%!La5<1xDJA}dmp9B@3*d-M17dhFF z!6K39P(;P2`$eK)@mc2nVw-sDh7#x6V6pgMR3$4ptP4A>Ik|4f!Kf%n*k;BqBpmws zx8pSzC1GK);ZbJBOnG*?LRD;d_@0QpD$6RyK5!Hy{k$h4A~HU5pJey1Cr^EQI4&+S JKK@ + + + Bem-Vindo! + + + + + + +
    + +
    +

    Esta é a página index padrão de seu site.

    +

    Este arquivo pode ser reescrito ou subistituído sem quaisquer dificuldades. Esta página é produzida pelo arquivo index.html contido no diretório web.

    +

    Tendo quaisquer dúvidas ou problemas contate o suporte.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_cz b/interface/ispconfig/server/conf/index/standard_index.html_cz new file mode 100644 index 000000000..f9077b41c --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_cz @@ -0,0 +1,60 @@ + + + + Vitejte! + + + + + + +
    + +
    +

    Toto je standardni stranka Vaseho webu.

    +

    Muzete ji bez obav vymazat nebo nahradit jinym souborem. Toto je soubor index.html v adresari web.

    +

    Pokud mate jakekoliv dotazy prosim kontaktuje Support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_de b/interface/ispconfig/server/conf/index/standard_index.html_de new file mode 100644 index 000000000..ad5661831 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_de @@ -0,0 +1,60 @@ + + + + Herzlich Willkommen! + + + + + + +
    + +
    +

    Dies ist die Standard-Index-Seite Ihres Webs.

    +

    Sie können sie problemlos löschen oder durch eine andere Seite ersetzen. Es handelt sich hierbei um die Datei index.html im Verzeichnis web.

    +

    Bei Fragen oder Problemen wenden Sie sich bitte an den Support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_en b/interface/ispconfig/server/conf/index/standard_index.html_en new file mode 100644 index 000000000..186ea25bd --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_en @@ -0,0 +1,60 @@ + + + + Welcome! + + + + + + +
    + +
    +

    This is the default index page of your website.

    +

    This file may be deleted or overwritten without any difficulty. This is produced by the file index.html in the web directory.

    +

    For questions or problems please contact support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_es b/interface/ispconfig/server/conf/index/standard_index.html_es new file mode 100644 index 000000000..0071036ed --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_es @@ -0,0 +1,60 @@ + + + + Bienvenido! + + + + + + +
    + +
    +

    Esta es la página principal del sitio.

    +

    Puede cambiarla por otra simplemente reemplazando este archivo. This is produced by the file index.html in the web directory.

    +

    Si tiene dudas o problemas, porfavor contacte al support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_fi b/interface/ispconfig/server/conf/index/standard_index.html_fi new file mode 100644 index 000000000..e34f57a27 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_fi @@ -0,0 +1,60 @@ + + + + Tervetuloa! + + + + + + +
    + +
    +

    Tämä on sivustosi oletusaloitussivu.

    +

    Tämä sivu voidaan poistaa tai vaihtaa ilman mitään vaikeuksia. Tämä sivu on index.html-tiedosto kotihakemistosi web-kansiossa.

    +

    Jos sinulla on ongelmia tai kysyttävää, ota yhteyttä asiakastukeen.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_fr b/interface/ispconfig/server/conf/index/standard_index.html_fr new file mode 100644 index 000000000..8615dba11 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_fr @@ -0,0 +1,60 @@ + + + + Bienvenue! + + + + + + +
    + +
    +

    Ceci est la page d'index standard de votre site.

    +

    Vous pouvez facilement effacer ou remplacer ce fichier. C'est le fichier index.html dans le dossier web.

    +

    Pour tous problèmes ou questions, merci de contacter le support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_gr b/interface/ispconfig/server/conf/index/standard_index.html_gr new file mode 100644 index 000000000..41751e169 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_gr @@ -0,0 +1,60 @@ + + + + Êáëþò Þñèáôå! + + + + + + +
    + +
    +

    ÃõôÞ åßíáé ç ðñïåðéëåãìÃíç áñ÷éêÞ óåëßäá ôïõ äéêôõáêïý óáò ôüðïõ.

    +

    Ìðïñåßôå åýêïëá íá ôç äéáãñÜøåôå Þ áíôéêáôáóôÞóåôå ìå Üëëï áñ÷åßï. Ãõôü åßíáé ôï index.html áñ÷åßï óôï web öÜêåëï.

    +

    Ãéá áðïñßåò Þ ðñïâëÞìáôá ðáñáêáëþ åðéêïéíùíÞóôå ìå ôï äéá÷åéñéóôÞ.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_hu b/interface/ispconfig/server/conf/index/standard_index.html_hu new file mode 100644 index 000000000..33444ec7b --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_hu @@ -0,0 +1,60 @@ + + + + Üdvözöljük! + + + + + + +
    + +
    +

    Ez az oldal az Ön weboldalának eredeti kezdõoldala.

    +

    Ezt az oldalt Ön igényei szerint módosíthatja, akár le is törölheti. Megtalálja ezt az állományt a web könyvtárban index.html néven.

    +

    Kérdéseivel, kérjük, forduljon a support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_it b/interface/ispconfig/server/conf/index/standard_index.html_it new file mode 100644 index 000000000..141bbb9e2 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_it @@ -0,0 +1,60 @@ + + + + Benvenuti! + + + + + + +
    + +
    +

    Questa è la pagina predefinita.

    +

    Questo file può essere cancellato o sovrascritto senza nessun problema. Questo è prodotto dal file index.html nella cartella web.

    +

    Per domande o problemi contattate il supporto.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_nl b/interface/ispconfig/server/conf/index/standard_index.html_nl new file mode 100644 index 000000000..9a0d660db --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_nl @@ -0,0 +1,60 @@ + + + + Welkom! + + + + + + +
    + +
    +

    Dit is de standaard indexpagina van uw website.

    +

    U kunt deze op eenvoudige wijze verwijderen en vervangen door een ander bestand. Dit is het index.html bestand in de web directorie.

    +

    Voor vragen of problemen kunt u contact opnemen met de support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_pl b/interface/ispconfig/server/conf/index/standard_index.html_pl new file mode 100644 index 000000000..e657b3842 --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_pl @@ -0,0 +1,60 @@ + + + + Welcome! + + + + + + +
    + +
    +

    This is the default index page of your website.

    +

    This file may be deleted or overwritten without any difficulty. This is produced by the file index.html in the web directory.

    +

    For questions or problems please contact the support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_se b/interface/ispconfig/server/conf/index/standard_index.html_se new file mode 100644 index 000000000..6a217475a --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_se @@ -0,0 +1,60 @@ + + + + Välkommen! + + + + + + +
    + +
    +

    Detta är en standard index sida på din webbplats.

    +

    Du kan antingen ta bort den eller ersätta den med en annan fil. Detta är en index.html fil i web mappen.

    +

    För frågor eller problem runt detta kontakta support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/standard_index.html_sr b/interface/ispconfig/server/conf/index/standard_index.html_sr new file mode 100644 index 000000000..07a88b85b --- /dev/null +++ b/interface/ispconfig/server/conf/index/standard_index.html_sr @@ -0,0 +1,60 @@ + + + + Dobrodošli! + + + + + + +
    + +
    +

    Ovo je standardna indeksna strana vaše internet prezentacije.

    +

    Možete je lako obrisati ili zameniti sa nekom drugom datotekom. Ovo je index.html datoteka u web directory.

    +

    Kontaktirajte support u vezi pitanja i problema.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_br b/interface/ispconfig/server/conf/index/user_standard_index.html_br new file mode 100644 index 000000000..88cc913e9 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_br @@ -0,0 +1,60 @@ + + + + Bem-Vindo! + + + + + + +
    + +
    +

    Esta é a página index padrão para o usuário {USER_USERNAME}.

    +

    Este arquivo pode ser reescrito ou subistituído sem quaisquer dificuldades. Esta página é produzida pelo arquivo index.html no diretório user/{USER_USERNAME}/web.

    +

    Tendo quaisquer dúvidas ou problemas contate o suporte.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_cz b/interface/ispconfig/server/conf/index/user_standard_index.html_cz new file mode 100644 index 000000000..0be2ca0ad --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_cz @@ -0,0 +1,60 @@ + + + + Vitejte! + + + + + + +
    + +
    +

    Toto je standardni stranka Vaseho webu {USER_USERNAME}

    +

    Muzete ji bez obav vymazat nebo nahradit jinym souborem. Toto je soubor index.html v adresari user/{USER_USERNAME}/web.

    +

    Pokud mate jakekoliv dotazy prosim kontaktuje Support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_de b/interface/ispconfig/server/conf/index/user_standard_index.html_de new file mode 100644 index 000000000..6264631b4 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_de @@ -0,0 +1,60 @@ + + + + Herzlich Willkommen! + + + + + + +
    + +
    +

    Dies ist die Standard-Index-Seite von Benutzer {USER_USERNAME}.

    +

    Sie können sie problemlos löschen oder durch eine andere Seite ersetzen. Es handelt sich hierbei um die Datei index.html im Verzeichnis user/{USER_USERNAME}/web.

    +

    Bei Fragen oder Problemen wenden Sie sich bitte an den Support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_en b/interface/ispconfig/server/conf/index/user_standard_index.html_en new file mode 100644 index 000000000..bb3a7aa5a --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_en @@ -0,0 +1,60 @@ + + + + Welcome! + + + + + + +
    + +
    +

    This is the default index page for user {USER_USERNAME}.

    +

    This file may be deleted or overwritten without any difficulty. This is produced by the file index.html in the user/{USER_USERNAME}/web directory.

    +

    For questions or problems please contact the support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_es b/interface/ispconfig/server/conf/index/user_standard_index.html_es new file mode 100644 index 000000000..ccd4f37eb --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_es @@ -0,0 +1,60 @@ + + + + Bienvenido! + + + + + + +
    + +
    +

    Esta es la página indice de la cuenta {USER_USERNAME}.

    +

    Puede cambiarla por otra simplemente reemplazando este archivo. This is produced by the file index.html in the user/{USER_USERNAME}/web directory.

    +

    Si tiene dudas o problemas, porfavor contacte al support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_fi b/interface/ispconfig/server/conf/index/user_standard_index.html_fi new file mode 100644 index 000000000..14cd51576 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_fi @@ -0,0 +1,60 @@ + + + + Tervetuloa! + + + + + + +
    + +
    +

    Tämä on käyttäjän {USER_USERNAME}oletusaloitussivu.

    +

    Tämä sivu voidaan poistaa tai vaihtaa ilman mitään vaikeuksia. Tämä sivu on index.html-tiedosto sivuston user/{USER_USERNAME}/web-kansiossa.

    +

    Jos sinulla on ongelmia tai kysyttävää, ota yhteyttä asiakastukeen.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_fr b/interface/ispconfig/server/conf/index/user_standard_index.html_fr new file mode 100644 index 000000000..8c074c099 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_fr @@ -0,0 +1,60 @@ + + + + Bienvenue! + + + + + + +
    + +
    +

    Ceci est la page d'index standard de l'utilisateur {USER_USERNAME}.

    +

    Vous pouvez facilement effacer ou remplacer ce fichier. C'est le fichier index.html dans le dossier user/{USER_USERNAME}/web.

    +

    Pour tous problèmes ou questions, merci de contacter le support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_gr b/interface/ispconfig/server/conf/index/user_standard_index.html_gr new file mode 100644 index 000000000..63f16a46f --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_gr @@ -0,0 +1,60 @@ + + + + Êáëþò Þñèáôå! + + + + + + +
    + +
    +

    ÃõôÞ åßíáé ç ðñïåðéëåãìÃíç áñ÷éêÞ óåëßäá ãéá ôï ÷ñÞóôç {USER_USERNAME}.

    +

    Ìðïñåßôå åýêïëá íá ôç äéáãñÜøåôå Þ áíôéêáôáóôÞóåôå ìå Üëëï áñ÷åßï. Ãõôü åßíáé ôï index.html áñ÷åßï óôï user/{USER_USERNAME}/web öÜêåëï.

    +

    Ãéá áðïñßåò Þ ðñïâëÞìáôá ðáñáêáëþ åðéêïéíùíÞóôå ìå ôï äéá÷åéñéóôÞ.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_hu b/interface/ispconfig/server/conf/index/user_standard_index.html_hu new file mode 100644 index 000000000..2ca87323e --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_hu @@ -0,0 +1,60 @@ + + + + Üdvözöljük! + + + + + + +
    + +
    +

    Ez az oldal a {USER_USERNAME} felhasználó eredeti kezdõoldala.

    +

    Ezt az oldalt Ön igényei szerint módosíthatja, akár le is törölheti. Megtalálja ezt az állományt a web könyvtárban user/{USER_USERNAME}/index.html néven.

    +

    Kérdéseivel, kérjük, forduljon a support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_it b/interface/ispconfig/server/conf/index/user_standard_index.html_it new file mode 100644 index 000000000..6f253f04f --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_it @@ -0,0 +1,60 @@ + + + + Benvenuti! + + + + + + +
    + +
    +

    Questa è la pagina di default per l'utente {USER_USERNAME}.

    +

    Questo file può essere cancellato o sovrascritto senza nessun problema. Questo è prodotto dal file index.html nella cartella user/{USER_USERNAME}/web.

    +

    Per domande o problemi contattate il supporto.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_nl b/interface/ispconfig/server/conf/index/user_standard_index.html_nl new file mode 100644 index 000000000..0c7e13c1d --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_nl @@ -0,0 +1,60 @@ + + + + Welkom! + + + + + + +
    + +
    +

    Dit is de standaard indexpagina voor gebruiker {USER_USERNAME}.

    +

    U kunt deze op eenvoudige wijze verwijderen en vervangen door een ander bestand. Dit is het index.html bestand in de user/{USER_USERNAME}/web directorie.

    +

    Voor vragen of problemen kunt u contact opnemen met de support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_pl b/interface/ispconfig/server/conf/index/user_standard_index.html_pl new file mode 100644 index 000000000..bb3a7aa5a --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_pl @@ -0,0 +1,60 @@ + + + + Welcome! + + + + + + +
    + +
    +

    This is the default index page for user {USER_USERNAME}.

    +

    This file may be deleted or overwritten without any difficulty. This is produced by the file index.html in the user/{USER_USERNAME}/web directory.

    +

    For questions or problems please contact the support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_se b/interface/ispconfig/server/conf/index/user_standard_index.html_se new file mode 100644 index 000000000..ed9c9ae12 --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_se @@ -0,0 +1,60 @@ + + + + Välkommen! + + + + + + +
    + +
    +

    Detta är en standard index sida för användare {USER_USERNAME}.

    +

    Du kan antingen ta bort den eller ersätta den med en annan fil. Detta är en index.html fil i user/{USER_USERNAME}/web mappen.

    +

    För frågor eller problem runt detta kontakta support.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/index/user_standard_index.html_sr b/interface/ispconfig/server/conf/index/user_standard_index.html_sr new file mode 100644 index 000000000..83ea2570e --- /dev/null +++ b/interface/ispconfig/server/conf/index/user_standard_index.html_sr @@ -0,0 +1,60 @@ + + + + Dobrodošli! + + + + + + +
    + +
    +

    Ovo je podrazumevana indeksna strana za korisnika {USER_USERNAME}.

    +

    Možete je lako obrisati ili zameniti sa nekom drugom datotekom. Ovo je index.html datoteka u user/{USER_USERNAME}/web directory.

    +

    Kontaktirajte support u vezi pitanja i problema.

    +
    + +
    + + diff --git a/interface/ispconfig/server/conf/mailfilter_move_junk.master b/interface/ispconfig/server/conf/mailfilter_move_junk.master new file mode 100644 index 000000000..ef346c922 --- /dev/null +++ b/interface/ispconfig/server/conf/mailfilter_move_junk.master @@ -0,0 +1,19 @@ + +SPAMDIR="Junk" +SPAMDIRFULL="$DEFAULT/.Junk" + +if ( /^X-Spam-Flag: YES$/ ) +{ + exception { + + `test -e $SPAMDIRFULL` + if ( $RETURNCODE != 0 ) + { + `maildirmake -f $SPAMDIR $DEFAULT` + `chown vmail:vmail -R $SPAMDIRFULL` + `chmod 0700 $SPAMDIRFULL` + `echo INBOX.$SPAMDIR >> $DEFAULT/courierimapsubscribed` + } + to "$SPAMDIRFULL/" + } +} \ No newline at end of file diff --git a/interface/ispconfig/server/conf/motd.master b/interface/ispconfig/server/conf/motd.master new file mode 100644 index 000000000..efc2ac3e8 --- /dev/null +++ b/interface/ispconfig/server/conf/motd.master @@ -0,0 +1,4 @@ +Welcome to + + + diff --git a/interface/ispconfig/server/conf/php-cgi-starter.master b/interface/ispconfig/server/conf/php-cgi-starter.master new file mode 100644 index 000000000..3c00f9dba --- /dev/null +++ b/interface/ispconfig/server/conf/php-cgi-starter.master @@ -0,0 +1,7 @@ +#!/bin/sh + +exec \ +-d open_basedir= \ +-d upload_tmp_dir=/tmp \ +-d session.save_path=/tmp +# -d safe_mode=${SAFE_MODE} \ No newline at end of file diff --git a/interface/ispconfig/server/conf/php-fcgi-starter.master b/interface/ispconfig/server/conf/php-fcgi-starter.master new file mode 100644 index 000000000..97a162872 --- /dev/null +++ b/interface/ispconfig/server/conf/php-fcgi-starter.master @@ -0,0 +1,16 @@ +#!/bin/sh +PHPRC="" +export PHPRC +PHP_DOCUMENT_ROOT="" +export PHP_DOCUMENT_ROOT +# The variable PHP_FCGI_CHILDREN is onyl useful for lighty or nginx as apache +# mod_fcgi will control the number of childs themself and never use the additional processes. +# PHP_FCGI_CHILDREN= +# export PHP_FCGI_CHILDREN +PHP_FCGI_MAX_REQUESTS= +export PHP_FCGI_MAX_REQUESTS +exec \ + -d open_basedir="" \ +-d upload_tmp_dir=/tmp \ +-d session.save_path=/tmp \ + $1 \ No newline at end of file diff --git a/interface/ispconfig/server/conf/sieve_filter.master b/interface/ispconfig/server/conf/sieve_filter.master new file mode 100644 index 000000000..c3393cf7c --- /dev/null +++ b/interface/ispconfig/server/conf/sieve_filter.master @@ -0,0 +1,30 @@ + +require ["fileinto", "regex", "vacation"]; + + +# Move spam to spam folder +if header :contains "X-Spam-Flag" "YES" { + fileinto "Junk"; + # Stop here so that we do not reply on spams + stop; +} + + + + + +################################################################# +# Autoreply +################################################################# + +# Move spam to spam folder +if header :contains "X-Spam-Flag" "YES" { + fileinto "Junk"; + # Stop here so that we do not reply on spams + stop; +} +vacation :days 1 + :subject "Out of office reply" + # :addresses ["test@test.int", "till@test.int"] + ""; + diff --git a/interface/ispconfig/server/conf/vhost.conf.master b/interface/ispconfig/server/conf/vhost.conf.master new file mode 100644 index 000000000..36182b056 --- /dev/null +++ b/interface/ispconfig/server/conf/vhost.conf.master @@ -0,0 +1,350 @@ + + + AllowOverride None + Order Deny,Allow + Deny from all + + +:80> + + DocumentRoot + + + DocumentRoot + + DocumentRoot + + + + ServerName + + + + ServerAdmin webmaster@ + + ErrorLog /var/log/ispconfig/httpd//error.log + + + ErrorDocument 400 /error/400.html + ErrorDocument 401 /error/401.html + ErrorDocument 403 /error/403.html + ErrorDocument 404 /error/404.html + ErrorDocument 405 /error/405.html + ErrorDocument 500 /error/500.html + ErrorDocument 503 /error/503.html + + + + Options FollowSymLinks + AllowOverride + Order allow,deny + Allow from all + + + # ssi enabled + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + Options +Includes + + + + Order allow,deny + Deny from all + Allow from none + + + + + Options FollowSymLinks + AllowOverride + Order allow,deny + Allow from all + + + # ssi enabled + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + Options +Includes + + + + Order allow,deny + Deny from all + Allow from none + + + + + + # cgi enabled + + Order allow,deny + Allow from all + + ScriptAlias /cgi-bin/ /cgi-bin/ + AddHandler cgi-script .cgi + AddHandler cgi-script .pl + + + # suexec enabled + SuexecUserGroup + + # Clear PHP settings of this website + + SetHandler None + + + # mod_php enabled + AddType application/x-httpd-php .php .php3 .php4 .php5 + php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@" + php_admin_value upload_tmp_dir /tmp + php_admin_value session.save_path /tmp + + php_admin_value open_basedir + + + + # suphp enabled + + suPHP_Engine on + # suPHP_UserGroup + AddHandler x-httpd-suphp .php .php3 .php4 .php5 + suPHP_AddHandler x-httpd-suphp + + + + # php as cgi enabled + ScriptAlias /php5-cgi + Action php5-cgi /php5-cgi + AddHandler php5-cgi .php .php3 .php4 .php5 + + Order allow,deny + Allow from all + + + + # php as fast-cgi enabled + + # SocketPath /tmp/fcgid_sock/ + IdleTimeout 3600 + ProcessLifeTime 7200 + # MaxProcessCount 1000 + DefaultMinClassProcessCount 3 + DefaultMaxClassProcessCount 100 + IPCConnectTimeout 8 + IPCCommTimeout 360 + BusyTimeout 300 + + + AddHandler fcgid-script .php .php3 .php4 .php5 + FCGIWrapper .php + Options +ExecCGI + AllowOverride + Order allow,deny + Allow from all + + + AddHandler fcgid-script .php .php3 .php4 .php5 + FCGIWrapper .php + Options +ExecCGI + AllowOverride + Order allow,deny + Allow from all + + + + + RewriteEngine on + + RewriteCond %{HTTP_HOST} ^ [NC] + RewriteRule ^/(.*)$ $1 + + + + # add support for apache mpm_itk + + AssignUserId + + + + + + + + + +########################################################### +# SSL Vhost +########################################################### + +:443> + + DocumentRoot + + + DocumentRoot + + DocumentRoot + + + + ServerName + + + + ServerAdmin webmaster@ + + ErrorLog /var/log/ispconfig/httpd//error.log + + + ErrorDocument 400 /error/400.html + ErrorDocument 401 /error/401.html + ErrorDocument 403 /error/403.html + ErrorDocument 404 /error/404.html + ErrorDocument 405 /error/405.html + ErrorDocument 500 /error/500.html + ErrorDocument 503 /error/503.html + + + SSLEngine on + SSLCertificateFile /ssl/.crt + SSLCertificateKeyFile /ssl/.key + + SSLCACertificateFile /ssl/.bundle + + + + Options FollowSymLinks + AllowOverride + Order allow,deny + Allow from all + + + # ssi enabled + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + Options +Includes + + + + Order allow,deny + Deny from all + Allow from none + + + + + Options FollowSymLinks + AllowOverride + Order allow,deny + Allow from all + + + # ssi enabled + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + Options +Includes + + + + Order allow,deny + Deny from all + Allow from none + + + + + + # cgi enabled + + Order allow,deny + Allow from all + + ScriptAlias /cgi-bin/ /cgi-bin/ + AddHandler cgi-script .cgi + AddHandler cgi-script .pl + + + # ssi enabled + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + + + # suexec enabled + SuexecUserGroup + + + # mod_php enabled + AddType application/x-httpd-php .php .php3 .php4 .php5 + php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@" + php_admin_value upload_tmp_dir /tmp + php_admin_value session.save_path /tmp + + php_admin_value open_basedir + + + + suPHP_Engine on + # suPHP_UserGroup + AddHandler x-httpd-suphp .php .php3 .php4 .php5 + suPHP_AddHandler x-httpd-suphp + + + # php as cgi enabled + ScriptAlias /php5-cgi + Action php5-cgi /php5-cgi + AddHandler php5-cgi .php .php3 .php4 .php5 + + Order allow,deny + Allow from all + + + + # php as fast-cgi enabled + + # SocketPath /tmp/fcgid_sock/ + IdleTimeout 3600 + ProcessLifeTime 7200 + # MaxProcessCount 1000 + DefaultMinClassProcessCount 3 + DefaultMaxClassProcessCount 100 + IPCConnectTimeout 8 + IPCCommTimeout 360 + BusyTimeout 300 + + + AddHandler fcgid-script .php .php3 .php4 .php5 + FCGIWrapper .php + Options +ExecCGI + AllowOverride + Order allow,deny + Allow from all + + + AddHandler fcgid-script .php .php3 .php4 .php5 + FCGIWrapper .php + Options +ExecCGI + AllowOverride + Order allow,deny + Allow from all + + + + + RewriteEngine on + + RewriteCond %{HTTP_HOST} ^ [NC] + RewriteRule ^/(.*)$ $1 + + + + # add support for apache mpm_itk + + AssignUserId + + + + + + + diff --git a/interface/ispconfig/server/cron_daily.php b/interface/ispconfig/server/cron_daily.php new file mode 100644 index 000000000..24c0961bc --- /dev/null +++ b/interface/ispconfig/server/cron_daily.php @@ -0,0 +1,303 @@ +uses('ini_parser,file,services'); + + +####################################################################################################### +// store the mailbox statistics in the database +####################################################################################################### + +$sql = "SELECT mailuser_id,maildir FROM mail_user WHERE server_id = ".$conf["server_id"]; +$records = $app->db->queryAllRecords($sql); +foreach($records as $rec) { + if(@is_file($rec["maildir"].'/ispconfig_mailsize')) { + + // rename file + rename($rec["maildir"].'/ispconfig_mailsize',$rec["maildir"].'/ispconfig_mailsize_save'); + + // Read the file + $lines = file($rec["maildir"].'/ispconfig_mailsize_save'); + $mail_traffic = 0; + foreach($lines as $line) { + $mail_traffic += intval($line); + } + unset($lines); + + // Delete backup file + if(@is_file($rec["maildir"].'/ispconfig_mailsize_save')) unlink($rec["maildir"].'/ispconfig_mailsize_save'); + + // Save the traffic stats in the sql database + $tstamp = date("Y-m"); + + $sql = "SELECT * FROM mail_traffic WHERE month = '$tstamp' AND mailuser_id = ".$rec["mailuser_id"]; + $tr = $app->dbmaster->queryOneRecord($sql); + + $mail_traffic += $tr["traffic"]; + if($tr["traffic_id"] > 0) { + $sql = "UPDATE mail_traffic SET traffic = $mail_traffic WHERE traffic_id = ".$tr["traffic_id"]; + } else { + $sql = "INSERT INTO mail_traffic (month,mailuser_id,traffic) VALUES ('$tstamp',".$rec["mailuser_id"].",$mail_traffic)"; + } + $app->dbmaster->query($sql); + echo $sql; + + } + +} + +####################################################################################################### +// Create webalizer statistics +####################################################################################################### + +function setConfigVar( $filename, $varName, $varValue ) { + if($lines = @file($filename)) { + $out = ''; + $found = 0; + foreach($lines as $line) { + list($key, $value) = preg_split("/[\t= ]+/", $line, 2); + if($key == $varName) { + $out .= $varName." ".$varValue."\n"; + $found = 1; + } else { + $out .= $line; + } + } + if($found == 0) { + //* add \n if the last line does not end with \n or \r + if(substr($out,-1) != "\n" && substr($out,-1) != "\r") $out .= "\n"; + //* add the new line at the end of the file + if($append == 1) $out .= $varName." ".$varValue."\n"; + } + + file_put_contents($filename,$out); + } +} + + +$sql = "SELECT domain_id, domain, document_root FROM web_domain WHERE server_id = ".$conf["server_id"]; +$records = $app->db->queryAllRecords($sql); + +foreach($records as $rec) { + $yesterday = date("Ymd",time() - 86400); + $logfile = escapeshellcmd($rec["document_root"].'/log/'.$yesterday.'-access.log'); + if(!@is_file($logfile)) { + $logfile = escapeshellcmd($rec["document_root"].'/log/'.$yesterday.'-access.log.gz'); + if(!@is_file($logfile)) { + continue; + } +} + +$domain = escapeshellcmd($rec["domain"]); +$statsdir = escapeshellcmd($rec["document_root"].'/web/stats'); +$webalizer = '/usr/bin/webalizer'; +$webalizer_conf_main = '/etc/webalizer/webalizer.conf'; +$webalizer_conf = escapeshellcmd($rec["document_root"].'/log/webalizer.conf'); + +if(!@is_file($webalizer_conf)) { + exec("cp $webalizer_conf_main $webalizer_conf"); +} + +if(@is_file($webalizer_conf)) { + setConfigVar($webalizer_conf, 'Incremental', 'yes'); + setConfigVar($webalizer_conf, 'IncrementalName', $statsdir.'/webalizer.current'); + setConfigVar($webalizer_conf, 'HistoryName', $statsdir.'/webalizer.hist'); +} + + +if(!@is_dir($statsdir)) mkdir($statsdir); + exec("$webalizer -c $webalizer_conf -n $domain -s $domain -r $domain -q -T -p -o $statsdir $logfile"); +} + +####################################################################################################### +// Make the web logfiles directories world readable to enable ftp access +####################################################################################################### + +exec('chmod +r /var/log/ispconfig/httpd/*'); + +####################################################################################################### +// Manage and compress web logfiles +####################################################################################################### + +$sql = "SELECT domain_id, domain, document_root FROM web_domain WHERE server_id = ".$conf["server_id"]; +$records = $app->db->queryAllRecords($sql); +foreach($records as $rec) { + $yesterday = date("Ymd",time() - 86400); + $logfile = escapeshellcmd($rec["document_root"].'/log/'.$yesterday.'-access.log'); + if(@is_file($logfile)) { + // Compress yesterdays logfile + exec("gzip -c $logfile > $logfile.gz"); + unlink($logfile); + } + + // delete logfiles after 30 days + $month_ago = date("Ymd",time() - 86400 * 30); + $logfile = escapeshellcmd($rec["document_root"].'/log/'.$month_ago.'-access.log.gz'); + if(@is_file($logfile)) { + unlink($logfile); + } +} + +####################################################################################################### +// Cleanup website tmp directories +####################################################################################################### + +$sql = "SELECT domain_id, domain, document_root, system_user FROM web_domain WHERE server_id = ".$conf["server_id"]; +$records = $app->db->queryAllRecords($sql); +$app->uses('system'); +if(is_array($records)) { + foreach($records as $rec){ + $tmp_path = realpath(escapeshellcmd($rec["document_root"].'/tmp')); + if($tmp_path != '' && strlen($tmp_path) > 10 && is_dir($tmp_path) && $app->system->is_user($rec['system_user'])){ + exec("cd ".$tmp_path."; find -mtime +1 -name 'sess_*' | grep -v -w .no_delete | xargs rm &> /dev/null 2> /dev/null"); + } + } +} + +####################################################################################################### +// Cleanup logs in master database (only the "master-server") +####################################################################################################### + +if ($app->dbmaster == $app->db) { + /** 7 days */ + $tstamp = time() - (60*60*24*7); + + /* + * Keep 7 days in sys_log + * (we can delete the old items, because if they are OK, they don't interrest anymore + * if they are NOT ok, the server will try to process them in 1 minute and so the + * error appears again after 1 minute. So it is no problem to delete the old one! + */ + $sql = "DELETE FROM sys_log WHERE tstamp < $tstamp AND server_id != 0"; + $app->dbmaster->query($sql); + + /* + * The sys_datalog is more difficult. + * 1) We have to keet ALL entries with + * server_id=0, because they depend on ALL servers (even if they are not + * actually in the system (and will be insered in 3 days or so). + * 2) We have to keey ALL entries which are not actually precessed by the + * server never mind how old they are! + * 3) We have to keep the entry with the highest autoinc-id, because mysql calculates the + * autoinc-id as "new value = max(row) +1" and does not store this in a separate table. + * This means, if we delete to entry with the highest autoinc-value then this value is + * reused as autoinc and so there are more than one entries with the same value (over + * for example 4 Weeks). This is confusing for our system. + * ATTENTION 2) and 3) is in some case NOT the same! so we have to check both! + */ + + /* First we need all servers and the last sys_datalog-id they processed */ + $sql = "SELECT server_id, updated FROM server ORDER BY server_id"; + $records = $app->dbmaster->queryAllRecords($sql); + + /* Then we need the highest value ever */ + $sql = "SELECT max(datalog_id) FROM sys_datalog"; + $res = $app->dbmaster->queryOneRecord($sql); + $maxId = $res['max(datalog_id)']; + + /* Then delete server by server */ + foreach($records as $server) { + $tmp_server_id = intval($server['server_id']); + if($tmp_server_id > 0) { + $sql = "DELETE FROM sys_datalog " . + "WHERE tstamp < " . $tstamp . + " AND server_id = " . intval($server['server_id']) . + " AND datalog_id < " . intval($server['updated']) . + " AND datalog_id < " . intval($maxId); + } +// echo $sql . "\n"; + $app->dbmaster->query($sql); + } +} + +####################################################################################################### +// enforce traffic quota (run only on the "master-server") +####################################################################################################### + +if ($app->dbmaster == $app->db) { + + $current_month = date('Y-m'); + + //* Check website traffic quota + $sql = "SELECT sys_groupid,domain_id,domain,traffic_quota,traffic_quota_lock FROM web_domain WHERE traffic_quota > 0 and type = 'vhost'"; + $records = $app->db->queryAllRecords($sql); + if(is_array($records)) { + foreach($records as $rec) { + + $web_traffic_quota = $rec['traffic_quota']; + $domain = $rec['domain']; + + // get the client + /* + $client_group_id = $rec["sys_groupid"]; + $client = $app->db->queryOneRecord("SELECT limit_traffic_quota,parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + $reseller = $app->db->queryOneRecord("SELECT limit_traffic_quota FROM client WHERE client_id = ".intval($client['parent_client_id'])); + + $client_traffic_quota = intval($client['limit_traffic_quota']); + $reseller_traffic_quota = intval($reseller['limit_traffic_quota']); + */ + + //* get the traffic + $tmp = $app->db->queryOneRecord("SELECT SUM(traffic_bytes) As total_traffic_bytes FROM web_traffic WHERE traffic_date like '$current_month%' AND hostname = '$domain'"); + $web_traffic = (int)$tmp['total_traffic_bytes']/1024/1024; + + //* Website is over quota, we will disable it + /*if( ($web_traffic_quota > 0 && $web_traffic > $web_traffic_quota) || + ($client_traffic_quota > 0 && $web_traffic > $client_traffic_quota) || + ($reseller_traffic_quota > 0 && $web_traffic > $reseller_traffic_quota)) {*/ + if($web_traffic_quota > 0 && $web_traffic > $web_traffic_quota) { + $app->dbmaster->datalogUpdate('web_domain', "traffic_quota_lock = 'y',active = 'n'", 'domain_id', $rec['domain_id']); + $app->log("Traffic quota for ".$rec['domain_id']." Exceeded. Disabling website.",LOGLEVEL_DEBUG); + } else { + //* unlock the website, if traffic is lower then quota + if($rec['traffic_quota_lock'] == 'y') { + $app->dbmaster->datalogUpdate('web_domain', "traffic_quota_lock = 'n',active = 'y'", 'domain_id', $rec['domain_id']); + $app->log("Traffic quota for ".$rec['domain_id']." ok again. Enabling website.",LOGLEVEL_DEBUG); + } + } + } + } + + +} + + +die("finished.\n"); +?> \ No newline at end of file diff --git a/interface/ispconfig/server/cron_daily.sh b/interface/ispconfig/server/cron_daily.sh new file mode 100644 index 000000000..da0ae3c16 --- /dev/null +++ b/interface/ispconfig/server/cron_daily.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin + +/usr/bin/php -q /usr/local/ispconfig/server/cron_daily.php \ No newline at end of file diff --git a/interface/ispconfig/server/lib/app.inc.php b/interface/ispconfig/server/lib/app.inc.php new file mode 100644 index 000000000..8cc03bf4d --- /dev/null +++ b/interface/ispconfig/server/lib/app.inc.php @@ -0,0 +1,181 @@ +load('db_'.$conf["db_type"]); + $this->db = new db; + if($this->db->linkId) $this->db->closeConn(); + $this->db->dbHost = $conf["db_host"]; + $this->db->dbName = $conf["db_database"]; + $this->db->dbUser = $conf["db_user"]; + $this->db->dbPass = $conf["db_password"]; + + /* + Initialize the connection to the master DB, + if we are in a multiserver setup + */ + + if($conf["dbmaster_host"] != '' && $conf["dbmaster_host"] != $conf["db_host"]) { + $this->dbmaster = new db; + if($this->dbmaster->linkId) $this->dbmaster->closeConn(); + $this->dbmaster->dbHost = $conf["dbmaster_host"]; + $this->dbmaster->dbName = $conf["dbmaster_database"]; + $this->dbmaster->dbUser = $conf["dbmaster_user"]; + $this->dbmaster->dbPass = $conf["dbmaster_password"]; + } else { + $this->dbmaster = $this->db; + } + + + } + + } + + function uses($classes) { + global $conf; + + $cl = explode(',',$classes); + if(is_array($cl)) { + foreach($cl as $classname) { + if(!@is_object($this->$classname)) { + if(is_file($conf['classpath'] . "/".$classname.".inc.php") && !is_link($conf['classpath'] . "/".$classname.".inc.php")) { + include_once($conf['classpath'] . "/".$classname.".inc.php"); + $this->$classname = new $classname; + } + } + } + } + } + + function load($classes) { + + global $conf; + $cl = explode(',',$classes); + if(is_array($cl)) { + foreach($cl as $classname) { + if(is_file($conf['classpath'] . "/".$classname.".inc.php") && !is_link($conf['classpath'] . "/".$classname.".inc.php")) { + include_once($conf['classpath'] . "/".$classname.".inc.php"); + } else { + die('Unable to load: '.$conf['classpath'] . "/".$classname.".inc.php"); + } + } + } + } + + /* + 0 = DEBUG + 1 = WARNING + 2 = ERROR + */ + + function log($msg, $priority = 0) { + + global $conf; + + if($priority >= $conf["log_priority"]) { + //if (is_writable($conf["log_file"])) { + if (!$fp = fopen ($conf["log_file"], "a")) { + die("Unable to open logfile."); + } + switch ($priority) { + case 0: + $priority_txt = "DEBUG"; + break; + case 1: + $priority_txt = "WARNING"; + break; + case 2: + $priority_txt = "ERROR"; + break; + } + + if (!fwrite($fp, date("d.m.Y-H:i")." - ".$priority_txt." - ". $msg."\r\n")) { + die("Unable to write to logfile."); + } + echo date("d.m.Y-H:i")." - ".$priority_txt." - ". $msg."\n"; + fclose($fp); + + // Log to database + if(isset($this->dbmaster)) { + $server_id = $conf['server_id']; + $loglevel = $priority; + $tstamp = time(); + $message = $this->dbmaster->quote($msg); + $datalog_id = (isset($this->modules->current_datalog_id) && $this->modules->current_datalog_id > 0)?$this->modules->current_datalog_id:0; + if($datalog_id > 0) { + $tmp_rec = $this->dbmaster->queryOneRecord("SELECT count(syslog_id) as number FROM sys_log WHERE datalog_id = $datalog_id AND loglevel = ".LOGLEVEL_ERROR); + //* Do not insert duplicate errors into the web log. + if($tmp_rec['number'] == 0) { + $sql = "INSERT INTO sys_log (server_id,datalog_id,loglevel,tstamp,message) VALUES ('$server_id',$datalog_id,'$loglevel','$tstamp','$message')"; + $this->dbmaster->query($sql); + } + } else { + $sql = "INSERT INTO sys_log (server_id,datalog_id,loglevel,tstamp,message) VALUES ('$server_id',0,'$loglevel','$tstamp','$message')"; + $this->dbmaster->query($sql); + } + + + } + + //} else { + // die("Unable to write to logfile."); + //} + } // if + } // func + + /* + 0 = DEBUG + 1 = WARNING + 2 = ERROR + */ + + function error($msg) { + $this->log($msg,3); + die($msg); + } + +} + +/* + Initialize application (app) object +*/ + +$app = new app; + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/db_mysql.inc.php b/interface/ispconfig/server/lib/classes/db_mysql.inc.php new file mode 100644 index 000000000..f7ac0f508 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/db_mysql.inc.php @@ -0,0 +1,612 @@ +dbHost = $conf["db_host"]; + $this->dbName = $conf["db_database"]; + $this->dbUser = $conf["db_user"]; + $this->dbPass = $conf["db_password"]; + $this->dbCharset = $conf['db_charset']; + //$this->connect(); + } + + // error handler + function updateError($location) + { + global $app; + $this->errorNumber = mysql_errno($this->linkId); + $this->errorMessage = mysql_error($this->linkId); + $this->errorLocation = $location; + if($this->errorNumber && $this->show_error_messages && method_exists($app,'log')) + { + // echo('
    '.$this->errorLocation.'
    '.$this->errorMessage); + $app->log($this->errorLocation." ".$this->errorMessage,LOGLEVEL_WARN); + //flush(); + } + } + + function connect() + { + if($this->linkId == 0) + { + $this->linkId = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass); + if(!$this->linkId) + { + $this->updateError('DB::connect()-> mysql_connect'); + return false; + } + $this->queryId = @mysql_query('SET NAMES '.$this->dbCharset, $this->linkId); + $this->queryId = @mysql_query("SET character_set_results = '".$this->dbCharset."', character_set_client = '".$this->dbCharset."', character_set_connection = '".$this->dbCharset."', character_set_database = '".$this->dbCharset."', character_set_server = '".$this->dbCharset."'", $this->linkId); + } + return true; + } + + function query($queryString) + { + if(!$this->connect()) + { + return false; + } + if(!mysql_select_db($this->dbName, $this->linkId)) + { + $this->updateError('DB::connect()-> mysql_select_db'); + return false; + } + $this->queryId = @mysql_query($queryString, $this->linkId); + $this->updateError('DB::query('.$queryString.') -> mysql_query'); + if(!$this->queryId) + { + return false; + } + $this->currentRow = 0; + return $this->queryId; + } + + // returns all records in an array + function queryAllRecords($queryString) + { + if(!$this->query($queryString)) + { + return false; + } + $ret = array(); + while($line = $this->nextRecord()) + { + $ret[] = $line; + } + return $ret; + } + + // returns one record in an array + function queryOneRecord($queryString) + { + if(!$this->query($queryString) || $this->numRows() == 0) + { + return false; + } + return $this->nextRecord(); + } + + // returns the next record in an array + function nextRecord() + { + $this->record = mysql_fetch_assoc($this->queryId); + $this->updateError('DB::nextRecord()-> mysql_fetch_array'); + if(!$this->record || !is_array($this->record)) + { + return false; + } + $this->currentRow++; + return $this->record; + } + + // returns number of rows returned by the last select query + function numRows() + { + return mysql_num_rows($this->queryId); + } + + // returns mySQL insert id + function insertID() + { + return mysql_insert_id($this->linkId); + } + + // Check der variablen + // deprecated, now use quote + function check($formfield) + { + return $this->quote($formfield); + } + + // Check der variablen + function quote($formfield) + { + if(!$this->connect()){ + $this->updateError('WARNING: mysql_connect: Used addslashes instead of mysql_real_escape_string'); + return addslashes($formfield); + } + + return mysql_real_escape_string($formfield, $this->linkId); + } + + // Check der variablen + function unquote($formfield) + { + return stripslashes($formfield); + } + + function toLower($record) { + if(is_array($record)) { + foreach($record as $key => $val) { + $key = strtolower($key); + $out[$key] = $val; + } + } + return $out; + } + + /* + //* These functions are deprecated and will be removed. + function insert($tablename,$form,$debug = 0) + { + if(is_array($form)){ + foreach($form as $key => $value) + { + $sql_key .= "$key, "; + $sql_value .= "'".$this->check($value)."', "; + } + $sql_key = substr($sql_key,0,strlen($sql_key) - 2); + $sql_value = substr($sql_value,0,strlen($sql_value) - 2); + + $sql = "INSERT INTO $tablename (" . $sql_key . ") VALUES (" . $sql_value .")"; + + if($debug == 1) echo "SQL-Statement: ".$sql."

    "; + $this->query($sql); + if($debug == 1) echo "mySQL Error Message: ".$this->errorMessage; + } + } + + function update($tablename,$form,$bedingung,$debug = 0) + { + + if(is_array($form)){ + foreach($form as $key => $value) + { + $insql .= "$key = '".$this->check($value)."', "; + } + $insql = substr($insql,0,strlen($insql) - 2); + $sql = "UPDATE $tablename SET " . $insql . " WHERE $bedingung"; + if($debug == 1) echo "SQL-Statement: ".$sql."

    "; + $this->query($sql); + if($debug == 1) echo "mySQL Error Message: ".$this->errorMessage; + } + } + */ + + public function diffrec($record_old, $record_new) { + $diffrec_full = array(); + $diff_num = 0; + + if(is_array($record_old) && count($record_old) > 0) { + foreach($record_old as $key => $val) { + // if(!isset($record_new[$key]) || $record_new[$key] != $val) { + if($record_new[$key] != $val) { + // Record has changed + $diffrec_full['old'][$key] = $val; + $diffrec_full['new'][$key] = $record_new[$key]; + $diff_num++; + } else { + $diffrec_full['old'][$key] = $val; + $diffrec_full['new'][$key] = $val; + } + } + } elseif(is_array($record_new)) { + foreach($record_new as $key => $val) { + if(isset($record_new[$key]) && @$record_old[$key] != $val) { + // Record has changed + $diffrec_full['new'][$key] = $val; + $diffrec_full['old'][$key] = @$record_old[$key]; + $diff_num++; + } else { + $diffrec_full['new'][$key] = $val; + $diffrec_full['old'][$key] = $val; + } + } + } + + return array('diff_num' => $diff_num, 'diff_rec' => $diffrec_full); + + } + + //** Function to fill the datalog with a full differential record. + public function datalogSave($db_table, $action, $primary_field, $primary_id, $record_old, $record_new) { + global $app,$conf; + + // Insert backticks only for incomplete table names. + if(stristr($db_table,'.')) { + $escape = ''; + } else { + $escape = '`'; + } + + $tmp = $this->diffrec($record_old, $record_new); + $diffrec_full = $tmp['diff_rec']; + $diff_num = $tmp['diff_num']; + unset($tmp); + + // Insert the server_id, if the record has a server_id + $server_id = (isset($record_old["server_id"]) && $record_old["server_id"] > 0)?$record_old["server_id"]:0; + if(isset($record_new["server_id"])) $server_id = $record_new["server_id"]; + + + if($diff_num > 0) { + //print_r($diff_num); + //print_r($diffrec_full); + $diffstr = $app->db->quote(serialize($diffrec_full)); + $username = $app->db->quote($_SESSION["s"]["user"]["username"]); + $dbidx = $primary_field.":".$primary_id; + + if($action == 'INSERT') $action = 'i'; + if($action == 'UPDATE') $action = 'u'; + if($action == 'DELETE') $action = 'd'; + $sql = "INSERT INTO sys_datalog (dbtable,dbidx,server_id,action,tstamp,user,data) VALUES ('".$db_table."','$dbidx','$server_id','$action','".time()."','$username','$diffstr')"; + $app->db->query($sql); + } + + return true; + } + + //** Inserts a record and saves the changes into the datalog + public function datalogInsert($tablename, $insert_data, $index_field) { + global $app; + + $old_rec = array(); + $this->query("INSERT INTO $tablename $insert_data"); + $index_value = $this->insertID(); + $new_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); + $this->datalogSave($tablename, 'INSERT', $index_field, $index_value, $old_rec, $new_rec); + + return $index_value; + } + + //** Updates a record and saves the changes into the datalog + public function datalogUpdate($tablename, $update_data, $index_field, $index_value) { + global $app; + + $old_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); + $this->query("UPDATE $tablename SET $update_data WHERE $index_field = '$index_value'"); + $new_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); + $this->datalogSave($tablename, 'UPDATE', $index_field, $index_value, $old_rec, $new_rec); + + return true; + } + + //** Deletes a record and saves the changes into the datalog + public function datalogDelete($tablename, $index_field, $index_value) { + global $app; + + $old_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'"); + $this->query("DELETE FROM $tablename WHERE $index_field = '$index_value'"); + $new_rec = array(); + $this->datalogSave($tablename, 'DELETE', $index_field, $index_value, $old_rec, $new_rec); + + return true; + } + + public function closeConn() + { + if($this->linkId) + { + mysql_close($this->linkId); + return true; + } else { return false; } + } + + public function freeResult($query) + { + if(mysql_free_result($query)) + { + return true; + } else { + return false; + } + } + + function delete() { + + } + + function Transaction($action) { + //action = begin, commit oder rollback + + } + + /* + $columns = array(action => add | alter | drop + name => Spaltenname + name_new => neuer Spaltenname, nur bei 'alter' belegt + type => 42go-Meta-Type: int16, int32, int64, double, char, varchar, text, blob + typeValue => Wert z.B. bei Varchar + defaultValue => Default Wert + notNull => true | false + autoInc => true | false + option => unique | primary | index) + + + */ + + function createTable($table_name,$columns) { + $index = ""; + $sql = "CREATE TABLE $table_name ("; + foreach($columns as $col){ + $sql .= $col["name"]." ".$this->mapType($col["type"],$col["typeValue"])." "; + + if($col["defaultValue"] != "") $sql .= "DEFAULT '".$col["defaultValue"]."' "; + if($col["notNull"] == true) { + $sql .= "NOT NULL "; + } else { + $sql .= "NULL "; + } + if($col["autoInc"] == true) $sql .= "auto_increment "; + $sql.= ","; + // key Definitionen + if($col["option"] == "primary") $index .= "PRIMARY KEY (".$col["name"]."),"; + if($col["option"] == "index") $index .= "INDEX (".$col["name"]."),"; + if($col["option"] == "unique") $index .= "UNIQUE (".$col["name"]."),"; + } + $sql .= $index; + $sql = substr($sql,0,-1); + $sql .= ")"; + + $this->query($sql); + return true; + } + + /* + $columns = array(action => add | alter | drop + name => Spaltenname + name_new => neuer Spaltenname, nur bei 'alter' belegt + type => 42go-Meta-Type: int16, int32, int64, double, char, varchar, text, blob + typeValue => Wert z.B. bei Varchar + defaultValue => Default Wert + notNull => true | false + autoInc => true | false + option => unique | primary | index) + + + */ + function alterTable($table_name,$columns) { + $index = ""; + $sql = "ALTER TABLE $table_name "; + foreach($columns as $col){ + if($col["action"] == 'add') { + $sql .= "ADD ".$col["name"]." ".$this->mapType($col["type"],$col["typeValue"])." "; + } elseif ($col["action"] == 'alter') { + $sql .= "CHANGE ".$col["name"]." ".$col["name_new"]." ".$this->mapType($col["type"],$col["typeValue"])." "; + } elseif ($col["action"] == 'drop') { + $sql .= "DROP ".$col["name"]." "; + } + if($col["action"] != 'drop') { + if($col["defaultValue"] != "") $sql .= "DEFAULT '".$col["defaultValue"]."' "; + if($col["notNull"] == true) { + $sql .= "NOT NULL "; + } else { + $sql .= "NULL "; + } + if($col["autoInc"] == true) $sql .= "auto_increment "; + $sql.= ","; + // key Definitionen + if($col["option"] == "primary") $index .= "PRIMARY KEY (".$col["name"]."),"; + if($col["option"] == "index") $index .= "INDEX (".$col["name"]."),"; + if($col["option"] == "unique") $index .= "UNIQUE (".$col["name"]."),"; + } + } + $sql .= $index; + $sql = substr($sql,0,-1); + + //die($sql); + $this->query($sql); + return true; + } + + function dropTable($table_name) { + $this->check($table_name); + $sql = "DROP TABLE '". $table_name."'"; + return $this->query($sql); + } + + // gibt Array mit Tabellennamen zurück + function getTables($database_name = '') { + + if($database_name == '') $database_name = $this->dbName; + $result = mysql_list_tables($database_name); + for ($i = 0; $i < mysql_num_rows($result); $i++) { + $tb_names[$i] = mysql_tablename($result, $i); + } + return $tb_names; + } + + // gibt Feldinformationen zur Tabelle zurück + /* + $columns = array(action => add | alter | drop + name => Spaltenname + name_new => neuer Spaltenname, nur bei 'alter' belegt + type => 42go-Meta-Type: int16, int32, int64, double, char, varchar, text, blob + typeValue => Wert z.B. bei Varchar + defaultValue => Default Wert + notNull => true | false + autoInc => true | false + option => unique | primary | index) + + + */ + + function tableInfo($table_name) { + + global $go_api,$go_info; + // Tabellenfelder einlesen + + if($rows = $go_api->db->queryAllRecords("SHOW FIELDS FROM ".$table_name)){ + foreach($rows as $row) { + $name = $row[0]; + $default = $row[4]; + $key = $row[3]; + $extra = $row[5]; + $isnull = $row[2]; + $type = $row[1]; + + + $column = array(); + + $column["name"] = $name; + //$column["type"] = $type; + $column["defaultValue"] = $default; + if(stristr($key,"PRI")) $column["option"] = "primary"; + if(stristr($isnull,"YES")) { + $column["notNull"] = false; + } else { + $column["notNull"] = true; + } + if($extra == 'auto_increment') $column["autoInc"] = true; + + + // Type in Metatype umsetzen + + if(stristr($type,"int(")) $metaType = 'int32'; + if(stristr($type,"bigint")) $metaType = 'int64'; + if(stristr($type,"char")) { + $metaType = 'char'; + $tmp_typeValue = explode('(',$type); + $column["typeValue"] = substr($tmp_typeValue[1],0,-1); + } + if(stristr($type,"varchar")) { + $metaType = 'varchar'; + $tmp_typeValue = explode('(',$type); + $column["typeValue"] = substr($tmp_typeValue[1],0,-1); + } + if(stristr($type,"text")) $metaType = 'text'; + if(stristr($type,"double")) $metaType = 'double'; + if(stristr($type,"blob")) $metaType = 'blob'; + + + $column["type"] = $metaType; + + $columns[] = $column; + } + return $columns; + } else { + return false; + } + + + //$this->createTable('tester',$columns); + + /* + $result = mysql_list_fields($go_info["server"]["db_name"],$table_name); + $fields = mysql_num_fields ($result); + $i = 0; + $table = mysql_field_table ($result, $i); + while ($i < $fields) { + $name = mysql_field_name ($result, $i); + $type = mysql_field_type ($result, $i); + $len = mysql_field_len ($result, $i); + $flags = mysql_field_flags ($result, $i); + print_r($flags); + + $columns = array(name => $name, + type => "", + defaultValue => "", + isnull => 1, + option => ""); + $returnvar[] = $columns; + + $i++; + } + */ + + + + } + + function mapType($metaType,$typeValue) { + global $go_api; + $metaType = strtolower($metaType); + switch ($metaType) { + case 'int16': + return 'smallint'; + break; + case 'int32': + return 'int'; + break; + case 'int64': + return 'bigint'; + break; + case 'double': + return 'double'; + break; + case 'char': + return 'char'; + break; + case 'varchar': + if($typeValue < 1) die("Datenbank Fehler: Für diesen Datentyp ist eine Längenangabe notwendig."); + return 'varchar('.$typeValue.')'; + break; + case 'text': + return 'text'; + break; + case 'blob': + return 'blob'; + break; + } + } + + } + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/file.inc.php b/interface/ispconfig/server/lib/classes/file.inc.php new file mode 100644 index 000000000..9fd28b834 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/file.inc.php @@ -0,0 +1,319 @@ +log("WARNING: could not open file ".$file, 2); + return false; + } else { + if(filesize($file) > 0){ + $content = fread($fp, filesize($file)); + } else { + $content = ""; + } + fclose($fp); + return $content; + } + } + + function wf($file, $content){ + global $app; + $this->mkdirs(dirname($file)); + if(!$fp = fopen ($file, "wb")){ + $app->log("WARNING: could not open file ".$file, 2); + return false; + } else { + fwrite($fp,$content); + fclose($fp); + return true; + } + } + + function af($file, $content){ + global $app; + $this->mkdirs(dirname($file)); + if(!$fp = fopen ($file, "ab")){ + $app->log("WARNING: could not open file ".$file, 2); + return false; + } else { + fwrite($fp,$content); + fclose($fp); + return true; + } + } + + function no_comments($file, $comment = '#'){ + $content = $this->unix_nl($this->rf($file)); + $lines = explode("\n", $content); + if(!empty($lines)){ + foreach($lines as $line){ + if(strstr($line, $comment)){ + $pos = strpos($line, $comment); + if($pos != 0){ + $new_lines[] = substr($line,0,$pos); + } else { + $new_lines[] = ""; + } + } else { + $new_lines[] = $line; + } + } + } + if(is_array($new_lines)){ + $content_without_comments = implode("\n", $new_lines); + $new_lines = NULL; + return $content_without_comments; + } else { + return ""; + } + } + + function manual_entries($file, $separator = '#### MAKE MANUAL ENTRIES BELOW THIS LINE! ####'){ + if(is_file($file)){ + $content = $this->rf($file); + $parts = explode($separator, $content); + $manual = "\n".trim($parts[1]); + return $manual; + } else { + return ""; + } + } + + function remove_blank_lines($input, $file = 1){ + //Leerzeilen löschen + if($file){ + $content = $this->unix_nl($this->rf($input)); + } else { + $content = $input; + } + $lines = explode("\n", $content); + if(!empty($lines)){ + foreach($lines as $line){ + if(trim($line) != "") $new_lines[] = $line; + } + } + if(is_array($new_lines)){ + $content = implode("\n", $new_lines); + } else { + $content = ""; + } + if($file){ + $this->wf($input, $content); + } else { + return $content; + } + } + + function unix_nl($input){ + $output = str_replace("\r\n", "\n", $input); + $output = str_replace("\r", "\n", $output); + return $output; + } + + function fileowner($file){ + $owner_id = fileowner($file); + clearstatcache(); + return $owner_id; + } + + function mkdirs($strPath, $mode = '0755'){ + // Verzeichnisse rekursiv erzeugen + if(is_dir($strPath)) return true; + $pStrPath = dirname($strPath); + if(!$this->mkdirs($pStrPath, $mode)) return false; + $old_umask = umask(0); + $ret_val = mkdir($strPath, octdec($mode)); + umask($old_umask); + return $ret_val; + } + + function find_includes($file){ + ob_start(); + $httpd_root = system('httpd -V | awk -F"\"" \'$1==" -D HTTPD_ROOT="{print $2}\''); + ob_end_clean(); + clearstatcache(); + if(is_file($file) && filesize($file) > 0){ + $includes[] = $file; + $inhalt = $this->unix_nl($this->no_comments($file)); + $lines = explode("\n", $inhalt); + if(!empty($lines)){ + foreach($lines as $line){ + if(stristr($line, "include ")){ + $include_file = str_replace("\n", "", trim(shell_exec("echo \"$line\" | awk '{print \$2}'"))); + if(substr($include_file,0,1) != "/"){ + $include_file = $httpd_root."/".$include_file; + } + if(is_file($include_file)){ + if($further_includes = $this->find_includes($include_file)){ + $includes = array_merge($includes, $further_includes); + } + } else { + if(strstr($include_file, "*")){ + $more_files = explode("\n", shell_exec("ls -l $include_file | awk '{print \$9}'")); + if(!empty($more_files)){ + foreach($more_files as $more_file){ + if(is_file($more_file)){ + if($further_includes = $this->find_includes($more_file)){ + $includes = array_merge($includes, $further_includes); + } + } + } + } + } + } + } + } + } + } + if(is_array($includes)){ + $includes = array_unique($includes); + return $includes; + } else { + return false; + } + } + + function edit_dist($var, $val){ + global $$var; + $files = array("/root/ispconfig/dist.inc.php"); + foreach($files as $file){ + if(is_file($file)){ + $file_content = $this->unix_nl($this->rf($file)); + $lines = explode("\n", $file_content); + for($i=0;$iwf($file, $file_content); + } + } + } + + function getDirectoryListing($dirname, $sortorder = "a", $show_subdirs = 0, $show_subdirfiles = 0, $exts = "", $ext_save = 1){ + // This function will return an array with filenames based on the criteria you can set in the variables + // @sortorder : a for ascending (the standard) or d for descending (you can use the "r" for reverse as well, works the same) + // @show_subdirs : 0 for NO, 1 for YES - meaning it will show the names of subdirectories if there are any + // Logically subdirnames will not be checked for the required extentions + // @show_subdirfiles : 0 for NO, 1 for YES - meaning it will show files from the subdirs + // Files from subdirs will be prefixed with the subdir name and checked for the required extentions. + // @exts can be either a string or an array, if not passed to the function, then the default will be a check for common image files + // If exts is set to "all" then all extentions are allowed + // @ext_save : 1 for YES, 0 for NO - meaning it will filter out system files or not (such as .htaccess) + + $dirname = realpath($dirname); + if (!$exts || empty($exts) || $exts == "") { + $exts = array("jpg", "gif", "jpeg", "png"); + } + if ($handle = opendir($dirname)) { + $filelist = array(); + while (false !== ($file = readdir($handle))) { + + // Filter out higher directory references + if ($file != "." && $file != "..") { + // Only look at directories or files, filter out symbolic links + if ( filetype ($dirname."/".$file) != "link") { + // If it's a file, check against valid extentions and add to the list + if ( filetype ($dirname."/".$file) == "file" ) { + if ($this->checkFileExtension($file, $exts, $ext_save)) { + $filelist[] = $file; + } + } + // If it's a directory and either subdirs should be listed or files from subdirs add relevant names to the list + else if ( filetype ($dirname."/".$file) == "dir" && ($show_subdirs == 1 || $show_subdirfiles == 1)) { + if ($show_subdirs == 1) { + $filelist[] = $file; + } + if ($show_subdirfiles == 1) { + $subdirname = $file; + $subdirfilelist = $this->getDirectoryListing($dirname."/".$subdirname."/", $sortorder, $show_subdirs, $show_subdirfiles, $exts, $ext_save); + for ($i = 0 ; $i < count($subdirfilelist) ; $i++) { + $subdirfilelist[$i] = $subdirname."/".$subdirfilelist[$i]; + } + $filelist = array_merge($filelist, $subdirfilelist); + } + + } + + } + } + } + closedir($handle); + + // Sort the results + if (count($filelist) > 1) { + natcasesort($filelist); + if ($sortorder == "d" || $sortorder == "r" ) { + $filelist = array_reverse($filelist, TRUE); + } + } + return $filelist; + } + else { + return false; + } + } + + function checkFileExtension($filename, $exts, $ext_save = 1){ + $passed = FALSE; + if ($ext_save == 1) { + if (preg_match("/^\./", $filename)) { + return $passed; + } + } + if ($exts == "all") { + $passed = TRUE; + return $passed; + } + if (is_string($exts)) { + if (preg_match("/\.". $exts ."$/i", $filename)) { + $passed = TRUE; + return $passed; + } + } else if (is_array($exts)) { + foreach ($exts as $theExt) { + if (preg_match("/\.". $theExt ."$/i", $filename)) { + $passed = TRUE; + return $passed; + } + } + } + return $passed; + } + +} +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/getconf.inc.php b/interface/ispconfig/server/lib/classes/getconf.inc.php new file mode 100644 index 000000000..96e2c9be3 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/getconf.inc.php @@ -0,0 +1,65 @@ +config[$server_id])) { + $app->uses('ini_parser'); + $server_id = intval($server_id); + $server = $app->db->queryOneRecord("SELECT config FROM server WHERE server_id = $server_id"); + $this->config[$server_id] = $app->ini_parser->parse_ini_string(stripslashes($server["config"])); + } + + if($section == '') { + return $this->config[$server_id]; + } else { + return $this->config[$server_id][$section]; + } + } + + public function get_global_config($section = '') { + global $app; + + if(!is_array($this->config['global'])) { + $app->uses('ini_parser'); + $tmp = $app->db->queryOneRecord("SELECT config FROM sys_ini WHERE sysini_id = 1"); + $this->config['global'] = $app->ini_parser->parse_ini_string(stripslashes($tmp["config"])); + } + return ($section == '') ? $this->config['global'] : $this->config['global'][$section]; + } + +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/ini_parser.inc.php b/interface/ispconfig/server/lib/classes/ini_parser.inc.php new file mode 100644 index 000000000..0e9dc918a --- /dev/null +++ b/interface/ispconfig/server/lib/classes/ini_parser.inc.php @@ -0,0 +1,69 @@ +config[$section][$item] = trim($matches[2]); + } + } + } + return $this->config; + } + + + + function get_ini_string($file) { + $content = ''; + foreach($this->config as $section => $data) { + $content .= "[$section]\n"; + foreach($data as $item => $value) { + if($value != '') $content .= "$item=$value\n"; + } + } + return $content; + } + +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/mod_mail_base.inc.php b/interface/ispconfig/server/lib/classes/mod_mail_base.inc.php new file mode 100644 index 000000000..f989e2f8b --- /dev/null +++ b/interface/ispconfig/server/lib/classes/mod_mail_base.inc.php @@ -0,0 +1,76 @@ + \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/modules.inc.php b/interface/ispconfig/server/lib/classes/modules.inc.php new file mode 100644 index 000000000..f5e14201c --- /dev/null +++ b/interface/ispconfig/server/lib/classes/modules.inc.php @@ -0,0 +1,250 @@ +debug) $app->log("Loading Module: $module_name",LOGLEVEL_DEBUG); + $app->loaded_modules[$module_name] = new $module_name; + $app->loaded_modules[$module_name]->onLoad(); + } + } + } + } else { + $app->log("Modules directory missing: $modules_dir",LOGLEVEL_ERROR); + } + + } + + /* + This function is called by the modules to register for a specific + table change notification + */ + + function registerTableHook($table_name,$module_name,$function_name) { + global $app; + $this->notification_hooks[$table_name][] = array('module' => $module_name, 'function' => $function_name); + if($this->debug) $app->log("Registered TableHook '$table_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG); + } + + /* + This function goes through all new records in the + sys_datalog table and and calls the function in the + modules that hooked on to the table change. + */ + + function processDatalog() { + global $app,$conf; + + //* If its a multiserver setup + if($app->db->dbHost != $app->dbmaster->dbHost) { + if($conf["mirror_server_id"] > 0) { + $sql = "SELECT * FROM sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = ".$conf["mirror_server_id"]." OR server_id = 0) ORDER BY datalog_id"; + } else { + $sql = "SELECT * FROM sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0) ORDER BY datalog_id"; + } + + $records = $app->dbmaster->queryAllRecords($sql); + foreach($records as $d) { + + //** encode data to utf-8 and unserialize it + if(!$data = unserialize(stripslashes($d["data"]))) { + $data = unserialize($d["data"]); + } + //** Decode data back to locale + foreach($data['old'] as $key => $val) { + $data['old'][$key] = utf8_decode($val); + } + foreach($data['new'] as $key => $val) { + $data['new'][$key] = utf8_decode($val); + } + + $replication_error = false; + + $this->current_datalog_id = $d["datalog_id"]; + + if(count($data['new']) > 0) { + if($d["action"] == 'i' || $d["action"] == 'u') { + $idx = explode(":",$d["dbidx"]); + $tmp_sql1 = ''; + $tmp_sql2 = ''; + foreach($data['new'] as $fieldname => $val) { + $tmp_sql1 .= "`$fieldname`,"; + $tmp_sql2 .= "'".$app->db->quote($val)."',"; + } + $tmp_sql1 = substr($tmp_sql1,0,-1); + $tmp_sql2 = substr($tmp_sql2,0,-1); + //$tmp_sql1 .= "$idx[0]"; + //$tmp_sql2 .= "$idx[1]"; + $sql = "REPLACE INTO $d[dbtable] ($tmp_sql1) VALUES ($tmp_sql2)"; + $app->db->errorNumber = 0; + $app->db->errorMessage = ''; + $app->db->query($sql); + if($app->db->errorNumber > 0) { + $replication_error = true; + $app->log("Replication failed. Error: (" . $d[dbtable] . ") in mysql server: (".$app->db->dbHost.") " . $app->db->errorMessage . " # SQL: " . $sql,LOGLEVEL_ERROR); + } + $app->log("Replicated from master: ".$sql,LOGLEVEL_DEBUG); + } + /* + if($d["action"] == 'u') { + $sql = "UPDATE $d[dbtable] SET "; + foreach($data['new'] as $fieldname => $val) { + $sql .= "`$fieldname` = '$val',"; + } + $sql = substr($sql,0,-1); + $idx = explode(":",$d["dbidx"]); + $sql .= " WHERE $idx[0] = $idx[1]"; + $app->db->query($sql); + if($app->db->errorNumber > 0) { + $replication_error = true; + $app->log("Replication failed. Error: (" . $d[dbtable] . ") " . $app->db->errorMessage . " # SQL: " . $sql,LOGLEVEL_ERROR); + } + $app->log("Replicated from master: ".$sql,LOGLEVEL_DEBUG); + } + */ + if($d["action"] == 'd') { + $idx = explode(":",$d["dbidx"]); + $sql = "DELETE FROM $d[dbtable] "; + $sql .= " WHERE $idx[0] = $idx[1]"; + $app->db->query($sql); + if($app->db->errorNumber > 0) { + $replication_error = true; + $app->log("Replication failed. Error: (" . $d[dbtable] . ") " . $app->db->errorMessage . " # SQL: " . $sql,LOGLEVEL_ERROR); + } + $app->log("Replicated from master: ".$sql,LOGLEVEL_DEBUG); + } + + + if($replication_error == false) { + if(is_array($data['old']) || is_array($data['new'])) { + $this->raiseTableHook($d["dbtable"],$d["action"],$data); + } else { + $app->log("Data array was empty for datalog_id ".$d["datalog_id"],LOGLEVEL_WARN); + } + //$this->raiseTableHook($d["dbtable"],$d["action"],$data); + //$app->dbmaster->query("DELETE FROM sys_datalog WHERE datalog_id = ".$d["datalog_id"]); + //$app->log("Deleting sys_datalog ID ".$d["datalog_id"],LOGLEVEL_DEBUG); + $app->dbmaster->query("UPDATE server SET updated = ".$d["datalog_id"]." WHERE server_id = ".$conf["server_id"]); + $app->log("Processed datalog_id ".$d["datalog_id"],LOGLEVEL_DEBUG); + } else { + $app->log("Error in Replication, changes were not processed.",LOGLEVEL_ERROR); + /* + * If there is any error in processing the datalog we can't continue, because + * we do not know if the newer actions require this (old) one. + */ + return; + } + } else { + $app->log("Datalog does not contain any changes for this record ".$d["datalog_id"],LOGLEVEL_DEBUG); + } + } + + //* if we have a single server setup + } else { + $sql = "SELECT * FROM sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0) ORDER BY datalog_id"; + $records = $app->db->queryAllRecords($sql); + foreach($records as $d) { + + //** encode data to utf-8 to be able to unserialize it and then unserialize it + if(!$data = unserialize(stripslashes($d["data"]))) { + $data = unserialize($d["data"]); + } + //** decode data back to current locale + foreach($data['old'] as $key => $val) { + $data['old'][$key] = utf8_decode($val); + } + foreach($data['new'] as $key => $val) { + $data['new'][$key] = utf8_decode($val); + } + + $this->current_datalog_id = $d["datalog_id"]; + if(is_array($data['old']) || is_array($data['new'])) { + $this->raiseTableHook($d["dbtable"],$d["action"],$data); + } else { + $app->log("Data array was empty for datalog_id ".$d["datalog_id"],LOGLEVEL_WARN); + } + //$app->db->query("DELETE FROM sys_datalog WHERE datalog_id = ".$rec["datalog_id"]); + //$app->log("Deleting sys_datalog ID ".$rec["datalog_id"],LOGLEVEL_DEBUG); + $app->db->query("UPDATE server SET updated = ".$d["datalog_id"]." WHERE server_id = ".$conf["server_id"]); + $app->log("Processed datalog_id ".$d["datalog_id"],LOGLEVEL_DEBUG); + } + } + + + + + + } + + function raiseTableHook($table_name,$action,$data) { + global $app; + + // Get the hooks for this table + $hooks = (isset($this->notification_hooks[$table_name]))?$this->notification_hooks[$table_name]:''; + if($this->debug) $app->log("Raised TableHook for table: '$table_name'",LOGLEVEL_DEBUG); + + if(is_array($hooks)) { + foreach($hooks as $hook) { + $module_name = $hook["module"]; + $function_name = $hook["function"]; + // Claa the processing function of the module + if($this->debug) $app->log("Call function '$function_name' in module '$module_name' raised by TableHook '$table_name'.",LOGLEVEL_DEBUG); + call_user_method($function_name,$app->loaded_modules[$module_name],$table_name,$action,$data); + unset($module_name); + unset($function_name); + } + } + unset($hook); + unset($hooks); + } + +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/plugins.inc.php b/interface/ispconfig/server/lib/classes/plugins.inc.php new file mode 100644 index 000000000..f1e041703 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/plugins.inc.php @@ -0,0 +1,130 @@ + $file) { + include_once($plugins_dir.$file); + if($this->debug) $app->log("Loading Plugin: $plugin_name",LOGLEVEL_DEBUG); + $app->loaded_plugins[$plugin_name] = new $plugin_name; + $app->loaded_plugins[$plugin_name]->onLoad(); + } + } else { + $app->log("Unable to open the plugin directory: $plugins_dir",LOGLEVEL_ERROR); + } + } else { + $app->log("Plugin directory missing: $plugins_dir",LOGLEVEL_ERROR); + } + + } + + /* + This function is used by the modules to announce which events they provide + */ + + function announceEvents($module_name,$events) { + global $app; + foreach($events as $event_name) { + $this->available_events[$event_name] = $module_name; + if($this->debug) $app->log("Announced event: $event_name",LOGLEVEL_DEBUG); + } + } + + + /* + This function is called by the plugin to register for an event + */ + + function registerEvent($event_name,$plugin_name,$function_name) { + global $app; + if(!isset($this->available_events[$event_name])) { + $app->log("Unable to register the function '$function_name' in the plugin '$plugin_name' for event '$event_name'",LOGLEVEL_DEBUG); + } else { + $this->subscribed_events[$event_name][] = array('plugin' => $plugin_name, 'function' => $function_name); + if($this->debug) $app->log("Registered the function '$function_name' in the plugin '$plugin_name' for event '$event_name'.",LOGLEVEL_DEBUG); + } + } + + + function raiseEvent($event_name,$data) { + global $app; + + // Get the subscriptions for this event + $events = (isset($this->subscribed_events[$event_name]))?$this->subscribed_events[$event_name]:''; + if($this->debug) $app->log("Raised event: '$event_name'",LOGLEVEL_DEBUG); + + if(is_array($events)) { + foreach($events as $event) { + $plugin_name = $event["plugin"]; + $function_name = $event["function"]; + // Call the processing function of the plugin + $app->log("Call function '$function_name' in plugin '$plugin_name' raised by event '$event_name'.",LOGLEVEL_DEBUG); + call_user_method($function_name,$app->loaded_plugins[$plugin_name],$event_name,$data); + unset($plugin_name); + unset($function_name); + } + } + unset($event); + unset($events); + } + +} + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/services.inc.php b/interface/ispconfig/server/lib/classes/services.inc.php new file mode 100644 index 000000000..2441409e8 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/services.inc.php @@ -0,0 +1,80 @@ +registered_services[$service_name])) { + $this->delayed_restarts[$service_name] = $action; + } else { + $app->log("Unable to add a delayed restart for '$service_name'. Service '$service_name' is not registered.",LOGLEVEL_WARNING); + } + + } + + // This function restarts a service when the function is called + function restartService($service_name,$action = 'restart') { + global $app; + + if(is_array($this->registered_services[$service_name])) { + $module_name = $this->registered_services[$service_name]["module"]; + $function_name = $this->registered_services[$service_name]["function"]; + $app->log("Call function '$function_name' in module '$module_name'.",LOGLEVEL_DEBUG); + call_user_method($function_name,$app->loaded_modules[$module_name],$action); + } else { + $app->log("Unable to restart $service_name. Service $service_name is not registered.",LOGLEVEL_WARNING); + } + + } + + // This function is used to register callback functions for services that can be restarted + function registerService($service_name,$module_name, $function_name) { + global $app; + $this->registered_services[$service_name] = array('module' => $module_name, 'function' => $function_name); + if($this->debug) $app->log("Registered Service '$service_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG); + } + + // This function is called at the end of the server script to restart services. + function processDelayedActions() { + global $app; + foreach($this->delayed_restarts as $service_name => $action) { + $this->restartService($service_name,$action); + } + } + +} +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/system.inc.php b/interface/ispconfig/server/lib/classes/system.inc.php new file mode 100644 index 000000000..407289fa6 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/system.inc.php @@ -0,0 +1,1232 @@ +server_id = $go_info["isp"]["server_id"]; + $this->server_conf = $go_info["isp"]["server_conf"]; + $this->server_conf["passwd_datei"] = '/etc/passwd'; + $this->server_conf["shadow_datei"] = '/etc/shadow'; + $this->server_conf["group_datei"] = '/etc/group'; + } + + /** + * Get the hostname from the server + * + * @return string + */ + public function hostname(){ + $dist = $this->server_conf["dist"]; + + ob_start(); + passthru("hostname"); + $hostname = ob_get_contents(); + ob_end_clean(); + $hostname = trim($hostname); + ob_start(); + if(!strstr($dist, "freebsd")){ + passthru("dnsdomainname"); + } else { + passthru("domainname"); + } + $domainname = ob_get_contents(); + ob_end_clean(); + $domainname = trim($domainname); + if($domainname != ""){ + if(!strstr($hostname, $domainname)) $hostname .= ".".$domainname; + } + return $hostname; + } + + /** + * Add an user to the system + * + */ + public function adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort = '*'){ + global $app; + if($this->is_user($user_username)){ + return false; + } else { + if(trim($user_username) != '') { + $user_datei = $this->server_conf["passwd_datei"]; + $shadow_datei = $this->server_conf["shadow_datei"]; + $shell = realpath($shell); + if(trim($passwort) == "") $passwort = '*'; + $new_user = "\n$user_username:x:$uid:$gid:$username:$homedir:$shell\n"; + $app->log->msg("USER: $new_user"); + $app->file->af($user_datei, $new_user); + if($shadow_datei == "/etc/shadow"){ + $datum = time(); + $tage = floor($datum/86400); + $new_passwd = "\n$user_username:$passwort:$tage:0:99999:7:::\n"; + } else { + $new_passwd = "\n$user_username:$passwort:$uid:$gid::0:0:$username:$homedir:$shell\n"; + } + $app->file->af($shadow_datei, $new_passwd); + // TB: leere Zeilen entfernen + $app->file->remove_blank_lines($shadow_datei); + $app->file->remove_blank_lines($user_datei); + // TB: user Sortierung deaktiviert + //$this->order_users_groups(); + if($shadow_datei != "/etc/shadow"){ + $app->file->af($shadow_datei, "\n"); + // TB: leere Zeilen entfernen + $app->file->remove_blank_lines($shadow_datei); + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } + } + } + + /** + * Update users when someone edit it + * + */ + function updateuser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort = '*'){ + //* First delete the users + $this->deluser($user_username); + //* Add the user again + $this->adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort); + } + + /** + * Lock the user + * + */ + function deactivateuser($user_username){ + $passwort = str_rot13($this->getpasswd($user_username)); + $user_attr = $this->get_user_attributes($user_username); + $uid = $user_attr["uid"]; + $gid = $user_attr["gid"]; + $username = $user_attr["name"]; + $homedir = $user_attr["homedir"]; + $shell = "/dev/null"; + $this->deluser($user_username); + $this->adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort); + } + /** + * Delete a user from the system + * + */ + function deluser($user_username){ + global $app; + if($this->is_user($user_username)){ + $user_datei = $this->server_conf["passwd_datei"]; + $shadow_datei = $this->server_conf["shadow_datei"]; + $users = $app->file->rf($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + $num_lines = sizeof($lines); + for($i=0;$i<$num_lines;$i++){ + if(trim($lines[$i]) != ""){ + list($f1,) = explode(":", $lines[$i]); + if($f1 != $user_username) $new_lines[] = $lines[$i]; + } + } + $new_users = implode("\n", $new_lines); + $app->file->wf($user_datei, $new_users); + unset($new_lines); + unset($lines); + unset($new_users); + } + $app->file->remove_blank_lines($user_datei); + + $passwds = $app->file->rf($shadow_datei); + $lines = explode("\n", $passwds); + if(is_array($lines)){ + $num_lines = sizeof($lines); + for($i=0;$i<$num_lines;$i++){ + if(trim($lines[$i]) != ""){ + list($f1,) = explode(":", $lines[$i]); + if($f1 != $user_username) $new_lines[] = $lines[$i]; + } + } + $new_passwds = implode("\n", $new_lines); + $app->file->wf($shadow_datei, $new_passwds); + unset($new_lines); + unset($lines); + unset($new_passwds); + } + $app->file->remove_blank_lines($shadow_datei); + + $group_file = $app->file->rf($this->server_conf["group_datei"]); + $group_file_lines = explode("\n", $group_file); + foreach($group_file_lines as $group_file_line){ + if(trim($group_file_line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $group_file_line); + $group_users = explode(",", str_replace(" ", "", $f4)); + if(in_array($user_username, $group_users)){ + $g_users = array(); + foreach($group_users as $group_user){ + if($group_user != $user_username) $g_users[] = $group_user; + } + $f4 = implode(",", $g_users); + } + $new_group_file[] = $f1.":".$f2.":".$f3.":".$f4; + } + } + $new_group_file = implode("\n", $new_group_file); + $app->file->wf($this->server_conf["group_datei"], $new_group_file); + // TB: auskommentiert + //$this->order_users_groups(); + + if($shadow_datei != "/etc/shadow"){ + $app->file->af($shadow_datei, "\n"); + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } else { + return false; + } + } + + /** + * Add a usergroup to the system + * + */ + function addgroup($group, $gid, $members = ''){ + global $app; + if($this->is_group($group)){ + return false; + } else { + $group_datei = $this->server_conf["group_datei"]; + $shadow_datei = $this->server_conf["shadow_datei"]; + $new_group = "\n$group:x:$gid:$members\n"; + $app->file->af($group_datei, $new_group); + + // TB: auskommentiert + //$this->order_users_groups(); + if($shadow_datei != "/etc/shadow"){ + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } + } + + /** + * Update usersgroup in way to delete and add it again + * + */ + function updategroup($group, $gid, $members = ''){ + $this->delgroup($group); + $this->addgroup($group, $gid, $members); + } + + /** + * Delete a usergroup from the system + * + */ + function delgroup($group){ + global $app; + if($this->is_group($group)){ + $group_datei = $this->server_conf["group_datei"]; + $shadow_datei = $this->server_conf["shadow_datei"]; + $groups = $app->file->rf($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + $num_lines = sizeof($lines); + for($i=0;$i<$num_lines;$i++){ + if(trim($lines[$i]) != ""){ + list($f1,) = explode(":", $lines[$i]); + if($f1 != $group) $new_lines[] = $lines[$i]; + } + } + $new_groups = implode("\n", $new_lines); + $app->file->wf($group_datei, $new_groups); + unset($new_lines); + unset($lines); + unset($new_groups); + } + // TB: auskommentiert + //$this->order_users_groups(); + if($shadow_datei != "/etc/shadow"){ + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } else { + return false; + } + } + /** + * Order usergroups + * + */ + function order_users_groups(){ + global $app; + $user_datei = $this->server_conf["passwd_datei"]; + $shadow_datei = $this->server_conf["shadow_datei"]; + $group_datei = $this->server_conf["group_datei"]; + + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $line); + $arr[$f3] = $line; + } + } + } + ksort($arr); + reset($arr); + if($shadow_datei != "/etc/shadow"){ + $app->file->wf($group_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)."\n"); + }else { + $app->file->wf($group_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); + } + unset($arr); + + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3,) = explode(":", $line); + if($f1 != "toor"){ + $arr[$f3] = $line; + } else { + $arr[70000] = $line; + } + } + } + } + ksort($arr); + reset($arr); + $app->file->wf($user_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); + unset($arr); + + $passwds = $app->file->no_comments($shadow_datei); + $lines = explode("\n", $passwds); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3,) = explode(":", $line); + if($f1 != "toor"){ + $uid = $this->getuid($f1); + if(!is_bool($uid)) $arr[$uid] = $line; + } else { + $arr[70000] = $line; + } + } + } + } + ksort($arr); + reset($arr); + $app->file->wf($shadow_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); + unset($arr); + } + + /** + * Find a user / group id + * + */ + function find_uid_gid($min, $max){ + global $app; + if($min < $max && $min >= 0 && $max >= 0 && $min <= 65536 && $max <= 65536 && is_int($min) && is_int($max)){ + for($i=$min;$i<=$max;$i++){ + $uid_arr[$i] = $gid_arr[$i] = 1; + } + $user_datei = $this->server_conf["passwd_datei"]; + $group_datei = $this->server_conf["group_datei"]; + + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(":", $line); + if($f3 >= $min && $f3 <= $max) unset($uid_arr[$f3]); + } + } + if(!empty($uid_arr)){ + foreach($uid_arr as $key => $val){ + $uids[] = $key; + } + $min_uid = min($uids); + unset($uid_arr); + } else { + return false; + } + } + + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $line); + if($f3 >= $min && $f3 <= $max) unset($gid_arr[$f3]); + } + } + if(!empty($gid_arr)){ + foreach($gid_arr as $key => $val){ + $gids[] = $key; + } + $min_gid = min($gids); + unset($gid_arr); + } else { + return false; + } + } + + $result = array_intersect($uids, $gids); + $new_id = (max($result)); + unset($uids); + unset($gids); + unset($result); + if($new_id <= $max){ + return $new_id; + } else { + return false; + } + } else { + return false; + } + } + + /** + * Check if the users is really a user into the system + * + */ + function is_user($user){ + global $app; + $user_datei = $this->server_conf["passwd_datei"]; + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(":", $line); + if($f1 == $user) return true; + } + } + } + return false; + } + + /** + * Check if the group is on this system + * + */ + function is_group($group){ + global $app; + $group_datei = $this->server_conf["group_datei"]; + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $line); + if($f1 == $group) return true; + } + } + } + return false; + } + + /* + // Alternative implementation of the is_group function. Should be faster then the old one To be tested. + function is_group($group) { + $groupfile = '/etc/group'; + if(is_file($groupfile)) { + $handle = fopen ($groupfile, "r"); + while (!feof($handle)) { + $line = trim(fgets($handle, 4096)); + if($line != ""){ + $parts = explode(":", $line); + if($parts[0] == $group) { + fclose ($handle); + return true; + } + } + } + fclose ($handle); + } + return false; + } + */ + + function root_group(){ + global $app; + $group_datei = $this->server_conf["group_datei"]; + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $line); + if($f3 == 0) return $f1; + } + } + } + return false; + } + + /** + * Get the groups of an user + * + */ + function get_user_groups($username){ + global $app; + $user_groups = array(); + $group_datei = $this->server_conf["group_datei"]; + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $line); + if(intval($f3) < intval($this->server_conf["groupid_von"]) && trim($f1) != 'users'){ + $tmp_group_users = explode(',', str_replace(' ', '', $f4)); + if(in_array($username, $tmp_group_users) && trim($f1) != '') $user_groups[] = $f1; + unset($tmp_group_users); + } + } + } + } + if(!empty($user_groups)) return implode(',', $user_groups); + return ''; + } + + /** + * Get a user password + * + */ + function getpasswd($user){ + global $app; + if($this->is_user($user)){ + $shadow_datei = $this->server_conf["shadow_datei"]; + $passwds = $app->file->no_comments($shadow_datei); + $lines = explode("\n", $passwds); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2,) = explode(":", $line); + if($f1 == $user) return $f2; + } + } + } + } else { + return false; + } + } + + /** + * Get the user id from an user + * + */ + function getuid($user){ + global $app; + if($this->is_user($user)){ + $user_datei = $this->server_conf["passwd_datei"]; + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3,) = explode(":", $line); + if($f1 == $user) return $f3; + } + } + } + } else { + return false; + } + } + + /** + * Get all information from a user + * + */ + function get_user_attributes($user){ + global $app; + if($this->is_user($user)){ + $user_datei = $this->server_conf["passwd_datei"]; + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(":", $line); + if($f1 == $user){ + $user_attr["username"] = $f1; + $user_attr["x"] = $f2; + $user_attr["uid"] = $f3; + $user_attr["gid"] = $f4; + $user_attr["name"] = $f5; + $user_attr["homedir"] = $f6; + $user_attr["shell"] = $f7; + return $user_attr; + } + } + } + } + } else { + return false; + } + } + + /** + * Edit the owner of a file + * + */ + function chown($file, $owner, $group = ''){ + $owner_change = @chown($file, $owner); + if($group != ""){ + $group_change = @chgrp($file, $group); + } else { + $group_change = 1; + } + if($owner_change && $group_change){ + return true; + } else { + return false; + } + } + + /** + * Add an user to a specific group + * + */ + function add_user_to_group($group, $user = 'admispconfig'){ + global $app; + $group_file = $app->file->rf($this->server_conf["group_datei"]); + $group_file_lines = explode("\n", $group_file); + foreach($group_file_lines as $group_file_line){ + list($group_name,$group_x,$group_id,$group_users) = explode(":",$group_file_line); + if($group_name == $group){ + $group_users = explode(",", str_replace(" ", "", $group_users)); + if(!in_array($user, $group_users)){ + $group_users[] = $user; + } + $group_users = implode(",", $group_users); + if(substr($group_users,0,1) == ",") $group_users = substr($group_users,1); + $group_file_line = $group_name.":".$group_x.":".$group_id.":".$group_users; + } + $new_group_file[] = $group_file_line; + } + $new_group_file = implode("\n", $new_group_file); + $app->file->wf($this->server_conf["group_datei"], $new_group_file); + $app->file->remove_blank_lines($this->server_conf["group_datei"]); + if($this->server_conf["shadow_datei"] != "/etc/shadow"){ + $app->log->caselog("pwd_mkdb ".$this->server_conf["shadow_datei"]." &> /dev/null", $this->FILE, __LINE__); + } + } + + function usermod($user, $groups){ + global $app; + if($this->is_user($user)){ + $groups = explode(",", str_replace(" ", "", $groups)); + $group_file = $app->file->rf($this->server_conf["group_datei"]); + $group_file_lines = explode("\n", $group_file); + foreach($group_file_lines as $group_file_line){ + if(trim($group_file_line) != ""){ + list($f1, $f2, $f3, $f4) = explode(":", $group_file_line); + $group_users = explode(",", str_replace(" ", "", $f4)); + if(!in_array($f1, $groups)){ + if(in_array($user, $group_users)){ + $g_users = array(); + foreach($group_users as $group_user){ + if($group_user != $user) $g_users[] = $group_user; + } + $f4 = implode(",", $g_users); + } + } else { + if(!in_array($user, $group_users)){ + if(trim($group_users[0]) == "") unset($group_users); + $group_users[] = $user; + } + $f4 = implode(",", $group_users); + } + $new_group_file[] = $f1.":".$f2.":".$f3.":".$f4; + } + } + $new_group_file = implode("\n", $new_group_file); + $app->file->wf($this->server_conf["group_datei"], $new_group_file); + $app->file->remove_blank_lines($this->server_conf["group_datei"]); + if($this->server_conf["shadow_datei"] != "/etc/shadow"){ + $app->log->caselog("pwd_mkdb ".$this->server_conf["shadow_datei"]." &> /dev/null", $this->FILE, __LINE__); + } + return true; + } else { + return false; + } + } + + /**boot autostart etc + * + */ + function rc_edit($service, $rl, $action){ + // $action = "on|off"; + global $app; + $dist_init_scripts = $app->system->server_conf["dist_init_scripts"]; + $dist_runlevel = $app->system->server_conf["dist_runlevel"]; + $dist = $app->system->server_conf["dist"]; + if(trim($dist_runlevel) == ""){ // falls es keine runlevel gibt (FreeBSD) + if($action == "on"){ + @symlink($dist_init_scripts."/".$service, $dist_init_scripts."/".$service.".sh"); + } + if($action == "off"){ + if(is_link($dist_init_scripts."/".$service.".sh")){ + unlink($dist_init_scripts."/".$service.".sh"); + } else { + exec("mv -f ".$dist_init_scripts."/".$service.".sh ".$dist_init_scripts."/".$service." &> /dev/null"); + } + } + } else { // Linux + if(substr($dist, 0,4) == 'suse'){ + if($action == "on"){ + exec("chkconfig --add $service &> /dev/null"); + } + if($action == "off"){ + exec("chkconfig --del $service &> /dev/null"); + } + } else { + $runlevels = explode(",", $rl); + foreach($runlevels as $runlevel){ + $runlevel = trim($runlevel); + if($runlevel != "" && is_dir($dist_runlevel."/rc".$runlevel.".d")){ + $handle=opendir($dist_runlevel."/rc".$runlevel.".d"); + while($file = readdir($handle)){ + if($file != "." && $file != ".."){ + $target = @readlink($dist_runlevel."/rc".$runlevel.".d/".$file); + if(strstr($file, $service) && strstr($target, $service) && substr($file,0,1) == "S") $ln_arr[$runlevel][] = $dist_runlevel."/rc".$runlevel.".d/".$file; + } + } + closedir($handle); + } + if($action == "on"){ + if(!is_array($ln_arr[$runlevel])) @symlink($dist_init_scripts."/".$service, $dist_runlevel."/rc".$runlevel.".d/S99".$service); + } + if($action == "off"){ + if(is_array($ln_arr[$runlevel])){ + foreach($ln_arr[$runlevel] as $link){ + unlink($link); + } + } + } + } + } + } + } + + /** + * Filter information from the commands + * + */ + function grep($content, $string, $params = ''){ + global $app; + // params: i, v, w + $content = $app->file->unix_nl($content); + $lines = explode("\n", $content); + foreach($lines as $line){ + if(!strstr($params, 'w')){ + if(strstr($params, 'i')){ + if(strstr($params, 'v')){ + if(!stristr($line, $string)) $find[] = $line; + } else { + if(stristr($line, $string)) $find[] = $line; + } + } else { + if(strstr($params, 'v')){ + if(!strstr($line, $string)) $find[] = $line; + } else { + if(strstr($line, $string)) $find[] = $line; + } + } + } else { + if(strstr($params, 'i')){ + if(strstr($params, 'v')){ + if(!$app->string->is_word($string, $line, 'i')) $find[] = $line; + } else { + if($app->string->is_word($string, $line, 'i')) $find[] = $line; + } + } else { + if(strstr($params, 'v')){ + if(!$app->string->is_word($string, $line)) $find[] = $line; + } else { + if($app->string->is_word($string, $line)) $find[] = $line; + } + } + } + } + if(is_array($find)){ + $ret_val = implode("\n", $find); + if(substr($ret_val,-1) != "\n") $ret_val .= "\n"; + $find = NULL; + return $ret_val; + } else { + return false; + } + } + + /** + * Strip content from fields + * + */ + function cut($content, $field, $delimiter = ':'){ + global $app; + $content = $app->file->unix_nl($content); + $lines = explode("\n", $content); + foreach($lines as $line){ + $elms = explode($delimiter, $line); + $find[] = $elms[($field-1)]; + } + if(is_array($find)){ + $ret_val = implode("\n", $find); + if(substr($ret_val,-1) != "\n") $ret_val .= "\n"; + $find = NULL; + return $ret_val; + } else { + return false; + } + } + + /** + * Get the content off a file + * + */ + function cat($file){ + global $app; + return $app->file->rf($file); + } + + /** + * Control services to restart etc + * + */ + function daemon_init($daemon, $action){ + //* $action = start|stop|restart|reload + global $app; + $dist = $this->server_conf["dist"]; + $dist_init_scripts = $this->server_conf["dist_init_scripts"]; + if(!strstr($dist, "freebsd")){ + $app->log->caselog("$dist_init_scripts/$daemon $action &> /dev/null", $this->FILE, __LINE__); + } else { + if(is_file($dist_init_scripts."/".$daemon.".sh") || is_link($dist_init_scripts."/".$daemon.".sh")){ + if($action == "start" || $action == "stop"){ + $app->log->caselog($dist_init_scripts."/".$daemon.".sh ".$action." &> /dev/null", $this->FILE, __LINE__); + } else { + $app->log->caselog($dist_init_scripts."/".$daemon.".sh stop &> /dev/null", $this->FILE, __LINE__); + sleep(3); + $app->log->caselog($dist_init_scripts."/".$daemon.".sh start &> /dev/null", $this->FILE, __LINE__); + } + } else { + if(is_file($dist_init_scripts."/".$daemon) || is_link($dist_init_scripts."/".$daemon)){ + if($action == "start" || $action == "stop"){ + $app->log->caselog($dist_init_scripts."/".$daemon." ".$action." &> /dev/null", $this->FILE, __LINE__); + } else { + $app->log->caselog($dist_init_scripts."/".$daemon." stop &> /dev/null", $this->FILE, __LINE__); + sleep(3); + $app->log->caselog($dist_init_scripts."/".$daemon." start &> /dev/null", $this->FILE, __LINE__); + } + } else { + if(is_file("/etc/rc.d/".$daemon) || is_link("/etc/rc.d/".$daemon)){ + if($action == "start" || $action == "stop"){ + $app->log->caselog("/etc/rc.d/".$daemon." ".$action." &> /dev/null", $this->FILE, __LINE__); + } else { + $app->log->caselog("/etc/rc.d/".$daemon." stop &> /dev/null", $this->FILE, __LINE__); + sleep(3); + $app->log->caselog("/etc/rc.d/".$daemon." start &> /dev/null", $this->FILE, __LINE__); + } + } + } + } + } + } + + function netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + $bin = str_pad($parts[0], 32, "0", STR_PAD_RIGHT); + $bin = wordwrap($bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function binary_netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + return substr_count($parts[0], "1"); + } + + function network($ip, $netmask){ + $netmask = $this->netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $netmask); + $netmask_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + for($i=0;$i<32;$i++){ + $network_bin .= substr($netmask_bin,$i,1) * substr($ip_bin,$i,1); + } + $network_bin = wordwrap($network_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($network_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + /** + * Make a broadcast address from an IP number in combination with netmask + * + */ + function broadcast($ip, $netmask){ + $netmask = $this->netmask($netmask); + $binary_netmask = $this->binary_netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $broadcast_bin = str_pad(substr($ip_bin, 0, $binary_netmask),32,"1",STR_PAD_RIGHT); + $broadcast_bin = wordwrap($broadcast_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($broadcast_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + /** + * Get the network address information + * + */ + function network_info(){ + $dist = $this->server_conf["dist"]; + ob_start(); + passthru("ifconfig"); + $output = ob_get_contents(); + ob_end_clean(); + $lines = explode("\n", $output); + foreach($lines as $line){ + $elms = explode(" ", $line); + if(trim($elms[0]) != "" && substr($elms[0],0,1) != "\t"){ + $elms[0] = trim($elms[0]); + if(strstr($dist, "freebsd")) $elms[0] = substr($elms[0],0,-1); + $interfaces[] = $elms[0]; + } + } + if(!empty($interfaces)){ + foreach($interfaces as $interface){ + ob_start(); + if(!strstr($dist, "freebsd")){ + passthru("ifconfig ".$interface." | grep -iw 'inet' | cut -f2 -d: | cut -f1 -d' '"); + } else { + passthru("ifconfig ".$interface." | grep -iw 'inet' | grep -iv 'inet6' | cut -f2 -d' '"); + } + $output = trim(ob_get_contents()); + ob_end_clean(); + if($output != ""){ + $ifconfig["INTERFACE"][$interface] = $output; + $ifconfig["IP"][$output] = $interface; + } + } + if(!empty($ifconfig)){ + return $ifconfig; + } else { + return false; + } + } else { + return false; + } + } + + /** + * Configure the network settings from the system + * + */ + function network_config(){ + $ifconfig = $this->network_info(); + if($ifconfig){ + $main_interface = $ifconfig["IP"][$this->server_conf["server_ip"]]; + if(strstr($main_interface, ":")){ + $parts = explode(":", $main_interface); + $main_interface = trim($parts[0]); + } + if($main_interface != ""){ + $ips = $this->data["isp_server_ip"]; + if(!empty($ips)){ + foreach($ips as $ip){ + if(!isset($ifconfig["IP"][$ip["server_ip"]])){ + $to_set[] = $ip["server_ip"]; + } else { + unset($ifconfig["IP"][$ip["server_ip"]]); + } + } + if(!empty($ifconfig["IP"])){ + foreach($ifconfig["IP"] as $key => $val){ + if(!strstr($val, "lo") && !strstr($val, "lp") && strstr($val, $main_interface)){ + exec("ifconfig ".$val." down &> /dev/null"); + unset($ifconfig["INTERFACE"][$val]); + } + } + } + if(!empty($to_set)){ + foreach($to_set as $to){ + $i = 0; + while($i >= 0){ + if(isset($ifconfig["INTERFACE"][$main_interface.":".$i])){ + $i++; + } else { + $new_interface = $main_interface.":".$i; + $i = -1; + } + } + exec("ifconfig ".$new_interface." ".$to." netmask ".$this->server_conf["server_netzmaske"]." up &> /dev/null"); + $ifconfig["INTERFACE"][$new_interface] = $to; + } + } + } + } + } + } + + function quota_dirs(){ + global $app; + $content = $app->file->unix_nl($app->file->no_comments("/etc/fstab")); + $lines = explode("\n", $content); + foreach($lines as $line){ + $line = trim($line); + if($line != ""){ + $elms = explode("\t", $line); + foreach($elms as $elm){ + if(trim($elm) != "") $f[] = $elm; + } + if(!empty($f) && stristr($f[3], "userquota") && stristr($f[3], "groupquota")){ + $q_dirs[] = trim($f[1]); + } + unset($f); + } + } + if(!empty($q_dirs)){ + return $q_dirs; + } else { + return false; + } + } + + /** + * Scan the trash for virusses infection + * + */ + function make_trashscan(){ + global $app; + //trashscan erstellen + // Template Öffnen + $app->tpl->clear_all(); + $app->tpl->define( array(table => "trashscan.master")); + + if(!isset($this->server_conf["virusadmin"]) || trim($this->server_conf["virusadmin"]) == "") $this->server_conf["virusadmin"] = "admispconfig@localhost"; + if(substr($this->server_conf["virusadmin"],0,1) == "#"){ + $notify = "no"; + } else { + $notify = "yes"; + } + + // Variablen zuweisen + $app->tpl->assign( array(VIRUSADMIN => $this->server_conf["virusadmin"], + NOTIFICATION => $notify)); + + $app->tpl->parse(TABLE, table); + + $trashscan_text = $app->tpl->fetch(); + + $datei = "/home/admispconfig/ispconfig/tools/clamav/bin/trashscan"; + $app->file->wf($datei, $trashscan_text); + + exec("chown admispconfig:admispconfig $datei &> /dev/null"); + exec("chmod 755 $datei"); + } + + /** + * Get the current time + * + */ + function get_time(){ + $addr = "http://www.ispconfig.org/"; + $timeout = 1; + $url_parts = parse_url($addr); + $path = $url_parts["path"]; + $port = 80; + $urlHandle = @fsockopen($url_parts["host"], $port, $errno, $errstr, $timeout); + if ($urlHandle){ + socket_set_timeout($urlHandle, $timeout); + + $urlString = "GET $path HTTP/1.0\r\nHost: ".$url_parts["host"]."\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"; + if ($user) $urlString .= "Authorization: Basic ".base64_encode("$user:$pass")."\r\n"; + $urlString .= "\r\n"; + fputs($urlHandle, $urlString); + + $month["Jan"] = "01"; + $month["Feb"] = "02"; + $month["Mar"] = "03"; + $month["Apr"] = "04"; + $month["May"] = "05"; + $month["Jun"] = "06"; + $month["Jul"] = "07"; + $month["Aug"] = "08"; + $month["Sep"] = "09"; + $month["Oct"] = "10"; + $month["Nov"] = "11"; + $month["Dec"] = "12"; + $c = 0; + $l = 0; + $startzeit = time(); + while(!feof($urlHandle) && $c < 2 && $l == 0){ + $line = trim(fgets($urlHandle,128)); + $response .= $line; + $c = time() - $startzeit; + if($line == "" || substr($line, 0, 5) == "Date:") $l += 1; // nur den Header auslesen + if(substr($line, 0, 5) == "Date:"){ + $parts = explode(" ", $line); + $tag = $parts[2]; + $monat = $month[$parts[3]]; + $jahr = $parts[4]; + list($stunde, $minute, $sekunde) = explode(":", $parts[5]); + $timestamp = mktime($stunde,$minute,$sekunde,$monat,$tag,$jahr); + } + } + + @fclose($urlHandle); + + return $timestamp; + } else { + @fclose($urlHandle); + return false; + } + } + + function replaceLine($filename,$search_pattern,$new_line,$strict = 0,$append = 1) { + $lines = @file($filename); + $out = ''; + $found = 0; + if(is_array($lines)) { + foreach($lines as $line) { + if($strict == 0) { + if(stristr($line,$search_pattern)) { + $out .= $new_line."\n"; + $found = 1; + } else { + $out .= $line; + } + } else { + if(trim($line) == $search_pattern) { + $out .= $new_line."\n"; + $found = 1; + } else { + $out .= $line; + } + } + } + } + + if($found == 0) { + //* add \n if the last line does not end with \n or \r + if(substr($out,-1) != "\n" && substr($out,-1) != "\r") $out .= "\n"; + //* add the new line at the end of the file + if($append == 1) $out .= $new_line."\n"; + } + file_put_contents($filename,$out); + } + + function removeLine($filename,$search_pattern,$strict = 0) { + if($lines = @file($filename)) { + $out = ''; + foreach($lines as $line) { + if($strict == 0) { + if(!stristr($line,$search_pattern)) { + $out .= $line; + } + } else { + if(!trim($line) == $search_pattern) { + $out .= $line; + } + } + } + file_put_contents($filename,$out); + } + } + + function maildirmake($maildir_path, $user = '', $subfolder = '') { + + global $app; + + if($subfolder != '') { + $dir = escapeshellarg($maildir_path.'/.'.$subfolder); + $dir_cur = escapeshellarg($maildir_path.'/.'.$subfolder.'/cur'); + $dir_new = escapeshellarg($maildir_path.'/.'.$subfolder.'/new'); + $dir_tmp = escapeshellarg($maildir_path.'/.'.$subfolder.'/tmp'); + } else { + $dir = escapeshellarg($maildir_path); + $dir_cur = escapeshellarg($maildir_path.'/cur'); + $dir_new = escapeshellarg($maildir_path.'/new'); + $dir_tmp = escapeshellarg($maildir_path.'/tmp'); + } + + exec("mkdir -p $dir_cur $dir_new $dir_tmp"); + exec("chmod 0700 $dir $dir_cur $dir_new $dir_tmp"); + + if($user != '' && $this->is_user($user) && $user != 'root') { + $user = escapeshellarg($user); + // I assume that the name of the (vmail group) is the same as the name of the mail user in ispconfig 3 + $group = $user; + exec("chown $user:$group $dir $dir_cur $dir_new $dir_tmp"); + } + + //* Add the subfolder to the subscriptions and courierimapsubscribed files + if($subfolder != '') { + // Courier + if(!is_file($maildir_path.'/courierimapsubscribed')) { + $tmp_file = escapeshellarg($maildir_path.'/courierimapsubscribed'); + exec("touch $tmp_file && chown vmail:vmail $tmp_file"); + } + $this->replaceLine($maildir_path.'/courierimapsubscribed','INBOX.'.$subfolder,'INBOX.'.$subfolder,1,1); + + // Dovecot + if(!is_file($maildir_path.'/subscriptions')) { + $tmp_file = escapeshellarg($maildir_path.'/subscriptions'); + exec("touch $tmp_file && chown vmail:vmail $tmp_file"); + } + $this->replaceLine($maildir_path.'/subscriptions',$subfolder,$subfolder,1,1); + } + + $app->log('Created Maildir '.$maildir_path.' with subfolder: '.$subfolder,LOGLEVEL_DEBUG); + + } + +} +?> \ No newline at end of file diff --git a/interface/ispconfig/server/lib/classes/tpl.inc.php b/interface/ispconfig/server/lib/classes/tpl.inc.php new file mode 100644 index 000000000..aaa017ef6 --- /dev/null +++ b/interface/ispconfig/server/lib/classes/tpl.inc.php @@ -0,0 +1,1501 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: class.tpl.inc.php,v 1.1 2003/07/08 12:31:10 platinum Exp $ + +// check to avoid multiple including of class +if (!defined('vlibTemplateClassLoaded')) { + define('vlibTemplateClassLoaded', 1); + + include_once ($conf['classpath'].'/tpl_error.inc.php'); + include_once ($conf['classpath'].'/tpl_ini.inc.php'); + + /** + * vlibTemplate is a class used to seperate PHP and HTML. + * For instructions on how to use vlibTemplate, see the + * vlibTemplate.html file, located in the 'docs' directory. + * + * @since 07/03/2002 + * @author Kelvin Jones + * @package vLIB + * @access public + * @see vlibTemplate.html + */ + + class tpl { + + /*-----------------------------------------------------------------------------\ + | ATTENTION | + | Do not touch the following variables. vlibTemplate will not work otherwise. | + \-----------------------------------------------------------------------------*/ + + var $OPTIONS = array( + 'MAX_INCLUDES' => 10, + 'TEMPLATE_DIR' => null, + 'GLOBAL_VARS' => null, + 'GLOBAL_CONTEXT_VARS' => null, + 'LOOP_CONTEXT_VARS' => null, + 'SET_LOOP_VAR' => null, + 'DEFAULT_ESCAPE' => null, + 'STRICT' => null, + 'CASELESS' => null, + 'UNKNOWNS' => null, + 'TIME_PARSE' => null, + 'ENABLE_PHPINCLUDE' => null, + 'INCLUDE_PATHS' => array(), + 'CACHE_DIRECTORY' => null, + 'CACHE_LIFETIME' => null, + 'CACHE_EXTENSION' => null + ); + + /** open and close tags used for escaping */ + var $ESCAPE_TAGS = array( + 'html' => array('open' => 'htmlspecialchars(' + ,'close'=> ', ENT_QUOTES)'), + 'url' => array('open' => 'urlencode(' + ,'close'=> ')'), + 'rawurl'=>array('open' => 'rawurlencode(' + ,'close'=> ')'), + 'sq' => array('open' => 'addcslashes(' + ,'close'=> ", \"'\")"), + 'dq' => array('open' => 'addcslashes(' + ,'close'=> ", '\"')"), + '1' => array('open' => 'htmlspecialchars(' + ,'close'=> ', ENT_QUOTES)'), + '0' => array('open' => '' + ,'close'=> ''), + 'none' => array('open' => '' + ,'close'=> ''), + 'hex' => array('open' => '$this->_escape_hex(', + 'close'=> ', false)'), + 'hexentity' => array('open' => '$this->_escape_hex(', + 'close'=> ', true)') + ); + + /** open and close tags used for formatting */ + var $FORMAT_TAGS = array( + 'strtoupper' => array('open' => 'strtoupper(', + 'close'=> ')'), + 'uc' => array('open' => 'strtoupper(', + 'close'=> ')'), + 'strtolower' => array('open' => 'strtolower(', + 'close'=> ')'), + 'lc' => array('open' => 'strtolower(', + 'close'=> ')'), + 'ucfirst' => array('open' => 'ucfirst(', + 'close'=> ')'), + 'lcucfirst' => array('open' => 'ucfirst(strtolower(', + 'close'=> '))'), + 'ucwords' => array('open' => 'ucwords(', + 'close'=> ')'), + 'lcucwords' => array('open' => 'ucwords(strtolower(', + 'close'=> '))') + ); + + /** operators allowed when using extended TMPL_IF syntax */ + var $allowed_if_ops = array('==','!=','<>','<','>','<=','>='); + + /** dbs allowed by vlibTemplate::setDbLoop(). */ + var $allowed_loop_dbs = array('MYSQL','POSTGRESQL','INFORMIX','INTERBASE','INGRES', + 'MSSQL','MSQL','OCI8','ORACLE','OVRIMOS','SYBASE'); + + /** root directory of vlibTemplate automagically filled in */ + var $VLIBTEMPLATE_ROOT = null; + + /** contains current directory used when doing recursive include */ + var $_currentincludedir = array(); + + /** current depth of includes */ + var $_includedepth = 0; + + /** full path to tmpl file */ + var $_tmplfilename = null; + + /** file data before it's parsed */ + var $_tmplfile = null; + + /** parsed version of file, ready for eval()ing */ + var $_tmplfilep = null; + + /** eval()ed version ready for printing or whatever */ + var $_tmploutput = null; + + /** array for variables to be kept */ + var $_vars = array(); + + /** array where loop variables are kept */ + var $_arrvars = array(); + + /** array which holds the current namespace during parse */ + var $_namespace = array(); + + /** variable is set to true once the template is parsed, to save re-parsing everything */ + var $_parsed = false; + + /** array holds all unknowns vars */ + var $_unknowns = array(); + + /** microtime when template parsing began */ + var $_firstparsetime = null; + + /** total time taken to parse template */ + var $_totalparsetime = null; + + /** name of current loop being passed in */ + var $_currloopname = null; + + /** rows with the above loop */ + var $_currloop = array(); + + /** define vars to avoid warnings */ + var $_debug = null; + var $_cache = null; + + /** array which holds the dynamic Includes */ + var $_dyninclude = array(); + /*-----------------------------------------------------------------------------\ + | public functions | + \-----------------------------------------------------------------------------*/ + + + /** + * FUNCTION: newTemplate + * + * Usually called by the class constructor. + * Stores the filename in $this->_tmplfilename. + * Raises an error if the template file is not found. + * + * @param string $tmplfile full path to template file + * @return boolean true + * @access public + */ + function newTemplate ($tmplfile) { + if (!$tfile = $this->_fileSearch($tmplfile)) vlibTemplateError::raiseError('VT_ERROR_NOFILE',KILL,$tmplfile); + + // make sure that any parsing vars are cleared for the new template + $this->_tmplfile = null; + $this->_tmplfilep = null; + $this->_tmploutput = null; + $this->_parsed = false; + $this->_unknowns = array(); + $this->_firstparsetime = null; + $this->_totalparsetime = null; + + // reset debug module + if ($this->_debug) $this->_debugReset(); + + $this->_tmplfilename = $tfile; + return true; + } + + /** + * FUNCTION: setVar + * + * Sets variables to be used by the template + * If $k is an array, then it will treat it as an associative array + * using the keys as variable names and the values as variable values. + * + * @param mixed $k key to define variable name + * @param mixed $v variable to assign to $k + * @return boolean true/false + * @access public + */ + function setVar ($k,$v=null) { + if (is_array($k)) { + foreach($k as $key => $value){ + $key = ($this->OPTIONS['CASELESS']) ? strtolower(trim($key)) : trim($key); + if (preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $key) && $value !== null ) { + $this->_vars[$key] = $value; + } + } + } + else { + if (preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $k) && $v !== null) { + if ($this->OPTIONS['CASELESS']) $k = strtolower($k); + $this->_vars[trim($k)] = $v; + } + else { + return false; + } + } + return true; + } + + /** + * FUNCTION: setInclude + * + * Sets dynamic includes to be used by the template + * If $k is an array, then it will treat it as an associative array + * using the keys as variable names and the values as variable values. + * + * @param mixed $k key to define variable name + * @param mixed $v variable to assign to $k + * @return boolean true/false + * @access public + */ + + function setInclude($k, $v = null) { + if(is_array($k)) { + foreach($k as $key => $val) { + $this->_dyninclude[$key] = $val; + } + } else { + $this->_dyninclude[$k] = $v; + } + + return true; + } + + /** + * FUNCTION: unsetVar + * + * Unsets a variable which has already been set + * Parse in all vars wanted for deletion in seperate parametres + * + * @param string var name to remove use: vlibTemplate::unsetVar(var[, var..]) + * @return boolean true/false returns true unless called with 0 params + * @access public + */ + function unsetVar () { + $num_args = func_num_args(); + if ($num_args < 1) return false; + + for ($i = 0; $i < $num_args; $i++) { + $var = func_get_arg($i); + if ($this->OPTIONS['CASELESS']) $var = strtolower($var); + if (!preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $var)) continue; + unset($this->_vars[$var]); + } + return true; + } + + /** + * FUNCTION: getVars + * + * Gets all vars currently set in global namespace. + * + * @return array + * @access public + */ + function getVars () { + if (empty($this->_vars)) return false; + return $this->_vars; + } + + /** + * FUNCTION: getVar + * + * Gets a single var from the global namespace + * + * @return var + * @access public + */ + function getVar ($var) { + if ($this->OPTIONS['CASELESS']) $var = strtolower($var); + if (empty($var) || !isset($this->_vars[$var])) return false; + return $this->_vars[$var]; + } + + /** + * FUNCTION: setContextVars + * + * sets the GLOBAL_CONTEXT_VARS + * + * @return true + * @access public + */ + function setContextVars () { + $_phpself = @$GLOBALS['HTTP_SERVER_VARS']['PHP_SELF']; + $_pathinfo = @$GLOBALS['HTTP_SERVER_VARS']['PATH_INFO']; + $_request_uri = @$GLOBALS['HTTP_SERVER_VARS']['REQUEST_URI']; + $_qs = @$GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING']; + + // the following fixes bug of $PHP_SELF on Win32 CGI and IIS. + $_self = (!empty($_pathinfo)) ? $_pathinfo : $_phpself; + $_uri = (!empty($_request_uri)) ? $_request_uri : $_self.'?'.$_qs; + + $this->setvar('__SELF__', $_self); + $this->setvar('__REQUEST_URI__', $_uri); + return true; + } + + /** + * FUNCTION: setLoop + * + * Builds the loop construct for use with . + * + * @param string $k string to define loop name + * @param array $v array to assign to $k + * @return boolean true/false + * @access public + */ + function setLoop ($k,$v) { + if (is_array($v) && preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $k)) { + $k = ($this->OPTIONS['CASELESS']) ? strtolower(trim($k)) : trim($k); + $this->_arrvars[$k] = array(); + if ($this->OPTIONS['SET_LOOP_VAR'] && !empty($v)) $this->setvar($k, 1); + if (($this->_arrvars[$k] = $this->_arrayBuild($v)) == false) { + vlibTemplateError::raiseError('VT_WARNING_INVALID_ARR',WARNING,$k); + } + } + return true; + } + + /** + * FUNCTION: setDbLoop [** EXPERIMENTAL **] + * + * Function to create a loop from a Db result resource link. + * + * @param string $loopname to commit loop. If not set, will use last loopname set using newLoop() + * @param string $result link to a Db result resource + * @param string $db_type, type of db that the result resource belongs to. + * @return boolean true/false + * @access public + */ + function setDbLoop ($loopname, $result, $db_type='MYSQL') { + + /* + $db_type = strtoupper($db_type); + if (!in_array($db_type, $this->allowed_loop_dbs)) { + vlibTemplateError::raiseError('VT_WARNING_INVALID_LOOP_DB',WARNING, $db_type); + return false; + } + + $loop_arr = array(); + switch ($db_type) { + + case 'MYSQL': + if (get_resource_type($result) != 'mysql result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = mysql_fetch_assoc($result)) { + $loop_arr[] = $r; + } + break; + + case 'POSTGRESQL': + if (get_resource_type($result) != 'pgsql result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + + $nr = (function_exists('pg_num_rows')) ? pg_num_rows($result) : pg_numrows($result); + + for ($i=0; $i < $nr; $i++) { + $loop_arr[] = pg_fetch_array($result, $i, PGSQL_ASSOC); + } + break; + + case 'INFORMIX': + if (!$result) { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = ifx_fetch_row($result, 'NEXT')) { + $loop_arr[] = $r; + } + break; + + case 'INTERBASE': + if (get_resource_type($result) != 'interbase result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = ibase_fetch_row($result)) { + $loop_arr[] = $r; + } + break; + + case 'INGRES': + if (!$result) { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = ingres_fetch_array(INGRES_ASSOC, $result)) { + $loop_arr[] = $r; + } + break; + + case 'MSSQL': + if (get_resource_type($result) != 'mssql result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = mssql_fetch_array($result)) { + $loop_arr[] = $r; + } + break; + + case 'MSQL': + if (get_resource_type($result) != 'msql result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while($r = msql_fetch_array($result, MSQL_ASSOC)) { + $loop_arr[] = $r; + } + break; + + case 'OCI8': + if (get_resource_type($result) != 'oci8 statement') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while(OCIFetchInto($result, &$r, OCI_ASSOC+OCI_RETURN_LOBS)) { + $loop_arr[] = $r; + } + break; + + case 'ORACLE': + if (get_resource_type($result) != 'oracle Cursor') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while(ora_fetch_into($result, &$r, ORA_FETCHINTO_ASSOC)) { + $loop_arr[] = $r; + } + break; + + case 'OVRIMOS': + if (!$result) { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + while(ovrimos_fetch_into($result, &$r, 'NEXT')) { + $loop_arr[] = $r; + } + break; + + case 'SYBASE': + if (get_resource_type($result) != 'sybase-db result') { + vlibTemplateError::raiseError('VT_WARNING_INVALID_RESOURCE',WARNING, $db_type); + return false; + } + + while($r = sybase_fetch_array($result)) { + $loop_arr[] = $r; + } + break; + } + $this->setLoop($loopname, $loop_arr); + return true; + */ + } + + /** + * FUNCTION: newLoop + * + * Sets the name for the curent loop in the 3 step loop process. + * + * @param string $name string to define loop name + * @return boolean true/false + * @access public + */ + function newLoop ($loopname) { + if (preg_match('/^[a-z_]+[a-z0-9_]*$/i', $loopname)) { + $this->_currloopname[$loopname] = $loopname; + $this->_currloop[$loopname] = array(); + return true; + } + else { + return false; + } + } + + /** + * FUNCTION: addRow + * + * Adds a row to the current loop in the 3 step loop process. + * + * @param array $row loop row to add to current loop + * @param string $loopname loop to which you want to add row, if not set will use last loop set using newLoop(). + * @return boolean true/false + * @access public + */ + function addRow ($row, $loopname=null) { + if (!$loopname) $loopname = $this->_currloopname[(count($this->_currloopname)-1)]; + + if (!isset($this->_currloop[$loopname]) || empty($this->_currloopname)) { + vlibTemplateError::raiseError('VT_WARNING_LOOP_NOT_SET',WARNING); + return false; + } + if (is_array($row)) { + $this->_currloop[$loopname][] = $row; + return true; + } + else { + return false; + } + } + + /** + * FUNCTION: addLoop + * + * Completes the 3 step loop process. This assigns the rows and resets + * the variables used. + * + * @param string $loopname to commit loop. If not set, will use last loopname set using newLoop() + * @return boolean true/false + * @access public + */ + function addLoop ($loopname=null) { + if ($loopname == null) { // add last loop used + if (!empty($this->_currloop)) { + foreach ($this->_currloop as $k => $v) { + $this->setLoop($k, $v); + unset($this->_currloop[$k]); + } + $this->_currloopname = array(); + return true; + } + else { + return false; + } + } + elseif (!isset($this->_currloop[$loopname]) || empty($this->_currloopname)) { // newLoop not yet envoked + vlibTemplateError::raiseError('VT_WARNING_LOOP_NOT_SET',WARNING); + return false; + } + else { // add a specific loop + $this->setLoop($loopname, $this->_currloop[$loopname]); + unset($this->_currloopname[$loopname], $this->_currloop[$loopname]); + } + return true; + } + + /** + * FUNCTION: unsetLoop + * + * Unsets a loop which has already been set. + * Can only unset top level loops. + * + * @param string loop to remove use: vlibTemplate::unsetLoop(loop[, loop..]) + * @return boolean true/false returns true unless called with 0 params + * @access public + */ + function unsetLoop () { + $num_args = func_num_args(); + if ($num_args < 1) return false; + + for ($i = 0; $i < $num_args; $i++) { + $var = func_get_arg($i); + if ($this->OPTIONS['CASELESS']) $var = strtolower($var); + if (!preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $var)) continue; + unset($this->_arrvars[$var]); + } + return true; + } + + + /** + * FUNCTION: reset + * + * Resets the vlibTemplate object. After using vlibTemplate::reset() you must + * use vlibTemplate::newTemplate(tmpl) to reuse, not passing in the options array. + * + * @return boolean true + * @access public + */ + function reset () { + $this->clearVars(); + $this->clearLoops(); + $this->_tmplfilename = null; + $this->_tmplfile = null; + $this->_tmplfilep = null; + $this->_tmploutput = null; + $this->_parsed = false; + $this->_unknowns = array(); + $this->_firstparsetime = null; + $this->_totalparsetime = null; + $this->_currloopname = null; + $this->_currloop = array(); + return true; + } + + /** + * FUNCTION: clearVars + * + * Unsets all variables in the template + * + * @return boolean true + * @access public + */ + function clearVars () { + $this->_vars = array(); + return true; + } + + /** + * FUNCTION: clearLoops + * + * Unsets all loops in the template + * + * @return boolean true + * @access public + */ + function clearLoops () { + $this->_arrvars = array(); + $this->_currloopname = null; + $this->_currloop = array(); + return true; + } + + /** + * FUNCTION: clearAll + * + * Unsets all variables and loops set using setVar/Loop() + * + * @return boolean true + * @access public + */ + function clearAll () { + $this->clearVars(); + $this->clearLoops(); + return true; + } + + /** + * FUNCTION: unknownsExist + * + * Returns true if unknowns were found after parsing. + * Function MUST be called AFTER one of the parsing functions to have any relevance. + * + * @return boolean true/false + * @access public + */ + function unknownsExist () { + return (!empty($this->_unknowns)); + } + + /** + * FUNCTION: unknowns + * + * Alias for unknownsExist. + * + * @access public + */ + function unknowns () { + return $this->unknownsExist(); + } + + /** + * FUNCTION: getUnknowns + * + * Returns an array of all unknown vars found when parsing. + * This function is only relevant after parsing a document. + * + * @return array + * @access public + */ + function getUnknowns () { + return $this->_unknowns; + } + + /** + * FUNCTION: setUnknowns + * + * Sets how you want to handle variables that were found in the + * template but not set in vlibTemplate using vlibTemplate::setVar(). + * + * @param string $arg ignore, remove, print, leave or comment + * @return boolean + * @access public + */ + function setUnknowns ($arg) { + $arg = strtolower(trim($arg)); + if (preg_match('/^ignore|remove|print|leave|comment$/', $arg)) { + $this->OPTIONS['UNKNOWNS'] = $arg; + return true; + } + return false; + } + + /** + * FUNCTION: setPath + * + * function sets the paths to use when including files. + * Use of this function: vlibTemplate::setPath(string path [, string path, ..]); + * i.e. if $tmpl is your template object do: $tmpl->setPath('/web/htdocs/templates','/web/htdocs/www'); + * with as many paths as you like. + * if this function is called without any arguments, it will just delete any previously set paths. + * + * @param string path (mulitple) + * @return bool success + * @access public + */ + function setPath () { + $num_args = func_num_args(); + if ($num_args < 1) { + $this->OPTIONS['INCLUDE_PATHS'] = array(); + return true; + } + for ($i = 0; $i < $num_args; $i++) { + $thispath = func_get_arg($i); + array_push($this->OPTIONS['INCLUDE_PATHS'], realpath($thispath)); + } + return true; + } + + /** + * FUNCTION: getParseTime + * + * After using one of the parse functions, this will allow you + * access the time taken to parse the template. + * see OPTION 'TIME_PARSE'. + * + * @return float time taken to parse template + * @access public + */ + function getParseTime () { + if ($this->OPTIONS['TIME_PARSE'] && $this->_parsed) { + return $this->_totalparsetime; + } + return false; + } + + + /** + * FUNCTION: fastPrint + * + * Identical to pparse() except that it uses output buffering w/ gz compression thus + * printing the output directly and compressed if poss. + * Will possibly if parsing a huge template. + * + * @access public + * @return boolean true/false + */ + function fastPrint () { + $ret = $this->_parse('ob_gzhandler'); + print($this->_tmploutput); + return $ret; + } + + + /** + * FUNCTION: pparse + * + * Calls parse, and then prints out $this->_tmploutput + * + * @access public + * @return boolean true/false + */ + function pparse () { + if (!$this->_parsed) $this->_parse(); + print($this->_tmploutput); + return true; + } + + /** + * FUNCTION: pprint + * + * Alias for pparse() + * + * @access public + */ + function pprint () { + return $this->pparse(); + } + + + /** + * FUNCTION: grab + * + * Returns the parsed output, ready for printing, passing to mail() ...etc. + * Invokes $this->_parse() if template has not yet been parsed. + * + * @access public + * @return boolean true/false + */ + function grab () { + if (!$this->_parsed) $this->_parse(); + return $this->_tmploutput; + } + + /*-----------------------------------------------------------------------------\ + | private functions | + \-----------------------------------------------------------------------------*/ + + /** + * FUNCTION: vlibTemplate + * + * vlibTemplate constructor. + * if $tmplfile has been passed to it, it will send to $this->newTemplate() + * + * @param string $tmplfile full path to template file + * @param array $options see above + * @return boolean true/false + * @access private + */ + function tpl ($tmplfile=null, $options=null) { + if (is_array($tmplfile) && $options == null) { + $options = $tmplfile; + unset($tmplfile); + } + + $this->VLIBTEMPLATE_ROOT = dirname(realpath(__FILE__)); + + if (is_array(vlibIni::vlibTemplate())) { + foreach (vlibIni::vlibTemplate() as $name => $val) { + $this->OPTIONS[$name] = $val; + } + } + + if (is_array($options)) { + foreach($options as $key => $val) { + $key = strtoupper($key); + if ($key == 'PATH') { + $this->setPath($val); + } + else { + $this->_setOption($key, strtolower($val)); + } + } + } + if($tmplfile) $this->newTemplate($tmplfile); + if ($this->OPTIONS['GLOBAL_CONTEXT_VARS']) $this->setContextVars(); + return true; + } + + /** FUNCTION: _getData + * + * function returns the text from the file, or if we're using cache, the text + * from the cache file. MUST RETURN DATA. + * @param string tmplfile contains path to template file + * @param do_eval used for included files. If set then this function must do the eval()'ing. + * @access private + * @return mixed data/string or boolean + */ + function _getData ($tmplfile, $do_eval=false) { + //check the current file depth + if ($this->_includedepth > $this->OPTIONS['MAX_INCLUDES'] || $tmplfile == false) { + return; + } + else { + if ($this->_debug) array_push ($this->_debugIncludedfiles, $tmplfile); + if ($do_eval) { + array_push($this->_currentincludedir, dirname($tmplfile)); + $this->_includedepth++; + } + } + + + if($this->_cache && $this->_checkCache($tmplfile)) { // cache exists so lets use it + $data = fread($fp = fopen($this->_cachefile, 'r'), filesize($this->_cachefile)); + fclose($fp); + } + else { // no cache lets parse the file + $data = fread($fp = fopen($tmplfile, 'r'), filesize($tmplfile)); + fclose($fp); + + $regex = '/(<|<\/|{|{\/|){1}'; + $regex.= '/ie'; + //$regex.= '([\r\n|\n|\r])?/ie'; + $data = preg_replace($regex,"\$this->_parseTag(array('\\0','\\1','\\2','\\3','\\4','\\5','\\6','\\7','\\8','\\9'));",$data); + + if ($this->_cache) { // add cache if need be + $this->_createCache($data); + } + } + + // now we must parse the $data and check for any 's + if ($this->_debug) $this->doDebugWarnings(file($tmplfile), $tmplfile); + + if ($do_eval) { + $success = @eval('?>'.$data.'_includedepth--; + array_pop($this->_currentincludedir); + return $success; + } + else { + return $data; + } + + } + + /** + * FUNCTION: _fileSearch + * + * Searches for all possible instances of file { $file } + * + * @param string $file path of file we're looking for + * @access private + * @return mixed fullpath to file or boolean false + */ + function _fileSearch ($file) { + $filename = basename($file); + $filepath = dirname($file); + + // check fullpath first.. + $fullpath = $filepath.'/'.$filename; + if (is_file($fullpath)) return $fullpath; + + // ..then check for relative path for current directory.. + if (!empty($this->_currentincludedir)) { + $currdir = $this->_currentincludedir[(count($this->_currentincludedir) -1)]; + $relativepath = realpath($currdir.'/'.$filepath.'/'.$filename); + if (is_file($relativepath)) { + array_push ($this->_currentincludedir, dirname($relativepath)); + return $relativepath; + } + } + + // ..then check for relative path for all additional given paths.. + if (!empty($this->OPTIONS['INCLUDE_PATHS'])) { + foreach ($this->OPTIONS['INCLUDE_PATHS'] as $currdir) { + $relativepath = realpath($currdir.'/'.$filepath.'/'.$filename); + if (is_file($relativepath)) { + return $relativepath; + } + } + } + + // ..then check path from TEMPLATE_DIR.. + if (!empty($this->OPTIONS['TEMPLATE_DIR'])) { + $fullpath = realpath($this->OPTIONS['TEMPLATE_DIR'].'/'.$filepath.'/'.$filename); + if (is_file($fullpath)) return $fullpath; + } + + // ..then check relative path from executing php script.. + $fullpath = realpath($filepath.'/'.$filename); + if (is_file($fullpath)) return $fullpath; + + // ..then check path from template file. + if (!empty($this->VLIBTEMPLATE_ROOT)) { + $fullpath = realpath($this->VLIBTEMPLATE_ROOT.'/'.$filepath.'/'.$filename); + if (is_file($fullpath)) return $fullpath; + } + + return false; // uh oh, file not found + } + + /** + * FUNCTION: _arrayBuild + * + * Modifies the array $arr to add Template variables, __FIRST__, __LAST__ ..etc + * if $this->OPTIONS['LOOP_CONTEXT_VARS'] is true. + * Used by $this->setloop(). + * + * @param array $arr + * @return array new look array + * @access private + */ + function _arrayBuild ($arr) { + if (is_array($arr) && !empty($arr)) { + $arr = array_values($arr); // to prevent problems w/ non sequential arrays + for ($i = 0; $i < count($arr); $i++) { + if(!is_array($arr[$i])) return false; + foreach ($arr[$i] as $k => $v) { + unset($arr[$i][$k]); + if ($this->OPTIONS['CASELESS']) $k = strtolower($k); + if (preg_match('/^[0-9]+$/', $k)) $k = '_'.$k; + + if (is_array($v)) { + if (($arr[$i][$k] = $this->_arrayBuild($v)) == false) return false; + } + else { // reinsert the var + $arr[$i][$k] = $v; + } + } + if ($this->OPTIONS['LOOP_CONTEXT_VARS']) { + if ($i == 0) $arr[$i]['__FIRST__'] = true; + if (($i + 1) == count($arr)) $arr[$i]['__LAST__'] = true; + if ($i != 0 && (($i + 1) < count($arr))) $arr[$i]['__INNER__'] = true; + if (is_int(($i+1) / 2)) $arr[$i]['__EVEN__'] = true; + if (!is_int(($i+1) / 2)) $arr[$i]['__ODD__'] = true; + $arr[$i]['__ROWNUM__'] = ($i + 1); + } + } + return $arr; + } + elseif (empty($arr)) { + return true; + } + } + + /** + * FUNCTION: _parseIf + * returns a string used for parsing in tmpl_if statements. + * + * @param string $varname + * @param string $value + * @param string $op + * @param string $namespace current namespace + * @access private + * @return string used for eval'ing + */ + function _parseIf ($varname, $value=null, $op=null, $namespace=null) { + if (isset($namespace)) $namespace = substr($namespace, 0, -1); + $comp_str = ''; // used for extended if statements + + // work out what to put on the end id value="whatever" is used + if (isset($value)) { + + // add the correct operator depending on whether it's been specified or not + if (!empty($op)) { + if (in_array($op, $this->allowed_if_ops)) { + $comp_str .= $op; + } + else { + vlibTemplateError::raiseError('VT_WARNING_INVALID_IF_OP', WARNING, $op); + } + } + else { + $comp_str .= '=='; + } + + // now we add the value, if it's numeric, then we leave the quotes off + if (is_numeric($value)) { + $comp_str .= $value; + } + else { + $comp_str .= '\''.$value.'\''; + } + } + + if (count($this->_namespace) == 0 || $namespace == 'global') return '$this->_vars[\''.$varname.'\']'.$comp_str; + $retstr = '$this->_arrvars'; + $numnamespaces = count($this->_namespace); + for ($i=0; $i < $numnamespaces; $i++) { + if ($this->_namespace[$i] == $namespace || (($i + 1) == $numnamespaces && !empty($namespace))) { + $retstr .= "['".$namespace."'][\$_".$i."]"; + break 1; + } + else { + $retstr .= "['".$this->_namespace[$i]."'][\$_".$i."]"; + } + } + if ($this->OPTIONS['GLOBAL_VARS'] && empty($namespace)) { + return '(('.$retstr.'[\''.$varname.'\'] !== null) ? '.$retstr.'[\''.$varname.'\'] : $this->_vars[\''.$varname.'\'])'.$comp_str; + } + else { + return $retstr."['".$varname."']".$comp_str; + } + } + + + /** + * FUNCTION: _parseLoop + * returns a string used for parsing in tmpl_loop statements. + * + * @param string $varname + * @access private + * @return string used for eval'ing + */ + function _parseLoop ($varname) { + array_push($this->_namespace, $varname); + $tempvar = count($this->_namespace) - 1; + $retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < count(\$this->_arrvars"; + for ($i=0; $i < count($this->_namespace); $i++) { + $retstr .= "['".$this->_namespace[$i]."']"; + if ($this->_namespace[$i] != $varname) $retstr .= "[\$_".$i."]"; + } + return $retstr."); \$_".$tempvar."++) {"; + } + + /** + * FUNCTION: _parseVar + * + * returns a string used for parsing in tmpl_var statements. + * + * @param string $wholetag + * @param string $tag + * @param string $varname + * @param string $escape + * @param string $format + * @param string $namespace + * @access private + * @return string used for eval'ing + */ + function _parseVar ($wholetag, $tag, $varname, $escape, $format, $namespace) { + if (!empty($namespace)) $namespace = substr($namespace, 0, -1); + $wholetag = stripslashes($wholetag); + + if (count($this->_namespace) == 0 || $namespace == 'global') { + $var1 = '$this->_vars[\''.$varname.'\']'; + } + else { + $var1build = "\$this->_arrvars"; + $numnamespaces = count($this->_namespace); + for ($i=0; $i < $numnamespaces; $i++) { + if ($this->_namespace[$i] == $namespace || (($i + 1) == $numnamespaces && !empty($namespace))) { + $var1build .= "['".$namespace."'][\$_".$i."]"; + break 1; + } + else { + $var1build .= "['".$this->_namespace[$i]."'][\$_".$i."]"; + } + } + $var1 = $var1build . "['$varname']"; + if ($this->OPTIONS['GLOBAL_VARS'] && empty($namespace)) { + $var2 = '$this->_vars[\''.$varname.'\']'; + } + } + + $beforevar = ''; + $aftervar = ''; + if (!empty($escape)&& isset($this->ESCAPE_TAGS[$escape])) { + $beforevar .= $this->ESCAPE_TAGS[$escape]['open']; + $aftervar = $this->ESCAPE_TAGS[$escape]['close'] . $aftervar; + } + + if (!empty($format)&& isset($this->FORMAT_TAGS[$format])) { + $beforevar .= $this->FORMAT_TAGS[$format]['open']; + $aftervar = $this->FORMAT_TAGS[$format]['close'] . $aftervar; + } + + // build return values + $retstr = 'if ('.$var1.' !== null) { '; + $retstr .= 'print('.$beforevar.$var1.$aftervar.'); '; + $retstr .= '}'; + + if (@$var2) { + $retstr .= ' elseif ('.$var2.' !== null) { '; + $retstr .= 'print('.$beforevar.$var2.$aftervar.'); '; + $retstr .= '}'; + } + + switch (strtolower($this->OPTIONS['UNKNOWNS'])) { + case 'comment': + $comment = addcslashes('/', '', $wholetag).'//-->', '"'); + $retstr .= ' else { print("'.$comment.'"); $this->_setUnknown("'.$varname.'"); }'; + return $retstr; + break; + case 'leave': + $retstr .= ' else { print("'.addcslashes($wholetag, '"').'"); $this->_setUnknown("'.$varname.'"); }'; + return $retstr; + break; + case 'print': + $retstr .= ' else { print("'.htmlspecialchars($wholetag, ENT_QUOTES).'"); $this->_setUnknown("'.$varname.'"); }'; + return $retstr; + break; + + case 'ignore': + return $retstr; + break; + case 'remove': + default: + $retstr .= ' else { $this->_setUnknown("'.$varname.'"); }'; + return $retstr; + break; + } + } + + /** + * FUNCTION: _parseTag + * takes values from preg_replace in $this->_intparse() and determines + * the replace string. + * + * @param array $args array of all matches found by preg_replace + * @access private + * @return string replace values + */ + function _parseTag ($args) { + $wholetag = $args[0]; + $openclose = $args[1]; + $tag = strtolower($args[2]); + $newline = $args[9]; + //echo "1#$newline#2"; + + if ($tag == 'else') return ''.$newline; + if ($tag == 'tmpl_include') return $wholetag; // ignore tmpl_include tags + + if (preg_match("/^<\/|{\/| MYSQL: "utf-8" --> "utf8", "iso-8859-1" --> "latin1") + +define("DB_TYPE",$conf["db_type"]); +define("DB_HOST",$conf["db_host"]); +define("DB_DATABASE",$conf["db_database"]); +define("DB_USER",$conf["db_user"]); +define("DB_PASSWORD",$conf["db_password"]); +define("DB_CHARSET",$conf["db_charset"]); + + +//** Database settings for the master DB. This setting is only used in multiserver setups +$conf["dbmaster_type"] = 'mysql'; +$conf["dbmaster_host"] = ''; +$conf["dbmaster_database"] = 'dbispconfig'; +$conf["dbmaster_user"] = ''; +$conf["dbmaster_password"] = '1c70c5d027ce02c30afb43fd39f9015a'; + + +//** Paths +define('ISPC_ROOT_PATH', realpath(dirname(__FILE__).'/../')); // The main ROOT is the parent directory to this file, ie Interface/. NO trailing slashes. +define('ISPC_LIB_PATH', ISPC_ROOT_PATH.'/lib'); +define('ISPC_CLASS_PATH', ISPC_ROOT_PATH.'/lib/classes'); +define('ISPC_WEB_PATH', ISPC_ROOT_PATH.'/web'); +define('ISPC_THEMES_PATH', ISPC_ROOT_PATH.'/web/themes'); +define('ISPC_WEB_TEMP_PATH', ISPC_WEB_PATH.'/temp'); // Path for downloads, accessible via browser +define('ISPC_CACHE_PATH', ISPC_ROOT_PATH.'/cache'); + +//** Paths (Do not change!) +$conf["rootpath"] = substr(dirname(__FILE__),0,-4); +$conf["fs_div"] = "/"; // File system divider, "\\" on windows and "/"" on linux and unix +$conf["classpath"] = $conf["rootpath"].$conf["fs_div"]."lib".$conf["fs_div"]."classes"; +$conf["temppath"] = $conf["rootpath"].$conf["fs_div"]."temp"; + +define("FS_DIV",$conf["fs_div"]); +define("SERVER_ROOT",$conf["rootpath"]); +define("INCLUDE_ROOT",SERVER_ROOT.FS_DIV."lib"); +define("CLASSES_ROOT",INCLUDE_ROOT.FS_DIV."classes"); + + +//** Server +$conf['app_title'] = ISPC_APP_TITLE; +$conf['app_version'] = ISPC_APP_VERSION; +$conf['app_link'] = 'http://www.ispconfig.org/'; +$conf['modules_available'] = 'admin,mail,sites,monitor,client,dns,help'; +$conf["server_id"] = "1"; + + +//** Interface +define('ISPC_INTERFACE_MODULES_ENABLED', 'mail,sites,dns,tools'); + + +//** Logging +$conf["log_file"] = '/var/log/ispconfig/ispconfig.log'; +$conf["log_priority"] = 2; // 0 = Debug, 1 = Warning, 2 = Error + + +//** Allow software package installations +$conf['software_updates_enabled'] = false; + + +//** Themes +$conf["theme"] = 'default'; +$conf["html_content_encoding"] = 'utf-8'; // example: utf-8, iso-8859-1, ... +$conf["logo"] = 'themes/default/images/ispc_logo.png'; + + +//** Default Language +$conf["language"] = 'en'; +$conf["debug_language"] = false; + + +//** Misc. +$conf["interface_logout_url"] = ""; // example: http://www.domain.tld/ + + +//** Auto Load Modules +$conf["start_db"] = true; +$conf["start_session"] = true; + + +//** Constants +define("LOGLEVEL_DEBUG",0); +define("LOGLEVEL_WARN",1); +define("LOGLEVEL_ERROR",2); + +?> diff --git a/interface/ispconfig/server/lib/mysql_clientdb.conf b/interface/ispconfig/server/lib/mysql_clientdb.conf new file mode 100644 index 000000000..b89c5079f --- /dev/null +++ b/interface/ispconfig/server/lib/mysql_clientdb.conf @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/client_module.inc.php b/interface/ispconfig/server/mods-available/client_module.inc.php new file mode 100644 index 000000000..4d46f114e --- /dev/null +++ b/interface/ispconfig/server/mods-available/client_module.inc.php @@ -0,0 +1,96 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('client',$this->module_name,'process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'client': + if($action == 'i') $app->plugins->raiseEvent('client_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('client_update',$data); + if($action == 'd') $app->plugins->raiseEvent('client_delete',$data); + break; + } // end switch + } // end function + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/cron_module.inc.php b/interface/ispconfig/server/mods-available/cron_module.inc.php new file mode 100644 index 000000000..503d7ef7c --- /dev/null +++ b/interface/ispconfig/server/mods-available/cron_module.inc.php @@ -0,0 +1,97 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('cron',$this->module_name,'process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'cron': + if($action == 'i') $app->plugins->raiseEvent('cron_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('cron_update',$data); + if($action == 'd') $app->plugins->raiseEvent('cron_delete',$data); + break; + } // end switch + } // end function + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/database_module.inc.php b/interface/ispconfig/server/mods-available/database_module.inc.php new file mode 100644 index 000000000..2dac689ee --- /dev/null +++ b/interface/ispconfig/server/mods-available/database_module.inc.php @@ -0,0 +1,103 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('web_database','database_module','process'); + + // Register service + //$app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'web_database': + if($action == 'i') $app->plugins->raiseEvent('database_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('database_update',$data); + if($action == 'd') $app->plugins->raiseEvent('database_delete',$data); + break; + } // end switch + } // end function + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/dns_module.inc.php b/interface/ispconfig/server/mods-available/dns_module.inc.php new file mode 100644 index 000000000..17c36bd26 --- /dev/null +++ b/interface/ispconfig/server/mods-available/dns_module.inc.php @@ -0,0 +1,128 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('dns_soa',$this->module_name,'process'); + $app->modules->registerTableHook('dns_rr',$this->module_name,'process'); + + + // Register service + $app->services->registerService('bind','dns_module','restartBind'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'dns_soa': + if($action == 'i') $app->plugins->raiseEvent('dns_soa_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('dns_soa_update',$data); + if($action == 'd') $app->plugins->raiseEvent('dns_soa_delete',$data); + break; + case 'dns_rr': + if($action == 'i') $app->plugins->raiseEvent('dns_rr_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('dns_rr_update',$data); + if($action == 'd') $app->plugins->raiseEvent('dns_rr_delete',$data); + break; + } // end switch + } // end function + + + function restartBind($action = 'restart') { + global $app; + + $command = ''; + if(is_file('/etc/init.d/bind9')) { + $command = '/etc/init.d/bind9'; + } else { + $command = '/etc/init.d/named'; + } + + if($action == 'restart') { + exec($command.' restart'); + } else { + exec($command.' reload'); + } + + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/mail_module.inc.php b/interface/ispconfig/server/mods-available/mail_module.inc.php new file mode 100644 index 000000000..d0c33f2ae --- /dev/null +++ b/interface/ispconfig/server/mods-available/mail_module.inc.php @@ -0,0 +1,153 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('mail_access','mail_module','process'); + $app->modules->registerTableHook('mail_domain','mail_module','process'); + $app->modules->registerTableHook('mail_forwarding','mail_module','process'); + $app->modules->registerTableHook('mail_transport','mail_module','process'); + $app->modules->registerTableHook('mail_user','mail_module','process'); + $app->modules->registerTableHook('mail_get','mail_module','process'); + $app->modules->registerTableHook('mail_content_filter','mail_module','process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'mail_access': + if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data); + break; + case 'mail_domain': + if($action == 'i') $app->plugins->raiseEvent('mail_domain_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_domain_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_domain_delete',$data); + break; + case 'mail_forwarding': + if($action == 'i') $app->plugins->raiseEvent('mail_forwarding_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_forwarding_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_forwarding_delete',$data); + break; + case 'mail_transport': + if($action == 'i') $app->plugins->raiseEvent('mail_transport_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_transport_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_transport_delete',$data); + break; + case 'mail_user': + if($action == 'i') $app->plugins->raiseEvent('mail_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_user_delete',$data); + break; + case 'mail_get': + if($action == 'i') $app->plugins->raiseEvent('mail_get_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_get_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_get_delete',$data); + break; + case 'mail_content_filter': + if($action == 'i') $app->plugins->raiseEvent('mail_content_filter_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_content_filter_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_content_filter_delete',$data); + break; + } // end switch + } // end function + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/monitor_core_module.inc.php b/interface/ispconfig/server/mods-available/monitor_core_module.inc.php new file mode 100644 index 000000000..8447baee3 --- /dev/null +++ b/interface/ispconfig/server/mods-available/monitor_core_module.inc.php @@ -0,0 +1,1465 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + /* none at them moment */ + //$app->modules->registerTableHook('mail_access','mail_module','process'); + + /* + Do the monitor every n minutes and write the result in the db + */ + $min = date('i'); + if (($min % $this->interval) == 0) + { + $this->doMonitor(); + } + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + function process($tablename, $action, $data) { + // global $app; + // + // switch ($tablename) { + // case 'mail_access': + // if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data); + // if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data); + // if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data); + // break; + // } // end switch + } // end function + + /* + This method is called every n minutes, when the module ist loaded. + The method then does a system-monitoring + */ + // TODO: what monitoring is done should be a config-var + function doMonitor() + { + /* Calls the single Monitoring steps */ + $this->monitorServer(); + $this->monitorDiskUsage(); + $this->monitorMemUsage(); + $this->monitorCpu(); + $this->monitorServices(); + $this->monitorMailLog(); + $this->monitorMailWarnLog(); + $this->monitorMailErrLog(); + $this->monitorMessagesLog(); + $this->monitorISPCCronLog(); + $this->monitorFreshClamLog(); + $this->monitorClamAvLog(); + $this->monitorIspConfigLog(); + $this->monitorSystemUpdate(); + $this->monitorMailQueue(); + $this->monitorRaid(); + $this->monitorRkHunter(); + $this->monitorFail2ban(); + $this->monitorSysLog(); + } + + function monitorServer(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'server_load'; + + /* + Fetch the data into a array + */ + $procUptime = shell_exec("cat /proc/uptime | cut -f1 -d' '"); + $data['up_days'] = floor($procUptime/86400); + $data['up_hours'] = floor(($procUptime-$data['up_days']*86400)/3600); + $data['up_minutes'] = floor(($procUptime-$data['up_days']*86400-$data['up_hours']*3600)/60); + + $data['uptime'] = shell_exec("uptime"); + + $tmp = explode(",", $data['uptime'], 4); + $tmpUser = explode(" ", trim($tmp[2])); + $data['user_online'] = intval($tmpUser[0]); + + /* Old Load Average Code + $loadTmp = explode(":" , trim($tmp[3])); + $load = explode(",", $loadTmp[1]); + $data['load_1'] = floatval(trim($load[0])); + $data['load_5'] = floatval(trim($load[1])); + $data['load_15'] = floatval(trim($load[2])); */ + + //* New Load Average code to fix "always zero" bug in non-english distros. NEEDS TESTING + $loadTmp = shell_exec("cat /proc/loadavg | cut -f1-3 -d' '"); + $load = explode(" ", $loadTmp); + $data['load_1'] = floatval(str_replace(',', '.', $load[0])); + $data['load_5'] = floatval(str_replace(',', '.', $load[1])); + $data['load_15'] = floatval(str_replace(',', '.', $load[2])); + + /** The state of the server-load. */ + $state = 'ok'; + if ($data['load_1'] > 20 ) $state = 'info'; + if ($data['load_1'] > 50 ) $state = 'warning'; + if ($data['load_1'] > 100 ) $state = 'critical'; + if ($data['load_1'] > 150 ) $state = 'error'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorDiskUsage() { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'disk_usage'; + + /** The state of the disk-usage */ + $state = 'ok'; + + /** Fetch the data of ALL devices into a array (needed for monitoring!)*/ + $dfData = shell_exec("df -hT"); + + // split into array + $df = explode("\n", $dfData); + + /* + * ignore the first line, process the rest + */ + for($i=1; $i <= sizeof($df); $i++){ + if ($df[$i] != '') + { + /* + * Make a array of the data + */ + $s = preg_split ("/[\s]+/", $df[$i]); + $data[$i]['fs'] = $s[0]; + $data[$i]['type'] = $s[1]; + $data[$i]['size'] = $s[2]; + $data[$i]['used'] = $s[3]; + $data[$i]['available'] = $s[4]; + $data[$i]['percent'] = $s[5]; + $data[$i]['mounted'] = $s[6]; + /* + * calculate the state + */ + $usePercent = floatval($data[$i]['percent']); + + //* We dont want to check the cdrom drive as a cd / dvd is always 100% full + if($data[$i]['type'] != 'iso9660' && $data[$i]['type'] != 'cramfs' && $data[$i]['type'] != 'udf') { + if ($usePercent > 75) $state = $this->_setState($state, 'info'); + if ($usePercent > 80) $state = $this->_setState($state, 'warning'); + if ($usePercent > 90) $state = $this->_setState($state, 'critical'); + if ($usePercent > 95) $state = $this->_setState($state, 'error'); + } + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMemUsage() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mem_usage'; + + /* + Fetch the data into a array + */ + $miData = shell_exec("cat /proc/meminfo"); + + $memInfo = explode("\n", $miData); + + foreach($memInfo as $line){ + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $tmp = explode(" ", trim($part[1])); + $value = 0; + if ($tmp[1] == 'kB') $value = $tmp[0] * 1024; + $data[$key] = $value; + } + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorCpu() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'cpu_info'; + + /* + Fetch the data into a array + */ + $cpuData = shell_exec("cat /proc/cpuinfo"); + $cpuInfo = explode("\n", $cpuData); + $processor = 0; + + foreach($cpuInfo as $line){ + + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $value = trim($part[1]); + if($key == 'processor') $processor = intval($value); + if($key != '') $data[$key.' '.$processor] = $value; + } + + /* the cpu has no state. It is, what it is */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorServices() + { + global $app; + global $conf; + + /** the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** get the "active" Services of the server from the DB */ + $services = $app->dbmaster->queryOneRecord("SELECT * FROM server WHERE server_id = " . $server_id); + + /* The type of the Monitor-data */ + $type = 'services'; + + /** the State of the monitoring */ + /* ok, if ALL aktive services are running, + * error, if not + * There is no other state! + */ + $state = 'ok'; + + /* Monitor Webserver */ + $data['webserver'] = -1; // unknown - not needed + if ($services['web_server'] == 1) + { + if($this->_checkTcp('localhost', 80)) { + $data['webserver'] = 1; + } else { + $data['webserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor FTP-Server */ + $data['ftpserver'] = -1; // unknown - not needed + if ($services['file_server'] == 1) + { + if($this->_checkFtp('localhost', 21)) { + $data['ftpserver'] = 1; + } else { + $data['ftpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor SMTP-Server */ + $data['smtpserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 25)) { + $data['smtpserver'] = 1; + } else { + $data['smtpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor POP3-Server */ + $data['pop3server'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 110)) { + $data['pop3server'] = 1; + } else { + $data['pop3server'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor IMAP-Server */ + $data['imapserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 143)) { + $data['imapserver'] = 1; + } else { + $data['imapserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor BIND-Server */ + $data['bindserver'] = -1; // unknown - not needed + if ($services['dns_server'] == 1) + { + if($this->_checkTcp('localhost', 53)) { + $data['bindserver'] = 1; + } else { + $data['bindserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor MYSQL-Server */ + $data['mysqlserver'] = -1; // unknown - not needed + if ($services['db_server'] == 1) + { + if($this->_checkTcp('localhost', 3306)) { + $data['mysqlserver'] = 1; + } else { + $data['mysqlserver'] = 0; + $state = 'error'; // because service is down + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorSystemUpdate(){ + /* + * This monitoring is expensive, so do it only once a hour + */ + $min = date('i'); + if ($min != 0) return; + + /* + * OK - here we go... + */ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'system_update'; + + /* This monitoring is only available at debian or Ubuntu */ + if(file_exists('/etc/debian_version')){ + + /* + * first update the "update-database" + */ + shell_exec('apt-get update'); + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $aptData = shell_exec('apt-get -s -qq dist-upgrade'); + if ($aptData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('apt-get -s -q dist-upgrade'); + } + elseif (file_exists("/etc/gentoo-release")) { + + /* + * first update the portage tree + */ + + // In keeping with gentoo's rsync policy, don't update to frequently (every four hours - taken from http://www.gentoo.org/doc/en/source_mirrors.xml) + $do_update = true; + if (file_exists('/usr/portage/metadata/timestamp.chk')) + { + $datetime = file_get_contents('/usr/portage/metadata/timestamp.chk'); + $datetime = trim($datetime); + + $dstamp = strtotime($datetime); + if ($dstamp) + { + $checkat = $dstamp + 14400; // + 4hours + if (mktime() < $checkat) { + $do_update = false; + } + } + } + + if ($do_update) { + shell_exec('emerge --sync --quiet'); + } + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $emergeData = shell_exec('emerge -puDNt --color n --nospinner --quiet world'); + if ($emergeData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('emerge -pvuDNt --color n --nospinner world'); + } + else { + /* + * It is not debian/Ubuntu, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorMailQueue(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mailq'; + + /* Get the data from the mailq */ + $data['output'] = shell_exec('mailq'); + + /* + * The last line has more informations + */ + $tmp = explode("\n", $data['output']); + $more = $tmp[sizeof($tmp) - 1]; + $this->_getIntArray($more); + $data['bytes'] = $res[0]; + $data['requests'] = $res[1]; + + /** The state of the mailq. */ + $state = 'ok'; + if ($data['requests'] > 2000 ) $state = 'info'; + if ($data['requests'] > 5000 ) $state = 'warning'; + if ($data['requests'] > 8000 ) $state = 'critical'; + if ($data['requests'] > 10000 ) $state = 'error'; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorRaid(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'raid_state'; + + /* This monitoring is only available if mdadm is installed */ + $location = system('which mdadm', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('cat /proc/mdstat'); + + /* + * Then calc the state. + */ + $tmp = explode("\n", $data['output']); + $state = 'ok'; + for ($i = 0; $i < sizeof($tmp); $i++){ + /* fetch the next line */ + $line = $tmp[$i]; + + if ((strpos($line, '[U_]') !== false) || (strpos($line, '[_U]') !== false)) + { + /* One Disk is not working. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of critical + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'critical'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + if (strpos($line, '[__]') !== false) + { + /* both Disk are not working */ + $state = $this->_setState($state, 'error'); + } + if (strpos($line, '[UU]') !== false) + { + /* The disks are OK. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of ok + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'ok'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + } + + } + else { + /* + * mdadm is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorRkHunter(){ + /* + * This monitoring is expensive, so do it only once a day + */ + $min = date('i'); + $hour = date('H'); + if (!($min == 0 && $hour == 23)) return; + + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'rkhunter'; + + /* This monitoring is only available if rkhunter is installed */ + $location = system('which rkhunter', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('rkhunter --update --checkall --nocolors --skip-keypress'); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * rkhunter is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorFail2ban(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_fail2ban'; + + /* This monitoring is only available if fail2ban is installed */ + $location = system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora + if($retval !== 0) $location = system('which fail2ban', $retval); // CentOS + if($retval === 0){ + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * fail2ban is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data = ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorSysLog(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'sys_log'; + + /* + * is there any warning or error for this server? + */ + $state = 'ok'; + $dbData = $app->dbmaster->queryAllRecords("SELECT loglevel FROM sys_log WHERE server_id = " . $server_id . " AND loglevel > 0"); + if (is_array($dbData)) { + foreach($dbData as $item){ + if ($item['loglevel'] == 1) $state = $this->_setState($state, 'warning'); + if ($item['loglevel'] == 2) $state = $this->_setState($state, 'error'); + } + } + + /** There is no monitor-data because the data is in the sys_log table */ + $data['output']= ''; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailWarnLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_warn'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailErrLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_err'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMessagesLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_messages'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorISPCCronLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispc_cron'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorFreshClamLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_freshclam'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* Get the data from the LAST log-Entry. + * if there can be found: + * WARNING: Your ClamAV installation is OUTDATED! + * then the clamav is outdated. This is a warning! + */ + $state = 'ok'; + + $tmp = explode("\n", $data); + $lastLog = array(); + if ($tmp[sizeof($tmp)-1] == "") + { + /* the log ends with an empty line remove this */ + array_pop($tmp); + } + if (strpos($tmp[sizeof($tmp)-1], "-------------") !== false) + { + /* the log ends with "-----..." remove this */ + array_pop($tmp); + } + for ($i = sizeof($tmp) -1; $i > 0; $i--){ + if (strpos($tmp[$i], "---------") === false){ + /* no delimiter found, so add this to the last-log */ + $lastLog[] = $tmp[$i]; + } + else + { + /* delimiter found, so there is no more line left! */ + break; + } + } + + /* + * Now we have the last log in the array. + * Check if the outdated-string is found... + */ + foreach($lastLog as $line){ + if (strpos(strtolower($line), "outdated") !== false) { + $state = $this->_setState($state, 'warning'); + } + } + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorClamAvLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_clamav'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorIspConfigLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispconfig'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function _getLogData($log){ + + $dist = ''; + $logfile = ''; + + if(@is_file('/etc/debian_version')) $dist = 'debian'; + if(@is_file('/etc/redhat-release')) $dist = 'redhat'; + if(@is_file('/etc/SuSE-release')) $dist = 'suse'; + if(@is_file('/etc/gentoo-release')) $dist = 'gentoo'; + + switch($log) { + case 'log_mail': + if($dist == 'debian') $logfile = '/var/log/mail.log'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.info'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_warn': + if($dist == 'debian') $logfile = '/var/log/mail.warn'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.warn'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_err': + if($dist == 'debian') $logfile = '/var/log/mail.err'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.err'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_messages': + if($dist == 'debian') $logfile = '/var/log/messages'; + if($dist == 'redhat') $logfile = '/var/log/messages'; + if($dist == 'suse') $logfile = '/var/log/messages'; + if($dist == 'gentoo') $logfile = '/var/log/messages'; + break; + case 'log_ispc_cron': + if($dist == 'debian') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'gentoo') $logfile = '/var/log/cron'; + break; + case 'log_freshclam': + if($dist == 'debian') $logfile = '/var/log/clamav/freshclam.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/freshclam.log'; + break; + case 'log_clamav': + if($dist == 'debian') $logfile = '/var/log/clamav/clamav.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/clamd.log'; + break; + case 'log_fail2ban': + if($dist == 'debian') $logfile = '/var/log/fail2ban.log'; + if($dist == 'redhat') $logfile = '/var/log/fail2ban.log'; + if($dist == 'suse') $logfile = '/var/log/fail2ban.log'; + if($dist == 'gentoo') $logfile = '/var/log/fail2ban.log'; + break; + case 'log_ispconfig': + if($dist == 'debian') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'gentoo') $logfile = '/var/log/ispconfig/ispconfig.log'; + break; + default: + $logfile = ''; + break; + } + + // Getting the logfile content + if($logfile != '') { + $logfile = escapeshellcmd($logfile); + if(stristr($logfile, ';') or substr($logfile,0,9) != '/var/log/' or stristr($logfile, '..')) { + $log = 'Logfile path error.'; + } + else + { + $log = ''; + if(is_readable($logfile)) { + if($fd = popen("tail -n 100 $logfile", 'r')) { + while (!feof($fd)) { + $log .= fgets($fd, 4096); + $n++; + if($n > 1000) break; + } + fclose($fd); + } + } else { + $log = 'Unable to read '.$logfile; + } + } + } + + return $log; + } + + function _checkTcp ($host,$port) { + + $fp = @fsockopen ($host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkUdp ($host,$port) { + + $fp = @fsockopen ('udp://'.$host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkFtp ($host,$port){ + + $conn_id = @ftp_connect($host, $port); + + if($conn_id){ + @ftp_close($conn_id); + return true; + } else { + return false; + } + } + + /* + Deletes Records older than n. + */ + function _delOldRecords($type, $min, $hour=0, $days=0) { + global $app; + + $now = time(); + $old = $now - ($min * 60) - ($hour * 60 * 60) - ($days * 24 * 60 * 60); + $sql = "DELETE FROM monitor_data " . + "WHERE " . + "type =" . "'" . $app->dbmaster->quote($type) . "' " . + "AND " . + "created < " . $old; + $app->dbmaster->query($sql); + } + + /* + * Set the state to the given level (or higher, but not lesser). + * * If the actual state is critical and you call the method with ok, + * then the state is critical. + * + * * If the actual state is critical and you call the method with error, + * then the state is error. + */ + function _setState($oldState, $newState) + { + /* + * Calculate the weight of the old state + */ + switch ($oldState) { + case 'no_state': $oldInt = 0; + break; + case 'ok': $oldInt = 1; + break; + case 'unknown': $oldInt = 2; + break; + case 'info': $oldInt = 3; + break; + case 'warning': $oldInt = 4; + break; + case 'critical': $oldInt = 5; + break; + case 'error': $oldInt = 6; + break; + } + /* + * Calculate the weight of the new state + */ + switch ($newState) { + case 'no_state': $newInt = 0 ; + break; + case 'ok': $newInt = 1 ; + break; + case 'unknown': $newInt = 2 ; + break; + case 'info': $newInt = 3 ; + break; + case 'warning': $newInt = 4 ; + break; + case 'critical': $newInt = 5 ; + break; + case 'error': $newInt = 6 ; + break; + } + + /* + * Set to the higher level + */ + if ($newInt > $oldInt){ + return $newState; + } + else + { + return $oldState; + } + } + + function _getIntArray($line){ + /** The array of float found */ + $res = array(); + /* First build a array from the line */ + $data = explode(' ', $line); + /* then check if any item is a float */ + foreach ($data as $item) { + if ($item . '' == (int)$item . ''){ + $res[] = $item; + } + } + return $res; + } + + +} // end class + +?> diff --git a/interface/ispconfig/server/mods-available/server_module.inc.php b/interface/ispconfig/server/mods-available/server_module.inc.php new file mode 100644 index 000000000..894c97253 --- /dev/null +++ b/interface/ispconfig/server/mods-available/server_module.inc.php @@ -0,0 +1,137 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('server','server_module','process'); + $app->modules->registerTableHook('server_ip','server_module','process'); + $app->modules->registerTableHook('firewall','server_module','process'); + $app->modules->registerTableHook('software_update_inst','server_module','process'); + + // Register service + //$app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'server': + if($action == 'i') $app->plugins->raiseEvent('server_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('server_update',$data); + if($action == 'd') $app->plugins->raiseEvent('server_delete',$data); + break; + case 'server_ip': + if($action == 'i') $app->plugins->raiseEvent('server_ip_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('server_ip_update',$data); + if($action == 'd') $app->plugins->raiseEvent('server_ip_delete',$data); + break; + case 'firewall': + if($action == 'i') $app->plugins->raiseEvent('firewall_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('firewall_update',$data); + if($action == 'd') $app->plugins->raiseEvent('firewall_delete',$data); + break; + case 'software_update_inst': + if($action == 'i') $app->plugins->raiseEvent('software_update_inst_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('software_update_inst_update',$data); + if($action == 'd') $app->plugins->raiseEvent('software_update_inst_delete',$data); + break; + } // end switch + } // end function + + /* + // This function is used + function restartHttpd($action = 'restart') { + global $app; + if($action == 'restart') { + exec('/etc/init.d/apache2 restart'); + } else { + exec('/etc/init.d/apache2 reload'); + } + } + */ + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-available/web_module.inc.php b/interface/ispconfig/server/mods-available/web_module.inc.php new file mode 100644 index 000000000..3ddeca5ed --- /dev/null +++ b/interface/ispconfig/server/mods-available/web_module.inc.php @@ -0,0 +1,140 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('web_domain','web_module','process'); + $app->modules->registerTableHook('ftp_user','web_module','process'); + $app->modules->registerTableHook('shell_user','web_module','process'); + + // Register service + $app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'web_domain': + if($action == 'i') $app->plugins->raiseEvent('web_domain_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('web_domain_update',$data); + if($action == 'd') $app->plugins->raiseEvent('web_domain_delete',$data); + break; + case 'ftp_user': + if($action == 'i') $app->plugins->raiseEvent('ftp_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('ftp_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('ftp_user_delete',$data); + break; + case 'shell_user': + if($action == 'i') $app->plugins->raiseEvent('shell_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('shell_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('shell_user_delete',$data); + break; + } // end switch + } // end function + + + // This function is used + function restartHttpd($action = 'restart') { + global $app; + + $command = ''; + if(is_file('/etc/init.d/httpd')) { + $command = '/etc/init.d/httpd'; + } else { + $command = '/etc/init.d/apache2'; + } + + if($action == 'restart') { + exec($command.' restart'); + } else { + exec($command.' reload'); + } + + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-core/monitor_core_module.inc.php b/interface/ispconfig/server/mods-core/monitor_core_module.inc.php new file mode 100644 index 000000000..8447baee3 --- /dev/null +++ b/interface/ispconfig/server/mods-core/monitor_core_module.inc.php @@ -0,0 +1,1465 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + /* none at them moment */ + //$app->modules->registerTableHook('mail_access','mail_module','process'); + + /* + Do the monitor every n minutes and write the result in the db + */ + $min = date('i'); + if (($min % $this->interval) == 0) + { + $this->doMonitor(); + } + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + function process($tablename, $action, $data) { + // global $app; + // + // switch ($tablename) { + // case 'mail_access': + // if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data); + // if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data); + // if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data); + // break; + // } // end switch + } // end function + + /* + This method is called every n minutes, when the module ist loaded. + The method then does a system-monitoring + */ + // TODO: what monitoring is done should be a config-var + function doMonitor() + { + /* Calls the single Monitoring steps */ + $this->monitorServer(); + $this->monitorDiskUsage(); + $this->monitorMemUsage(); + $this->monitorCpu(); + $this->monitorServices(); + $this->monitorMailLog(); + $this->monitorMailWarnLog(); + $this->monitorMailErrLog(); + $this->monitorMessagesLog(); + $this->monitorISPCCronLog(); + $this->monitorFreshClamLog(); + $this->monitorClamAvLog(); + $this->monitorIspConfigLog(); + $this->monitorSystemUpdate(); + $this->monitorMailQueue(); + $this->monitorRaid(); + $this->monitorRkHunter(); + $this->monitorFail2ban(); + $this->monitorSysLog(); + } + + function monitorServer(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'server_load'; + + /* + Fetch the data into a array + */ + $procUptime = shell_exec("cat /proc/uptime | cut -f1 -d' '"); + $data['up_days'] = floor($procUptime/86400); + $data['up_hours'] = floor(($procUptime-$data['up_days']*86400)/3600); + $data['up_minutes'] = floor(($procUptime-$data['up_days']*86400-$data['up_hours']*3600)/60); + + $data['uptime'] = shell_exec("uptime"); + + $tmp = explode(",", $data['uptime'], 4); + $tmpUser = explode(" ", trim($tmp[2])); + $data['user_online'] = intval($tmpUser[0]); + + /* Old Load Average Code + $loadTmp = explode(":" , trim($tmp[3])); + $load = explode(",", $loadTmp[1]); + $data['load_1'] = floatval(trim($load[0])); + $data['load_5'] = floatval(trim($load[1])); + $data['load_15'] = floatval(trim($load[2])); */ + + //* New Load Average code to fix "always zero" bug in non-english distros. NEEDS TESTING + $loadTmp = shell_exec("cat /proc/loadavg | cut -f1-3 -d' '"); + $load = explode(" ", $loadTmp); + $data['load_1'] = floatval(str_replace(',', '.', $load[0])); + $data['load_5'] = floatval(str_replace(',', '.', $load[1])); + $data['load_15'] = floatval(str_replace(',', '.', $load[2])); + + /** The state of the server-load. */ + $state = 'ok'; + if ($data['load_1'] > 20 ) $state = 'info'; + if ($data['load_1'] > 50 ) $state = 'warning'; + if ($data['load_1'] > 100 ) $state = 'critical'; + if ($data['load_1'] > 150 ) $state = 'error'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorDiskUsage() { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'disk_usage'; + + /** The state of the disk-usage */ + $state = 'ok'; + + /** Fetch the data of ALL devices into a array (needed for monitoring!)*/ + $dfData = shell_exec("df -hT"); + + // split into array + $df = explode("\n", $dfData); + + /* + * ignore the first line, process the rest + */ + for($i=1; $i <= sizeof($df); $i++){ + if ($df[$i] != '') + { + /* + * Make a array of the data + */ + $s = preg_split ("/[\s]+/", $df[$i]); + $data[$i]['fs'] = $s[0]; + $data[$i]['type'] = $s[1]; + $data[$i]['size'] = $s[2]; + $data[$i]['used'] = $s[3]; + $data[$i]['available'] = $s[4]; + $data[$i]['percent'] = $s[5]; + $data[$i]['mounted'] = $s[6]; + /* + * calculate the state + */ + $usePercent = floatval($data[$i]['percent']); + + //* We dont want to check the cdrom drive as a cd / dvd is always 100% full + if($data[$i]['type'] != 'iso9660' && $data[$i]['type'] != 'cramfs' && $data[$i]['type'] != 'udf') { + if ($usePercent > 75) $state = $this->_setState($state, 'info'); + if ($usePercent > 80) $state = $this->_setState($state, 'warning'); + if ($usePercent > 90) $state = $this->_setState($state, 'critical'); + if ($usePercent > 95) $state = $this->_setState($state, 'error'); + } + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMemUsage() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mem_usage'; + + /* + Fetch the data into a array + */ + $miData = shell_exec("cat /proc/meminfo"); + + $memInfo = explode("\n", $miData); + + foreach($memInfo as $line){ + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $tmp = explode(" ", trim($part[1])); + $value = 0; + if ($tmp[1] == 'kB') $value = $tmp[0] * 1024; + $data[$key] = $value; + } + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorCpu() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'cpu_info'; + + /* + Fetch the data into a array + */ + $cpuData = shell_exec("cat /proc/cpuinfo"); + $cpuInfo = explode("\n", $cpuData); + $processor = 0; + + foreach($cpuInfo as $line){ + + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $value = trim($part[1]); + if($key == 'processor') $processor = intval($value); + if($key != '') $data[$key.' '.$processor] = $value; + } + + /* the cpu has no state. It is, what it is */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorServices() + { + global $app; + global $conf; + + /** the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** get the "active" Services of the server from the DB */ + $services = $app->dbmaster->queryOneRecord("SELECT * FROM server WHERE server_id = " . $server_id); + + /* The type of the Monitor-data */ + $type = 'services'; + + /** the State of the monitoring */ + /* ok, if ALL aktive services are running, + * error, if not + * There is no other state! + */ + $state = 'ok'; + + /* Monitor Webserver */ + $data['webserver'] = -1; // unknown - not needed + if ($services['web_server'] == 1) + { + if($this->_checkTcp('localhost', 80)) { + $data['webserver'] = 1; + } else { + $data['webserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor FTP-Server */ + $data['ftpserver'] = -1; // unknown - not needed + if ($services['file_server'] == 1) + { + if($this->_checkFtp('localhost', 21)) { + $data['ftpserver'] = 1; + } else { + $data['ftpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor SMTP-Server */ + $data['smtpserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 25)) { + $data['smtpserver'] = 1; + } else { + $data['smtpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor POP3-Server */ + $data['pop3server'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 110)) { + $data['pop3server'] = 1; + } else { + $data['pop3server'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor IMAP-Server */ + $data['imapserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 143)) { + $data['imapserver'] = 1; + } else { + $data['imapserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor BIND-Server */ + $data['bindserver'] = -1; // unknown - not needed + if ($services['dns_server'] == 1) + { + if($this->_checkTcp('localhost', 53)) { + $data['bindserver'] = 1; + } else { + $data['bindserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor MYSQL-Server */ + $data['mysqlserver'] = -1; // unknown - not needed + if ($services['db_server'] == 1) + { + if($this->_checkTcp('localhost', 3306)) { + $data['mysqlserver'] = 1; + } else { + $data['mysqlserver'] = 0; + $state = 'error'; // because service is down + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorSystemUpdate(){ + /* + * This monitoring is expensive, so do it only once a hour + */ + $min = date('i'); + if ($min != 0) return; + + /* + * OK - here we go... + */ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'system_update'; + + /* This monitoring is only available at debian or Ubuntu */ + if(file_exists('/etc/debian_version')){ + + /* + * first update the "update-database" + */ + shell_exec('apt-get update'); + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $aptData = shell_exec('apt-get -s -qq dist-upgrade'); + if ($aptData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('apt-get -s -q dist-upgrade'); + } + elseif (file_exists("/etc/gentoo-release")) { + + /* + * first update the portage tree + */ + + // In keeping with gentoo's rsync policy, don't update to frequently (every four hours - taken from http://www.gentoo.org/doc/en/source_mirrors.xml) + $do_update = true; + if (file_exists('/usr/portage/metadata/timestamp.chk')) + { + $datetime = file_get_contents('/usr/portage/metadata/timestamp.chk'); + $datetime = trim($datetime); + + $dstamp = strtotime($datetime); + if ($dstamp) + { + $checkat = $dstamp + 14400; // + 4hours + if (mktime() < $checkat) { + $do_update = false; + } + } + } + + if ($do_update) { + shell_exec('emerge --sync --quiet'); + } + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $emergeData = shell_exec('emerge -puDNt --color n --nospinner --quiet world'); + if ($emergeData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('emerge -pvuDNt --color n --nospinner world'); + } + else { + /* + * It is not debian/Ubuntu, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorMailQueue(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mailq'; + + /* Get the data from the mailq */ + $data['output'] = shell_exec('mailq'); + + /* + * The last line has more informations + */ + $tmp = explode("\n", $data['output']); + $more = $tmp[sizeof($tmp) - 1]; + $this->_getIntArray($more); + $data['bytes'] = $res[0]; + $data['requests'] = $res[1]; + + /** The state of the mailq. */ + $state = 'ok'; + if ($data['requests'] > 2000 ) $state = 'info'; + if ($data['requests'] > 5000 ) $state = 'warning'; + if ($data['requests'] > 8000 ) $state = 'critical'; + if ($data['requests'] > 10000 ) $state = 'error'; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorRaid(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'raid_state'; + + /* This monitoring is only available if mdadm is installed */ + $location = system('which mdadm', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('cat /proc/mdstat'); + + /* + * Then calc the state. + */ + $tmp = explode("\n", $data['output']); + $state = 'ok'; + for ($i = 0; $i < sizeof($tmp); $i++){ + /* fetch the next line */ + $line = $tmp[$i]; + + if ((strpos($line, '[U_]') !== false) || (strpos($line, '[_U]') !== false)) + { + /* One Disk is not working. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of critical + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'critical'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + if (strpos($line, '[__]') !== false) + { + /* both Disk are not working */ + $state = $this->_setState($state, 'error'); + } + if (strpos($line, '[UU]') !== false) + { + /* The disks are OK. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of ok + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'ok'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + } + + } + else { + /* + * mdadm is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorRkHunter(){ + /* + * This monitoring is expensive, so do it only once a day + */ + $min = date('i'); + $hour = date('H'); + if (!($min == 0 && $hour == 23)) return; + + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'rkhunter'; + + /* This monitoring is only available if rkhunter is installed */ + $location = system('which rkhunter', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('rkhunter --update --checkall --nocolors --skip-keypress'); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * rkhunter is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorFail2ban(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_fail2ban'; + + /* This monitoring is only available if fail2ban is installed */ + $location = system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora + if($retval !== 0) $location = system('which fail2ban', $retval); // CentOS + if($retval === 0){ + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * fail2ban is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data = ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorSysLog(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'sys_log'; + + /* + * is there any warning or error for this server? + */ + $state = 'ok'; + $dbData = $app->dbmaster->queryAllRecords("SELECT loglevel FROM sys_log WHERE server_id = " . $server_id . " AND loglevel > 0"); + if (is_array($dbData)) { + foreach($dbData as $item){ + if ($item['loglevel'] == 1) $state = $this->_setState($state, 'warning'); + if ($item['loglevel'] == 2) $state = $this->_setState($state, 'error'); + } + } + + /** There is no monitor-data because the data is in the sys_log table */ + $data['output']= ''; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailWarnLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_warn'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailErrLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_err'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMessagesLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_messages'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorISPCCronLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispc_cron'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorFreshClamLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_freshclam'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* Get the data from the LAST log-Entry. + * if there can be found: + * WARNING: Your ClamAV installation is OUTDATED! + * then the clamav is outdated. This is a warning! + */ + $state = 'ok'; + + $tmp = explode("\n", $data); + $lastLog = array(); + if ($tmp[sizeof($tmp)-1] == "") + { + /* the log ends with an empty line remove this */ + array_pop($tmp); + } + if (strpos($tmp[sizeof($tmp)-1], "-------------") !== false) + { + /* the log ends with "-----..." remove this */ + array_pop($tmp); + } + for ($i = sizeof($tmp) -1; $i > 0; $i--){ + if (strpos($tmp[$i], "---------") === false){ + /* no delimiter found, so add this to the last-log */ + $lastLog[] = $tmp[$i]; + } + else + { + /* delimiter found, so there is no more line left! */ + break; + } + } + + /* + * Now we have the last log in the array. + * Check if the outdated-string is found... + */ + foreach($lastLog as $line){ + if (strpos(strtolower($line), "outdated") !== false) { + $state = $this->_setState($state, 'warning'); + } + } + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorClamAvLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_clamav'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorIspConfigLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispconfig'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function _getLogData($log){ + + $dist = ''; + $logfile = ''; + + if(@is_file('/etc/debian_version')) $dist = 'debian'; + if(@is_file('/etc/redhat-release')) $dist = 'redhat'; + if(@is_file('/etc/SuSE-release')) $dist = 'suse'; + if(@is_file('/etc/gentoo-release')) $dist = 'gentoo'; + + switch($log) { + case 'log_mail': + if($dist == 'debian') $logfile = '/var/log/mail.log'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.info'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_warn': + if($dist == 'debian') $logfile = '/var/log/mail.warn'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.warn'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_err': + if($dist == 'debian') $logfile = '/var/log/mail.err'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.err'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_messages': + if($dist == 'debian') $logfile = '/var/log/messages'; + if($dist == 'redhat') $logfile = '/var/log/messages'; + if($dist == 'suse') $logfile = '/var/log/messages'; + if($dist == 'gentoo') $logfile = '/var/log/messages'; + break; + case 'log_ispc_cron': + if($dist == 'debian') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'gentoo') $logfile = '/var/log/cron'; + break; + case 'log_freshclam': + if($dist == 'debian') $logfile = '/var/log/clamav/freshclam.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/freshclam.log'; + break; + case 'log_clamav': + if($dist == 'debian') $logfile = '/var/log/clamav/clamav.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/clamd.log'; + break; + case 'log_fail2ban': + if($dist == 'debian') $logfile = '/var/log/fail2ban.log'; + if($dist == 'redhat') $logfile = '/var/log/fail2ban.log'; + if($dist == 'suse') $logfile = '/var/log/fail2ban.log'; + if($dist == 'gentoo') $logfile = '/var/log/fail2ban.log'; + break; + case 'log_ispconfig': + if($dist == 'debian') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'gentoo') $logfile = '/var/log/ispconfig/ispconfig.log'; + break; + default: + $logfile = ''; + break; + } + + // Getting the logfile content + if($logfile != '') { + $logfile = escapeshellcmd($logfile); + if(stristr($logfile, ';') or substr($logfile,0,9) != '/var/log/' or stristr($logfile, '..')) { + $log = 'Logfile path error.'; + } + else + { + $log = ''; + if(is_readable($logfile)) { + if($fd = popen("tail -n 100 $logfile", 'r')) { + while (!feof($fd)) { + $log .= fgets($fd, 4096); + $n++; + if($n > 1000) break; + } + fclose($fd); + } + } else { + $log = 'Unable to read '.$logfile; + } + } + } + + return $log; + } + + function _checkTcp ($host,$port) { + + $fp = @fsockopen ($host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkUdp ($host,$port) { + + $fp = @fsockopen ('udp://'.$host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkFtp ($host,$port){ + + $conn_id = @ftp_connect($host, $port); + + if($conn_id){ + @ftp_close($conn_id); + return true; + } else { + return false; + } + } + + /* + Deletes Records older than n. + */ + function _delOldRecords($type, $min, $hour=0, $days=0) { + global $app; + + $now = time(); + $old = $now - ($min * 60) - ($hour * 60 * 60) - ($days * 24 * 60 * 60); + $sql = "DELETE FROM monitor_data " . + "WHERE " . + "type =" . "'" . $app->dbmaster->quote($type) . "' " . + "AND " . + "created < " . $old; + $app->dbmaster->query($sql); + } + + /* + * Set the state to the given level (or higher, but not lesser). + * * If the actual state is critical and you call the method with ok, + * then the state is critical. + * + * * If the actual state is critical and you call the method with error, + * then the state is error. + */ + function _setState($oldState, $newState) + { + /* + * Calculate the weight of the old state + */ + switch ($oldState) { + case 'no_state': $oldInt = 0; + break; + case 'ok': $oldInt = 1; + break; + case 'unknown': $oldInt = 2; + break; + case 'info': $oldInt = 3; + break; + case 'warning': $oldInt = 4; + break; + case 'critical': $oldInt = 5; + break; + case 'error': $oldInt = 6; + break; + } + /* + * Calculate the weight of the new state + */ + switch ($newState) { + case 'no_state': $newInt = 0 ; + break; + case 'ok': $newInt = 1 ; + break; + case 'unknown': $newInt = 2 ; + break; + case 'info': $newInt = 3 ; + break; + case 'warning': $newInt = 4 ; + break; + case 'critical': $newInt = 5 ; + break; + case 'error': $newInt = 6 ; + break; + } + + /* + * Set to the higher level + */ + if ($newInt > $oldInt){ + return $newState; + } + else + { + return $oldState; + } + } + + function _getIntArray($line){ + /** The array of float found */ + $res = array(); + /* First build a array from the line */ + $data = explode(' ', $line); + /* then check if any item is a float */ + foreach ($data as $item) { + if ($item . '' == (int)$item . ''){ + $res[] = $item; + } + } + return $res; + } + + +} // end class + +?> diff --git a/interface/ispconfig/server/mods-enabled/client_module.inc.php b/interface/ispconfig/server/mods-enabled/client_module.inc.php new file mode 100644 index 000000000..4d46f114e --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/client_module.inc.php @@ -0,0 +1,96 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('client',$this->module_name,'process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'client': + if($action == 'i') $app->plugins->raiseEvent('client_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('client_update',$data); + if($action == 'd') $app->plugins->raiseEvent('client_delete',$data); + break; + } // end switch + } // end function + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/cron_module.inc.php b/interface/ispconfig/server/mods-enabled/cron_module.inc.php new file mode 100644 index 000000000..503d7ef7c --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/cron_module.inc.php @@ -0,0 +1,97 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('cron',$this->module_name,'process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'cron': + if($action == 'i') $app->plugins->raiseEvent('cron_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('cron_update',$data); + if($action == 'd') $app->plugins->raiseEvent('cron_delete',$data); + break; + } // end switch + } // end function + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/database_module.inc.php b/interface/ispconfig/server/mods-enabled/database_module.inc.php new file mode 100644 index 000000000..2dac689ee --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/database_module.inc.php @@ -0,0 +1,103 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('web_database','database_module','process'); + + // Register service + //$app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'web_database': + if($action == 'i') $app->plugins->raiseEvent('database_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('database_update',$data); + if($action == 'd') $app->plugins->raiseEvent('database_delete',$data); + break; + } // end switch + } // end function + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/dns_module.inc.php b/interface/ispconfig/server/mods-enabled/dns_module.inc.php new file mode 100644 index 000000000..17c36bd26 --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/dns_module.inc.php @@ -0,0 +1,128 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('dns_soa',$this->module_name,'process'); + $app->modules->registerTableHook('dns_rr',$this->module_name,'process'); + + + // Register service + $app->services->registerService('bind','dns_module','restartBind'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'dns_soa': + if($action == 'i') $app->plugins->raiseEvent('dns_soa_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('dns_soa_update',$data); + if($action == 'd') $app->plugins->raiseEvent('dns_soa_delete',$data); + break; + case 'dns_rr': + if($action == 'i') $app->plugins->raiseEvent('dns_rr_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('dns_rr_update',$data); + if($action == 'd') $app->plugins->raiseEvent('dns_rr_delete',$data); + break; + } // end switch + } // end function + + + function restartBind($action = 'restart') { + global $app; + + $command = ''; + if(is_file('/etc/init.d/bind9')) { + $command = '/etc/init.d/bind9'; + } else { + $command = '/etc/init.d/named'; + } + + if($action == 'restart') { + exec($command.' restart'); + } else { + exec($command.' reload'); + } + + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/mail_module.inc.php b/interface/ispconfig/server/mods-enabled/mail_module.inc.php new file mode 100644 index 000000000..d0c33f2ae --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/mail_module.inc.php @@ -0,0 +1,153 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('mail_access','mail_module','process'); + $app->modules->registerTableHook('mail_domain','mail_module','process'); + $app->modules->registerTableHook('mail_forwarding','mail_module','process'); + $app->modules->registerTableHook('mail_transport','mail_module','process'); + $app->modules->registerTableHook('mail_user','mail_module','process'); + $app->modules->registerTableHook('mail_get','mail_module','process'); + $app->modules->registerTableHook('mail_content_filter','mail_module','process'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'mail_access': + if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data); + break; + case 'mail_domain': + if($action == 'i') $app->plugins->raiseEvent('mail_domain_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_domain_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_domain_delete',$data); + break; + case 'mail_forwarding': + if($action == 'i') $app->plugins->raiseEvent('mail_forwarding_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_forwarding_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_forwarding_delete',$data); + break; + case 'mail_transport': + if($action == 'i') $app->plugins->raiseEvent('mail_transport_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_transport_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_transport_delete',$data); + break; + case 'mail_user': + if($action == 'i') $app->plugins->raiseEvent('mail_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_user_delete',$data); + break; + case 'mail_get': + if($action == 'i') $app->plugins->raiseEvent('mail_get_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_get_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_get_delete',$data); + break; + case 'mail_content_filter': + if($action == 'i') $app->plugins->raiseEvent('mail_content_filter_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('mail_content_filter_update',$data); + if($action == 'd') $app->plugins->raiseEvent('mail_content_filter_delete',$data); + break; + } // end switch + } // end function + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/monitor_core_module.inc.php b/interface/ispconfig/server/mods-enabled/monitor_core_module.inc.php new file mode 100644 index 000000000..8447baee3 --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/monitor_core_module.inc.php @@ -0,0 +1,1465 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + /* none at them moment */ + //$app->modules->registerTableHook('mail_access','mail_module','process'); + + /* + Do the monitor every n minutes and write the result in the db + */ + $min = date('i'); + if (($min % $this->interval) == 0) + { + $this->doMonitor(); + } + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + function process($tablename, $action, $data) { + // global $app; + // + // switch ($tablename) { + // case 'mail_access': + // if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data); + // if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data); + // if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data); + // break; + // } // end switch + } // end function + + /* + This method is called every n minutes, when the module ist loaded. + The method then does a system-monitoring + */ + // TODO: what monitoring is done should be a config-var + function doMonitor() + { + /* Calls the single Monitoring steps */ + $this->monitorServer(); + $this->monitorDiskUsage(); + $this->monitorMemUsage(); + $this->monitorCpu(); + $this->monitorServices(); + $this->monitorMailLog(); + $this->monitorMailWarnLog(); + $this->monitorMailErrLog(); + $this->monitorMessagesLog(); + $this->monitorISPCCronLog(); + $this->monitorFreshClamLog(); + $this->monitorClamAvLog(); + $this->monitorIspConfigLog(); + $this->monitorSystemUpdate(); + $this->monitorMailQueue(); + $this->monitorRaid(); + $this->monitorRkHunter(); + $this->monitorFail2ban(); + $this->monitorSysLog(); + } + + function monitorServer(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'server_load'; + + /* + Fetch the data into a array + */ + $procUptime = shell_exec("cat /proc/uptime | cut -f1 -d' '"); + $data['up_days'] = floor($procUptime/86400); + $data['up_hours'] = floor(($procUptime-$data['up_days']*86400)/3600); + $data['up_minutes'] = floor(($procUptime-$data['up_days']*86400-$data['up_hours']*3600)/60); + + $data['uptime'] = shell_exec("uptime"); + + $tmp = explode(",", $data['uptime'], 4); + $tmpUser = explode(" ", trim($tmp[2])); + $data['user_online'] = intval($tmpUser[0]); + + /* Old Load Average Code + $loadTmp = explode(":" , trim($tmp[3])); + $load = explode(",", $loadTmp[1]); + $data['load_1'] = floatval(trim($load[0])); + $data['load_5'] = floatval(trim($load[1])); + $data['load_15'] = floatval(trim($load[2])); */ + + //* New Load Average code to fix "always zero" bug in non-english distros. NEEDS TESTING + $loadTmp = shell_exec("cat /proc/loadavg | cut -f1-3 -d' '"); + $load = explode(" ", $loadTmp); + $data['load_1'] = floatval(str_replace(',', '.', $load[0])); + $data['load_5'] = floatval(str_replace(',', '.', $load[1])); + $data['load_15'] = floatval(str_replace(',', '.', $load[2])); + + /** The state of the server-load. */ + $state = 'ok'; + if ($data['load_1'] > 20 ) $state = 'info'; + if ($data['load_1'] > 50 ) $state = 'warning'; + if ($data['load_1'] > 100 ) $state = 'critical'; + if ($data['load_1'] > 150 ) $state = 'error'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorDiskUsage() { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'disk_usage'; + + /** The state of the disk-usage */ + $state = 'ok'; + + /** Fetch the data of ALL devices into a array (needed for monitoring!)*/ + $dfData = shell_exec("df -hT"); + + // split into array + $df = explode("\n", $dfData); + + /* + * ignore the first line, process the rest + */ + for($i=1; $i <= sizeof($df); $i++){ + if ($df[$i] != '') + { + /* + * Make a array of the data + */ + $s = preg_split ("/[\s]+/", $df[$i]); + $data[$i]['fs'] = $s[0]; + $data[$i]['type'] = $s[1]; + $data[$i]['size'] = $s[2]; + $data[$i]['used'] = $s[3]; + $data[$i]['available'] = $s[4]; + $data[$i]['percent'] = $s[5]; + $data[$i]['mounted'] = $s[6]; + /* + * calculate the state + */ + $usePercent = floatval($data[$i]['percent']); + + //* We dont want to check the cdrom drive as a cd / dvd is always 100% full + if($data[$i]['type'] != 'iso9660' && $data[$i]['type'] != 'cramfs' && $data[$i]['type'] != 'udf') { + if ($usePercent > 75) $state = $this->_setState($state, 'info'); + if ($usePercent > 80) $state = $this->_setState($state, 'warning'); + if ($usePercent > 90) $state = $this->_setState($state, 'critical'); + if ($usePercent > 95) $state = $this->_setState($state, 'error'); + } + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMemUsage() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mem_usage'; + + /* + Fetch the data into a array + */ + $miData = shell_exec("cat /proc/meminfo"); + + $memInfo = explode("\n", $miData); + + foreach($memInfo as $line){ + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $tmp = explode(" ", trim($part[1])); + $value = 0; + if ($tmp[1] == 'kB') $value = $tmp[0] * 1024; + $data[$key] = $value; + } + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorCpu() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'cpu_info'; + + /* + Fetch the data into a array + */ + $cpuData = shell_exec("cat /proc/cpuinfo"); + $cpuInfo = explode("\n", $cpuData); + $processor = 0; + + foreach($cpuInfo as $line){ + + $part = preg_split("/:/", $line); + $key = trim($part[0]); + $value = trim($part[1]); + if($key == 'processor') $processor = intval($value); + if($key != '') $data[$key.' '.$processor] = $value; + } + + /* the cpu has no state. It is, what it is */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorServices() + { + global $app; + global $conf; + + /** the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** get the "active" Services of the server from the DB */ + $services = $app->dbmaster->queryOneRecord("SELECT * FROM server WHERE server_id = " . $server_id); + + /* The type of the Monitor-data */ + $type = 'services'; + + /** the State of the monitoring */ + /* ok, if ALL aktive services are running, + * error, if not + * There is no other state! + */ + $state = 'ok'; + + /* Monitor Webserver */ + $data['webserver'] = -1; // unknown - not needed + if ($services['web_server'] == 1) + { + if($this->_checkTcp('localhost', 80)) { + $data['webserver'] = 1; + } else { + $data['webserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor FTP-Server */ + $data['ftpserver'] = -1; // unknown - not needed + if ($services['file_server'] == 1) + { + if($this->_checkFtp('localhost', 21)) { + $data['ftpserver'] = 1; + } else { + $data['ftpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor SMTP-Server */ + $data['smtpserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 25)) { + $data['smtpserver'] = 1; + } else { + $data['smtpserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor POP3-Server */ + $data['pop3server'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 110)) { + $data['pop3server'] = 1; + } else { + $data['pop3server'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor IMAP-Server */ + $data['imapserver'] = -1; // unknown - not needed + if ($services['mail_server'] == 1) + { + if($this->_checkTcp('localhost', 143)) { + $data['imapserver'] = 1; + } else { + $data['imapserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor BIND-Server */ + $data['bindserver'] = -1; // unknown - not needed + if ($services['dns_server'] == 1) + { + if($this->_checkTcp('localhost', 53)) { + $data['bindserver'] = 1; + } else { + $data['bindserver'] = 0; + $state = 'error'; // because service is down + } + } + + /* Monitor MYSQL-Server */ + $data['mysqlserver'] = -1; // unknown - not needed + if ($services['db_server'] == 1) + { + if($this->_checkTcp('localhost', 3306)) { + $data['mysqlserver'] = 1; + } else { + $data['mysqlserver'] = 0; + $state = 'error'; // because service is down + } + } + + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorSystemUpdate(){ + /* + * This monitoring is expensive, so do it only once a hour + */ + $min = date('i'); + if ($min != 0) return; + + /* + * OK - here we go... + */ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'system_update'; + + /* This monitoring is only available at debian or Ubuntu */ + if(file_exists('/etc/debian_version')){ + + /* + * first update the "update-database" + */ + shell_exec('apt-get update'); + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $aptData = shell_exec('apt-get -s -qq dist-upgrade'); + if ($aptData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('apt-get -s -q dist-upgrade'); + } + elseif (file_exists("/etc/gentoo-release")) { + + /* + * first update the portage tree + */ + + // In keeping with gentoo's rsync policy, don't update to frequently (every four hours - taken from http://www.gentoo.org/doc/en/source_mirrors.xml) + $do_update = true; + if (file_exists('/usr/portage/metadata/timestamp.chk')) + { + $datetime = file_get_contents('/usr/portage/metadata/timestamp.chk'); + $datetime = trim($datetime); + + $dstamp = strtotime($datetime); + if ($dstamp) + { + $checkat = $dstamp + 14400; // + 4hours + if (mktime() < $checkat) { + $do_update = false; + } + } + } + + if ($do_update) { + shell_exec('emerge --sync --quiet'); + } + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $emergeData = shell_exec('emerge -puDNt --color n --nospinner --quiet world'); + if ($emergeData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('emerge -pvuDNt --color n --nospinner world'); + } + else { + /* + * It is not debian/Ubuntu, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorMailQueue(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'mailq'; + + /* Get the data from the mailq */ + $data['output'] = shell_exec('mailq'); + + /* + * The last line has more informations + */ + $tmp = explode("\n", $data['output']); + $more = $tmp[sizeof($tmp) - 1]; + $this->_getIntArray($more); + $data['bytes'] = $res[0]; + $data['requests'] = $res[1]; + + /** The state of the mailq. */ + $state = 'ok'; + if ($data['requests'] > 2000 ) $state = 'info'; + if ($data['requests'] > 5000 ) $state = 'warning'; + if ($data['requests'] > 8000 ) $state = 'critical'; + if ($data['requests'] > 10000 ) $state = 'error'; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorRaid(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'raid_state'; + + /* This monitoring is only available if mdadm is installed */ + $location = system('which mdadm', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('cat /proc/mdstat'); + + /* + * Then calc the state. + */ + $tmp = explode("\n", $data['output']); + $state = 'ok'; + for ($i = 0; $i < sizeof($tmp); $i++){ + /* fetch the next line */ + $line = $tmp[$i]; + + if ((strpos($line, '[U_]') !== false) || (strpos($line, '[_U]') !== false)) + { + /* One Disk is not working. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of critical + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'critical'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + if (strpos($line, '[__]') !== false) + { + /* both Disk are not working */ + $state = $this->_setState($state, 'error'); + } + if (strpos($line, '[UU]') !== false) + { + /* The disks are OK. + * if the next line starts with "[>" or "[=" then + * recovery (resync) is in state and the state is + * information instead of ok + */ + $nextLine = $tmp[$i+1]; + if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { + $state = $this->_setState($state, 'ok'); + } + else + { + $state = $this->_setState($state, 'info'); + } + } + } + + } + else { + /* + * mdadm is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorRkHunter(){ + /* + * This monitoring is expensive, so do it only once a day + */ + $min = date('i'); + $hour = date('H'); + if (!($min == 0 && $hour == 23)) return; + + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'rkhunter'; + + /* This monitoring is only available if rkhunter is installed */ + $location = system('which rkhunter', $retval); + if($retval === 0){ + /* + * Fetch the output + */ + $data['output'] = shell_exec('rkhunter --update --checkall --nocolors --skip-keypress'); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * rkhunter is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data['output']= ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 0, 2); + } + + function monitorFail2ban(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_fail2ban'; + + /* This monitoring is only available if fail2ban is installed */ + $location = system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora + if($retval !== 0) $location = system('which fail2ban', $retval); // CentOS + if($retval === 0){ + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * fail2ban is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data = ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorSysLog(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'sys_log'; + + /* + * is there any warning or error for this server? + */ + $state = 'ok'; + $dbData = $app->dbmaster->queryAllRecords("SELECT loglevel FROM sys_log WHERE server_id = " . $server_id . " AND loglevel > 0"); + if (is_array($dbData)) { + foreach($dbData as $item){ + if ($item['loglevel'] == 1) $state = $this->_setState($state, 'warning'); + if ($item['loglevel'] == 2) $state = $this->_setState($state, 'error'); + } + } + + /** There is no monitor-data because the data is in the sys_log table */ + $data['output']= ''; + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailWarnLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_warn'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorMailErrLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_mail_err'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function monitorMessagesLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_messages'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorISPCCronLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispc_cron'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorFreshClamLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_freshclam'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* Get the data from the LAST log-Entry. + * if there can be found: + * WARNING: Your ClamAV installation is OUTDATED! + * then the clamav is outdated. This is a warning! + */ + $state = 'ok'; + + $tmp = explode("\n", $data); + $lastLog = array(); + if ($tmp[sizeof($tmp)-1] == "") + { + /* the log ends with an empty line remove this */ + array_pop($tmp); + } + if (strpos($tmp[sizeof($tmp)-1], "-------------") !== false) + { + /* the log ends with "-----..." remove this */ + array_pop($tmp); + } + for ($i = sizeof($tmp) -1; $i > 0; $i--){ + if (strpos($tmp[$i], "---------") === false){ + /* no delimiter found, so add this to the last-log */ + $lastLog[] = $tmp[$i]; + } + else + { + /* delimiter found, so there is no more line left! */ + break; + } + } + + /* + * Now we have the last log in the array. + * Check if the outdated-string is found... + */ + foreach($lastLog as $line){ + if (strpos(strtolower($line), "outdated") !== false) { + $state = $this->_setState($state, 'warning'); + } + } + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorClamAvLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_clamav'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + function monitorIspConfigLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispconfig'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + // Todo: the state should be calculated. + $state = 'ok'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + + + function _getLogData($log){ + + $dist = ''; + $logfile = ''; + + if(@is_file('/etc/debian_version')) $dist = 'debian'; + if(@is_file('/etc/redhat-release')) $dist = 'redhat'; + if(@is_file('/etc/SuSE-release')) $dist = 'suse'; + if(@is_file('/etc/gentoo-release')) $dist = 'gentoo'; + + switch($log) { + case 'log_mail': + if($dist == 'debian') $logfile = '/var/log/mail.log'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.info'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_warn': + if($dist == 'debian') $logfile = '/var/log/mail.warn'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.warn'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_mail_err': + if($dist == 'debian') $logfile = '/var/log/mail.err'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.err'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; + break; + case 'log_messages': + if($dist == 'debian') $logfile = '/var/log/messages'; + if($dist == 'redhat') $logfile = '/var/log/messages'; + if($dist == 'suse') $logfile = '/var/log/messages'; + if($dist == 'gentoo') $logfile = '/var/log/messages'; + break; + case 'log_ispc_cron': + if($dist == 'debian') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'gentoo') $logfile = '/var/log/cron'; + break; + case 'log_freshclam': + if($dist == 'debian') $logfile = '/var/log/clamav/freshclam.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/freshclam.log'; + break; + case 'log_clamav': + if($dist == 'debian') $logfile = '/var/log/clamav/clamav.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/clamd.log'; + break; + case 'log_fail2ban': + if($dist == 'debian') $logfile = '/var/log/fail2ban.log'; + if($dist == 'redhat') $logfile = '/var/log/fail2ban.log'; + if($dist == 'suse') $logfile = '/var/log/fail2ban.log'; + if($dist == 'gentoo') $logfile = '/var/log/fail2ban.log'; + break; + case 'log_ispconfig': + if($dist == 'debian') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'gentoo') $logfile = '/var/log/ispconfig/ispconfig.log'; + break; + default: + $logfile = ''; + break; + } + + // Getting the logfile content + if($logfile != '') { + $logfile = escapeshellcmd($logfile); + if(stristr($logfile, ';') or substr($logfile,0,9) != '/var/log/' or stristr($logfile, '..')) { + $log = 'Logfile path error.'; + } + else + { + $log = ''; + if(is_readable($logfile)) { + if($fd = popen("tail -n 100 $logfile", 'r')) { + while (!feof($fd)) { + $log .= fgets($fd, 4096); + $n++; + if($n > 1000) break; + } + fclose($fd); + } + } else { + $log = 'Unable to read '.$logfile; + } + } + } + + return $log; + } + + function _checkTcp ($host,$port) { + + $fp = @fsockopen ($host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkUdp ($host,$port) { + + $fp = @fsockopen ('udp://'.$host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } + + function _checkFtp ($host,$port){ + + $conn_id = @ftp_connect($host, $port); + + if($conn_id){ + @ftp_close($conn_id); + return true; + } else { + return false; + } + } + + /* + Deletes Records older than n. + */ + function _delOldRecords($type, $min, $hour=0, $days=0) { + global $app; + + $now = time(); + $old = $now - ($min * 60) - ($hour * 60 * 60) - ($days * 24 * 60 * 60); + $sql = "DELETE FROM monitor_data " . + "WHERE " . + "type =" . "'" . $app->dbmaster->quote($type) . "' " . + "AND " . + "created < " . $old; + $app->dbmaster->query($sql); + } + + /* + * Set the state to the given level (or higher, but not lesser). + * * If the actual state is critical and you call the method with ok, + * then the state is critical. + * + * * If the actual state is critical and you call the method with error, + * then the state is error. + */ + function _setState($oldState, $newState) + { + /* + * Calculate the weight of the old state + */ + switch ($oldState) { + case 'no_state': $oldInt = 0; + break; + case 'ok': $oldInt = 1; + break; + case 'unknown': $oldInt = 2; + break; + case 'info': $oldInt = 3; + break; + case 'warning': $oldInt = 4; + break; + case 'critical': $oldInt = 5; + break; + case 'error': $oldInt = 6; + break; + } + /* + * Calculate the weight of the new state + */ + switch ($newState) { + case 'no_state': $newInt = 0 ; + break; + case 'ok': $newInt = 1 ; + break; + case 'unknown': $newInt = 2 ; + break; + case 'info': $newInt = 3 ; + break; + case 'warning': $newInt = 4 ; + break; + case 'critical': $newInt = 5 ; + break; + case 'error': $newInt = 6 ; + break; + } + + /* + * Set to the higher level + */ + if ($newInt > $oldInt){ + return $newState; + } + else + { + return $oldState; + } + } + + function _getIntArray($line){ + /** The array of float found */ + $res = array(); + /* First build a array from the line */ + $data = explode(' ', $line); + /* then check if any item is a float */ + foreach ($data as $item) { + if ($item . '' == (int)$item . ''){ + $res[] = $item; + } + } + return $res; + } + + +} // end class + +?> diff --git a/interface/ispconfig/server/mods-enabled/server_module.inc.php b/interface/ispconfig/server/mods-enabled/server_module.inc.php new file mode 100644 index 000000000..894c97253 --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/server_module.inc.php @@ -0,0 +1,137 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('server','server_module','process'); + $app->modules->registerTableHook('server_ip','server_module','process'); + $app->modules->registerTableHook('firewall','server_module','process'); + $app->modules->registerTableHook('software_update_inst','server_module','process'); + + // Register service + //$app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'server': + if($action == 'i') $app->plugins->raiseEvent('server_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('server_update',$data); + if($action == 'd') $app->plugins->raiseEvent('server_delete',$data); + break; + case 'server_ip': + if($action == 'i') $app->plugins->raiseEvent('server_ip_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('server_ip_update',$data); + if($action == 'd') $app->plugins->raiseEvent('server_ip_delete',$data); + break; + case 'firewall': + if($action == 'i') $app->plugins->raiseEvent('firewall_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('firewall_update',$data); + if($action == 'd') $app->plugins->raiseEvent('firewall_delete',$data); + break; + case 'software_update_inst': + if($action == 'i') $app->plugins->raiseEvent('software_update_inst_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('software_update_inst_update',$data); + if($action == 'd') $app->plugins->raiseEvent('software_update_inst_delete',$data); + break; + } // end switch + } // end function + + /* + // This function is used + function restartHttpd($action = 'restart') { + global $app; + if($action == 'restart') { + exec('/etc/init.d/apache2 restart'); + } else { + exec('/etc/init.d/apache2 reload'); + } + } + */ + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/mods-enabled/web_module.inc.php b/interface/ispconfig/server/mods-enabled/web_module.inc.php new file mode 100644 index 000000000..3ddeca5ed --- /dev/null +++ b/interface/ispconfig/server/mods-enabled/web_module.inc.php @@ -0,0 +1,140 @@ +plugins->announceEvents($this->module_name,$this->actions_available); + + /* + As we want to get notified of any changes on several database tables, + we register for them. + + The following function registers the function "functionname" + to be executed when a record for the table "dbtable" is + processed in the sys_datalog. "classname" is the name of the + class that contains the function functionname. + */ + + $app->modules->registerTableHook('web_domain','web_module','process'); + $app->modules->registerTableHook('ftp_user','web_module','process'); + $app->modules->registerTableHook('shell_user','web_module','process'); + + // Register service + $app->services->registerService('httpd','web_module','restartHttpd'); + + } + + /* + This function is called when a change in one of the registered tables is detected. + The function then raises the events for the plugins. + */ + + function process($tablename,$action,$data) { + global $app; + + switch ($tablename) { + case 'web_domain': + if($action == 'i') $app->plugins->raiseEvent('web_domain_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('web_domain_update',$data); + if($action == 'd') $app->plugins->raiseEvent('web_domain_delete',$data); + break; + case 'ftp_user': + if($action == 'i') $app->plugins->raiseEvent('ftp_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('ftp_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('ftp_user_delete',$data); + break; + case 'shell_user': + if($action == 'i') $app->plugins->raiseEvent('shell_user_insert',$data); + if($action == 'u') $app->plugins->raiseEvent('shell_user_update',$data); + if($action == 'd') $app->plugins->raiseEvent('shell_user_delete',$data); + break; + } // end switch + } // end function + + + // This function is used + function restartHttpd($action = 'restart') { + global $app; + + $command = ''; + if(is_file('/etc/init.d/httpd')) { + $command = '/etc/init.d/httpd'; + } else { + $command = '/etc/init.d/apache2'; + } + + if($action == 'restart') { + exec($command.' restart'); + } else { + exec($command.' reload'); + } + + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/apache2_plugin.inc.php b/interface/ispconfig/server/plugins-available/apache2_plugin.inc.php new file mode 100644 index 000000000..16b405ae4 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/apache2_plugin.inc.php @@ -0,0 +1,987 @@ +plugins->registerEvent('web_domain_insert',$this->plugin_name,'ssl'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'ssl'); + $app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'ssl'); + + $app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'delete'); + + $app->plugins->registerEvent('server_ip_insert',$this->plugin_name,'server_ip'); + $app->plugins->registerEvent('server_ip_update',$this->plugin_name,'server_ip'); + $app->plugins->registerEvent('server_ip_delete',$this->plugin_name,'server_ip'); + + } + + // Handle the creation of SSL certificates + function ssl($event_name,$data) { + global $app, $conf; + + if(!is_dir($data["new"]["document_root"]."/ssl")) exec("mkdir -p ".$data["new"]["document_root"]."/ssl"); + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $key_file = $ssl_dir.'/'.$domain.".key.org"; + $key_file2 = $ssl_dir.'/'.$domain.".key"; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + + //* Create a SSL Certificate + if($data["new"]["ssl_action"] == 'create') { + $rand_file = $ssl_dir."/random_file"; + $rand_data = md5(uniqid(microtime(),1)); + for($i=0; $i<1000; $i++){ + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + } + file_put_contents($rand_file, $rand_data); + + $ssl_password = substr(md5(uniqid(microtime(),1)), 0, 15); + + $ssl_cnf = " RANDFILE = $rand_file + + [ req ] + default_bits = 2048 + default_keyfile = keyfile.pem + distinguished_name = req_distinguished_name + attributes = req_attributes + prompt = no + output_password = $ssl_password + + [ req_distinguished_name ] + C = ".$data['new']['ssl_country']." + ST = ".$data['new']['ssl_state']." + L = ".$data['new']['ssl_locality']." + O = ".$data['new']['ssl_organisation']." + OU = ".$data['new']['ssl_organisation_unit']." + CN = $domain + emailAddress = webmaster@".$data['new']['domain']." + + [ req_attributes ] + challengePassword = A challenge password"; + + $ssl_cnf_file = $ssl_dir."/openssl.conf"; + file_put_contents($ssl_cnf_file,$ssl_cnf); + + $rand_file = escapeshellcmd($rand_file); + $key_file = escapeshellcmd($key_file); + $key_file2 = escapeshellcmd($key_file2); + $ssl_days = 3650; + $csr_file = escapeshellcmd($csr_file); + $config_file = escapeshellcmd($ssl_cnf_file); + $crt_file = escapeshellcmd($crt_file); + + if(is_file($ssl_cnf_file)){ + exec("openssl genrsa -des3 -rand $rand_file -passout pass:$ssl_password -out $key_file 2048 && openssl req -new -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -out $csr_file -days $ssl_days -config $config_file && openssl req -x509 -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -in $csr_file -out $crt_file -days $ssl_days -config $config_file && openssl rsa -passin pass:$ssl_password -in $key_file -out $key_file2"); + $app->log("Creating SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + exec("chmod 400 $key_file2"); + @unlink($config_file); + @unlink($rand_file); + $ssl_request = $app->db->quote(file_get_contents($csr_file)); + $ssl_cert = $app->db->quote(file_get_contents($crt_file)); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'"); + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'"); + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + } + + //* Save a SSL certificate to disk + if($data["new"]["ssl_action"] == 'save') { + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + file_put_contents($csr_file,$data["new"]["ssl_request"]); + file_put_contents($crt_file,$data["new"]["ssl_cert"]); + if(trim($data["new"]["ssl_bundle"]) != '') file_put_contents($bundle_file,$data["new"]["ssl_bundle"]); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->log("Saving SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + //* Delete a SSL certificate + if($data["new"]["ssl_action"] == 'del') { + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + unlink($csr_file); + unlink($crt_file); + unlink($bundle_file); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->log("Deleting SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + + + } + + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) { + + $old_parent_domain_id = intval($data["old"]["parent_domain_id"]); + $new_parent_domain_id = intval($data["new"]["parent_domain_id"]); + + // If the parent_domain_id has been chenged, we will have to update the old site as well. + if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) { + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->update($event_name,$data); + } + + // This is not a vhost, so we need to update the parent record instead. + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + } + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { + $apache_chrooted = true; + $app->log("Info: Apache is chrooted.",LOGLEVEL_DEBUG); + } else { + $apache_chrooted = false; + } + + if($data["new"]["document_root"] == '') { + $app->log("document_root not set",LOGLEVEL_WARN); + return 0; + } + if($data["new"]["system_user"] == 'root' or $data["new"]["system_group"] == 'root') { + $app->log("Websites can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + //* If the client of the site has been changed, we have a change of the document root + if($this->action == 'update' && $data["new"]["document_root"] != $data["old"]["document_root"]) { + + //* Get the old client ID + $old_client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $old_client_id = intval($old_client["client_id"]); + unset($old_client); + + //* Remove the old symlinks + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$old_client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // create the symlinks, if not exist + if(is_link($tmp_symlink)) { + exec("rm -f ".escapeshellcmd($tmp_symlink)); + $app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + + //* Move the site data + $tmp_docroot = explode('/',$data["new"]["document_root"]); + unset($tmp_docroot[count($tmp_docroot)-1]); + $new_dir = implode('/',$tmp_docroot); + + $tmp_docroot = explode('/',$data["old"]["document_root"]); + unset($tmp_docroot[count($tmp_docroot)-1]); + $old_dir = implode('/',$tmp_docroot); + + exec('rm -rf '.$data["new"]["document_root"]); + if(!is_dir($new_dir)) exec('mkdir -p '.$new_dir); + exec('mv '.$data["old"]["document_root"].' '.$new_dir); + $app->log("Moving site to new document root: ".'mv '.$data["old"]["document_root"].' '.$new_dir,LOGLEVEL_DEBUG); + + //* Change the owner of the website files to the new website owner + exec('chown --recursive --from='.escapeshellcmd($data["old"]["system_user"]).':'.escapeshellcmd($data['old']['system_group']).' '.escapeshellcmd($data["new"]["system_user"]).':'.escapeshellcmd($data['new']['system_group']).' '.$new_dir); + + //* Change the home directory and group of the website user + $command = 'usermod'; + $command .= ' --home '.escapeshellcmd($data["new"]["document_root"]); + $command .= ' --gid '.escapeshellcmd($data['new']['system_group']); + $command .= ' '.escapeshellcmd($data["new"]["system_user"]); + exec($command); + + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + + } + + //print_r($data); + + // Check if the directories are there and create them if nescessary. + if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web"); + if(!is_dir($data["new"]["document_root"]."/web/error") and $data["new"]["errordocs"]) exec("mkdir -p ".$data["new"]["document_root"]."/web/error"); + //if(!is_dir($data["new"]["document_root"]."/log")) exec("mkdir -p ".$data["new"]["document_root"]."/log"); + if(!is_dir($data["new"]["document_root"]."/ssl")) exec("mkdir -p ".$data["new"]["document_root"]."/ssl"); + if(!is_dir($data["new"]["document_root"]."/cgi-bin")) exec("mkdir -p ".$data["new"]["document_root"]."/cgi-bin"); + if(!is_dir($data["new"]["document_root"]."/tmp")) exec("mkdir -p ".$data["new"]["document_root"]."/tmp"); + + // Remove the symlink for the site, if site is renamed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + if(is_dir('/var/log/ispconfig/httpd/'.$data["old"]["domain"])) exec('rm -rf /var/log/ispconfig/httpd/'.$data["old"]["domain"]); + if(is_link($data["old"]["document_root"]."/log")) unlink($data["old"]["document_root"]."/log"); + } + + // Create the symlink for the logfiles + if(!is_dir('/var/log/ispconfig/httpd/'.$data["new"]["domain"])) exec('mkdir -p /var/log/ispconfig/httpd/'.$data["new"]["domain"]); + if(!is_link($data["new"]["document_root"]."/log")) { + exec("ln -s /var/log/ispconfig/httpd/".$data["new"]["domain"]." ".$data["new"]["document_root"]."/log"); + $app->log("Creating Symlink: ln -s /var/log/ispconfig/httpd/".$data["new"]["domain"]." ".$data["new"]["document_root"]."/log",LOGLEVEL_DEBUG); + } + /* + // Create the symlink for the logfiles + // This does not work as vlogger can not log trogh symlinks. + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + if(is_dir($data["old"]["document_root"]."/log")) exec('rm -rf '.$data["old"]["document_root"]."/log"); + if(is_link('/var/log/ispconfig/httpd/'.$data["old"]["domain"])) unlink('/var/log/ispconfig/httpd/'.$data["old"]["domain"]); + } + + // Create the symlink for the logfiles + if(!is_dir($data["new"]["document_root"]."/log")) exec('mkdir -p '.$data["new"]["document_root"]."/log"); + if(!is_link('/var/log/ispconfig/httpd/'.$data["new"]["domain"])) { + exec("ln -s ".$data["new"]["document_root"]."/log /var/log/ispconfig/httpd/".$data["new"]["domain"]); + $app->log("Creating Symlink: ln -s ".$data["new"]["document_root"]."/log /var/log/ispconfig/httpd/".$data["new"]["domain"],LOGLEVEL_DEBUG); + } + */ + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["new"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + // Remove old symlinks, if site is renamed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // remove the symlinks, if not exist + if(is_link($tmp_symlink)) { + exec("rm -f ".escapeshellcmd($tmp_symlink)); + $app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + } + + // Create the symlinks for the sites + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["new"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + //* Remove symlink if target folder has been changed. + if($data["old"]["document_root"] != '' && $data["old"]["document_root"] != $data["new"]["document_root"] && is_link($tmp_symlink)) { + unlink($tmp_symlink); + } + // create the symlinks, if not exist + if(!is_link($tmp_symlink)) { + exec("ln -s ".escapeshellcmd($data["new"]["document_root"])."/ ".escapeshellcmd($tmp_symlink)); + $app->log("Creating Symlink: ln -s ".$data["new"]["document_root"]."/ ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + + + if($this->action == 'insert' && $data["new"]["type"] == 'vhost') { + // Copy the error pages + if($data["new"]["errordocs"]){ + $error_page_path = escapeshellcmd($data["new"]["document_root"])."/web/error/"; + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/400.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/*.html ".$error_page_path); + } + else { + exec("cp /usr/local/ispconfig/server/conf/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + } + exec("chmod -R a+r ".$error_page_path); + } + + // copy the standard index page + if (file_exists("/usr/local/ispconfig/server/conf-custom/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2)." ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/index/standard_index.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/index/standard_index.html ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + } + else { + exec("cp /usr/local/ispconfig/server/conf/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2)." ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + exec("cp /usr/local/ispconfig/server/conf/index/favicon.ico ".escapeshellcmd($data["new"]["document_root"])."/web/"); + exec("cp /usr/local/ispconfig/server/conf/index/robots.txt ".escapeshellcmd($data["new"]["document_root"])."/web/"); + exec("cp /usr/local/ispconfig/server/conf/index/.htaccess ".escapeshellcmd($data["new"]["document_root"])."/web/"); + } + } + exec("chmod -R a+r ".escapeshellcmd($data["new"]["document_root"])."/web/"); + + //** Copy the error documents on update when the error document checkbox has been activated and was deactivated before + } elseif ($this->action == 'update' && $data["new"]["type"] == 'vhost' && $data["old"]["errordocs"] == 0 && $data["new"]["errordocs"] == 1) { + + $error_page_path = escapeshellcmd($data["new"]["document_root"])."/web/error/"; + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/400.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/*.html ".$error_page_path); + } + else { + exec("cp /usr/local/ispconfig/server/conf/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + } + exec("chmod -R a+r ".$error_page_path); + } // end copy error docs + + // Create group and user, if not exist + $app->uses("system"); + + $groupname = escapeshellcmd($data["new"]["system_group"]); + if($data["new"]["system_group"] != '' && !$app->system->is_group($data["new"]["system_group"])) { + exec("groupadd $groupname"); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." groupadd $groupname"); + $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG); + } + + $username = escapeshellcmd($data["new"]["system_user"]); + if($data["new"]["system_user"] != '' && !$app->system->is_user($data["new"]["system_user"])) { + exec("useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." "."useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); + $app->log("Adding the user: $username",LOGLEVEL_DEBUG); + } + + // Set the quota for the user + if($username != '' && $app->system->is_user($username)) { + if($data["new"]["hd_quota"] > 0){ + $blocks_soft = $data["new"]["hd_quota"] * 1024; + $blocks_hard = $blocks_soft + 1024; + } else { + $blocks_soft = $blocks_hard = 0; + } + exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null"); + exec("setquota -T -u $username 604800 604800 -a &> /dev/null"); + } + + if($this->action == 'insert') { + // Chown and chmod the directories below the document root + $this->_exec("chown -R $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + // The document root itself has to be owned by root in normal level and by the web owner in security level 20 + if($web_config['security_level'] == 20) { + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + } else { + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"])); + } + } + + + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + + $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"])."/*"); + $this->_exec("chmod 710 ".escapeshellcmd($data["new"]["document_root"]."/web")); + + // make temp direcory writable for the apache user and the website user + $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); + + $command = 'usermod'; + $command .= ' --groups sshusers'; + $command .= ' '.escapeshellcmd($data["new"]["system_user"]); + $this->_exec($command); + + //* if we have a chrooted apache enviroment + if($apache_chrooted) { + $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + //* add the apache user to the client group in the chroot enviroment + $tmp_groupfile = $app->system->server_conf["group_datei"]; + $app->system->server_conf["group_datei"] = $web_config['website_basedir'].'/etc/group'; + $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); + $app->system->server_conf["group_datei"] = $tmp_groupfile; + unset($tmp_groupfile); + } + + //* add the apache user to the client group + $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); + + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + + /* + * Workaround for jailkit: If jailkit is enabled for the site, the + * website root has to be owned by the root user and we have to chmod it to 755 then + */ + + //* Check if there is a jailkit user for this site + $tmp = $app->db->queryOneRecord("SELECT count(shell_user_id) as number FROM shell_user WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND chroot = 'jailkit'"); + if($tmp['number'] > 0) { + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); + } + unset($tmp); + + // If the security Level is set to medium + } else { + + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/*")); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); + + // make temp direcory writable for the apache user and the website user + $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); + } + + // Change the owner of the error log to the owner of the website + if(!@is_file($data["new"]["document_root"]."/log/error.log")) exec('touch '.escapeshellcmd($data["new"]["document_root"])."/log/error.log"); + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])."/log/error.log"); + + + // Create the vhost config file + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("vhost.conf.master"); + + $vhost_data = $data["new"]; + $vhost_data["web_document_root"] = $data["new"]["document_root"]."/web"; + $vhost_data["web_document_root_www"] = $web_config["website_basedir"]."/".$data["new"]["domain"]."/web"; + $vhost_data["web_basedir"] = $web_config["website_basedir"]; + $vhost_data["security_level"] = $web_config["security_level"]; + $vhost_data["allow_override"] = ($data["new"]["allow_override"] == '')?'All':$data["new"]["allow_override"]; + $vhost_data["php_open_basedir"] = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $vhost_data["ssl_domain"] = $data["new"]["ssl_domain"]; + + // Check if a SSL cert exists + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $key_file = $ssl_dir.'/'.$domain.".key"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + + if($data["new"]["ssl"] == 'y' && @is_file($crt_file) && @is_file($key_file)) { + $vhost_data["ssl_enabled"] = 1; + $app->log("Enable SSL for: $domain",LOGLEVEL_DEBUG); + } else { + $vhost_data["ssl_enabled"] = 0; + $app->log("Disable SSL for: $domain",LOGLEVEL_DEBUG); + } + + if(@is_file($bundle_file)) $vhost_data['has_bundle_cert'] = 1; + + //$vhost_data["document_root"] = $data["new"]["document_root"]."/web"; + $tpl->setVar($vhost_data); + + // Rewrite rules + $rewrite_rules = array(); + if($data["new"]["redirect_type"] != '') { + if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/'; + /* Disabled path extension + if($data["new"]["redirect_type"] == 'no' && substr($data["new"]["redirect_path"],0,4) != 'http') { + $data["new"]["redirect_path"] = $data["new"]["document_root"]."/web".realpath($data["new"]["redirect_path"]).'/'; + } + */ + + $rewrite_rules[] = array( 'rewrite_domain' => $data["new"]["domain"], + 'rewrite_type' => ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']', + 'rewrite_target' => $data["new"]["redirect_path"]); + + switch($data["new"]["subdomain"]) { + case 'www': + $rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$data["new"]["domain"], + 'rewrite_type' => ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']', + 'rewrite_target' => $data["new"]["redirect_path"]); + break; + case '*': + // TODO + //$rewrite_rules[] = array( 'rewrite_domain' => '*'.$alias["domain"], + // 'rewrite_type' => $alias["redirect_type"], + // 'rewrite_target' => $alias["redirect_path"]); + break; + } + } + + // get alias domains (co-domains and subdomains) + $aliases = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND active = 'y'"); + $server_alias = array(); + switch($data["new"]["subdomain"]) { + case 'www': + $server_alias[] .= 'www.'.$data["new"]["domain"].' '; + break; + case '*': + $server_alias[] .= '*.'.$data["new"]["domain"].' '; + break; + } + if(is_array($aliases)) { + foreach($aliases as $alias) { + switch($alias["subdomain"]) { + case 'www': + $server_alias[] .= 'www.'.$alias["domain"].' '.$alias["domain"].' '; + break; + case '*': + $server_alias[] .= '*.'.$alias["domain"].' '.$alias["domain"].' '; + break; + default: + $server_alias[] .= $alias["domain"].' '; + break; + } + $app->log("Add server alias: $alias[domain]",LOGLEVEL_DEBUG); + // Rewriting + if($alias["redirect_type"] != '') { + if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/'; + /* Disabled path extension + if($data["new"]["redirect_type"] == 'no' && substr($data["new"]["redirect_path"],0,4) != 'http') { + $data["new"]["redirect_path"] = $data["new"]["document_root"]."/web".realpath($data["new"]["redirect_path"]).'/'; + } + */ + $rewrite_rules[] = array( 'rewrite_domain' => $alias["domain"], + 'rewrite_type' => ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']', + 'rewrite_target' => $alias["redirect_path"]); + switch($alias["subdomain"]) { + case 'www': + $rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$alias["domain"], + 'rewrite_type' => ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']', + 'rewrite_target' => $alias["redirect_path"]); + break; + case '*': + // TODO + //$rewrite_rules[] = array( 'rewrite_domain' => '*'.$alias["domain"], + // 'rewrite_type' => $alias["redirect_type"], + // 'rewrite_target' => $alias["redirect_path"]); + break; + } + } + } + } + + //* If we have some alias records + if(count($server_alias) > 0) { + $server_alias_str = ''; + $n = 0; + + // begin a new ServerAlias line after 30 alias domains + foreach($server_alias as $tmp_alias) { + if($n % 30 == 0) $server_alias_str .= "\n ServerAlias "; + $server_alias_str .= $tmp_alias; + } + unset($tmp_alias); + + $tpl->setVar('alias',trim($server_alias_str)); + } else { + $tpl->setVar('alias',''); + } + + if(count($rewrite_rules) > 0) { + $tpl->setVar('rewrite_enabled',1); + } else { + $tpl->setVar('rewrite_enabled',0); + } + $tpl->setLoop('redirects',$rewrite_rules); + + /** + * install fast-cgi starter script and add script aliasd config + * first we create the script directory if not already created, then copy over the starter script + * settings are copied over from the server ini config for now + * TODO: Create form for fastcgi configs per site. + */ + + if ($data["new"]["php"] == "fast-cgi") + { + $fastcgi_config = $app->getconf->get_server_config($conf["server_id"], 'fastcgi'); + + $fastcgi_starter_path = str_replace("[system_user]",$data["new"]["system_user"],$fastcgi_config["fastcgi_starter_path"]); + $fastcgi_starter_path = str_replace("[client_id]",$client_id,$fastcgi_starter_path); + + if (!is_dir($fastcgi_starter_path)) + { + exec("mkdir -p ".escapeshellcmd($fastcgi_starter_path)); + //exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($fastcgi_starter_path)); + + + $app->log("Creating fastcgi starter script directory: $fastcgi_starter_path",LOGLEVEL_DEBUG); + } + + exec("chown -R ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($fastcgi_starter_path)); + + $fcgi_tpl = new tpl(); + $fcgi_tpl->newTemplate("php-fcgi-starter.master"); + + $fcgi_tpl->setVar('php_ini_path',escapeshellcmd($fastcgi_config["fastcgi_phpini_path"])); + $fcgi_tpl->setVar('document_root',escapeshellcmd($data["new"]["document_root"])); + $fcgi_tpl->setVar('php_fcgi_children',escapeshellcmd($fastcgi_config["fastcgi_children"])); + $fcgi_tpl->setVar('php_fcgi_max_requests',escapeshellcmd($fastcgi_config["fastcgi_max_requests"])); + $fcgi_tpl->setVar('php_fcgi_bin',escapeshellcmd($fastcgi_config["fastcgi_bin"])); + $fcgi_tpl->setVar('security_level',intval($web_config["security_level"])); + + $php_open_basedir = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $fcgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir)); + + $fcgi_starter_script = escapeshellcmd($fastcgi_starter_path.$fastcgi_config["fastcgi_starter_script"]); + file_put_contents($fcgi_starter_script,$fcgi_tpl->grab()); + unset($fcgi_tpl); + + $app->log("Creating fastcgi starter script: $fcgi_starter_script",LOGLEVEL_DEBUG); + + + exec("chmod 755 $fcgi_starter_script"); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." $fcgi_starter_script"); + + $tpl->setVar('fastcgi_alias',$fastcgi_config["fastcgi_alias"]); + $tpl->setVar('fastcgi_starter_path',$fastcgi_starter_path); + $tpl->setVar('fastcgi_starter_script',$fastcgi_config["fastcgi_starter_script"]); + + } + + /** + * install cgi starter script and add script alias to config. + * This is needed to allow cgi with suexec (to do so, we need a bin in the document-path!) + * first we create the script directory if not already created, then copy over the starter script. + * TODO: we have to fetch the data from the server-settings. + */ + + if ($data["new"]["php"] == "cgi") + { + //$cgi_config = $app->getconf->get_server_config($conf["server_id"], 'cgi'); + + $cgi_config["cgi_starter_path"] = $web_config["website_basedir"]."/php-cgi-scripts/[system_user]/"; + $cgi_config["cgi_starter_script"] = "php-cgi-starter"; + $cgi_config["cgi_bin"] = "/usr/bin/php-cgi"; + + $cgi_starter_path = str_replace("[system_user]",$data["new"]["system_user"],$cgi_config["cgi_starter_path"]); + $cgi_starter_path = str_replace("[client_id]",$client_id,$cgi_starter_path); + + if (!is_dir($cgi_starter_path)) + { + exec("mkdir -p ".escapeshellcmd($cgi_starter_path)); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($cgi_starter_path)); + + $app->log("Creating cgi starter script directory: $cgi_starter_path",LOGLEVEL_DEBUG); + } + + $cgi_tpl = new tpl(); + $cgi_tpl->newTemplate("php-cgi-starter.master"); + + // This works, because php "rewrites" a symlink to the physical path + $php_open_basedir = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $cgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir)); + $cgi_tpl->setVar('document_root', escapeshellcmd($data["new"]["document_root"])); + + // This will NOT work! + //$cgi_tpl->setVar('open_basedir', "/var/www/" . $data["new"]["domain"]); + $cgi_tpl->setVar('php_cgi_bin',$cgi_config["cgi_bin"]); + $cgi_tpl->setVar('security_level',$web_config["security_level"]); + + $cgi_starter_script = escapeshellcmd($cgi_starter_path.$cgi_config["cgi_starter_script"]); + file_put_contents($cgi_starter_script,$cgi_tpl->grab()); + unset($cgi_tpl); + + $app->log("Creating cgi starter script: $cgi_starter_script",LOGLEVEL_DEBUG); + + + exec("chmod 755 $cgi_starter_script"); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." $cgi_starter_script"); + + $tpl->setVar('cgi_starter_path',$cgi_starter_path); + $tpl->setVar('cgi_starter_script',$cgi_config["cgi_starter_script"]); + + } + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["new"]["domain"].'.vhost'); + file_put_contents($vhost_file,$tpl->grab()); + $app->log("Writing the vhost file: $vhost_file",LOGLEVEL_DEBUG); + unset($tpl); + + // Set the symlink to enable the vhost + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["new"]["domain"].'.vhost'); + if($data["new"]["active"] == 'y' && !is_link($vhost_symlink)) { + symlink($vhost_file,$vhost_symlink); + $app->log("Creating the symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + } + + // Remove the symlink, if site is inactive + if($data["new"]["active"] == 'n' && is_link($vhost_symlink)) { + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + } + + // remove old symlink and vhost file, if domain name of the site has changed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_file); + $app->log("Removing File $vhost_file",LOGLEVEL_DEBUG); + } + + //* Create .htaccess and .htpasswd file for website statistics + if(!is_file($data["new"]["document_root"].'/web/stats/.htaccess') or $data["old"]["document_root"] != $data["new"]["document_root"]) { + if(!is_dir($data["new"]["document_root"].'/web/stats')) mkdir($data["new"]["document_root"].'/web/stats'); + $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data["new"]["document_root"]."/.htpasswd_stats\nrequire valid-user"; + file_put_contents($data["new"]["document_root"].'/web/stats/.htaccess',$ht_file); + chmod($data["new"]["document_root"].'/web/stats/.htaccess',0755); + unset($ht_file); + } + + if(!is_file($data["new"]["document_root"].'/.htpasswd_stats') || $data["new"]["stats_password"] != $data["old"]["stats_password"]) { + if(trim($data["new"]["stats_password"]) != '') { + $htp_file = 'admin:'.trim($data["new"]["stats_password"]); + file_put_contents($data["new"]["document_root"].'/.htpasswd_stats',$htp_file); + chmod($data["new"]["document_root"].'/.htpasswd_stats',0755); + unset($htp_file); + } + } + + + if($apache_chrooted) { + $app->services->restartServiceDelayed('httpd','restart'); + } else { + // request a httpd reload when all records have been processed + $app->services->restartServiceDelayed('httpd','reload'); + } + + //* Unset action to clean it for next processed vhost. + $this->action = ''; + + } + + function delete($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['/var/www'].'/etc/passwd')) { + $apache_chrooted = true; + } else { + $apache_chrooted = false; + } + + if($data["old"]["type"] != "vhost" && $data["old"]["parent_domain_id"] > 0) { + //* This is a alias domain or subdomain, so we have to update the website instead + $parent_domain_id = intval($data["old"]["parent_domain_id"]); + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + // just run the update function + $this->update($event_name,$data); + + } else { + //* This is a website + // Deleting the vhost file, symlink and the data directory + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_file); + $app->log("Removing vhost file: $vhost_file",LOGLEVEL_DEBUG); + + $docroot = escapeshellcmd($data["old"]["document_root"]); + if($docroot != '' && !stristr($docroot,'..')) exec("rm -rf $docroot"); + + + //remove the php fastgi starter script if available + if ($data["old"]["php"] == "fast-cgi") + { + $fastcgi_starter_path = str_replace("[system_user]",$data["old"]["system_user"],$web_config["fastcgi_starter_path"]); + if (is_dir($fastcgi_starter_path)) + { + exec("rm -rf $fastcgi_starter_path"); + } + } + + //remove the php cgi starter script if available + if ($data["old"]["php"] == "cgi") + { + // TODO: fetch the date from the server-settings + $web_config["cgi_starter_path"] = $web_config["website_basedir"]."/php-cgi-scripts/[system_user]/"; + + $cgi_starter_path = str_replace("[system_user]",$data["old"]["system_user"],$web_config["cgi_starter_path"]); + if (is_dir($cgi_starter_path)) + { + exec("rm -rf $cgi_starter_path"); + } + } + + $app->log("Removing website: $docroot",LOGLEVEL_DEBUG); + + // Delete the symlinks for the sites + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // create the symlinks, if not exist + if(is_link($tmp_symlink)) { + unlink($tmp_symlink); + $app->log("Removing symlink: ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + // end removing symlinks + + // Delete the log file directory + $vhost_logfile_dir = escapeshellcmd('/var/log/ispconfig/httpd/'.$data["old"]["domain"]); + if($data["old"]["domain"] != '' && !stristr($vhost_logfile_dir,'..')) exec("rm -rf $vhost_logfile_dir"); + $app->log("Removing website logfile directory: $vhost_logfile_dir",LOGLEVEL_DEBUG); + + //delete the web user + $command = 'userdel'; + $command .= ' '.$data["old"]["system_user"]; + exec($command); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + } + } + + //* This function is called when a IP on the server is inserted, updated or deleted + function server_ip($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("apache_ispconfig.conf.master"); + $records = $app->db->queryAllRecords("SELECT * FROM server_ip WHERE server_id = ".$conf["server_id"]." AND virtualhost = 'y'"); + + if(count($records) > 0) { + $tpl->setLoop('ip_adresses',$records); + } + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/ispconfig.conf'); + file_put_contents($vhost_file,$tpl->grab()); + $app->log("Writing the conf file: ispconfig.conf",LOGLEVEL_DEBUG); + unset($tpl); + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/apps_vhost_plugin.inc.php b/interface/ispconfig/server/plugins-available/apps_vhost_plugin.inc.php new file mode 100644 index 000000000..e864dbd99 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/apps_vhost_plugin.inc.php @@ -0,0 +1,114 @@ +plugins->registerEvent('server_insert','apps_vhost_plugin','insert'); + $app->plugins->registerEvent('server_update','apps_vhost_plugin','update'); + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + // Dont just copy over the virtualhost template but add some custom settings + $content = file_get_contents($conf["rootpath"]."/conf/apache_apps.vhost.master"); + + $vhost_conf_dir = $web_config['vhost_conf_dir']; + $vhost_conf_enabled_dir = $web_config['vhost_conf_enabled_dir']; + $apps_vhost_servername = ($web_config['apps_vhost_servername'] == '')?'':'ServerName '.$web_config['apps_vhost_servername']; + + $web_config['apps_vhost_port'] = (empty($web_config['apps_vhost_port']))?8081:$web_config['apps_vhost_port']; + $web_config['apps_vhost_ip'] = (empty($web_config['apps_vhost_ip']))?'_default_':$web_config['apps_vhost_ip']; + + $content = str_replace('{apps_vhost_ip}', $web_config['apps_vhost_ip'], $content); + $content = str_replace('{apps_vhost_port}', $web_config['apps_vhost_port'], $content); + $content = str_replace('{apps_vhost_dir}', $web_config['website_basedir'].'/apps', $content); + $content = str_replace('{apps_vhost_servername}', $apps_vhost_servername, $content); + $content = str_replace('{apps_vhost_basedir}', $web_config['website_basedir'], $content); + + + // comment out the listen directive if port is 80 or 443 + if($web_config['apps_vhost_ip'] == 80 or $web_config['apps_vhost_ip'] == 443) { + $content = str_replace('{vhost_port_listen}', '#', $content); + } else { + $content = str_replace('{vhost_port_listen}', '', $content); + } + + file_put_contents("$vhost_conf_dir/apps.vhost", $content); + + $app->services->restartServiceDelayed('httpd','restart'); + + + } + + +} // end class + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/bind_dlz_plugin.inc.php b/interface/ispconfig/server/plugins-available/bind_dlz_plugin.inc.php new file mode 100644 index 000000000..c0f67472f --- /dev/null +++ b/interface/ispconfig/server/plugins-available/bind_dlz_plugin.inc.php @@ -0,0 +1,352 @@ +plugins->registerEvent('dns_soa_insert',$this->plugin_name,'soa_insert'); + $app->plugins->registerEvent('dns_soa_update',$this->plugin_name,'soa_update'); + $app->plugins->registerEvent('dns_soa_delete',$this->plugin_name,'soa_delete'); + + //* RR + $app->plugins->registerEvent('dns_rr_insert',$this->plugin_name,'rr_insert'); + $app->plugins->registerEvent('dns_rr_update',$this->plugin_name,'rr_update'); + $app->plugins->registerEvent('dns_rr_delete',$this->plugin_name,'rr_delete'); + } + + + function soa_insert($event_name,$data) + { + global $app, $conf; + + if($data["new"]["active"] != 'Y') return; + + $origin = substr($data["new"]["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + $serial = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$ispconfig_id); + + $ttl = $data["new"]["ttl"]; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + $_db->query("INSERT INTO records (zone, ttl, type, primary_ns, resp_contact, serial, refresh, retry, expire, minimum, ispconfig_id) VALUES ". + "('$origin', $ttl, 'SOA', '{$data["new"]["ns"]}', '{$data["new"]["mbox"]}', '{$serial["serial"]}', '{$serial["refresh"]}'," . + "'{$serial["retry"]}', '{$serial["expire"]}', '{$serial["minimum"]}', $ispconfig_id)"); + unset($_db); + } + + function soa_update($event_name,$data) + { + global $app, $conf; + + if($data["new"]["active"] != 'Y') + { + if($data["old"]["active"] != 'Y') return; + $this->soa_delete($event_name,$data); + } + else + { + if($data["old"]["active"] == 'Y') + { + $origin = substr($data["new"]["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + $serial = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$ispconfig_id); + + $ttl = $data["new"]["ttl"]; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + $_db->query("UPDATE records SET zone = '$origin', ttl = $ttl, primary_ns = '{$data["new"]["ns"]}', resp_contact = '{$data["new"]["mbox"]}', ". + "serial = '{$serial["serial"]}', refresh = '{$serial["refresh"]}', retry = '{$serial["retry"]}', expire = '{$serial["expire"]}', ". + "minimum = '{$serial["minimum"]}' WHERE ispconfig_id = ".$data["new"]["id"]." AND type = 'SOA'"); + unset($_db); + } + else + { + $this->soa_insert($event_name,$data); + $ispconfig_id = $data["new"]["id"]; + + if ($records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone = $ispconfig_id AND active = 'Y'")) + { + foreach($records as $record) + { + foreach ($record as $key => $val) { + $data["new"][$key] = $val; + } + $this->rr_insert("dns_rr_insert", $data); + } + } + } + } + + } + + function soa_delete($event_name,$data) + { + global $app, $conf; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + $_db->query("DELETE FROM records WHERE ispconfig_id = {$data["old"]["id"]}"); + unset($_db); + } + + function rr_insert($event_name,$data) + { + global $app, $conf; + if($data["new"]["active"] != 'Y') return; + + $zone = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data["new"]["zone"]); + $origin = substr($zone["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + + $type = $data["new"]["type"]; + + if (substr($data["new"]["name"], -1) == '.') { + $name = substr($data["new"]["name"], 0, -1); + } else { + $name = ($data["new"]["name"] == "") ? $name = '@' : $data["new"]["name"]; + } + + if ($name == $origin || $name == '') { + $name = '@'; + } + + switch ($type) + { + case "CNAME": + case "MX": + case "NS": + case "ALIAS": + case "PTR": + case "SRV": + if(substr($data["new"]["data"], -1) != '.'){ + $content = $data["new"]["data"] . '.'; + } else { + $content = $data["new"]["data"]; + } + break; + case "HINFO": + $content = $data["new"]["data"]; + $quote1 = strpos($content, '"'); + + if($quote1 !== FALSE) { + $quote2 = strpos(substr($content, ($quote1 + 1)), '"'); + } + + if ($quote1 !== FALSE && $quote2 !== FALSE) { + $text_between_quotes = str_replace(' ', '_', substr($content, ($quote1 + 1), (($quote2 - $quote1)))); + $content = $text_between_quotes.substr($content, ($quote2 + 2)); + } + break; + default: + $content = $data["new"]["data"]; + } + + $ttl = $data["new"]["ttl"]; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + if ($type == 'MX') { + $_db->query("INSERT INTO records (zone, ttl, type, host, mx_priority, data, ispconfig_id)". + " VALUES ('$origin', $ttl, '$type', '$name', {$data["new"]["aux"]}, '$content', $ispconfig_id)"); + } else { + $_db->query("INSERT INTO records (zone, ttl, type, host, data, ispconfig_id)". + " VALUES ('$origin', $ttl, '$type', '$name', '$content', $ispconfig_id)"); + } + + unset($_db); + } + + function rr_update($event_name,$data) + { + global $app, $conf; + + if ($data["new"]["active"] != 'Y') + { + if($data["old"]["active"] != 'Y') return; + $this->rr_delete($event_name,$data); + } + else + { + if ($data["old"]["active"] == 'Y') + { + $zone = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data["new"]["zone"]); + $origin = substr($zone["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + + $type = $data["new"]["type"]; + + if (substr($data["new"]["name"], -1) == '.') { + $name = substr($data["new"]["name"], 0, -1); + } else { + $name = ($data["new"]["name"] == "") ? $name = '@' : $data["new"]["name"]; + } + + if ($name == $origin || $name == '') { + $name = '@'; + } + + switch ($type) + { + case "CNAME": + case "MX": + case "NS": + case "ALIAS": + case "PTR": + case "SRV": + if(substr($data["new"]["data"], -1) != '.'){ + $content = $data["new"]["data"] . '.'; + } else { + $content = $data["new"]["data"]; + } + break; + case "HINFO": + $content = $data["new"]["data"]; + $quote1 = strpos($content, '"'); + if($quote1 !== FALSE){ + $quote2 = strpos(substr($content, ($quote1 + 1)), '"'); + } + if($quote1 !== FALSE && $quote2 !== FALSE){ + $text_between_quotes = str_replace(' ', '_', substr($content, ($quote1 + 1), (($quote2 - $quote1)))); + $content = $text_between_quotes.substr($content, ($quote2 + 2)); + } + break; + default: + $content = $data["new"]["data"]; + } + + $ttl = $data["new"]["ttl"]; + $prio = (int)$data["new"]["aux"]; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + if ($type == 'MX') { + $_db->query("UPDATE records SET zone = '$origin', ttl = $ttl, type = '$type', host = '$name', mx_priority = $prio, ". + "data = '$content' WHERE ispconfig_id = $ispconfig_id AND type != 'SOA'"); + } else { + $_db->query("UPDATE records SET zone = '$origin', ttl = $ttl, type = '$type', host = '$name', ". + "data = '$content' WHERE ispconfig_id = $ispconfig_id AND type != 'SOA'"); + } + + unset($_db); + } else { + $this->rr_insert($event_name,$data); + } + } + } + + function rr_delete($event_name,$data) { + global $app, $conf; + + $_db = clone $app->db; + $_db->dbName = 'named'; + + $_db->query("DELETE FROM named.records WHERE ispconfig_id = {$data["old"]["id"]} AND type != 'SOA'"); + unset($_db); + } +} // end class +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/bind_plugin.inc.php b/interface/ispconfig/server/plugins-available/bind_plugin.inc.php new file mode 100644 index 000000000..f7de32912 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/bind_plugin.inc.php @@ -0,0 +1,224 @@ +plugins->registerEvent('dns_soa_insert',$this->plugin_name,'soa_insert'); + $app->plugins->registerEvent('dns_soa_update',$this->plugin_name,'soa_update'); + $app->plugins->registerEvent('dns_soa_delete',$this->plugin_name,'soa_delete'); + + //* RR + $app->plugins->registerEvent('dns_rr_insert',$this->plugin_name,'rr_insert'); + $app->plugins->registerEvent('dns_rr_update',$this->plugin_name,'rr_update'); + $app->plugins->registerEvent('dns_rr_delete',$this->plugin_name,'rr_delete'); + + } + + + function soa_insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + $this->soa_update($event_name,$data); + + } + + function soa_update($event_name,$data) { + global $app, $conf; + + //* Load libraries + $app->uses("getconf,tpl"); + + //* load the server configuration options + $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); + + //* Write the domain file + if(!empty($data['new']['id'])) { + $tpl = new tpl(); + $tpl->newTemplate("bind_pri.domain.master"); + + $zone = $data['new']; + $tpl->setVar($zone); + + $records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone = ".$zone['id']." AND active = 'Y'"); + $tpl->setLoop('zones',$records); + + + $filename = escapeshellcmd($dns_config['bind_zonefiles_dir'].'/pri.'.substr($zone['origin'],0,-1)); + $app->log("Writing BIND domain file: ".$filename,LOGLEVEL_DEBUG); + file_put_contents($filename,$tpl->grab()); + exec('chown '.escapeshellcmd($dns_config['bind_user']).':'.escapeshellcmd($dns_config['bind_group']).' '.$filename); + unset($tpl); + unset($records); + unset($records_out); + unset($zone); + } + + //* rebuild the named.conf file if the origin has changed or when the origin is inserted. + //if($this->action == 'insert' || $data['old']['origin'] != $data['new']['origin']) { + $this->write_named_conf($data,$dns_config); + //} + + //* Delete old domain file, if domain name has been changed + if($data['old']['origin'] != $data['new']['origin']) { + $filename = $dns_config['bind_zonefiles_dir'].'/pri.'.substr($data['old']['origin'],0,-1); + if(is_file($filename)) unset($filename); + } + + //* Reload bind nameserver + $app->services->restartServiceDelayed('bind','reload'); + + } + + function soa_delete($event_name,$data) { + global $app, $conf; + + //* load the server configuration options + $app->uses("getconf,tpl"); + $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); + + //* rebuild the named.conf file + $this->write_named_conf($data,$dns_config); + + //* Delete the domain file + $zone_file_name = $dns_config['bind_zonefiles_dir'].'/pri.'.substr($data['old']['origin'],0,-1); + if(is_file($zone_file_name)) unlink($zone_file_name); + $app->log("Deleting BIND domain file: ".$zone_file_name,LOGLEVEL_DEBUG); + + //* Reload bind nameserver + $app->services->restartServiceDelayed('bind','reload'); + + } + + function rr_insert($event_name,$data) { + global $app, $conf; + + //* Get the data of the soa and call soa_update + $tmp = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data['new']['zone']); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->soa_update($event_name,$data); + + } + + function rr_update($event_name,$data) { + global $app, $conf; + + //* Get the data of the soa and call soa_update + $tmp = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data['new']['zone']); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->soa_update($event_name,$data); + + } + + function rr_delete($event_name,$data) { + global $app, $conf; + + //* Get the data of the soa and call soa_update + $tmp = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data['old']['zone']); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->soa_update($event_name,$data); + + } + + ################################################################### + + function write_named_conf($data, $dns_config) { + global $app, $conf; + + $tmps = $app->db->queryAllRecords("SELECT origin, xfer, also_notify FROM dns_soa WHERE active = 'Y'"); + $zones = array(); + + foreach($tmps as $tmp) { + + $options = ''; + if(trim($tmp['xfer']) != '') $options .= ' allow-transfer {'.str_replace(',',';',$tmp['xfer']).";};\n"; + if(trim($tmp['also_notify']) != '') $options .= ' also-notify {'.str_replace(',',';',$tmp['also_notify']).";};\n"; + + $zones[] = array( 'zone' => substr($tmp['origin'],0,-1), + 'zonefile_path' => $dns_config['bind_zonefiles_dir'].'/pri.'.substr($tmp['origin'],0,-1), + 'options' => $options + ); + } + + $tpl = new tpl(); + $tpl->newTemplate("bind_named.conf.local.master"); + $tpl->setLoop('zones',$zones); + + file_put_contents($dns_config['named_conf_local_path'],$tpl->grab()); + $app->log("Writing BIND named.conf.local file: ".$dns_config['named_conf_local_path'],LOGLEVEL_DEBUG); + + unset($tpl); + unset($zones); + unset($tmps); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/cron_jailkit_plugin.inc.php b/interface/ispconfig/server/plugins-available/cron_jailkit_plugin.inc.php new file mode 100644 index 000000000..43adee1c5 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/cron_jailkit_plugin.inc.php @@ -0,0 +1,328 @@ +plugins->registerEvent('cron_insert', $this->plugin_name, 'insert'); + $app->plugins->registerEvent('cron_update', $this->plugin_name, 'update'); + $app->plugins->registerEvent('cron_delete', $this->plugin_name, 'delete'); + + } + + //* This function is called, when a cron job is inserted in the database + function insert($event_name,$data) { + global $app, $conf; + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + $this->parent_domain = $parent_domain; + + $app->uses('system'); + + if($app->system->is_user($parent_domain['system_user'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['type'] == "chrooted") + { + // load the server configuration options + /* + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + $this->parent_domain = $parent_domain; + + $this->_setup_jailkit_chroot(); + + //$command .= 'usermod -U '.escapeshellcmd($parent_domain['system_user']); + //exec($command); + + $this->_add_jailkit_user(); + */ + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + + $this->_add_jailkit_user(); + + $command .= 'usermod -U '.escapeshellcmd($parent_domain["system_user"]); + exec($command); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a cron job is updated in the database + function update($event_name,$data) { + global $app, $conf; + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + $app->uses('system'); + + $this->parent_domain = $parent_domain; + + if($app->system->is_user($parent_domain['system_user'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['type'] == "chrooted") + { + $app->log("Jailkit Plugin (Cron) -> setting up jail", LOGLEVEL_DEBUG); + // load the server configuration options + /* + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + $this->parent_domain = $parent_domain; + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + */ + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a cron job is deleted in the database + function delete($event_name,$data) { + global $app, $conf; + + //* nothing to do here! + + } + + function _setup_jailkit_chroot() + { + //check if the chroot environment is created yet if not create it with a list of program sections from the config + if (!is_dir($this->parent_domain['document_root'].'/etc/jailkit')) + { + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_chroot.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_sections'].'\''; + exec($command); + + $this->app->log("Added jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + //$this->_add_jailkit_programs(); // done later on + + $this->app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("bash.bashrc.master"); + + $tpl->setVar('jailkit_chroot',true); + $tpl->setVar('domain',$this->parent_domain['domain']); + $tpl->setVar('home_dir',$this->_get_home_dir("")); + + $bashrc = escapeshellcmd($this->parent_domain['document_root']).'/etc/bash.bashrc'; + if(@is_file($bashrc)) exec('rm '.$bashrc); + + file_put_contents($bashrc,$tpl->grab()); + unset($tpl); + + $this->app->log("Added bashrc scrpt : ".$bashrc,LOGLEVEL_DEBUG); + + $tpl = new tpl(); + $tpl->newTemplate("motd.master"); + + $tpl->setVar('domain',$this->parent_domain['domain']); + + $motd = escapeshellcmd($this->parent_domain['document_root']).'/var/run/motd'; + if(@is_file($motd)) exec('rm '.$motd); + + file_put_contents($motd,$tpl->grab()); + + } + $this->_add_jailkit_programs(); + } + + function _add_jailkit_programs() + { + //copy over further programs and its libraries + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_programs'].'\''; + exec($command); + + $this->app->log("Added programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_cron_programs'].'\''; + exec($command); + + $this->app->log("Added cron programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + } + + function _add_jailkit_user() + { + //add the user to the chroot + $jailkit_chroot_userhome = $this->_get_home_dir($this->parent_domain['system_user']); + + if(!is_dir($this->parent_domain['document_root'].'/etc')) mkdir($this->parent_domain['document_root'].'/etc'); + if(!is_file($this->parent_domain['document_root'].'/etc/passwd')) exec('touch '.$this->parent_domain['document_root'].'/etc/passwd'); + + // IMPORTANT! + // ALWAYS create the user. Even if the user was created before + // if we check if the user exists, then a update (no shell -> jailkit) will not work + // and the user has FULL ACCESS to the root of the server! + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_user.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['system_user']); + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' '.$jailkit_chroot_userhome; + $command .= ' '.escapeshellcmd("/bin/bash"); + exec($command); + + $this->app->log("Added jailkit user to chroot with command: ".$command,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->parent_domain['document_root'].$jailkit_chroot_userhome)); + } + + function _get_home_dir($username) + { + return str_replace("[username]",escapeshellcmd($username),$this->jailkit_config["jailkit_chroot_home"]); + } + + //* Update the website root directory permissions depending on the security level + function _update_website_security_level() { + global $app,$conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + $this->_exec("chmod 755 ".escapeshellcmd($this->parent_domain['document_root'])); + $this->_exec("chown root:root ".escapeshellcmd($this->parent_domain['document_root'])); + } + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/cron_plugin.inc.php b/interface/ispconfig/server/plugins-available/cron_plugin.inc.php new file mode 100644 index 000000000..4ee83137a --- /dev/null +++ b/interface/ispconfig/server/plugins-available/cron_plugin.inc.php @@ -0,0 +1,239 @@ +plugins->registerEvent('cron_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('cron_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('cron_delete',$this->plugin_name,'delete'); + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + + } + + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + // load the server configuration options + $app->uses("getconf"); + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["new"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + // Create group and user, if not exist + $app->uses("system"); + + $groupname = escapeshellcmd($parent_domain["system_group"]); + if($parent_domain["system_group"] != '' && !$app->system->is_group($parent_domain["system_group"])) { + exec("groupadd $groupname"); + $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG); + } + + $username = escapeshellcmd($parent_domain["system_user"]); + if($parent_domain["system_user"] != '' && !$app->system->is_user($parent_domain["system_user"])) { + exec("useradd -d ".escapeshellcmd($parent_domain["document_root"])." -g $groupname $username -s /bin/false"); + $app->log("Adding the user: $username",LOGLEVEL_DEBUG); + } + + // Set the quota for the user + if($username != '' && $app->system->is_user($username)) { + if($parent_domain["hd_quota"] > 0){ + $blocks_soft = $parent_domain["hd_quota"] * 1024; + $blocks_hard = $blocks_soft + 1024; + } else { + $blocks_soft = $blocks_hard = 0; + } + exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null"); + exec("setquota -T -u $username 604800 604800 -a &> /dev/null"); + } + + // make temp direcory writable for the apache user and the website user + exec("chmod 777 ".escapeshellcmd($parent_domain["document_root"]."/tmp")); + + /** TODO READ CRON MASTER **/ + + $this->parent_domain = $parent_domain; + $this->_write_crontab(); + + $this->action = ''; + + } + + function delete($event_name,$data) { + global $app, $conf; + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["old"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + $this->parent_domain = $parent_domain; + $this->_write_crontab(); + } + + function _write_crontab() { + global $app, $conf; + + //* load the server configuration options + $app->uses("getconf"); + + $cron_config = $app->getconf->get_server_config($conf["server_id"], 'cron'); + + //* try to find customer's mail address + + /** TODO: add possibility for client to choose mail notification! **/ + $cron_content = "MAILTO=''\n\n"; + $chr_cron_content = "MAILTO=''\n\n"; + $chr_cron_content .= "SHELL='/usr/sbin/jk_chrootsh'\n\n"; + + $cmd_count = 0; + $chr_cmd_count = 0; + + //* read all active cron jobs from database and write them to file + $cron_jobs = $app->db->queryAllRecords("SELECT `run_min`, `run_hour`, `run_mday`, `run_month`, `run_wday`, `command`, `type` FROM `cron` WHERE `parent_domain_id` = ".intval($this->parent_domain["domain_id"]) . " AND `active` = 'y'"); + if($cron_jobs && count($cron_jobs) > 0) { + foreach($cron_jobs as $job) { + $command = "{$job['run_min']}\t{$job['run_hour']}\t{$job['run_mday']}\t{$job['run_month']}\t{$job['run_wday']}"; + $command .= "\t{$this->parent_domain['system_user']}"; //* running as user + if($job['type'] == 'url') { + $command .= "\t{$cron_config['wget']} -q -O /dev/null " . escapeshellarg($job['command']) . " >/dev/null 2>&1"; + } else { + if($job['type'] == 'chrooted') { + if(substr($job['command'], 0, strlen($this->parent_domain['document_root'])) == $this->parent_domain['document_root']) { + //* delete the unneeded path part + $job['command'] = substr($job['command'], strlen($this->parent_domain['document_root'])); + } + } + + $command .= "\t"; + if(substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'].'/'; + $command .= $job['command']; + } + + if($job['type'] == 'chrooted') { + $chr_cron_content .= $command . "\n"; + $chr_cmd_count++; + } else { + $cron_content .= $command . "\n"; + $cmd_count++; + } + } + } + + $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_'.$this->parent_domain["system_user"]); + if($cmd_count > 0) { + file_put_contents($cron_file, $cron_content); + $app->log("Wrote Cron file $cron_file with content:\n$cron_content",LOGLEVEL_DEBUG); + } else { + @unlink($cron_file); + $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG); + } + + $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_chrooted_'.$this->parent_domain["system_user"]); + if($chr_cmd_count > 0) { + file_put_contents($cron_file, $chr_cron_content); + $app->log("Wrote Cron file $cron_file with content:\n$chr_cron_content",LOGLEVEL_DEBUG); + } else { + @unlink($cron_file); + $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG); + } + + return 0; + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/firewall_plugin.inc.php b/interface/ispconfig/server/plugins-available/firewall_plugin.inc.php new file mode 100644 index 000000000..c3bc470cd --- /dev/null +++ b/interface/ispconfig/server/plugins-available/firewall_plugin.inc.php @@ -0,0 +1,145 @@ +plugins->registerEvent('firewall_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('firewall_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('firewall_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + $tcp_ports = ''; + $udp_ports = ''; + + $ports = explode(',',$data["new"]["tcp_port"]); + if(is_array($ports)) { + foreach($ports as $p) { + if(strstr($p,':')) { + $p_parts = explode(':',$p); + $p_clean = intval($p_parts[0]).':'.intval($p_parts[1]); + } else { + $p_clean = intval($p); + } + $tcp_ports .= $p_clean . ' '; + } + } + $tcp_ports = trim($tcp_ports); + + $ports = explode(',',$data["new"]["udp_port"]); + if(is_array($ports)) { + foreach($ports as $p) { + if(strstr($p,':')) { + $p_parts = explode(':',$p); + $p_clean = intval($p_parts[0]).':'.intval($p_parts[1]); + } else { + $p_clean = intval($p); + } + $udp_ports .= $p_clean . ' '; + } + } + $udp_ports = trim($udp_ports); + + $app->load('tpl'); + $tpl = new tpl(); + $tpl->newTemplate("bastille-firewall.cfg.master"); + + $tpl->setVar("TCP_PUBLIC_SERVICES",$tcp_ports); + $tpl->setVar("UDP_PUBLIC_SERVICES",$udp_ports); + + file_put_contents('/etc/Bastille/bastille-firewall.cfg',$tpl->grab()); + $app->log('Writing firewall configuration /etc/Bastille/bastille-firewall.cfg',LOGLEVEL_DEBUG); + unset($tpl); + + if($data["new"]["active"] == 'y') { + exec('/etc/init.d/bastille-firewall restart'); + if(@is_file('/etc/debian_version')) exec('update-rc.d bastille-firewall defaults'); + $app->log('Restarting the firewall',LOGLEVEL_DEBUG); + } else { + exec('/etc/init.d/bastille-firewall stop'); + if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove'); + $app->log('Stopping the firewall',LOGLEVEL_DEBUG); + } + + + } + + function delete($event_name,$data) { + global $app, $conf; + + exec('/etc/init.d/bastille-firewall stop'); + if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove'); + $app->log('Stopping the firewall',LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/ftpuser_base_plugin.inc.php b/interface/ispconfig/server/plugins-available/ftpuser_base_plugin.inc.php new file mode 100644 index 000000000..04bb51b98 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/ftpuser_base_plugin.inc.php @@ -0,0 +1,112 @@ +plugins->registerEvent('ftp_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('ftp_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('ftp_user_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + if(!is_dir($data['new']['dir'])) { + $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG); + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id'])); + + exec('mkdir -p '.escapeshellcmd($data['new']['dir'])); + exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']); + + $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG); + } + + } + + function update($event_name,$data) { + global $app, $conf; + + if(!is_dir($data['new']['dir'])) { + $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG); + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id'])); + + exec('mkdir -p '.escapeshellcmd($data['new']['dir'])); + exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']); + + $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG); + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $app->log("Ftpuser:".$data['new']['username']." deleted.",LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/getmail_plugin.inc.php b/interface/ispconfig/server/plugins-available/getmail_plugin.inc.php new file mode 100644 index 000000000..032ed437d --- /dev/null +++ b/interface/ispconfig/server/plugins-available/getmail_plugin.inc.php @@ -0,0 +1,163 @@ +plugins->registerEvent('mail_get_insert','getmail_plugin','insert'); + $app->plugins->registerEvent('mail_get_update','getmail_plugin','update'); + $app->plugins->registerEvent('mail_get_delete','getmail_plugin','delete'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + // load the server specific configuration options for getmail + $app->uses("getconf"); + $getmail_config = $app->getconf->get_server_config($conf["server_id"], 'getmail'); + $this->getmail_config_dir = $getmail_config["getmail_config_dir"]; + + // Check if the config directory exists. + if(!is_dir($this->getmail_config_dir)) { + $app->log("Getmail config directory '".$this->getmail_config_dir."' does not exist.",LOGLEVEL_ERROR); + } else { + + // Delete the config file first, if it exists + $this->delete($event_name,$data); + + // Get the new config file path + $config_file_path = escapeshellcmd($this->getmail_config_dir.'/'.$data["new"]["source_server"].'_'.$data["new"]["source_username"].'.conf'); + if(stristr($config_file_path, "..") or stristr($config_file_path, "|") or stristr($config_file_path,";") or stristr($config_file_path,'$')) { + $app->log("Possibly faked path for getmail config file: '$config_file_path'. File is not written.",LOGLEVEL_ERROR); + return false; + } + + + if($data["new"]["active"] == 'y') { + // Open master template + $tpl = file_get_contents($conf["rootpath"].'/conf/getmail.conf.master'); + + // Shall emails be deleted after retrieval + if($data["new"]["source_delete"] == 'y') { + $tpl = str_replace('{DELETE}','1',$tpl); + } else { + $tpl = str_replace('{DELETE}','0',$tpl); + } + + // Set the data retriever + if($data["new"]["type"] == 'pop3') { + $tpl = str_replace('{TYPE}','SimplePOP3Retriever',$tpl); + } elseif ($data["new"]["type"] == 'imap') { + $tpl = str_replace('{TYPE}','SimpleIMAPRetriever',$tpl); + } elseif ($data["new"]["type"] == 'pop3ssl') { + $tpl = str_replace('{TYPE}','SimplePOP3SSLRetriever',$tpl); + } elseif ($data["new"]["type"] == 'imapssl') { + $tpl = str_replace('{TYPE}','SimpleIMAPSSLRetriever',$tpl); + } + + // Set server, username, password and destination. + $tpl = str_replace('{SERVER}',$data["new"]["source_server"],$tpl); + $tpl = str_replace('{USERNAME}',$data["new"]["source_username"],$tpl); + $tpl = str_replace('{PASSWORD}',$data["new"]["source_password"],$tpl); + $tpl = str_replace('{DESTINATION}',$data["new"]["destination"],$tpl); + + // Write the config file. + file_put_contents($config_file_path,$tpl); + $app->log("Writing Getmail config file: $config_file_path",LOGLEVEL_DEBUG); + exec("chmod 400 $config_file_path"); + exec("chown getmail $config_file_path"); + unset($tpl); + unset($config_file_path); + + } else { + // If record is set to inactive, we will delete the file + if(is_file($config_file_path)) unlink($config_file_path); + } + } + } + + function delete($event_name,$data) { + global $app, $conf; + + // load the server specific configuration options for getmail + $app->uses("getconf"); + $getmail_config = $app->getconf->get_server_config($conf["server_id"], 'getmail'); + $this->getmail_config_dir = $getmail_config["getmail_config_dir"]; + + $config_file_path = escapeshellcmd($this->getmail_config_dir.'/'.$data["old"]["source_server"].'_'.$data["old"]["source_username"].'.conf'); + if(stristr($config_file_path,"..") || stristr($config_file_path,"|") || stristr($config_file_path,";") || stristr($config_file_path,'$')) { + $app->log("Possibly faked path for getmail config file: '$config_file_path'. File is not written.",LOGLEVEL_ERROR); + return false; + } + if(is_file($config_file_path)) unlink($config_file_path); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/mail_plugin.inc.php b/interface/ispconfig/server/plugins-available/mail_plugin.inc.php new file mode 100644 index 000000000..bbabe660e --- /dev/null +++ b/interface/ispconfig/server/plugins-available/mail_plugin.inc.php @@ -0,0 +1,311 @@ +plugins->registerEvent('mail_user_insert',$this->plugin_name,'user_insert'); + $app->plugins->registerEvent('mail_user_update',$this->plugin_name,'user_update'); + $app->plugins->registerEvent('mail_user_delete',$this->plugin_name,'user_delete'); + + //* Mail Domains + //$app->plugins->registerEvent('mail_domain_insert',$this->plugin_name,'domain_insert'); + //$app->plugins->registerEvent('mail_domain_update',$this->plugin_name,'domain_update'); + $app->plugins->registerEvent('mail_domain_delete',$this->plugin_name,'domain_delete'); + + //* Mail transports + $app->plugins->registerEvent('mail_transport_insert',$this->plugin_name,'transport_update'); + $app->plugins->registerEvent('mail_transport_update',$this->plugin_name,'transport_update'); + $app->plugins->registerEvent('mail_transport_delete',$this->plugin_name,'transport_update'); + + } + + + function user_insert($event_name,$data) { + global $app, $conf; + + //* get the config + $app->uses("getconf,system"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + // convert to lower case - it could cause problems if some directory above has upper case name +// $data['new']['maildir'] = strtolower($data['new']['maildir']); + + $maildomain_path = $data['new']['maildir']; + $tmp_basepath = $data['new']['maildir']; + $tmp_basepath_parts = explode('/',$tmp_basepath); + unset($tmp_basepath_parts[count($tmp_basepath_parts)-1]); + $base_path = implode('/',$tmp_basepath_parts); + + + + //* Create the mail domain directory, if it does not exist + if(!empty($base_path) && !is_dir($base_path)) { + exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + } + + // Dovecot uses a different mail layout with a separate 'Maildir' subdirectory. + if($mail_config['pop3_imap_daemon'] == 'dovecot') { + exec("su -c 'mkdir -p ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$maildomain_path,LOGLEVEL_DEBUG); + $maildomain_path .= '/Maildir'; + } + + //* When the mail user dir exists but it is not a valid maildir, remove it + if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { + exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail"); + $app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN); + } + + //* Create the maildir, if it doesn not exist, set permissions, set quota. + if(!empty($maildomain_path) && !is_dir($maildomain_path)) { + + //exec("su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name']); + + exec('chown -R '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log("Set ownership on ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_DEBUG); + + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. + if($mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); // Avoid maildirmake quota bug, see debian bug #214911 + $app->log('Created Maildir: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + if(!is_dir($data['new']['maildir'].'/.Sent')) { + //exec("su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Sent: '."su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Sent'); + } + if(!is_dir($data['new']['maildir'].'/.Drafts')) { + //exec("su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Drafts: '."su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Drafts'); + } + if(!is_dir($data['new']['maildir'].'/.Trash')) { + //exec("su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Trash: '."su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Trash'); + } + if(!is_dir($data['new']['maildir'].'/.Junk')) { + //exec("su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Junk: '."su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Junk'); + } + + //* Set the maildir quota + if(is_dir($data['new']['maildir'].'/new') && $mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']); + $app->log('Set Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + function user_update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf,system"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + // convert to lower case - it could cause problems if some directory above has upper case name + // $data['new']['maildir'] = strtolower($data['new']['maildir']); + + // Create the maildir, if it does not exist + /* + if(!is_dir($data['new']['maildir'])) { + exec('mkdir -p '.escapeshellcmd($data['new']['maildir'])); + exec('chown '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log('Created Maildir: '.$data['new']['maildir'],LOGLEVEL_DEBUG); + } + */ + + $maildomain_path = $data['new']['maildir']; + $tmp_basepath = $data['new']['maildir']; + $tmp_basepath_parts = explode('/',$tmp_basepath); + unset($tmp_basepath_parts[count($tmp_basepath_parts)-1]); + $base_path = implode('/',$tmp_basepath_parts); + + //* Create the mail domain directory, if it does not exist + if(!empty($base_path) && !is_dir($base_path)) { + exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + } + + // Dovecot uses a different mail layout with a separate 'Maildir' subdirectory. + if($mail_config['pop3_imap_daemon'] == 'dovecot') { + exec("su -c 'mkdir -p ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + $maildomain_path .= '/Maildir'; + } + + //* When the mail user dir exists but it is not a valid maildir, remove it + if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { + exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail"); + $app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN); + } + + //* Create the maildir, if it doesn not exist, set permissions, set quota. + if(!empty($maildomain_path) && !is_dir($maildomain_path.'/new')) { + //exec("su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log("Created Maildir "."su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name']); + + exec('chown -R '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log("Set ownership on ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_DEBUG); + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. + if($mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); // Avoid maildirmake quota bug, see debian bug #214911 + $app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + if(!is_dir($data['new']['maildir'].'/.Sent')) { + //exec("su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Sent: '."su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Sent'); + } + if(!is_dir($data['new']['maildir'].'/.Drafts')) { + //exec("su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Drafts: '."su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Drafts'); + } + if(!is_dir($data['new']['maildir'].'/.Trash')) { + //exec("su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Trash: '."su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Trash'); + } + if(!is_dir($data['new']['maildir'].'/.Junk')) { + //exec("su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Junk: '."su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Junk'); + } + + // Move mailbox, if domain has changed and delete old mailbox + if($data['new']['maildir'] != $data['old']['maildir'] && is_dir($data['old']['maildir'])) { + if(is_dir($data['new']['maildir'])) { + exec("rm -fr ".escapeshellcmd($data['new']['maildir'])); + //rmdir($data['new']['maildir']); + } + exec('mv -f '.escapeshellcmd($data['old']['maildir']).' '.escapeshellcmd($data['new']['maildir'])); + // exec('mv -f '.escapeshellcmd($data['old']['maildir']).'/* '.escapeshellcmd($data['new']['maildir'])); + // if(is_file($data['old']['maildir'].'.ispconfig_mailsize'))exec('mv -f '.escapeshellcmd($data['old']['maildir']).'.ispconfig_mailsize '.escapeshellcmd($data['new']['maildir'])); + // rmdir($data['old']['maildir']); + $app->log('Moved Maildir from: '.$data['old']['maildir'].' to '.$data['new']['maildir'],LOGLEVEL_DEBUG); + } + //This is to fix the maildrop quota not being rebuilt after the quota is changed. + // Courier Layout + if(is_dir($data['new']['maildir'].'/new') && $mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']); + $app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + function user_delete($event_name,$data) { + global $app, $conf; + + $old_maildir_path = escapeshellcmd($data['old']['maildir']); + if(!stristr($old_maildir_path,'..') && !stristr($old_maildir_path,'*') && strlen($old_maildir_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildir_path)); + $app->log('Deleted the Maildir: '.$data['old']['maildir'],LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the maildir: '.$data['old']['maildir'],LOGLEVEL_ERROR); + } + } + + function domain_delete($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + //* Delete maildomain path + $old_maildomain_path = escapeshellcmd($mail_config['homedir_path'].'/'.$data['old']['domain']); + if(!stristr($old_maildomain_path,'//') && !stristr($old_maildomain_path,'..') && !stristr($old_maildomain_path,'*') && !stristr($old_maildomain_path,'&') && strlen($old_maildomain_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildomain_path)); + $app->log('Deleted the mail domain directory: '.$old_maildomain_path,LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the mail domain directory: '.$old_maildomain_path,LOGLEVEL_ERROR); + } + + //* Delete mailfilter path + $old_maildomain_path = escapeshellcmd($mail_config['homedir_path'].'/mailfilters/'.$data['old']['domain']); + if(!stristr($old_maildomain_path,'//') && !stristr($old_maildomain_path,'..') && !stristr($old_maildomain_path,'*') && !stristr($old_maildomain_path,'&') && strlen($old_maildomain_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildomain_path)); + $app->log('Deleted the mail domain mailfilter directory: '.$old_maildomain_path,LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the mail domain mailfilter directory: '.$old_maildomain_path,LOGLEVEL_ERROR); + } + } + + function transport_update($event_name,$data) { + global $app, $conf; + + exec('/etc/init.d/postfix reload &> /dev/null'); + $app->log('Postfix config reloaded ',LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/maildeliver_plugin.inc.php b/interface/ispconfig/server/plugins-available/maildeliver_plugin.inc.php new file mode 100644 index 000000000..5e325dbf0 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/maildeliver_plugin.inc.php @@ -0,0 +1,131 @@ +plugins->registerEvent('mail_user_update','maildeliver_plugin','update'); + $app->plugins->registerEvent('mail_user_delete','maildeliver_plugin','delete'); + + } + + + function update($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + if(substr($mail_config["homedir_path"],-1) == '/') { + $mail_config["homedir_path"] = substr($mail_config["homedir_path"],0,-1); + } + + if(isset($data["new"]["email"])) { + $email_parts = explode("@",$data["new"]["email"]); + } else { + $email_parts = explode("@",$data["old"]["email"]); + } + + // Write the custom mailfilter script, if mailfilter recipe has changed + if($data["old"]["custom_mailfilter"] != $data["new"]["custom_mailfilter"] + or $data["old"]["move_junk"] != $data["new"]["move_junk"] + or $data["old"]["autoresponder_text"] != $data["new"]["autoresponder_text"] + or $data["old"]["autoresponder"] != $data["new"]["autoresponder"] + or (isset($data["new"]["email"]) and $data["old"]["email"] != $data["new"]["email"]) + or $data["old"]["autoresponder_start_date"] != $data["new"]["autoresponder_start_date"] + or $data["old"]["autoresponder_end_date"] != $data["new"]["autoresponder_end_date"]) { + + $app->log("Mailfilter config has been changed",LOGLEVEL_DEBUG); + + $sieve_file = $data["new"]["maildir"].'/.sieve'; + if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file",LOGLEVEL_WARN); + + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("sieve_filter.master"); + + // Custom filters + $tpl->setVar('custom_mailfilter',$data["new"]["custom_mailfilter"]); + + // Move junk + $tpl->setVar('move_junk',$data["new"]["move_junk"]); + + // Autoresponder + $tpl->setVar('autoresponder',$data["new"]["autoresponder"]); + $tpl->setVar('autoresponder_text',$data["new"]["autoresponder_text"]); + + file_put_contents($sieve_file,$tpl->grab()); + + unset($tpl); + + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $sieve_file = $data["old"]["maildir"].'/.sieve'; + if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file",LOGLEVEL_WARN); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/maildrop_plugin.inc.php b/interface/ispconfig/server/plugins-available/maildrop_plugin.inc.php new file mode 100644 index 000000000..fa60380e1 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/maildrop_plugin.inc.php @@ -0,0 +1,240 @@ +plugins->registerEvent('mail_user_update','maildrop_plugin','update'); + $app->plugins->registerEvent('mail_user_delete','maildrop_plugin','delete'); + + } + + + function update($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + if(substr($mail_config["homedir_path"],-1) == '/') { + $mail_config["homedir_path"] = substr($mail_config["homedir_path"],0,-1); + } + $this->mailfilter_config_dir = $mail_config["homedir_path"].'/mailfilters'; + + + // Check if the config directory exists. + if(!is_dir($this->mailfilter_config_dir)) { + $app->log("Mailfilter config directory '".$this->mailfilter_config_dir."' does not exist. Creating it now.",LOGLEVEL_WARN); + mkdir($this->mailfilter_config_dir); + exec("chown vmail ".$this->mailfilter_config_dir); + exec("chmod 770 ".$this->mailfilter_config_dir); + } + + if(isset($data["new"]["email"])) { + $email_parts = explode("@",$data["new"]["email"]); + } else { + $email_parts = explode("@",$data["old"]["email"]); + } + + // make sure that the config directories exist + if(!is_dir($this->mailfilter_config_dir.'/'.$email_parts[1])) { + mkdir($this->mailfilter_config_dir.'/'.$email_parts[1]); + exec("chown vmail ".$this->mailfilter_config_dir.'/'.$email_parts[1]); + exec("chmod 770 ".$this->mailfilter_config_dir.'/'.$email_parts[1]); + } + if(!is_dir($this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0])) { + mkdir($this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0]); + exec("chown vmail ".$this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0]); + exec("chmod 770 ".$this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0]); + } + + // Check if something has been changed regarding the autoresponders + if($data["old"]["autoresponder_text"] != $data["new"]["autoresponder_text"] + or $data["old"]["autoresponder"] != $data["new"]["autoresponder"] + or (isset($data["new"]["email"]) and $data["old"]["email"] != $data["new"]["email"]) + or $data["old"]["autoresponder_start_date"] != $data["new"]["autoresponder_start_date"] + or $data["old"]["autoresponder_end_date"] != $data["new"]["autoresponder_end_date"]) { + + // We delete the old autoresponder, if it exists + $email_parts = explode("@",$data["old"]["email"]); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lock'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst.gdbm'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst.lock'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.msg'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.autoresponder'; + if(is_file($file)) unlink($ar_file) or $app->log("Unable to delete file: $ar_file",LOGLEVEL_WARN); + + + //Now we create the new autoresponder, if it is enabled + if($data["new"]["autoresponder"] == 'y') { + if(isset($data["new"]["email"])) { + $email_parts = explode("@",$data["new"]["email"]); + } else { + $email_parts = explode("@",$data["old"]["email"]); + } + + // Load the master template + $tpl = file_get_contents($conf["rootpath"].'/conf/autoresponder.master'); + $tpl = str_replace('{vmail_mailbox_base}',$mail_config["homedir_path"],$tpl); + + if ($data["new"]["autoresponder_start_date"] != '0000-00-00 00:00:00') { // Dates have been set + $tpl = str_replace('{start_date}',strtotime($data["new"]["autoresponder_start_date"]),$tpl); + $tpl = str_replace('{end_date}',strtotime($data["new"]["autoresponder_end_date"]),$tpl); + } else { + $tpl = str_replace('{start_date}',-7200,$tpl); + $tpl = str_replace('{end_date}',2147464800,$tpl); + } + + // Write the config file. + $config_file_path = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.autoresponder'; + file_put_contents($config_file_path,$tpl); + $app->log("Writing Autoresponder mailfilter file: $config_file_path",LOGLEVEL_DEBUG); + exec("chmod 770 $config_file_path"); + exec("chown vmail $config_file_path"); + unset($tpl); + unset($config_file_path); + + // Write the autoresponder message file + $config_file_path = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.msg'; + file_put_contents($config_file_path,$data["new"]["autoresponder_text"]); + exec("chmod 770 $config_file_path"); + exec("chown vmail $config_file_path"); + $app->log("Writing Autoresponder message file: $config_file_path",LOGLEVEL_DEBUG); + } + } + + // Write the custom mailfilter script, if mailfilter recipe has changed + if($data["old"]["custom_mailfilter"] != $data["new"]["custom_mailfilter"] or + $data["old"]["move_junk"] != $data["new"]["move_junk"]) { + $app->log("Mailfilter config has been changed",LOGLEVEL_DEBUG); + if(trim($data["new"]["custom_mailfilter"]) != '' or $data["new"]["move_junk"] != 'n') { + // Delete the old filter recipe + $email_parts = explode("@",$data["old"]["email"]); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.mailfilter'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + + // write the new recipe + if(isset($data["new"]["email"])) { + $email_parts = explode("@",$data["new"]["email"]); + } else { + $email_parts = explode("@",$data["old"]["email"]); + } + $config_file_path = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.mailfilter'; + + $mailfilter_content = ''; + if($data["new"]["move_junk"] == 'y') { + $mailfilter_content .= file_get_contents($conf["rootpath"].'/conf/mailfilter_move_junk.master')."\n"; + } + $mailfilter_content .= $data["new"]["custom_mailfilter"]; + + file_put_contents($config_file_path,$mailfilter_content); + $app->log("Writing new custom Mailfiter".$config_file_path,LOGLEVEL_DEBUG); + exec("chmod 770 $config_file_path"); + exec("chown vmail $config_file_path"); + unset($config_file_path); + } else { + // Delete the mailfilter recipe + $email_parts = explode("@",$data["old"]["email"]); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.mailfilter'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $app->log("Deleting custom Mailfiter".$file,LOGLEVEL_DEBUG); + } + //} + } + } + + function delete($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + $this->mailfilter_config_dir = $mail_config["homedir_path"].'/mailfilters'; + + $email_parts = explode("@",$data["old"]["email"]); + $dir = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0]; + if(is_dir($dir)) { + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lock'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.msg'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.autoresponder'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.mailfilter'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst.gdbm'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + $file = $this->mailfilter_config_dir.'/'.$email_parts[1].'/'.$email_parts[0].'/.vacation.lst.lock'; + if(is_file($file)) unlink($file) or $app->log("Unable to delete file: $file",LOGLEVEL_WARN); + rmdir($dir) or $app->log("Unable to delete directory: $dir",LOGLEVEL_WARN); + } + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/mysql_clientdb_plugin.inc.php b/interface/ispconfig/server/plugins-available/mysql_clientdb_plugin.inc.php new file mode 100644 index 000000000..6b2651d60 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/mysql_clientdb_plugin.inc.php @@ -0,0 +1,305 @@ +plugins->registerEvent('database_insert',$this->plugin_name,'db_insert'); + $app->plugins->registerEvent('database_update',$this->plugin_name,'db_update'); + $app->plugins->registerEvent('database_delete',$this->plugin_name,'db_delete'); + + + } + + function process_host_list($action, $database_name, $database_user, $database_password, $host_list, $link, $database_rename_user = "") { + global $app; + + $action = strtoupper($action); + + // set to all hosts if none given + if(trim($host_list) == "") $host_list = "%"; + + // process arrays and comma separated strings + if(!is_array($host_list)) $host_list = split(",", $host_list); + + $success = true; + + // loop through hostlist + foreach($host_list as $db_host) { + $db_host = trim($db_host); + + // check if entry is valid ip address + $valid = true; + if($db_host == "%") { + $valid = true; + } elseif(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $db_host)) { + $groups = explode(".", $db_host); + foreach($groups as $group){ + if($group<0 OR $group>255) + $valid=false; + } + } else { + $valid = false; + } + + if($valid == false) continue; + + if($action == "GRANT") { + if(!mysql_query("GRANT ALL ON ".mysql_real_escape_string($database_name,$link).".* TO '".mysql_real_escape_string($database_user,$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($database_password,$link)."';",$link)) $success = false; + } elseif($action == "REVOKE") { + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($database_name,$link).".* FROM '".mysql_real_escape_string($database_user,$link)."';",$link); + } elseif($action == "DROP") { + if(!mysql_query("DROP USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host';",$link)) $success = false; + } elseif($action == "RENAME") { + if(!mysql_query("RENAME USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host' TO '".mysql_real_escape_string($database_rename_user,$link)."'@'$db_host'",$link)) $success = false; + } elseif($action == "PASSWORD") { + if(!mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($database_user,$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($database_password,$link)."');",$link)) $success = false; + } + } + + return $success; + } + + function db_insert($event_name,$data) { + global $app, $conf; + + if($data["new"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + // Charset for the new table + if($data["new"]["database_charset"] != '') { + $query_charset_table = ' DEFAULT CHARACTER SET '.$data["new"]["database_charset"]; + } else { + $query_charset_table = ''; + } + + //* Create the new database + if (mysql_query('CREATE DATABASE '.mysql_real_escape_string($data["new"]["database_name"]).$query_charset_table,$link)) { + $app->log('Created MySQL database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG); + } else { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + } + + // Create the database user if database is active + if($data["new"]["active"] == 'y') { + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + + + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + } + + function db_update($event_name,$data) { + global $app, $conf; + + if($data["new"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + // Create the database user if database was disabled before + if($data["new"]["active"] == 'y' && $data["old"]["active"] == 'n') { + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + + // mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + //echo "GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"]).".* TO '".mysql_real_escape_string($data["new"]["database_user"])."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"])."';"; + } + + // Remove database user, if inactive + if($data["new"]["active"] == 'n' && $data["old"]["active"] == 'y') { + + if($data["old"]["remote_access"] == 'y') { + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link); + + + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link); + } + + //* Rename User + if($data["new"]["database_user"] != $data["old"]["database_user"]) { + $db_host = 'localhost'; + mysql_query("RENAME USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host' TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host'",$link); + if($data["old"]["remote_access"] == 'y') { + $this->process_host_list("RENAME", "", $data["new"]["database_user"], "", $data["new"]["remote_ips"], $link, $data["new"]["database_user"]); + } + $app->log('Renaming mysql user: '.$data["old"]["database_user"].' to '.$data["new"]["database_user"],LOGLEVEL_DEBUG); + } + + //* Remote access option has changed. + if($data["new"]["remote_access"] != $data["old"]["remote_access"]) { + + //* revoke old priveliges + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link); + + //* set new priveliges + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } else { + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + } + $app->log('Changing mysql remote access priveliges for database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG); + } elseif($data["new"]["remote_access"] == 'y' && $data["new"]["remote_ips"] != $data["old"]["remote_ips"]) { + //* Change remote access list + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + //* Change password + if($data["new"]["database_password"] != $data["old"]["database_password"]) { + $db_host = 'localhost'; + mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($data["new"]["database_password"],$link)."');",$link); + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("PASSWORD", "", $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + $app->log('Changing mysql user password for: '.$data["new"]["database_user"],LOGLEVEL_DEBUG); + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + + } + + function db_delete($event_name,$data) { + global $app, $conf; + + if($data["old"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + //* Get the db host setting for the access priveliges + if($data["old"]["remote_access"] == 'y') { + if($this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link)) { + $app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql user: '.$data["old"]["database_user"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + } + $db_host = 'localhost'; + if(mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link)) { + $app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql user: '.$data["old"]["database_user"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + + if(mysql_query('DROP DATABASE '.mysql_real_escape_string($data["old"]["database_name"],$link),$link)) { + $app->log('Dropping mysql database: '.$data["old"]["database_name"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql database: '.$data["old"]["database_name"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/network_settings_plugin.inc.php b/interface/ispconfig/server/plugins-available/network_settings_plugin.inc.php new file mode 100644 index 000000000..cfe33c7a2 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/network_settings_plugin.inc.php @@ -0,0 +1,289 @@ +plugins->registerEvent('server_insert','network_settings_plugin','insert'); + $app->plugins->registerEvent('server_update','network_settings_plugin','update'); + + $app->plugins->registerEvent('server_ip_insert','network_settings_plugin','insert'); + $app->plugins->registerEvent('server_ip_update','network_settings_plugin','update'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $server_config = $app->getconf->get_server_config($conf["server_id"], 'server'); + + // Configure the debian network card settings + if($server_config['auto_network_configuration'] == 'y') { + + if (is_file('/etc/debian_version')) + { + copy('/etc/network/interfaces','/etc/network/interfaces~'); + + $app->load('tpl'); + + $network_tpl = new tpl(); + $network_tpl->newTemplate("debian_network_interfaces.master"); + + $network_tpl->setVar('ip_address',$server_config["ip_address"]); + $network_tpl->setVar('netmask',$server_config["netmask"]); + $network_tpl->setVar('gateway',$server_config["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($server_config["ip_address"],$server_config["netmask"])); + $network_tpl->setVar('network',$this->network($server_config["ip_address"],$server_config["netmask"])); + + $records = $app->db->queryAllRecords("SELECT ip_address FROM server_ip WHERE server_id = ".intval($conf["server_id"]) . " order by ip_address"); + $ip_records = array(); + $additionl_ip_records = 0; + $n = 0; + if(is_array($records)) { + foreach($records as $rec) { + /* + * don't insert the main-ip again! + */ + if ($rec['ip_address'] != $server_config["ip_address"]) + { + $ip_records[$n] = array( + 'id' => $n, + 'ip_address' => $rec['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($rec['ip_address'],$server_config["netmask"]), + 'network' => $this->network($rec['ip_address'],$server_config["netmask"]) + ); + $additionl_ip_records = 1; + $n++; + } + } + } + + /* + * If we have more than 1 IP we have to add the main-ip at the end + * of the network-ip-list. If we don't do so, there may be problems + * in multi-server-settings (with the acces from other server to the + * main-server) because the LAST IP in the list is the IP mysql uses + * to determine the host, the user is logging in from. + */ + if ($additionl_ip_records != 0) + { + $swap["ip_address"] = $ip_records[$n-1]["ip_address"]; + $swap["netmask"] = $ip_records[$n-1]["netmask"]; + $swap["gateway"] = $ip_records[$n-1]["gateway"]; + + $ip_records[$n-1] = array( + 'id' => $n-1, + 'ip_address' => $server_config['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($server_config['ip_address'],$server_config["netmask"]), + 'network' => $this->network($server_config['ip_address'],$server_config["netmask"]) + ); + $network_tpl->setVar('ip_address',$swap["ip_address"]); + $network_tpl->setVar('netmask',$swap["netmask"]); + $network_tpl->setVar('gateway',$swap["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($swap["ip_address"],$swap["netmask"])); + $network_tpl->setVar('network',$this->network($swap["ip_address"],$swap["netmask"])); + } + + $network_tpl->setVar('additionl_ip_records',$additionl_ip_records); + $network_tpl->setLoop('interfaces',$ip_records); + file_put_contents('/etc/network/interfaces',$network_tpl->grab()); + unset($network_tpl); + + $app->log("Changed Network settings",LOGLEVEL_DEBUG); + exec('/etc/init.d/networking force-reload'); + } + elseif (is_file('/etc/gentoo-release')) + { + copy('/etc/conf.d/net','/etc/conf.d/net~'); + + $app->load('tpl'); + + $network_tpl = new tpl(); + $network_tpl->newTemplate("gentoo_network_interfaces.master"); + + $network_tpl->setVar('ip_address',$server_config["ip_address"]); + $network_tpl->setVar('netmask',$server_config["netmask"]); + $network_tpl->setVar('gateway',$server_config["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($server_config["ip_address"],$server_config["netmask"])); + + $records = $app->db->queryAllRecords("SELECT ip_address FROM server_ip WHERE server_id = ".intval($conf["server_id"]) . " order by ip_address"); + $ip_records = array(); + $additionl_ip_records = 0; + $n = 0; + if(is_array($records)) { + foreach($records as $rec) { + /* + * don't insert the main-ip again! + */ + if ($rec['ip_address'] != $server_config["ip_address"]) + { + $ip_records[$n] = array( + 'id' => $n, + 'ip_address' => $rec['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($rec['ip_address'],$server_config["netmask"]) + ); + $additionl_ip_records = 1; + $n++; + } + } + } + + /* + * If we have more than 1 IP we have to add the main-ip at the end + * of the network-ip-list. If we don't do so, there may be problems + * in multi-server-settings (with the acces from other server to the + * main-server) because the LAST IP in the list is the IP mysql uses + * to determine the host, the user is logging in from. + */ + if ($additionl_ip_records != 0) + { + $swap["ip_address"] = $ip_records[$n-1]["ip_address"]; + $swap["netmask"] = $ip_records[$n-1]["netmask"]; + $swap["gateway"] = $ip_records[$n-1]["gateway"]; + + $ip_records[$n-1] = array( + 'id' => $n-1, + 'ip_address' => $server_config['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($server_config['ip_address'],$server_config["netmask"]) + ); + $network_tpl->setVar('ip_address',$swap["ip_address"]); + $network_tpl->setVar('netmask',$swap["netmask"]); + $network_tpl->setVar('gateway',$swap["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($swap["ip_address"],$swap["netmask"])); + } + + $network_tpl->setVar('additionl_ip_records',$additionl_ip_records); + $network_tpl->setLoop('interfaces',$ip_records); + file_put_contents('/etc/conf.d/net',$network_tpl->grab()); + unset($network_tpl); + + $app->log("Changed Network settings",LOGLEVEL_DEBUG); + exec('/etc/init.d/net.eth0 restart'); + } + else { + $app->log("Network configuration not available for this linux distribution.",LOGLEVEL_DEBUG); + } + + } else { + $app->log("Network configuration disabled in server settings.",LOGLEVEL_WARN); + } + + } + + function network($ip, $netmask){ + $netmask = $this->netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $netmask); + $netmask_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + for($i=0;$i<32;$i++){ + $network_bin .= substr($netmask_bin,$i,1) * substr($ip_bin,$i,1); + } + $network_bin = wordwrap($network_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($network_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function broadcast($ip, $netmask){ + $netmask = $this->netmask($netmask); + $binary_netmask = $this->binary_netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $broadcast_bin = str_pad(substr($ip_bin, 0, $binary_netmask),32,"1",STR_PAD_RIGHT); + $broadcast_bin = wordwrap($broadcast_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($broadcast_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + $bin = str_pad($parts[0], 32, "0", STR_PAD_RIGHT); + $bin = wordwrap($bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function binary_netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + return substr_count($parts[0], "1"); + } + +} // end class + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/pma_symlink_plugin.inc.php b/interface/ispconfig/server/plugins-available/pma_symlink_plugin.inc.php new file mode 100644 index 000000000..bbc32631f --- /dev/null +++ b/interface/ispconfig/server/plugins-available/pma_symlink_plugin.inc.php @@ -0,0 +1,121 @@ +plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update'); + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + } + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) { + + $old_parent_domain_id = intval($data["old"]["parent_domain_id"]); + $new_parent_domain_id = intval($data["new"]["parent_domain_id"]); + + // If the parent_domain_id has been chenged, we will have to update the old site as well. + if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) { + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->update($event_name,$data); + } + + // This is not a vhost, so we need to update the parent record instead. + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + } + + if($data["new"]["document_root"] == '') { + $app->log("document_root not set",LOGLEVEL_WARN); + return 0; + } + + $symlink = true; + if($data["new"]["php"] == "suphp") $symlink = false; + elseif($data["new"]["php"] == "cgi" && $data["new"]["suexec"] == "y") $symlink = false; + elseif($data["new"]["php"] == "fast-cgi" && $data["new"]["suexec"] == "y") $symlink = false; + + + if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web"); + if($symlink == false) { + if(is_link($data["new"]["document_root"]."/web/phpmyadmin")) exec("rm -f ".$data["new"]["document_root"]."/web/phpmyadmin"); + } else { + if(!is_link($data["new"]["document_root"]."/web/phpmyadmin")) exec("ln -s /var/www/phpmyadmin ".$data["new"]["document_root"]."/web/phpmyadmin"); + else exec("ln -sf /var/www/phpmyadmin ".$data["new"]["document_root"]."/web/phpmyadmin"); + } + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/postfix_filter_plugin.inc.php b/interface/ispconfig/server/plugins-available/postfix_filter_plugin.inc.php new file mode 100644 index 000000000..6b5ed5373 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/postfix_filter_plugin.inc.php @@ -0,0 +1,153 @@ +plugins->registerEvent('mail_content_filter_insert','postfix_filter_plugin','insert'); + $app->plugins->registerEvent('mail_content_filter_update','postfix_filter_plugin','update'); + $app->plugins->registerEvent('mail_content_filter_delete','postfix_filter_plugin','delete'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + $type = $data["new"]["type"]; + if($type != '') { + $sql = "SELECT * FROM mail_content_filter WHERE server_id = ".intval($conf["server_id"])." AND type = '".$app->db->quote($type)."' AND active = 'y'"; + $rules = $app->db->queryAllRecords($sql); + $content = ''; + foreach($rules as $rule) { + $content .= $rule["pattern"]."\n"; + $content .= " ".$rule["action"]." ".$rule["data"]."\n"; + } + + if($type == 'header') { + file_put_contents('/etc/postfix/header_checks',$content); + $app->log("Writing /etc/postfix/header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'mime_header') { + file_put_contents('/etc/postfix/mime_header_checks',$content); + $app->log("Writing /etc/postfix/mime_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'nested_header') { + file_put_contents('/etc/postfix/nested_header_checks',$content); + $app->log("Writing /etc/postfix/nested_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'body') { + file_put_contents('/etc/postfix/body_checks',$content); + $app->log("Writing /etc/postfix/body_checks",LOGLEVEL_DEBUG); + } + } + + $type = $data["old"]["type"]; + if($type != '') { + $sql = "SELECT * FROM mail_content_filter WHERE server_id = ".intval($conf["server_id"])." AND type = '".$app->db->quote($type)."' AND active = 'y'"; + $rules = $app->db->queryAllRecords($sql); + $content = ''; + foreach($rules as $rule) { + $content .= $rule["pattern"]."\n"; + $content .= " ".$rule["action"]." ".$rule["data"]."\n"; + } + + if($type == 'header') { + file_put_contents('/etc/postfix/header_checks',$content); + $app->log("Writing /etc/postfix/header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'mime_header') { + file_put_contents('/etc/postfix/mime_header_checks',$content); + $app->log("Writing /etc/postfix/mime_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'nested_header') { + file_put_contents('/etc/postfix/nested_header_checks',$content); + $app->log("Writing /etc/postfix/nested_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'body') { + file_put_contents('/etc/postfix/body_checks',$content); + $app->log("Writing /etc/postfix/body_checks",LOGLEVEL_DEBUG); + } + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/postfix_server_plugin.inc.php b/interface/ispconfig/server/plugins-available/postfix_server_plugin.inc.php new file mode 100644 index 000000000..f506ce32a --- /dev/null +++ b/interface/ispconfig/server/plugins-available/postfix_server_plugin.inc.php @@ -0,0 +1,116 @@ +plugins->registerEvent('server_insert','postfix_server_plugin','insert'); + $app->plugins->registerEvent('server_update','postfix_server_plugin','update'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + copy('/etc/postfix/main.cf','/etc/postfix/main.cf~'); + + if($mail_config["relayhost"] != '') { + exec("postconf -e 'relayhost = ".$mail_config["relayhost"]."'"); + if($mail_config["relayhost_user"] != '' && $mail_config["relayhost_password"] != '') { + exec("postconf -e 'smtp_sasl_auth_enable = yes'"); + } else { + exec("postconf -e 'smtp_sasl_auth_enable = no'"); + } + exec("postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'"); + exec("postconf -e 'smtp_sasl_security_options ='"); + + // Store the sasl passwd + $content = $mail_config["relayhost"]." ".$mail_config["relayhost_user"].":".$mail_config["relayhost_password"]; + file_put_contents('/etc/postfix/sasl_passwd',$content); + exec("chown root:root /etc/postfix/sasl_passwd"); + exec("chmod 600 /etc/postfix/sasl_passwd"); + exec("postmap /etc/postfix/sasl_passwd"); + exec("/etc/init.d/postfix restart"); + + } else { + exec("postconf -e 'relayhost ='"); + } + + exec("postconf -e 'mailbox_size_limit = ".intval($mail_config["mailbox_size_limit"]*1024*1024)."'"); + exec("postconf -e 'message_size_limit = ".intval($mail_config["message_size_limit"]*1024*1024)."'"); + + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/powerdns_plugin.inc.php b/interface/ispconfig/server/plugins-available/powerdns_plugin.inc.php new file mode 100644 index 000000000..ebe88a829 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/powerdns_plugin.inc.php @@ -0,0 +1,345 @@ +plugins->registerEvent('dns_soa_insert',$this->plugin_name,'soa_insert'); + $app->plugins->registerEvent('dns_soa_update',$this->plugin_name,'soa_update'); + $app->plugins->registerEvent('dns_soa_delete',$this->plugin_name,'soa_delete'); + + //* RR + $app->plugins->registerEvent('dns_rr_insert',$this->plugin_name,'rr_insert'); + $app->plugins->registerEvent('dns_rr_update',$this->plugin_name,'rr_update'); + $app->plugins->registerEvent('dns_rr_delete',$this->plugin_name,'rr_delete'); + + } + + + function soa_insert($event_name,$data) { + global $app, $conf; + + if($data["new"]["active"] != 'Y') return; + + $origin = substr($data["new"]["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + $serial = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$ispconfig_id); + $serial_id = $serial["serial"]; + $app->db->query("INSERT INTO powerdns.domains (name, type, notified_serial, ispconfig_id) VALUES ('$origin', 'MASTER', $serial_id, $ispconfig_id)"); + //$app->db->query("INSERT INTO powerdns.domains (name, type, ispconfig_id) VALUES ('$origin', 'NATIVE', $ispconfig_id)"); + $zone_id = mysql_insert_id(); + if(substr($data["new"]["ns"], -1) == '.'){ + $ns = substr($data["new"]["ns"], 0, -1); + } else { + $ns = $data["new"]["ns"].'.'.$origin; + } + if($ns == '') $ns = $origin; + + $hostmaster = substr($data["new"]["mbox"], 0, -1); + $content = $ns.' '.$hostmaster.' 0'; + //$content = $ns.' '.$hostmaster.' '.$serial_id.''; + $ttl = $data["new"]["ttl"]; + + $app->db->query("INSERT INTO powerdns.records (domain_id, name, type, content, ttl, prio, change_date, ispconfig_id) VALUES ($zone_id, '$origin', 'SOA', '$content', $ttl, 0, ".time().", $ispconfig_id)"); + + } + + function soa_update($event_name,$data) { + global $app, $conf; + + if($data["new"]["active"] != 'Y'){ + if($data["old"]["active"] != 'Y') return; + $this->soa_delete($event_name,$data); + } else { + if($data["old"]["active"] == 'Y'){ + $origin = substr($data["new"]["origin"], 0, -1); + $ispconfig_id = $data["new"]["id"]; + $serial = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$ispconfig_id); + $serial_id = $serial["serial"]; + //$app->db->query("UPDATE powerdns.domains SET name = '$origin', notified_serial = $serial_id WHERE ispconfig_id = $ispconfig_id"); + //$app->db->query("UPDATE powerdns.domains SET name = '$origin' WHERE ispconfig_id = $ispconfig_id"); + + if(substr($data["new"]["ns"], -1) == '.'){ + $ns = substr($data["new"]["ns"], 0, -1); + } else { + $ns = $data["new"]["ns"].'.'.$origin; + } + if($ns == '') $ns = $origin; + + $hostmaster = substr($data["new"]["mbox"], 0, -1); + //$content = $ns.' '.$hostmaster.' 0'; + $content = $ns.' '.$hostmaster.' '.$serial_id.''; + $ttl = $data["new"]["ttl"]; + $app->db->query("UPDATE powerdns.records SET name = '$origin', content = '$content', ttl = $ttl, change_date = ".time()." WHERE ispconfig_id = ".$data["new"]["id"]." AND type = 'SOA'"); + } else { + $this->soa_insert($event_name,$data); + $ispconfig_id = $data["new"]["id"]; + if($records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone = $ispconfig_id AND active = 'Y'")){ + foreach($records as $record){ + foreach($record as $key => $val){ + $data["new"][$key] = $val; + } + $this->rr_insert("dns_rr_insert", $data); + } + } + + } + } + + } + + function soa_delete($event_name,$data) { + global $app, $conf; + + $zone = $app->db->queryOneRecord("SELECT * FROM powerdns.domains WHERE ispconfig_id = ".$data["old"]["id"]); + $zone_id = $zone["id"]; + $app->db->query("DELETE FROM powerdns.records WHERE domain_id = $zone_id"); + $app->db->query("DELETE FROM powerdns.domains WHERE id = $zone_id"); + + } + + function rr_insert($event_name,$data) { + global $app, $conf; + if($data["new"]["active"] != 'Y') return; + + $zone = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data["new"]["zone"]); + $origin = substr($zone["origin"], 0, -1); + $powerdns_zone = $app->db->queryOneRecord("SELECT * FROM powerdns.domains WHERE ispconfig_id = ".$data["new"]["zone"]); + $zone_id = $powerdns_zone["id"]; + + $type = $data["new"]["type"]; + + if(substr($data["new"]["name"], -1) == '.'){ + $name = substr($data["new"]["name"], 0, -1); + } else { + if($data["new"]["name"] == ""){ + $name = $origin; + } else { + $name = $data["new"]["name"].'.'.$origin; + } + } + if($name == '') $name = $origin; + + switch ($type) { + case "CNAME": + case "MX": + case "NS": + case "ALIAS": + case "PTR": + case "SRV": + if(substr($data["new"]["data"], -1) == '.'){ + $content = substr($data["new"]["data"], 0, -1); + } else { + $content = $data["new"]["data"].'.'.$origin; + } + break; + case "HINFO": + $content = $data["new"]["data"]; + $quote1 = strpos($content, '"'); + if($quote1 !== FALSE){ + $quote2 = strpos(substr($content, ($quote1 + 1)), '"'); + } + if($quote1 !== FALSE && $quote2 !== FALSE){ + $text_between_quotes = str_replace(' ', '_', substr($content, ($quote1 + 1), (($quote2 - $quote1)))); + $content = $text_between_quotes.substr($content, ($quote2 + 2)); + } + break; + default: + $content = $data["new"]["data"]; + } + + $ttl = $data["new"]["ttl"]; + $prio = $data["new"]["aux"]; + $change_date = time(); + $ispconfig_id = $data["new"]["id"]; + + $app->db->query("INSERT INTO powerdns.records (domain_id, name, type, content, ttl, prio, change_date, ispconfig_id) VALUES ($zone_id, '$name', '$type', '$content', $ttl, $prio, $change_date, $ispconfig_id)"); + + } + + function rr_update($event_name,$data) { + global $app, $conf; + + if($data["new"]["active"] != 'Y'){ + if($data["old"]["active"] != 'Y') return; + $this->rr_delete($event_name,$data); + } else { + if($data["old"]["active"] == 'Y'){ + $zone = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data["new"]["zone"]); + $origin = substr($zone["origin"], 0, -1); + $powerdns_zone = $app->db->queryOneRecord("SELECT * FROM powerdns.domains WHERE ispconfig_id = ".$data["new"]["zone"]); + $zone_id = $powerdns_zone["id"]; + + $type = $data["new"]["type"]; + + if(substr($data["new"]["name"], -1) == '.'){ + $name = substr($data["new"]["name"], 0, -1); + } else { + if($data["new"]["name"] == ""){ + $name = $origin; + } else { + $name = $data["new"]["name"].'.'.$origin; + } + } + if($name == '') $name = $origin; + + switch ($type) { + case "CNAME": + case "MX": + case "NS": + case "ALIAS": + case "PTR": + case "SRV": + if(substr($data["new"]["data"], -1) == '.'){ + $content = substr($data["new"]["data"], 0, -1); + } else { + $content = $data["new"]["data"].'.'.$origin; + } + break; + case "HINFO": + $content = $data["new"]["data"]; + $quote1 = strpos($content, '"'); + if($quote1 !== FALSE){ + $quote2 = strpos(substr($content, ($quote1 + 1)), '"'); + } + if($quote1 !== FALSE && $quote2 !== FALSE){ + $text_between_quotes = str_replace(' ', '_', substr($content, ($quote1 + 1), (($quote2 - $quote1)))); + $content = $text_between_quotes.substr($content, ($quote2 + 2)); + } + break; + default: + $content = $data["new"]["data"]; + } + + $ttl = $data["new"]["ttl"]; + $prio = $data["new"]["aux"]; + $change_date = time(); + $ispconfig_id = $data["new"]["id"]; + //echo "UPDATE powerdns.records SET name = '$name', type = '$type', content = '$content', ttl = $ttl, prio = $prio, change_date = ".time()." WHERE id = $record_id"; + $app->db->query("UPDATE powerdns.records SET name = '$name', type = '$type', content = '$content', ttl = $ttl, prio = $prio, change_date = ".time()." WHERE ispconfig_id = $ispconfig_id AND type != 'SOA'"); + + } else { + $this->rr_insert($event_name,$data); + } + } + + } + + function rr_delete($event_name,$data) { + global $app, $conf; + + $ispconfig_id = $data["old"]["id"]; + $app->db->query("DELETE FROM powerdns.records WHERE ispconfig_id = $ispconfig_id AND type != 'SOA'"); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/shelluser_base_plugin.inc.php b/interface/ispconfig/server/plugins-available/shelluser_base_plugin.inc.php new file mode 100644 index 000000000..ed7fdc635 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/shelluser_base_plugin.inc.php @@ -0,0 +1,189 @@ +plugins->registerEvent('shell_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('shell_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('shell_user_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['puser'])) { + // Get the UID of the parent user + $uid = intval($app->system->getuid($data['new']['puser'])); + if($uid > $this->min_uid) { + $command = 'useradd'; + $command .= ' -d '.escapeshellcmd($data['new']['dir']); + $command .= ' -g '.escapeshellcmd($data['new']['pgroup']); + $command .= ' -o '; // non unique + if($data['new']['password'] != '') $command .= ' -p '.escapeshellcmd($data['new']['password']); + $command .= ' -s '.escapeshellcmd($data['new']['shell']); + $command .= ' -u '.escapeshellcmd($uid); + $command .= ' '.escapeshellcmd($data['new']['username']); + + exec($command); + $app->log("Executed command: ".$command,LOGLEVEL_DEBUG); + $app->log("Added shelluser: ".$data['new']['username'],LOGLEVEL_DEBUG); + + //* Create .bash_history file + exec('touch '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chmod 755 '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chown '.escapeshellcmd($data['new']['username']).':'.escapeshellcmd($data['new']['pgroup']).' '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + + //* Disable shell user temporarily if we use jailkit + if($data['new']['chroot'] == 'jailkit') { + $command = 'usermod -s /bin/false -L '.escapeshellcmd($data['new']['username']); + exec($command); + $app->log("Disabling shelluser temporarily: ".$command,LOGLEVEL_DEBUG); + } + + } else { + $app->log("UID = $uid for shelluser:".$data['new']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("Skippung insert of user:".$data['new']['username'].", parent user ".$data['new']['puser']." does not exist.",LOGLEVEL_WARN); + } + } + + function update($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['puser'])) { + // Get the UID of the parent user + $uid = intval($app->system->getuid($data['new']['puser'])); + if($uid > $this->min_uid) { + // Check if the user that we want to update exists, if not, we insert it + if($app->system->is_user($data['old']['username'])) { + $command = 'usermod'; + $command .= ' --home '.escapeshellcmd($data['new']['dir']); + $command .= ' --gid '.escapeshellcmd($data['new']['pgroup']); + // $command .= ' --non-unique '; + $command .= ' --password '.escapeshellcmd($data['new']['password']); + if($data['new']['chroot'] != 'jailkit') $command .= ' --shell '.escapeshellcmd($data['new']['shell']); + // $command .= ' --uid '.escapeshellcmd($uid); + $command .= ' --login '.escapeshellcmd($data['new']['username']); + $command .= ' '.escapeshellcmd($data['old']['username']); + + exec($command); + $app->log("Executed command: $command ",LOGLEVEL_DEBUG); + $app->log("Updated shelluser: ".$data['old']['username'],LOGLEVEL_DEBUG); + + + //* Create .bash_history file + if(!is_file($data['new']['dir']).'/.bash_history') { + exec('touch '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chmod 755 '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chown '.escapeshellcmd($data['new']['username']).':'.escapeshellcmd($data['new']['pgroup']).' '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + } + + } else { + // The user does not exist, so we insert it now + $this->insert($event_name,$data); + } + } else { + $app->log("UID = $uid for shelluser:".$data['new']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("Skippung update for user:".$data['new']['username'].", parent user ".$data['new']['puser']." does not exist.",LOGLEVEL_WARN); + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['old']['username'])) { + // Get the UID of the user + $userid = intval($app->system->getuid($data['old']['username'])); + if($userid > $this->min_uid) { + // We delete only non jailkit users, jailkit users will be deleted by the jailkit plugin. + if ($data['old']['chroot'] != "jailkit") { + $command = 'userdel -f'; + $command .= ' '.escapeshellcmd($data['old']['username']); + + exec($command); + $app->log("Deleted shelluser: ".$data['old']['username'],LOGLEVEL_DEBUG); + } + + } else { + $app->log("UID = $userid for shelluser:".$data['old']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("User:".$data['new']['username']." does not exist in in /etc/passwd, skipping delete.",LOGLEVEL_WARN); + } + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/shelluser_jailkit_plugin.inc.php b/interface/ispconfig/server/plugins-available/shelluser_jailkit_plugin.inc.php new file mode 100644 index 000000000..e5665fc11 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/shelluser_jailkit_plugin.inc.php @@ -0,0 +1,303 @@ +plugins->registerEvent('shell_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('shell_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('shell_user_delete',$this->plugin_name,'delete'); + + + } + + //* This function is called, when a shell user is inserted in the database + function insert($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['username'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['chroot'] == "jailkit") + { + // load the server configuration options + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + + $this->_add_jailkit_user(); + + $command .= 'usermod -U '.escapeshellcmd($data['new']['username']); + exec($command); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin -> insert username:".$data['new']['username'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin -> insert username:".$data['new']['username']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a shell user is updated in the database + function update($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['username'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['chroot'] == "jailkit") + { + // load the server configuration options + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin -> update username:".$data['new']['username'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin -> update username:".$data['new']['username']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a shell user is deleted in the database + /** + * TODO: Remove chroot user home and from the chroot passwd file + */ + function delete($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if ($data['old']['chroot'] == "jailkit") + { + $app->uses("getconf"); + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $jailkit_chroot_userhome = $this->_get_home_dir($data['old']['username']); + + //commented out proved to be dangerous on config errors + //exec('rm -rf '.$data['old']['dir'].$jailkit_chroot_userhome); + + if(@is_dir($data['old']['dir'].$jailkit_chroot_userhome)) { + $command = 'userdel'; + $command .= ' '.escapeshellcmd($data['old']['username']); + exec($command); + $app->log("Jailkit Plugin -> delete chroot home:".$data['old']['dir'].$jailkit_chroot_userhome,LOGLEVEL_DEBUG); + } + + } + + $app->log("Jailkit Plugin -> delete username:".$data['old']['username'],LOGLEVEL_DEBUG); + + + } + + function _setup_jailkit_chroot() + { + //check if the chroot environment is created yet if not create it with a list of program sections from the config + if (!is_dir($this->data['new']['dir'].'/etc/jailkit')) + { + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_chroot.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_sections'].'\''; + exec($command); + + $this->app->log("Added jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + $this->_add_jailkit_programs(); + + //add bash.bashrc script + //we need to collect the domain name to be used as the HOSTNAME in the bashrc script + $web = $this->app->db->queryOneRecord("SELECT domain FROM web_domain WHERE domain_id = ".intval($this->data['new']["parent_domain_id"])); + + $this->app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("bash.bashrc.master"); + + $tpl->setVar('jailkit_chroot',true); + $tpl->setVar('domain',$web['domain']); + $tpl->setVar('home_dir',$this->_get_home_dir("")); + + $bashrc = escapeshellcmd($this->data['new']['dir']).'/etc/bash.bashrc'; + if(@is_file($bashrc)) exec('rm '.$bashrc); + + file_put_contents($bashrc,$tpl->grab()); + unset($tpl); + + $this->app->log("Added bashrc scrpt : ".$bashrc,LOGLEVEL_DEBUG); + + $tpl = new tpl(); + $tpl->newTemplate("motd.master"); + + $tpl->setVar('domain',$web['domain']); + + $motd = escapeshellcmd($this->data['new']['dir']).'/var/run/motd'; + if(@is_file($motd)) exec('rm '.$motd); + + file_put_contents($motd,$tpl->grab()); + + } + } + + function _add_jailkit_programs() + { + //copy over further programs and its libraries + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_programs'].'\''; + exec($command); + + $this->app->log("Added programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + } + + function _get_home_dir($username) + { + return str_replace("[username]",escapeshellcmd($username),$this->jailkit_config["jailkit_chroot_home"]); + } + + function _add_jailkit_user() + { + //add the user to the chroot + $jailkit_chroot_userhome = $this->_get_home_dir($this->data['new']['username']); + $jailkit_chroot_puserhome = $this->_get_home_dir($this->data['new']['puser']); + + if(!is_dir($this->data['new']['dir'].'/etc')) mkdir($this->data['new']['dir'].'/etc'); + if(!is_file($this->data['new']['dir'].'/etc/passwd')) exec('touch '.$this->data['new']['dir'].'/etc/passwd'); + + // IMPORTANT! + // ALWAYS create the user. Even if the user was created before + // if we check if the user exists, then a update (no shell -> jailkit) will not work + // and the user has FULL ACCESS to the root of the server! + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_user.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['username']); + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' '.$jailkit_chroot_userhome; + $command .= ' '.escapeshellcmd($this->data['new']['shell']); + $command .= ' '.$this->data['new']['puser']; + $command .= ' '.$jailkit_chroot_puserhome; + exec($command); + + $this->app->log("Added jailkit user to chroot with command: ".$command,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_userhome)); + exec("chown ".$this->data['new']['username'].":".$this->data['new']['pgroup']." ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_userhome)); + + $this->app->log("Added created jailkit user home in : ".$this->data['new']['dir'].$jailkit_chroot_userhome,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_puserhome)); + exec("chown ".$this->data['new']['puser'].":".$this->data['new']['pgroup']." ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_puserhome)); + + $this->app->log("Added created jailkit parent user home in : ".$this->data['new']['dir'].$jailkit_chroot_puserhome,LOGLEVEL_DEBUG); + } + + //* Update the website root directory permissions depending on the security level + function _update_website_security_level() { + global $app,$conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + // Get the parent website of this shell user + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$this->data['new']['parent_domain_id']); + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + $this->_exec("chmod 755 ".escapeshellcmd($web["document_root"])); + $this->_exec("chown root:root ".escapeshellcmd($web["document_root"])); + } + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/software_update_plugin.inc.php b/interface/ispconfig/server/plugins-available/software_update_plugin.inc.php new file mode 100644 index 000000000..08656c387 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/software_update_plugin.inc.php @@ -0,0 +1,178 @@ +plugins->registerEvent('software_update_inst_insert',$this->plugin_name,'process'); + //$app->plugins->registerEvent('software_update_inst_update',$this->plugin_name,'process'); + //$app->plugins->registerEvent('software_update_inst_delete',$this->plugin_name,'process'); + + + } + + function set_install_status($inst_id, $status) { + global $app; + + $app->db->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'"); + $app->dbmaster->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'"); + } + + function process($event_name,$data) { + global $app, $conf; + + //* Get the info of the package: + $software_update_id = intval($data["new"]["software_update_id"]); + $software_update = $app->db->queryOneRecord("SELECT * FROM software_update WHERE software_update_id = '$software_update_id'"); + $software_package = $app->db->queryOneRecord("SELECT * FROM software_package WHERE package_name = '".$app->db->quote($software_update['package_name'])."'"); + + if($software_package['package_type'] == 'ispconfig' && !$conf['software_updates_enabled'] == true) { + $app->log('Software Updates not enabled on this server. To enable updates, set $conf["software_updates_enabled"] = true; in config.inc.php',LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $installuser = ''; + if($software_package['package_type'] == 'ispconfig') { + $installuser = ''; + } elseif ($software_package['package_type'] == 'app') { + $installuser = 'ispapps'; + } else { + $app->log('package_type not supported',LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $temp_dir = '/tmp/'.md5 (uniqid (rand())); + $app->log("The temp dir is $temp_dir",LOGLEVEL_DEBUG); + mkdir($temp_dir); + if($installuser != '') exec('chown '.$installuser.' '.$temp_dir); + + if(!is_dir($temp_dir)) { + $app->log("Unable to create temp directory.",LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $cmd = "cd $temp_dir && wget ".$software_update["update_url"]; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + $app->log("Downloading the update file from: ".$software_update["update_url"],LOGLEVEL_DEBUG); + + $url_parts = parse_url($software_update["update_url"]); + $update_filename = basename($url_parts["path"]); + $app->log("The update filename is $update_filename",LOGLEVEL_DEBUG); + + if(is_file($temp_dir.'/'.$update_filename)) { + + //* Checking the md5sum + if(md5_file($temp_dir.'/'.$update_filename) != $software_update["update_md5"]) { + $app->log("The md5 sum of the downloaded file is incorrect. Update aborted.",LOGLEVEL_WARN); + exec("rm -rf $temp_dir"); + $app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } else { + $app->log("md5sum of the downloaded file is verified.",LOGLEVEL_DEBUG); + } + + + //* unpacking the update + $cmd = "cd $temp_dir && unzip $update_filename"; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + + if(is_file($temp_dir.'/setup.sh')) { + // Execute the setup script + exec('chmod +x '.$temp_dir.'/setup.sh'); + $app->log("Executing setup.sh file in directory $temp_dir",LOGLEVEL_DEBUG); + $cmd = 'cd '.$temp_dir.' && ./setup.sh > package_install.log'; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + + $log_data = @file_get_contents("{$temp_dir}/package_install.log"); + if(preg_match("'.*\[OK\]\s*$'is", $log_data)) { + $app->log("Installation successful",LOGLEVEL_DEBUG); + $app->log($log_data,LOGLEVEL_DEBUG); + $this->set_install_status($data["new"]["software_update_inst_id"], "installed"); + } else { + $app->log("Installation failed:\n\n" . $log_data,LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + } else { + $app->log("setup.sh file not found",LOGLEVEL_ERROR); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + } else { + $app->log("Download of the update file failed",LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + + exec("rm -rf $temp_dir"); + $app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-available/webmail_symlink_plugin.inc.php b/interface/ispconfig/server/plugins-available/webmail_symlink_plugin.inc.php new file mode 100644 index 000000000..f20dbbc64 --- /dev/null +++ b/interface/ispconfig/server/plugins-available/webmail_symlink_plugin.inc.php @@ -0,0 +1,121 @@ +plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update'); + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + } + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) { + + $old_parent_domain_id = intval($data["old"]["parent_domain_id"]); + $new_parent_domain_id = intval($data["new"]["parent_domain_id"]); + + // If the parent_domain_id has been chenged, we will have to update the old site as well. + if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) { + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->update($event_name,$data); + } + + // This is not a vhost, so we need to update the parent record instead. + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + } + + if($data["new"]["document_root"] == '') { + $app->log("document_root not set",LOGLEVEL_WARN); + return 0; + } + + $symlink = true; + if($data["new"]["php"] == "suphp") $symlink = false; + elseif($data["new"]["php"] == "cgi" && $data["new"]["suexec"] == "y") $symlink = false; + elseif($data["new"]["php"] == "fast-cgi" && $data["new"]["suexec"] == "y") $symlink = false; + + + if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web"); + if($symlink == false) { + if(is_link($data["new"]["document_root"]."/web/webmail")) exec("rm -f ".$data["new"]["document_root"]."/web/webmail"); + } else { + if(!is_link($data["new"]["document_root"]."/web/webmail")) exec("ln -s /var/www/webmail ".$data["new"]["document_root"]."/web/webmail"); + else exec("ln -sf /var/www/webmail ".$data["new"]["document_root"]."/web/webmail"); + } + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/apache2_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/apache2_plugin.inc.php new file mode 100644 index 000000000..16b405ae4 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/apache2_plugin.inc.php @@ -0,0 +1,987 @@ +plugins->registerEvent('web_domain_insert',$this->plugin_name,'ssl'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'ssl'); + $app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'ssl'); + + $app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('web_domain_delete',$this->plugin_name,'delete'); + + $app->plugins->registerEvent('server_ip_insert',$this->plugin_name,'server_ip'); + $app->plugins->registerEvent('server_ip_update',$this->plugin_name,'server_ip'); + $app->plugins->registerEvent('server_ip_delete',$this->plugin_name,'server_ip'); + + } + + // Handle the creation of SSL certificates + function ssl($event_name,$data) { + global $app, $conf; + + if(!is_dir($data["new"]["document_root"]."/ssl")) exec("mkdir -p ".$data["new"]["document_root"]."/ssl"); + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $key_file = $ssl_dir.'/'.$domain.".key.org"; + $key_file2 = $ssl_dir.'/'.$domain.".key"; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + + //* Create a SSL Certificate + if($data["new"]["ssl_action"] == 'create') { + $rand_file = $ssl_dir."/random_file"; + $rand_data = md5(uniqid(microtime(),1)); + for($i=0; $i<1000; $i++){ + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + $rand_data .= md5(uniqid(microtime(),1)); + } + file_put_contents($rand_file, $rand_data); + + $ssl_password = substr(md5(uniqid(microtime(),1)), 0, 15); + + $ssl_cnf = " RANDFILE = $rand_file + + [ req ] + default_bits = 2048 + default_keyfile = keyfile.pem + distinguished_name = req_distinguished_name + attributes = req_attributes + prompt = no + output_password = $ssl_password + + [ req_distinguished_name ] + C = ".$data['new']['ssl_country']." + ST = ".$data['new']['ssl_state']." + L = ".$data['new']['ssl_locality']." + O = ".$data['new']['ssl_organisation']." + OU = ".$data['new']['ssl_organisation_unit']." + CN = $domain + emailAddress = webmaster@".$data['new']['domain']." + + [ req_attributes ] + challengePassword = A challenge password"; + + $ssl_cnf_file = $ssl_dir."/openssl.conf"; + file_put_contents($ssl_cnf_file,$ssl_cnf); + + $rand_file = escapeshellcmd($rand_file); + $key_file = escapeshellcmd($key_file); + $key_file2 = escapeshellcmd($key_file2); + $ssl_days = 3650; + $csr_file = escapeshellcmd($csr_file); + $config_file = escapeshellcmd($ssl_cnf_file); + $crt_file = escapeshellcmd($crt_file); + + if(is_file($ssl_cnf_file)){ + exec("openssl genrsa -des3 -rand $rand_file -passout pass:$ssl_password -out $key_file 2048 && openssl req -new -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -out $csr_file -days $ssl_days -config $config_file && openssl req -x509 -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -in $csr_file -out $crt_file -days $ssl_days -config $config_file && openssl rsa -passin pass:$ssl_password -in $key_file -out $key_file2"); + $app->log("Creating SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + exec("chmod 400 $key_file2"); + @unlink($config_file); + @unlink($rand_file); + $ssl_request = $app->db->quote(file_get_contents($csr_file)); + $ssl_cert = $app->db->quote(file_get_contents($crt_file)); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'"); + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'"); + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + } + + //* Save a SSL certificate to disk + if($data["new"]["ssl_action"] == 'save') { + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + file_put_contents($csr_file,$data["new"]["ssl_request"]); + file_put_contents($crt_file,$data["new"]["ssl_cert"]); + if(trim($data["new"]["ssl_bundle"]) != '') file_put_contents($bundle_file,$data["new"]["ssl_bundle"]); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->log("Saving SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + //* Delete a SSL certificate + if($data["new"]["ssl_action"] == 'del') { + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $csr_file = $ssl_dir.'/'.$domain.".csr"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + unlink($csr_file); + unlink($crt_file); + unlink($bundle_file); + /* Update the DB of the (local) Server */ + $app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + /* Update also the master-DB of the Server-Farm */ + $app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'"); + $app->log("Deleting SSL Cert for: $domain",LOGLEVEL_DEBUG); + } + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + + + } + + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) { + + $old_parent_domain_id = intval($data["old"]["parent_domain_id"]); + $new_parent_domain_id = intval($data["new"]["parent_domain_id"]); + + // If the parent_domain_id has been chenged, we will have to update the old site as well. + if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) { + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + $this->update($event_name,$data); + } + + // This is not a vhost, so we need to update the parent record instead. + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + } + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { + $apache_chrooted = true; + $app->log("Info: Apache is chrooted.",LOGLEVEL_DEBUG); + } else { + $apache_chrooted = false; + } + + if($data["new"]["document_root"] == '') { + $app->log("document_root not set",LOGLEVEL_WARN); + return 0; + } + if($data["new"]["system_user"] == 'root' or $data["new"]["system_group"] == 'root') { + $app->log("Websites can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + //* If the client of the site has been changed, we have a change of the document root + if($this->action == 'update' && $data["new"]["document_root"] != $data["old"]["document_root"]) { + + //* Get the old client ID + $old_client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $old_client_id = intval($old_client["client_id"]); + unset($old_client); + + //* Remove the old symlinks + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$old_client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // create the symlinks, if not exist + if(is_link($tmp_symlink)) { + exec("rm -f ".escapeshellcmd($tmp_symlink)); + $app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + + //* Move the site data + $tmp_docroot = explode('/',$data["new"]["document_root"]); + unset($tmp_docroot[count($tmp_docroot)-1]); + $new_dir = implode('/',$tmp_docroot); + + $tmp_docroot = explode('/',$data["old"]["document_root"]); + unset($tmp_docroot[count($tmp_docroot)-1]); + $old_dir = implode('/',$tmp_docroot); + + exec('rm -rf '.$data["new"]["document_root"]); + if(!is_dir($new_dir)) exec('mkdir -p '.$new_dir); + exec('mv '.$data["old"]["document_root"].' '.$new_dir); + $app->log("Moving site to new document root: ".'mv '.$data["old"]["document_root"].' '.$new_dir,LOGLEVEL_DEBUG); + + //* Change the owner of the website files to the new website owner + exec('chown --recursive --from='.escapeshellcmd($data["old"]["system_user"]).':'.escapeshellcmd($data['old']['system_group']).' '.escapeshellcmd($data["new"]["system_user"]).':'.escapeshellcmd($data['new']['system_group']).' '.$new_dir); + + //* Change the home directory and group of the website user + $command = 'usermod'; + $command .= ' --home '.escapeshellcmd($data["new"]["document_root"]); + $command .= ' --gid '.escapeshellcmd($data['new']['system_group']); + $command .= ' '.escapeshellcmd($data["new"]["system_user"]); + exec($command); + + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + + } + + //print_r($data); + + // Check if the directories are there and create them if nescessary. + if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web"); + if(!is_dir($data["new"]["document_root"]."/web/error") and $data["new"]["errordocs"]) exec("mkdir -p ".$data["new"]["document_root"]."/web/error"); + //if(!is_dir($data["new"]["document_root"]."/log")) exec("mkdir -p ".$data["new"]["document_root"]."/log"); + if(!is_dir($data["new"]["document_root"]."/ssl")) exec("mkdir -p ".$data["new"]["document_root"]."/ssl"); + if(!is_dir($data["new"]["document_root"]."/cgi-bin")) exec("mkdir -p ".$data["new"]["document_root"]."/cgi-bin"); + if(!is_dir($data["new"]["document_root"]."/tmp")) exec("mkdir -p ".$data["new"]["document_root"]."/tmp"); + + // Remove the symlink for the site, if site is renamed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + if(is_dir('/var/log/ispconfig/httpd/'.$data["old"]["domain"])) exec('rm -rf /var/log/ispconfig/httpd/'.$data["old"]["domain"]); + if(is_link($data["old"]["document_root"]."/log")) unlink($data["old"]["document_root"]."/log"); + } + + // Create the symlink for the logfiles + if(!is_dir('/var/log/ispconfig/httpd/'.$data["new"]["domain"])) exec('mkdir -p /var/log/ispconfig/httpd/'.$data["new"]["domain"]); + if(!is_link($data["new"]["document_root"]."/log")) { + exec("ln -s /var/log/ispconfig/httpd/".$data["new"]["domain"]." ".$data["new"]["document_root"]."/log"); + $app->log("Creating Symlink: ln -s /var/log/ispconfig/httpd/".$data["new"]["domain"]." ".$data["new"]["document_root"]."/log",LOGLEVEL_DEBUG); + } + /* + // Create the symlink for the logfiles + // This does not work as vlogger can not log trogh symlinks. + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + if(is_dir($data["old"]["document_root"]."/log")) exec('rm -rf '.$data["old"]["document_root"]."/log"); + if(is_link('/var/log/ispconfig/httpd/'.$data["old"]["domain"])) unlink('/var/log/ispconfig/httpd/'.$data["old"]["domain"]); + } + + // Create the symlink for the logfiles + if(!is_dir($data["new"]["document_root"]."/log")) exec('mkdir -p '.$data["new"]["document_root"]."/log"); + if(!is_link('/var/log/ispconfig/httpd/'.$data["new"]["domain"])) { + exec("ln -s ".$data["new"]["document_root"]."/log /var/log/ispconfig/httpd/".$data["new"]["domain"]); + $app->log("Creating Symlink: ln -s ".$data["new"]["document_root"]."/log /var/log/ispconfig/httpd/".$data["new"]["domain"],LOGLEVEL_DEBUG); + } + */ + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["new"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + // Remove old symlinks, if site is renamed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // remove the symlinks, if not exist + if(is_link($tmp_symlink)) { + exec("rm -f ".escapeshellcmd($tmp_symlink)); + $app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + } + + // Create the symlinks for the sites + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["new"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + //* Remove symlink if target folder has been changed. + if($data["old"]["document_root"] != '' && $data["old"]["document_root"] != $data["new"]["document_root"] && is_link($tmp_symlink)) { + unlink($tmp_symlink); + } + // create the symlinks, if not exist + if(!is_link($tmp_symlink)) { + exec("ln -s ".escapeshellcmd($data["new"]["document_root"])."/ ".escapeshellcmd($tmp_symlink)); + $app->log("Creating Symlink: ln -s ".$data["new"]["document_root"]."/ ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + + + if($this->action == 'insert' && $data["new"]["type"] == 'vhost') { + // Copy the error pages + if($data["new"]["errordocs"]){ + $error_page_path = escapeshellcmd($data["new"]["document_root"])."/web/error/"; + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/400.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/*.html ".$error_page_path); + } + else { + exec("cp /usr/local/ispconfig/server/conf/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + } + exec("chmod -R a+r ".$error_page_path); + } + + // copy the standard index page + if (file_exists("/usr/local/ispconfig/server/conf-custom/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2)." ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/index/standard_index.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/index/standard_index.html ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + } + else { + exec("cp /usr/local/ispconfig/server/conf/index/standard_index.html_".substr(escapeshellcmd($conf["language"]),0,2)." ".escapeshellcmd($data["new"]["document_root"])."/web/index.html"); + exec("cp /usr/local/ispconfig/server/conf/index/favicon.ico ".escapeshellcmd($data["new"]["document_root"])."/web/"); + exec("cp /usr/local/ispconfig/server/conf/index/robots.txt ".escapeshellcmd($data["new"]["document_root"])."/web/"); + exec("cp /usr/local/ispconfig/server/conf/index/.htaccess ".escapeshellcmd($data["new"]["document_root"])."/web/"); + } + } + exec("chmod -R a+r ".escapeshellcmd($data["new"]["document_root"])."/web/"); + + //** Copy the error documents on update when the error document checkbox has been activated and was deactivated before + } elseif ($this->action == 'update' && $data["new"]["type"] == 'vhost' && $data["old"]["errordocs"] == 0 && $data["new"]["errordocs"] == 1) { + + $error_page_path = escapeshellcmd($data["new"]["document_root"])."/web/error/"; + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2))){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + else { + if (file_exists("/usr/local/ispconfig/server/conf-custom/error/400.html")){ + exec("cp /usr/local/ispconfig/server/conf-custom/error/*.html ".$error_page_path); + } + else { + exec("cp /usr/local/ispconfig/server/conf/error/".substr(escapeshellcmd($conf["language"]),0,2)."/* ".$error_page_path); + } + } + exec("chmod -R a+r ".$error_page_path); + } // end copy error docs + + // Create group and user, if not exist + $app->uses("system"); + + $groupname = escapeshellcmd($data["new"]["system_group"]); + if($data["new"]["system_group"] != '' && !$app->system->is_group($data["new"]["system_group"])) { + exec("groupadd $groupname"); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." groupadd $groupname"); + $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG); + } + + $username = escapeshellcmd($data["new"]["system_user"]); + if($data["new"]["system_user"] != '' && !$app->system->is_user($data["new"]["system_user"])) { + exec("useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." "."useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); + $app->log("Adding the user: $username",LOGLEVEL_DEBUG); + } + + // Set the quota for the user + if($username != '' && $app->system->is_user($username)) { + if($data["new"]["hd_quota"] > 0){ + $blocks_soft = $data["new"]["hd_quota"] * 1024; + $blocks_hard = $blocks_soft + 1024; + } else { + $blocks_soft = $blocks_hard = 0; + } + exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null"); + exec("setquota -T -u $username 604800 604800 -a &> /dev/null"); + } + + if($this->action == 'insert') { + // Chown and chmod the directories below the document root + $this->_exec("chown -R $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + // The document root itself has to be owned by root in normal level and by the web owner in security level 20 + if($web_config['security_level'] == 20) { + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + } else { + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"])); + } + } + + + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + + $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"])."/*"); + $this->_exec("chmod 710 ".escapeshellcmd($data["new"]["document_root"]."/web")); + + // make temp direcory writable for the apache user and the website user + $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); + + $command = 'usermod'; + $command .= ' --groups sshusers'; + $command .= ' '.escapeshellcmd($data["new"]["system_user"]); + $this->_exec($command); + + //* if we have a chrooted apache enviroment + if($apache_chrooted) { + $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + //* add the apache user to the client group in the chroot enviroment + $tmp_groupfile = $app->system->server_conf["group_datei"]; + $app->system->server_conf["group_datei"] = $web_config['website_basedir'].'/etc/group'; + $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); + $app->system->server_conf["group_datei"] = $tmp_groupfile; + unset($tmp_groupfile); + } + + //* add the apache user to the client group + $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); + + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + + /* + * Workaround for jailkit: If jailkit is enabled for the site, the + * website root has to be owned by the root user and we have to chmod it to 755 then + */ + + //* Check if there is a jailkit user for this site + $tmp = $app->db->queryOneRecord("SELECT count(shell_user_id) as number FROM shell_user WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND chroot = 'jailkit'"); + if($tmp['number'] > 0) { + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); + } + unset($tmp); + + // If the security Level is set to medium + } else { + + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/*")); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); + + // make temp direcory writable for the apache user and the website user + $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); + } + + // Change the owner of the error log to the owner of the website + if(!@is_file($data["new"]["document_root"]."/log/error.log")) exec('touch '.escapeshellcmd($data["new"]["document_root"])."/log/error.log"); + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])."/log/error.log"); + + + // Create the vhost config file + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("vhost.conf.master"); + + $vhost_data = $data["new"]; + $vhost_data["web_document_root"] = $data["new"]["document_root"]."/web"; + $vhost_data["web_document_root_www"] = $web_config["website_basedir"]."/".$data["new"]["domain"]."/web"; + $vhost_data["web_basedir"] = $web_config["website_basedir"]; + $vhost_data["security_level"] = $web_config["security_level"]; + $vhost_data["allow_override"] = ($data["new"]["allow_override"] == '')?'All':$data["new"]["allow_override"]; + $vhost_data["php_open_basedir"] = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $vhost_data["ssl_domain"] = $data["new"]["ssl_domain"]; + + // Check if a SSL cert exists + $ssl_dir = $data["new"]["document_root"]."/ssl"; + $domain = $data["new"]["ssl_domain"]; + $key_file = $ssl_dir.'/'.$domain.".key"; + $crt_file = $ssl_dir.'/'.$domain.".crt"; + $bundle_file = $ssl_dir.'/'.$domain.".bundle"; + + if($data["new"]["ssl"] == 'y' && @is_file($crt_file) && @is_file($key_file)) { + $vhost_data["ssl_enabled"] = 1; + $app->log("Enable SSL for: $domain",LOGLEVEL_DEBUG); + } else { + $vhost_data["ssl_enabled"] = 0; + $app->log("Disable SSL for: $domain",LOGLEVEL_DEBUG); + } + + if(@is_file($bundle_file)) $vhost_data['has_bundle_cert'] = 1; + + //$vhost_data["document_root"] = $data["new"]["document_root"]."/web"; + $tpl->setVar($vhost_data); + + // Rewrite rules + $rewrite_rules = array(); + if($data["new"]["redirect_type"] != '') { + if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/'; + /* Disabled path extension + if($data["new"]["redirect_type"] == 'no' && substr($data["new"]["redirect_path"],0,4) != 'http') { + $data["new"]["redirect_path"] = $data["new"]["document_root"]."/web".realpath($data["new"]["redirect_path"]).'/'; + } + */ + + $rewrite_rules[] = array( 'rewrite_domain' => $data["new"]["domain"], + 'rewrite_type' => ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']', + 'rewrite_target' => $data["new"]["redirect_path"]); + + switch($data["new"]["subdomain"]) { + case 'www': + $rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$data["new"]["domain"], + 'rewrite_type' => ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']', + 'rewrite_target' => $data["new"]["redirect_path"]); + break; + case '*': + // TODO + //$rewrite_rules[] = array( 'rewrite_domain' => '*'.$alias["domain"], + // 'rewrite_type' => $alias["redirect_type"], + // 'rewrite_target' => $alias["redirect_path"]); + break; + } + } + + // get alias domains (co-domains and subdomains) + $aliases = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND active = 'y'"); + $server_alias = array(); + switch($data["new"]["subdomain"]) { + case 'www': + $server_alias[] .= 'www.'.$data["new"]["domain"].' '; + break; + case '*': + $server_alias[] .= '*.'.$data["new"]["domain"].' '; + break; + } + if(is_array($aliases)) { + foreach($aliases as $alias) { + switch($alias["subdomain"]) { + case 'www': + $server_alias[] .= 'www.'.$alias["domain"].' '.$alias["domain"].' '; + break; + case '*': + $server_alias[] .= '*.'.$alias["domain"].' '.$alias["domain"].' '; + break; + default: + $server_alias[] .= $alias["domain"].' '; + break; + } + $app->log("Add server alias: $alias[domain]",LOGLEVEL_DEBUG); + // Rewriting + if($alias["redirect_type"] != '') { + if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/'; + /* Disabled path extension + if($data["new"]["redirect_type"] == 'no' && substr($data["new"]["redirect_path"],0,4) != 'http') { + $data["new"]["redirect_path"] = $data["new"]["document_root"]."/web".realpath($data["new"]["redirect_path"]).'/'; + } + */ + $rewrite_rules[] = array( 'rewrite_domain' => $alias["domain"], + 'rewrite_type' => ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']', + 'rewrite_target' => $alias["redirect_path"]); + switch($alias["subdomain"]) { + case 'www': + $rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$alias["domain"], + 'rewrite_type' => ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']', + 'rewrite_target' => $alias["redirect_path"]); + break; + case '*': + // TODO + //$rewrite_rules[] = array( 'rewrite_domain' => '*'.$alias["domain"], + // 'rewrite_type' => $alias["redirect_type"], + // 'rewrite_target' => $alias["redirect_path"]); + break; + } + } + } + } + + //* If we have some alias records + if(count($server_alias) > 0) { + $server_alias_str = ''; + $n = 0; + + // begin a new ServerAlias line after 30 alias domains + foreach($server_alias as $tmp_alias) { + if($n % 30 == 0) $server_alias_str .= "\n ServerAlias "; + $server_alias_str .= $tmp_alias; + } + unset($tmp_alias); + + $tpl->setVar('alias',trim($server_alias_str)); + } else { + $tpl->setVar('alias',''); + } + + if(count($rewrite_rules) > 0) { + $tpl->setVar('rewrite_enabled',1); + } else { + $tpl->setVar('rewrite_enabled',0); + } + $tpl->setLoop('redirects',$rewrite_rules); + + /** + * install fast-cgi starter script and add script aliasd config + * first we create the script directory if not already created, then copy over the starter script + * settings are copied over from the server ini config for now + * TODO: Create form for fastcgi configs per site. + */ + + if ($data["new"]["php"] == "fast-cgi") + { + $fastcgi_config = $app->getconf->get_server_config($conf["server_id"], 'fastcgi'); + + $fastcgi_starter_path = str_replace("[system_user]",$data["new"]["system_user"],$fastcgi_config["fastcgi_starter_path"]); + $fastcgi_starter_path = str_replace("[client_id]",$client_id,$fastcgi_starter_path); + + if (!is_dir($fastcgi_starter_path)) + { + exec("mkdir -p ".escapeshellcmd($fastcgi_starter_path)); + //exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($fastcgi_starter_path)); + + + $app->log("Creating fastcgi starter script directory: $fastcgi_starter_path",LOGLEVEL_DEBUG); + } + + exec("chown -R ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($fastcgi_starter_path)); + + $fcgi_tpl = new tpl(); + $fcgi_tpl->newTemplate("php-fcgi-starter.master"); + + $fcgi_tpl->setVar('php_ini_path',escapeshellcmd($fastcgi_config["fastcgi_phpini_path"])); + $fcgi_tpl->setVar('document_root',escapeshellcmd($data["new"]["document_root"])); + $fcgi_tpl->setVar('php_fcgi_children',escapeshellcmd($fastcgi_config["fastcgi_children"])); + $fcgi_tpl->setVar('php_fcgi_max_requests',escapeshellcmd($fastcgi_config["fastcgi_max_requests"])); + $fcgi_tpl->setVar('php_fcgi_bin',escapeshellcmd($fastcgi_config["fastcgi_bin"])); + $fcgi_tpl->setVar('security_level',intval($web_config["security_level"])); + + $php_open_basedir = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $fcgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir)); + + $fcgi_starter_script = escapeshellcmd($fastcgi_starter_path.$fastcgi_config["fastcgi_starter_script"]); + file_put_contents($fcgi_starter_script,$fcgi_tpl->grab()); + unset($fcgi_tpl); + + $app->log("Creating fastcgi starter script: $fcgi_starter_script",LOGLEVEL_DEBUG); + + + exec("chmod 755 $fcgi_starter_script"); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." $fcgi_starter_script"); + + $tpl->setVar('fastcgi_alias',$fastcgi_config["fastcgi_alias"]); + $tpl->setVar('fastcgi_starter_path',$fastcgi_starter_path); + $tpl->setVar('fastcgi_starter_script',$fastcgi_config["fastcgi_starter_script"]); + + } + + /** + * install cgi starter script and add script alias to config. + * This is needed to allow cgi with suexec (to do so, we need a bin in the document-path!) + * first we create the script directory if not already created, then copy over the starter script. + * TODO: we have to fetch the data from the server-settings. + */ + + if ($data["new"]["php"] == "cgi") + { + //$cgi_config = $app->getconf->get_server_config($conf["server_id"], 'cgi'); + + $cgi_config["cgi_starter_path"] = $web_config["website_basedir"]."/php-cgi-scripts/[system_user]/"; + $cgi_config["cgi_starter_script"] = "php-cgi-starter"; + $cgi_config["cgi_bin"] = "/usr/bin/php-cgi"; + + $cgi_starter_path = str_replace("[system_user]",$data["new"]["system_user"],$cgi_config["cgi_starter_path"]); + $cgi_starter_path = str_replace("[client_id]",$client_id,$cgi_starter_path); + + if (!is_dir($cgi_starter_path)) + { + exec("mkdir -p ".escapeshellcmd($cgi_starter_path)); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." ".escapeshellcmd($cgi_starter_path)); + + $app->log("Creating cgi starter script directory: $cgi_starter_path",LOGLEVEL_DEBUG); + } + + $cgi_tpl = new tpl(); + $cgi_tpl->newTemplate("php-cgi-starter.master"); + + // This works, because php "rewrites" a symlink to the physical path + $php_open_basedir = ($data["new"]["php_open_basedir"] == '')?$data["new"]["document_root"]:$data["new"]["php_open_basedir"]; + $cgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir)); + $cgi_tpl->setVar('document_root', escapeshellcmd($data["new"]["document_root"])); + + // This will NOT work! + //$cgi_tpl->setVar('open_basedir', "/var/www/" . $data["new"]["domain"]); + $cgi_tpl->setVar('php_cgi_bin',$cgi_config["cgi_bin"]); + $cgi_tpl->setVar('security_level',$web_config["security_level"]); + + $cgi_starter_script = escapeshellcmd($cgi_starter_path.$cgi_config["cgi_starter_script"]); + file_put_contents($cgi_starter_script,$cgi_tpl->grab()); + unset($cgi_tpl); + + $app->log("Creating cgi starter script: $cgi_starter_script",LOGLEVEL_DEBUG); + + + exec("chmod 755 $cgi_starter_script"); + exec("chown ".$data["new"]["system_user"].":".$data["new"]["system_group"]." $cgi_starter_script"); + + $tpl->setVar('cgi_starter_path',$cgi_starter_path); + $tpl->setVar('cgi_starter_script',$cgi_config["cgi_starter_script"]); + + } + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["new"]["domain"].'.vhost'); + file_put_contents($vhost_file,$tpl->grab()); + $app->log("Writing the vhost file: $vhost_file",LOGLEVEL_DEBUG); + unset($tpl); + + // Set the symlink to enable the vhost + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["new"]["domain"].'.vhost'); + if($data["new"]["active"] == 'y' && !is_link($vhost_symlink)) { + symlink($vhost_file,$vhost_symlink); + $app->log("Creating the symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + } + + // Remove the symlink, if site is inactive + if($data["new"]["active"] == 'n' && is_link($vhost_symlink)) { + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + } + + // remove old symlink and vhost file, if domain name of the site has changed + if($this->action == 'update' && $data["old"]["domain"] != '' && $data["new"]["domain"] != $data["old"]["domain"]) { + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_file); + $app->log("Removing File $vhost_file",LOGLEVEL_DEBUG); + } + + //* Create .htaccess and .htpasswd file for website statistics + if(!is_file($data["new"]["document_root"].'/web/stats/.htaccess') or $data["old"]["document_root"] != $data["new"]["document_root"]) { + if(!is_dir($data["new"]["document_root"].'/web/stats')) mkdir($data["new"]["document_root"].'/web/stats'); + $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data["new"]["document_root"]."/.htpasswd_stats\nrequire valid-user"; + file_put_contents($data["new"]["document_root"].'/web/stats/.htaccess',$ht_file); + chmod($data["new"]["document_root"].'/web/stats/.htaccess',0755); + unset($ht_file); + } + + if(!is_file($data["new"]["document_root"].'/.htpasswd_stats') || $data["new"]["stats_password"] != $data["old"]["stats_password"]) { + if(trim($data["new"]["stats_password"]) != '') { + $htp_file = 'admin:'.trim($data["new"]["stats_password"]); + file_put_contents($data["new"]["document_root"].'/.htpasswd_stats',$htp_file); + chmod($data["new"]["document_root"].'/.htpasswd_stats',0755); + unset($htp_file); + } + } + + + if($apache_chrooted) { + $app->services->restartServiceDelayed('httpd','restart'); + } else { + // request a httpd reload when all records have been processed + $app->services->restartServiceDelayed('httpd','reload'); + } + + //* Unset action to clean it for next processed vhost. + $this->action = ''; + + } + + function delete($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['/var/www'].'/etc/passwd')) { + $apache_chrooted = true; + } else { + $apache_chrooted = false; + } + + if($data["old"]["type"] != "vhost" && $data["old"]["parent_domain_id"] > 0) { + //* This is a alias domain or subdomain, so we have to update the website instead + $parent_domain_id = intval($data["old"]["parent_domain_id"]); + $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$parent_domain_id." AND active = 'y'"); + $data["new"] = $tmp; + $data["old"] = $tmp; + $this->action = 'update'; + // just run the update function + $this->update($event_name,$data); + + } else { + //* This is a website + // Deleting the vhost file, symlink and the data directory + $vhost_symlink = escapeshellcmd($web_config["vhost_conf_enabled_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_symlink); + $app->log("Removing symlink: $vhost_symlink => $vhost_file",LOGLEVEL_DEBUG); + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["old"]["domain"].'.vhost'); + unlink($vhost_file); + $app->log("Removing vhost file: $vhost_file",LOGLEVEL_DEBUG); + + $docroot = escapeshellcmd($data["old"]["document_root"]); + if($docroot != '' && !stristr($docroot,'..')) exec("rm -rf $docroot"); + + + //remove the php fastgi starter script if available + if ($data["old"]["php"] == "fast-cgi") + { + $fastcgi_starter_path = str_replace("[system_user]",$data["old"]["system_user"],$web_config["fastcgi_starter_path"]); + if (is_dir($fastcgi_starter_path)) + { + exec("rm -rf $fastcgi_starter_path"); + } + } + + //remove the php cgi starter script if available + if ($data["old"]["php"] == "cgi") + { + // TODO: fetch the date from the server-settings + $web_config["cgi_starter_path"] = $web_config["website_basedir"]."/php-cgi-scripts/[system_user]/"; + + $cgi_starter_path = str_replace("[system_user]",$data["old"]["system_user"],$web_config["cgi_starter_path"]); + if (is_dir($cgi_starter_path)) + { + exec("rm -rf $cgi_starter_path"); + } + } + + $app->log("Removing website: $docroot",LOGLEVEL_DEBUG); + + // Delete the symlinks for the sites + $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + $tmp_symlinks_array = explode(':',$web_config["website_symlinks"]); + if(is_array($tmp_symlinks_array)) { + foreach($tmp_symlinks_array as $tmp_symlink) { + $tmp_symlink = str_replace("[client_id]",$client_id,$tmp_symlink); + $tmp_symlink = str_replace("[website_domain]",$data["old"]["domain"],$tmp_symlink); + // Remove trailing slash + if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); + // create the symlinks, if not exist + if(is_link($tmp_symlink)) { + unlink($tmp_symlink); + $app->log("Removing symlink: ".$tmp_symlink,LOGLEVEL_DEBUG); + } + } + } + // end removing symlinks + + // Delete the log file directory + $vhost_logfile_dir = escapeshellcmd('/var/log/ispconfig/httpd/'.$data["old"]["domain"]); + if($data["old"]["domain"] != '' && !stristr($vhost_logfile_dir,'..')) exec("rm -rf $vhost_logfile_dir"); + $app->log("Removing website logfile directory: $vhost_logfile_dir",LOGLEVEL_DEBUG); + + //delete the web user + $command = 'userdel'; + $command .= ' '.$data["old"]["system_user"]; + exec($command); + if($apache_chrooted) $this->_exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + } + } + + //* This function is called when a IP on the server is inserted, updated or deleted + function server_ip($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("apache_ispconfig.conf.master"); + $records = $app->db->queryAllRecords("SELECT * FROM server_ip WHERE server_id = ".$conf["server_id"]." AND virtualhost = 'y'"); + + if(count($records) > 0) { + $tpl->setLoop('ip_adresses',$records); + } + + $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/ispconfig.conf'); + file_put_contents($vhost_file,$tpl->grab()); + $app->log("Writing the conf file: ispconfig.conf",LOGLEVEL_DEBUG); + unset($tpl); + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/apps_vhost_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/apps_vhost_plugin.inc.php new file mode 100644 index 000000000..e864dbd99 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/apps_vhost_plugin.inc.php @@ -0,0 +1,114 @@ +plugins->registerEvent('server_insert','apps_vhost_plugin','insert'); + $app->plugins->registerEvent('server_update','apps_vhost_plugin','update'); + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + // Dont just copy over the virtualhost template but add some custom settings + $content = file_get_contents($conf["rootpath"]."/conf/apache_apps.vhost.master"); + + $vhost_conf_dir = $web_config['vhost_conf_dir']; + $vhost_conf_enabled_dir = $web_config['vhost_conf_enabled_dir']; + $apps_vhost_servername = ($web_config['apps_vhost_servername'] == '')?'':'ServerName '.$web_config['apps_vhost_servername']; + + $web_config['apps_vhost_port'] = (empty($web_config['apps_vhost_port']))?8081:$web_config['apps_vhost_port']; + $web_config['apps_vhost_ip'] = (empty($web_config['apps_vhost_ip']))?'_default_':$web_config['apps_vhost_ip']; + + $content = str_replace('{apps_vhost_ip}', $web_config['apps_vhost_ip'], $content); + $content = str_replace('{apps_vhost_port}', $web_config['apps_vhost_port'], $content); + $content = str_replace('{apps_vhost_dir}', $web_config['website_basedir'].'/apps', $content); + $content = str_replace('{apps_vhost_servername}', $apps_vhost_servername, $content); + $content = str_replace('{apps_vhost_basedir}', $web_config['website_basedir'], $content); + + + // comment out the listen directive if port is 80 or 443 + if($web_config['apps_vhost_ip'] == 80 or $web_config['apps_vhost_ip'] == 443) { + $content = str_replace('{vhost_port_listen}', '#', $content); + } else { + $content = str_replace('{vhost_port_listen}', '', $content); + } + + file_put_contents("$vhost_conf_dir/apps.vhost", $content); + + $app->services->restartServiceDelayed('httpd','restart'); + + + } + + +} // end class + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/cron_jailkit_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/cron_jailkit_plugin.inc.php new file mode 100644 index 000000000..43adee1c5 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/cron_jailkit_plugin.inc.php @@ -0,0 +1,328 @@ +plugins->registerEvent('cron_insert', $this->plugin_name, 'insert'); + $app->plugins->registerEvent('cron_update', $this->plugin_name, 'update'); + $app->plugins->registerEvent('cron_delete', $this->plugin_name, 'delete'); + + } + + //* This function is called, when a cron job is inserted in the database + function insert($event_name,$data) { + global $app, $conf; + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + $this->parent_domain = $parent_domain; + + $app->uses('system'); + + if($app->system->is_user($parent_domain['system_user'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['type'] == "chrooted") + { + // load the server configuration options + /* + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + $this->parent_domain = $parent_domain; + + $this->_setup_jailkit_chroot(); + + //$command .= 'usermod -U '.escapeshellcmd($parent_domain['system_user']); + //exec($command); + + $this->_add_jailkit_user(); + */ + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + + $this->_add_jailkit_user(); + + $command .= 'usermod -U '.escapeshellcmd($parent_domain["system_user"]); + exec($command); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a cron job is updated in the database + function update($event_name,$data) { + global $app, $conf; + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + $app->uses('system'); + + $this->parent_domain = $parent_domain; + + if($app->system->is_user($parent_domain['system_user'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['type'] == "chrooted") + { + $app->log("Jailkit Plugin (Cron) -> setting up jail", LOGLEVEL_DEBUG); + // load the server configuration options + /* + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + $this->parent_domain = $parent_domain; + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + */ + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a cron job is deleted in the database + function delete($event_name,$data) { + global $app, $conf; + + //* nothing to do here! + + } + + function _setup_jailkit_chroot() + { + //check if the chroot environment is created yet if not create it with a list of program sections from the config + if (!is_dir($this->parent_domain['document_root'].'/etc/jailkit')) + { + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_chroot.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_sections'].'\''; + exec($command); + + $this->app->log("Added jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + //$this->_add_jailkit_programs(); // done later on + + $this->app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("bash.bashrc.master"); + + $tpl->setVar('jailkit_chroot',true); + $tpl->setVar('domain',$this->parent_domain['domain']); + $tpl->setVar('home_dir',$this->_get_home_dir("")); + + $bashrc = escapeshellcmd($this->parent_domain['document_root']).'/etc/bash.bashrc'; + if(@is_file($bashrc)) exec('rm '.$bashrc); + + file_put_contents($bashrc,$tpl->grab()); + unset($tpl); + + $this->app->log("Added bashrc scrpt : ".$bashrc,LOGLEVEL_DEBUG); + + $tpl = new tpl(); + $tpl->newTemplate("motd.master"); + + $tpl->setVar('domain',$this->parent_domain['domain']); + + $motd = escapeshellcmd($this->parent_domain['document_root']).'/var/run/motd'; + if(@is_file($motd)) exec('rm '.$motd); + + file_put_contents($motd,$tpl->grab()); + + } + $this->_add_jailkit_programs(); + } + + function _add_jailkit_programs() + { + //copy over further programs and its libraries + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_programs'].'\''; + exec($command); + + $this->app->log("Added programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_cron_programs'].'\''; + exec($command); + + $this->app->log("Added cron programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + } + + function _add_jailkit_user() + { + //add the user to the chroot + $jailkit_chroot_userhome = $this->_get_home_dir($this->parent_domain['system_user']); + + if(!is_dir($this->parent_domain['document_root'].'/etc')) mkdir($this->parent_domain['document_root'].'/etc'); + if(!is_file($this->parent_domain['document_root'].'/etc/passwd')) exec('touch '.$this->parent_domain['document_root'].'/etc/passwd'); + + // IMPORTANT! + // ALWAYS create the user. Even if the user was created before + // if we check if the user exists, then a update (no shell -> jailkit) will not work + // and the user has FULL ACCESS to the root of the server! + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_user.sh'; + $command .= ' '.escapeshellcmd($this->parent_domain['system_user']); + $command .= ' '.escapeshellcmd($this->parent_domain['document_root']); + $command .= ' '.$jailkit_chroot_userhome; + $command .= ' '.escapeshellcmd("/bin/bash"); + exec($command); + + $this->app->log("Added jailkit user to chroot with command: ".$command,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->parent_domain['document_root'].$jailkit_chroot_userhome)); + } + + function _get_home_dir($username) + { + return str_replace("[username]",escapeshellcmd($username),$this->jailkit_config["jailkit_chroot_home"]); + } + + //* Update the website root directory permissions depending on the security level + function _update_website_security_level() { + global $app,$conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + $this->_exec("chmod 755 ".escapeshellcmd($this->parent_domain['document_root'])); + $this->_exec("chown root:root ".escapeshellcmd($this->parent_domain['document_root'])); + } + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/cron_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/cron_plugin.inc.php new file mode 100644 index 000000000..4ee83137a --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/cron_plugin.inc.php @@ -0,0 +1,239 @@ +plugins->registerEvent('cron_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('cron_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('cron_delete',$this->plugin_name,'delete'); + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->action = 'insert'; + // just run the update function + $this->update($event_name,$data); + + } + + + function update($event_name,$data) { + global $app, $conf; + + if($this->action != 'insert') $this->action = 'update'; + + // load the server configuration options + $app->uses("getconf"); + + if($data["new"]["parent_domain_id"] == '') { + $app->log("Parent domain not set",LOGLEVEL_WARN); + return 0; + } + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') { + $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN); + return 0; + } + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["new"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + // Create group and user, if not exist + $app->uses("system"); + + $groupname = escapeshellcmd($parent_domain["system_group"]); + if($parent_domain["system_group"] != '' && !$app->system->is_group($parent_domain["system_group"])) { + exec("groupadd $groupname"); + $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG); + } + + $username = escapeshellcmd($parent_domain["system_user"]); + if($parent_domain["system_user"] != '' && !$app->system->is_user($parent_domain["system_user"])) { + exec("useradd -d ".escapeshellcmd($parent_domain["document_root"])." -g $groupname $username -s /bin/false"); + $app->log("Adding the user: $username",LOGLEVEL_DEBUG); + } + + // Set the quota for the user + if($username != '' && $app->system->is_user($username)) { + if($parent_domain["hd_quota"] > 0){ + $blocks_soft = $parent_domain["hd_quota"] * 1024; + $blocks_hard = $blocks_soft + 1024; + } else { + $blocks_soft = $blocks_hard = 0; + } + exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null"); + exec("setquota -T -u $username 604800 604800 -a &> /dev/null"); + } + + // make temp direcory writable for the apache user and the website user + exec("chmod 777 ".escapeshellcmd($parent_domain["document_root"]."/tmp")); + + /** TODO READ CRON MASTER **/ + + $this->parent_domain = $parent_domain; + $this->_write_crontab(); + + $this->action = ''; + + } + + function delete($event_name,$data) { + global $app, $conf; + + //* get data from web + $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["old"]["parent_domain_id"])); + if(!$parent_domain["domain_id"]) { + $app->log("Parent domain not found",LOGLEVEL_WARN); + return 0; + } + + // Get the client ID + $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"])); + $client_id = intval($client["client_id"]); + unset($client); + + $this->parent_domain = $parent_domain; + $this->_write_crontab(); + } + + function _write_crontab() { + global $app, $conf; + + //* load the server configuration options + $app->uses("getconf"); + + $cron_config = $app->getconf->get_server_config($conf["server_id"], 'cron'); + + //* try to find customer's mail address + + /** TODO: add possibility for client to choose mail notification! **/ + $cron_content = "MAILTO=''\n\n"; + $chr_cron_content = "MAILTO=''\n\n"; + $chr_cron_content .= "SHELL='/usr/sbin/jk_chrootsh'\n\n"; + + $cmd_count = 0; + $chr_cmd_count = 0; + + //* read all active cron jobs from database and write them to file + $cron_jobs = $app->db->queryAllRecords("SELECT `run_min`, `run_hour`, `run_mday`, `run_month`, `run_wday`, `command`, `type` FROM `cron` WHERE `parent_domain_id` = ".intval($this->parent_domain["domain_id"]) . " AND `active` = 'y'"); + if($cron_jobs && count($cron_jobs) > 0) { + foreach($cron_jobs as $job) { + $command = "{$job['run_min']}\t{$job['run_hour']}\t{$job['run_mday']}\t{$job['run_month']}\t{$job['run_wday']}"; + $command .= "\t{$this->parent_domain['system_user']}"; //* running as user + if($job['type'] == 'url') { + $command .= "\t{$cron_config['wget']} -q -O /dev/null " . escapeshellarg($job['command']) . " >/dev/null 2>&1"; + } else { + if($job['type'] == 'chrooted') { + if(substr($job['command'], 0, strlen($this->parent_domain['document_root'])) == $this->parent_domain['document_root']) { + //* delete the unneeded path part + $job['command'] = substr($job['command'], strlen($this->parent_domain['document_root'])); + } + } + + $command .= "\t"; + if(substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'].'/'; + $command .= $job['command']; + } + + if($job['type'] == 'chrooted') { + $chr_cron_content .= $command . "\n"; + $chr_cmd_count++; + } else { + $cron_content .= $command . "\n"; + $cmd_count++; + } + } + } + + $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_'.$this->parent_domain["system_user"]); + if($cmd_count > 0) { + file_put_contents($cron_file, $cron_content); + $app->log("Wrote Cron file $cron_file with content:\n$cron_content",LOGLEVEL_DEBUG); + } else { + @unlink($cron_file); + $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG); + } + + $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_chrooted_'.$this->parent_domain["system_user"]); + if($chr_cmd_count > 0) { + file_put_contents($cron_file, $chr_cron_content); + $app->log("Wrote Cron file $cron_file with content:\n$chr_cron_content",LOGLEVEL_DEBUG); + } else { + @unlink($cron_file); + $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG); + } + + return 0; + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/firewall_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/firewall_plugin.inc.php new file mode 100644 index 000000000..c3bc470cd --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/firewall_plugin.inc.php @@ -0,0 +1,145 @@ +plugins->registerEvent('firewall_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('firewall_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('firewall_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + $tcp_ports = ''; + $udp_ports = ''; + + $ports = explode(',',$data["new"]["tcp_port"]); + if(is_array($ports)) { + foreach($ports as $p) { + if(strstr($p,':')) { + $p_parts = explode(':',$p); + $p_clean = intval($p_parts[0]).':'.intval($p_parts[1]); + } else { + $p_clean = intval($p); + } + $tcp_ports .= $p_clean . ' '; + } + } + $tcp_ports = trim($tcp_ports); + + $ports = explode(',',$data["new"]["udp_port"]); + if(is_array($ports)) { + foreach($ports as $p) { + if(strstr($p,':')) { + $p_parts = explode(':',$p); + $p_clean = intval($p_parts[0]).':'.intval($p_parts[1]); + } else { + $p_clean = intval($p); + } + $udp_ports .= $p_clean . ' '; + } + } + $udp_ports = trim($udp_ports); + + $app->load('tpl'); + $tpl = new tpl(); + $tpl->newTemplate("bastille-firewall.cfg.master"); + + $tpl->setVar("TCP_PUBLIC_SERVICES",$tcp_ports); + $tpl->setVar("UDP_PUBLIC_SERVICES",$udp_ports); + + file_put_contents('/etc/Bastille/bastille-firewall.cfg',$tpl->grab()); + $app->log('Writing firewall configuration /etc/Bastille/bastille-firewall.cfg',LOGLEVEL_DEBUG); + unset($tpl); + + if($data["new"]["active"] == 'y') { + exec('/etc/init.d/bastille-firewall restart'); + if(@is_file('/etc/debian_version')) exec('update-rc.d bastille-firewall defaults'); + $app->log('Restarting the firewall',LOGLEVEL_DEBUG); + } else { + exec('/etc/init.d/bastille-firewall stop'); + if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove'); + $app->log('Stopping the firewall',LOGLEVEL_DEBUG); + } + + + } + + function delete($event_name,$data) { + global $app, $conf; + + exec('/etc/init.d/bastille-firewall stop'); + if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove'); + $app->log('Stopping the firewall',LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/ftpuser_base_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/ftpuser_base_plugin.inc.php new file mode 100644 index 000000000..04bb51b98 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/ftpuser_base_plugin.inc.php @@ -0,0 +1,112 @@ +plugins->registerEvent('ftp_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('ftp_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('ftp_user_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + if(!is_dir($data['new']['dir'])) { + $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG); + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id'])); + + exec('mkdir -p '.escapeshellcmd($data['new']['dir'])); + exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']); + + $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG); + } + + } + + function update($event_name,$data) { + global $app, $conf; + + if(!is_dir($data['new']['dir'])) { + $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG); + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id'])); + + exec('mkdir -p '.escapeshellcmd($data['new']['dir'])); + exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']); + + $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG); + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $app->log("Ftpuser:".$data['new']['username']." deleted.",LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/getmail_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/getmail_plugin.inc.php new file mode 100644 index 000000000..032ed437d --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/getmail_plugin.inc.php @@ -0,0 +1,163 @@ +plugins->registerEvent('mail_get_insert','getmail_plugin','insert'); + $app->plugins->registerEvent('mail_get_update','getmail_plugin','update'); + $app->plugins->registerEvent('mail_get_delete','getmail_plugin','delete'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + // load the server specific configuration options for getmail + $app->uses("getconf"); + $getmail_config = $app->getconf->get_server_config($conf["server_id"], 'getmail'); + $this->getmail_config_dir = $getmail_config["getmail_config_dir"]; + + // Check if the config directory exists. + if(!is_dir($this->getmail_config_dir)) { + $app->log("Getmail config directory '".$this->getmail_config_dir."' does not exist.",LOGLEVEL_ERROR); + } else { + + // Delete the config file first, if it exists + $this->delete($event_name,$data); + + // Get the new config file path + $config_file_path = escapeshellcmd($this->getmail_config_dir.'/'.$data["new"]["source_server"].'_'.$data["new"]["source_username"].'.conf'); + if(stristr($config_file_path, "..") or stristr($config_file_path, "|") or stristr($config_file_path,";") or stristr($config_file_path,'$')) { + $app->log("Possibly faked path for getmail config file: '$config_file_path'. File is not written.",LOGLEVEL_ERROR); + return false; + } + + + if($data["new"]["active"] == 'y') { + // Open master template + $tpl = file_get_contents($conf["rootpath"].'/conf/getmail.conf.master'); + + // Shall emails be deleted after retrieval + if($data["new"]["source_delete"] == 'y') { + $tpl = str_replace('{DELETE}','1',$tpl); + } else { + $tpl = str_replace('{DELETE}','0',$tpl); + } + + // Set the data retriever + if($data["new"]["type"] == 'pop3') { + $tpl = str_replace('{TYPE}','SimplePOP3Retriever',$tpl); + } elseif ($data["new"]["type"] == 'imap') { + $tpl = str_replace('{TYPE}','SimpleIMAPRetriever',$tpl); + } elseif ($data["new"]["type"] == 'pop3ssl') { + $tpl = str_replace('{TYPE}','SimplePOP3SSLRetriever',$tpl); + } elseif ($data["new"]["type"] == 'imapssl') { + $tpl = str_replace('{TYPE}','SimpleIMAPSSLRetriever',$tpl); + } + + // Set server, username, password and destination. + $tpl = str_replace('{SERVER}',$data["new"]["source_server"],$tpl); + $tpl = str_replace('{USERNAME}',$data["new"]["source_username"],$tpl); + $tpl = str_replace('{PASSWORD}',$data["new"]["source_password"],$tpl); + $tpl = str_replace('{DESTINATION}',$data["new"]["destination"],$tpl); + + // Write the config file. + file_put_contents($config_file_path,$tpl); + $app->log("Writing Getmail config file: $config_file_path",LOGLEVEL_DEBUG); + exec("chmod 400 $config_file_path"); + exec("chown getmail $config_file_path"); + unset($tpl); + unset($config_file_path); + + } else { + // If record is set to inactive, we will delete the file + if(is_file($config_file_path)) unlink($config_file_path); + } + } + } + + function delete($event_name,$data) { + global $app, $conf; + + // load the server specific configuration options for getmail + $app->uses("getconf"); + $getmail_config = $app->getconf->get_server_config($conf["server_id"], 'getmail'); + $this->getmail_config_dir = $getmail_config["getmail_config_dir"]; + + $config_file_path = escapeshellcmd($this->getmail_config_dir.'/'.$data["old"]["source_server"].'_'.$data["old"]["source_username"].'.conf'); + if(stristr($config_file_path,"..") || stristr($config_file_path,"|") || stristr($config_file_path,";") || stristr($config_file_path,'$')) { + $app->log("Possibly faked path for getmail config file: '$config_file_path'. File is not written.",LOGLEVEL_ERROR); + return false; + } + if(is_file($config_file_path)) unlink($config_file_path); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/mail_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/mail_plugin.inc.php new file mode 100644 index 000000000..bbabe660e --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/mail_plugin.inc.php @@ -0,0 +1,311 @@ +plugins->registerEvent('mail_user_insert',$this->plugin_name,'user_insert'); + $app->plugins->registerEvent('mail_user_update',$this->plugin_name,'user_update'); + $app->plugins->registerEvent('mail_user_delete',$this->plugin_name,'user_delete'); + + //* Mail Domains + //$app->plugins->registerEvent('mail_domain_insert',$this->plugin_name,'domain_insert'); + //$app->plugins->registerEvent('mail_domain_update',$this->plugin_name,'domain_update'); + $app->plugins->registerEvent('mail_domain_delete',$this->plugin_name,'domain_delete'); + + //* Mail transports + $app->plugins->registerEvent('mail_transport_insert',$this->plugin_name,'transport_update'); + $app->plugins->registerEvent('mail_transport_update',$this->plugin_name,'transport_update'); + $app->plugins->registerEvent('mail_transport_delete',$this->plugin_name,'transport_update'); + + } + + + function user_insert($event_name,$data) { + global $app, $conf; + + //* get the config + $app->uses("getconf,system"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + // convert to lower case - it could cause problems if some directory above has upper case name +// $data['new']['maildir'] = strtolower($data['new']['maildir']); + + $maildomain_path = $data['new']['maildir']; + $tmp_basepath = $data['new']['maildir']; + $tmp_basepath_parts = explode('/',$tmp_basepath); + unset($tmp_basepath_parts[count($tmp_basepath_parts)-1]); + $base_path = implode('/',$tmp_basepath_parts); + + + + //* Create the mail domain directory, if it does not exist + if(!empty($base_path) && !is_dir($base_path)) { + exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + } + + // Dovecot uses a different mail layout with a separate 'Maildir' subdirectory. + if($mail_config['pop3_imap_daemon'] == 'dovecot') { + exec("su -c 'mkdir -p ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$maildomain_path,LOGLEVEL_DEBUG); + $maildomain_path .= '/Maildir'; + } + + //* When the mail user dir exists but it is not a valid maildir, remove it + if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { + exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail"); + $app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN); + } + + //* Create the maildir, if it doesn not exist, set permissions, set quota. + if(!empty($maildomain_path) && !is_dir($maildomain_path)) { + + //exec("su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name']); + + exec('chown -R '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log("Set ownership on ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_DEBUG); + + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. + if($mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); // Avoid maildirmake quota bug, see debian bug #214911 + $app->log('Created Maildir: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + if(!is_dir($data['new']['maildir'].'/.Sent')) { + //exec("su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Sent: '."su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Sent'); + } + if(!is_dir($data['new']['maildir'].'/.Drafts')) { + //exec("su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Drafts: '."su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Drafts'); + } + if(!is_dir($data['new']['maildir'].'/.Trash')) { + //exec("su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Trash: '."su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Trash'); + } + if(!is_dir($data['new']['maildir'].'/.Junk')) { + //exec("su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Junk: '."su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Junk'); + } + + //* Set the maildir quota + if(is_dir($data['new']['maildir'].'/new') && $mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']); + $app->log('Set Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + function user_update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf,system"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + // convert to lower case - it could cause problems if some directory above has upper case name + // $data['new']['maildir'] = strtolower($data['new']['maildir']); + + // Create the maildir, if it does not exist + /* + if(!is_dir($data['new']['maildir'])) { + exec('mkdir -p '.escapeshellcmd($data['new']['maildir'])); + exec('chown '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log('Created Maildir: '.$data['new']['maildir'],LOGLEVEL_DEBUG); + } + */ + + $maildomain_path = $data['new']['maildir']; + $tmp_basepath = $data['new']['maildir']; + $tmp_basepath_parts = explode('/',$tmp_basepath); + unset($tmp_basepath_parts[count($tmp_basepath_parts)-1]); + $base_path = implode('/',$tmp_basepath_parts); + + //* Create the mail domain directory, if it does not exist + if(!empty($base_path) && !is_dir($base_path)) { + exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + } + + // Dovecot uses a different mail layout with a separate 'Maildir' subdirectory. + if($mail_config['pop3_imap_daemon'] == 'dovecot') { + exec("su -c 'mkdir -p ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG); + $maildomain_path .= '/Maildir'; + } + + //* When the mail user dir exists but it is not a valid maildir, remove it + if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { + exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail"); + $app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN); + } + + //* Create the maildir, if it doesn not exist, set permissions, set quota. + if(!empty($maildomain_path) && !is_dir($maildomain_path.'/new')) { + //exec("su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log("Created Maildir "."su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name']); + + exec('chown -R '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir'])); + $app->log("Set ownership on ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_DEBUG); + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. + if($mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); // Avoid maildirmake quota bug, see debian bug #214911 + $app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + if(!is_dir($data['new']['maildir'].'/.Sent')) { + //exec("su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Sent: '."su -c 'maildirmake -f Sent ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Sent'); + } + if(!is_dir($data['new']['maildir'].'/.Drafts')) { + //exec("su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Drafts: '."su -c 'maildirmake -f Drafts ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Drafts'); + } + if(!is_dir($data['new']['maildir'].'/.Trash')) { + //exec("su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Trash: '."su -c 'maildirmake -f Trash ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Trash'); + } + if(!is_dir($data['new']['maildir'].'/.Junk')) { + //exec("su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); + //$app->log('Created submaildir Junk: '."su -c 'maildirmake -f Junk ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + $app->system->maildirmake($maildomain_path,$mail_config['mailuser_name'],'Junk'); + } + + // Move mailbox, if domain has changed and delete old mailbox + if($data['new']['maildir'] != $data['old']['maildir'] && is_dir($data['old']['maildir'])) { + if(is_dir($data['new']['maildir'])) { + exec("rm -fr ".escapeshellcmd($data['new']['maildir'])); + //rmdir($data['new']['maildir']); + } + exec('mv -f '.escapeshellcmd($data['old']['maildir']).' '.escapeshellcmd($data['new']['maildir'])); + // exec('mv -f '.escapeshellcmd($data['old']['maildir']).'/* '.escapeshellcmd($data['new']['maildir'])); + // if(is_file($data['old']['maildir'].'.ispconfig_mailsize'))exec('mv -f '.escapeshellcmd($data['old']['maildir']).'.ispconfig_mailsize '.escapeshellcmd($data['new']['maildir'])); + // rmdir($data['old']['maildir']); + $app->log('Moved Maildir from: '.$data['old']['maildir'].' to '.$data['new']['maildir'],LOGLEVEL_DEBUG); + } + //This is to fix the maildrop quota not being rebuilt after the quota is changed. + // Courier Layout + if(is_dir($data['new']['maildir'].'/new') && $mail_config['pop3_imap_daemon'] != 'dovecot') { + exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']); + $app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG); + } + } + + function user_delete($event_name,$data) { + global $app, $conf; + + $old_maildir_path = escapeshellcmd($data['old']['maildir']); + if(!stristr($old_maildir_path,'..') && !stristr($old_maildir_path,'*') && strlen($old_maildir_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildir_path)); + $app->log('Deleted the Maildir: '.$data['old']['maildir'],LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the maildir: '.$data['old']['maildir'],LOGLEVEL_ERROR); + } + } + + function domain_delete($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + //* Delete maildomain path + $old_maildomain_path = escapeshellcmd($mail_config['homedir_path'].'/'.$data['old']['domain']); + if(!stristr($old_maildomain_path,'//') && !stristr($old_maildomain_path,'..') && !stristr($old_maildomain_path,'*') && !stristr($old_maildomain_path,'&') && strlen($old_maildomain_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildomain_path)); + $app->log('Deleted the mail domain directory: '.$old_maildomain_path,LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the mail domain directory: '.$old_maildomain_path,LOGLEVEL_ERROR); + } + + //* Delete mailfilter path + $old_maildomain_path = escapeshellcmd($mail_config['homedir_path'].'/mailfilters/'.$data['old']['domain']); + if(!stristr($old_maildomain_path,'//') && !stristr($old_maildomain_path,'..') && !stristr($old_maildomain_path,'*') && !stristr($old_maildomain_path,'&') && strlen($old_maildomain_path) >= 10) { + exec('rm -rf '.escapeshellcmd($old_maildomain_path)); + $app->log('Deleted the mail domain mailfilter directory: '.$old_maildomain_path,LOGLEVEL_DEBUG); + } else { + $app->log('Possible security violation when deleting the mail domain mailfilter directory: '.$old_maildomain_path,LOGLEVEL_ERROR); + } + } + + function transport_update($event_name,$data) { + global $app, $conf; + + exec('/etc/init.d/postfix reload &> /dev/null'); + $app->log('Postfix config reloaded ',LOGLEVEL_DEBUG); + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/maildeliver_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/maildeliver_plugin.inc.php new file mode 100644 index 000000000..5e325dbf0 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/maildeliver_plugin.inc.php @@ -0,0 +1,131 @@ +plugins->registerEvent('mail_user_update','maildeliver_plugin','update'); + $app->plugins->registerEvent('mail_user_delete','maildeliver_plugin','delete'); + + } + + + function update($event_name,$data) { + global $app, $conf; + + // load the server configuration options + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + if(substr($mail_config["homedir_path"],-1) == '/') { + $mail_config["homedir_path"] = substr($mail_config["homedir_path"],0,-1); + } + + if(isset($data["new"]["email"])) { + $email_parts = explode("@",$data["new"]["email"]); + } else { + $email_parts = explode("@",$data["old"]["email"]); + } + + // Write the custom mailfilter script, if mailfilter recipe has changed + if($data["old"]["custom_mailfilter"] != $data["new"]["custom_mailfilter"] + or $data["old"]["move_junk"] != $data["new"]["move_junk"] + or $data["old"]["autoresponder_text"] != $data["new"]["autoresponder_text"] + or $data["old"]["autoresponder"] != $data["new"]["autoresponder"] + or (isset($data["new"]["email"]) and $data["old"]["email"] != $data["new"]["email"]) + or $data["old"]["autoresponder_start_date"] != $data["new"]["autoresponder_start_date"] + or $data["old"]["autoresponder_end_date"] != $data["new"]["autoresponder_end_date"]) { + + $app->log("Mailfilter config has been changed",LOGLEVEL_DEBUG); + + $sieve_file = $data["new"]["maildir"].'/.sieve'; + if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file",LOGLEVEL_WARN); + + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("sieve_filter.master"); + + // Custom filters + $tpl->setVar('custom_mailfilter',$data["new"]["custom_mailfilter"]); + + // Move junk + $tpl->setVar('move_junk',$data["new"]["move_junk"]); + + // Autoresponder + $tpl->setVar('autoresponder',$data["new"]["autoresponder"]); + $tpl->setVar('autoresponder_text',$data["new"]["autoresponder_text"]); + + file_put_contents($sieve_file,$tpl->grab()); + + unset($tpl); + + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $sieve_file = $data["old"]["maildir"].'/.sieve'; + if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file",LOGLEVEL_WARN); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/mysql_clientdb_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/mysql_clientdb_plugin.inc.php new file mode 100644 index 000000000..6b2651d60 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/mysql_clientdb_plugin.inc.php @@ -0,0 +1,305 @@ +plugins->registerEvent('database_insert',$this->plugin_name,'db_insert'); + $app->plugins->registerEvent('database_update',$this->plugin_name,'db_update'); + $app->plugins->registerEvent('database_delete',$this->plugin_name,'db_delete'); + + + } + + function process_host_list($action, $database_name, $database_user, $database_password, $host_list, $link, $database_rename_user = "") { + global $app; + + $action = strtoupper($action); + + // set to all hosts if none given + if(trim($host_list) == "") $host_list = "%"; + + // process arrays and comma separated strings + if(!is_array($host_list)) $host_list = split(",", $host_list); + + $success = true; + + // loop through hostlist + foreach($host_list as $db_host) { + $db_host = trim($db_host); + + // check if entry is valid ip address + $valid = true; + if($db_host == "%") { + $valid = true; + } elseif(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $db_host)) { + $groups = explode(".", $db_host); + foreach($groups as $group){ + if($group<0 OR $group>255) + $valid=false; + } + } else { + $valid = false; + } + + if($valid == false) continue; + + if($action == "GRANT") { + if(!mysql_query("GRANT ALL ON ".mysql_real_escape_string($database_name,$link).".* TO '".mysql_real_escape_string($database_user,$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($database_password,$link)."';",$link)) $success = false; + } elseif($action == "REVOKE") { + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($database_name,$link).".* FROM '".mysql_real_escape_string($database_user,$link)."';",$link); + } elseif($action == "DROP") { + if(!mysql_query("DROP USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host';",$link)) $success = false; + } elseif($action == "RENAME") { + if(!mysql_query("RENAME USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host' TO '".mysql_real_escape_string($database_rename_user,$link)."'@'$db_host'",$link)) $success = false; + } elseif($action == "PASSWORD") { + if(!mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($database_user,$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($database_password,$link)."');",$link)) $success = false; + } + } + + return $success; + } + + function db_insert($event_name,$data) { + global $app, $conf; + + if($data["new"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + // Charset for the new table + if($data["new"]["database_charset"] != '') { + $query_charset_table = ' DEFAULT CHARACTER SET '.$data["new"]["database_charset"]; + } else { + $query_charset_table = ''; + } + + //* Create the new database + if (mysql_query('CREATE DATABASE '.mysql_real_escape_string($data["new"]["database_name"]).$query_charset_table,$link)) { + $app->log('Created MySQL database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG); + } else { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + } + + // Create the database user if database is active + if($data["new"]["active"] == 'y') { + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + + + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + } + + function db_update($event_name,$data) { + global $app, $conf; + + if($data["new"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + // Create the database user if database was disabled before + if($data["new"]["active"] == 'y' && $data["old"]["active"] == 'n') { + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + + // mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link); + //echo "GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"]).".* TO '".mysql_real_escape_string($data["new"]["database_user"])."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"])."';"; + } + + // Remove database user, if inactive + if($data["new"]["active"] == 'n' && $data["old"]["active"] == 'y') { + + if($data["old"]["remote_access"] == 'y') { + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + } + + $db_host = 'localhost'; + mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link); + + + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link); + } + + //* Rename User + if($data["new"]["database_user"] != $data["old"]["database_user"]) { + $db_host = 'localhost'; + mysql_query("RENAME USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host' TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host'",$link); + if($data["old"]["remote_access"] == 'y') { + $this->process_host_list("RENAME", "", $data["new"]["database_user"], "", $data["new"]["remote_ips"], $link, $data["new"]["database_user"]); + } + $app->log('Renaming mysql user: '.$data["old"]["database_user"].' to '.$data["new"]["database_user"],LOGLEVEL_DEBUG); + } + + //* Remote access option has changed. + if($data["new"]["remote_access"] != $data["old"]["remote_access"]) { + + //* revoke old priveliges + //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link); + + //* set new priveliges + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } else { + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + } + $app->log('Changing mysql remote access priveliges for database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG); + } elseif($data["new"]["remote_access"] == 'y' && $data["new"]["remote_ips"] != $data["old"]["remote_ips"]) { + //* Change remote access list + $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link); + $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + + //* Change password + if($data["new"]["database_password"] != $data["old"]["database_password"]) { + $db_host = 'localhost'; + mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($data["new"]["database_password"],$link)."');",$link); + + if($data["new"]["remote_access"] == 'y') { + $this->process_host_list("PASSWORD", "", $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link); + } + $app->log('Changing mysql user password for: '.$data["new"]["database_user"],LOGLEVEL_DEBUG); + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + + } + + function db_delete($event_name,$data) { + global $app, $conf; + + if($data["old"]["type"] == 'mysql') { + if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) { + $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR); + return; + } + + //* Connect to the database + $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password); + if (!$link) { + $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR); + return; + } + + //* Get the db host setting for the access priveliges + if($data["old"]["remote_access"] == 'y') { + if($this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link)) { + $app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql user: '.$data["old"]["database_user"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + } + $db_host = 'localhost'; + if(mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link)) { + $app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql user: '.$data["old"]["database_user"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + + if(mysql_query('DROP DATABASE '.mysql_real_escape_string($data["old"]["database_name"],$link),$link)) { + $app->log('Dropping mysql database: '.$data["old"]["database_name"],LOGLEVEL_DEBUG); + } else { + $app->log('Error while dropping mysql database: '.$data["old"]["database_name"].' '.mysql_error($link),LOGLEVEL_ERROR); + } + + mysql_query("FLUSH PRIVILEGES;",$link); + mysql_close($link); + } + + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/network_settings_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/network_settings_plugin.inc.php new file mode 100644 index 000000000..cfe33c7a2 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/network_settings_plugin.inc.php @@ -0,0 +1,289 @@ +plugins->registerEvent('server_insert','network_settings_plugin','insert'); + $app->plugins->registerEvent('server_update','network_settings_plugin','update'); + + $app->plugins->registerEvent('server_ip_insert','network_settings_plugin','insert'); + $app->plugins->registerEvent('server_ip_update','network_settings_plugin','update'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $server_config = $app->getconf->get_server_config($conf["server_id"], 'server'); + + // Configure the debian network card settings + if($server_config['auto_network_configuration'] == 'y') { + + if (is_file('/etc/debian_version')) + { + copy('/etc/network/interfaces','/etc/network/interfaces~'); + + $app->load('tpl'); + + $network_tpl = new tpl(); + $network_tpl->newTemplate("debian_network_interfaces.master"); + + $network_tpl->setVar('ip_address',$server_config["ip_address"]); + $network_tpl->setVar('netmask',$server_config["netmask"]); + $network_tpl->setVar('gateway',$server_config["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($server_config["ip_address"],$server_config["netmask"])); + $network_tpl->setVar('network',$this->network($server_config["ip_address"],$server_config["netmask"])); + + $records = $app->db->queryAllRecords("SELECT ip_address FROM server_ip WHERE server_id = ".intval($conf["server_id"]) . " order by ip_address"); + $ip_records = array(); + $additionl_ip_records = 0; + $n = 0; + if(is_array($records)) { + foreach($records as $rec) { + /* + * don't insert the main-ip again! + */ + if ($rec['ip_address'] != $server_config["ip_address"]) + { + $ip_records[$n] = array( + 'id' => $n, + 'ip_address' => $rec['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($rec['ip_address'],$server_config["netmask"]), + 'network' => $this->network($rec['ip_address'],$server_config["netmask"]) + ); + $additionl_ip_records = 1; + $n++; + } + } + } + + /* + * If we have more than 1 IP we have to add the main-ip at the end + * of the network-ip-list. If we don't do so, there may be problems + * in multi-server-settings (with the acces from other server to the + * main-server) because the LAST IP in the list is the IP mysql uses + * to determine the host, the user is logging in from. + */ + if ($additionl_ip_records != 0) + { + $swap["ip_address"] = $ip_records[$n-1]["ip_address"]; + $swap["netmask"] = $ip_records[$n-1]["netmask"]; + $swap["gateway"] = $ip_records[$n-1]["gateway"]; + + $ip_records[$n-1] = array( + 'id' => $n-1, + 'ip_address' => $server_config['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($server_config['ip_address'],$server_config["netmask"]), + 'network' => $this->network($server_config['ip_address'],$server_config["netmask"]) + ); + $network_tpl->setVar('ip_address',$swap["ip_address"]); + $network_tpl->setVar('netmask',$swap["netmask"]); + $network_tpl->setVar('gateway',$swap["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($swap["ip_address"],$swap["netmask"])); + $network_tpl->setVar('network',$this->network($swap["ip_address"],$swap["netmask"])); + } + + $network_tpl->setVar('additionl_ip_records',$additionl_ip_records); + $network_tpl->setLoop('interfaces',$ip_records); + file_put_contents('/etc/network/interfaces',$network_tpl->grab()); + unset($network_tpl); + + $app->log("Changed Network settings",LOGLEVEL_DEBUG); + exec('/etc/init.d/networking force-reload'); + } + elseif (is_file('/etc/gentoo-release')) + { + copy('/etc/conf.d/net','/etc/conf.d/net~'); + + $app->load('tpl'); + + $network_tpl = new tpl(); + $network_tpl->newTemplate("gentoo_network_interfaces.master"); + + $network_tpl->setVar('ip_address',$server_config["ip_address"]); + $network_tpl->setVar('netmask',$server_config["netmask"]); + $network_tpl->setVar('gateway',$server_config["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($server_config["ip_address"],$server_config["netmask"])); + + $records = $app->db->queryAllRecords("SELECT ip_address FROM server_ip WHERE server_id = ".intval($conf["server_id"]) . " order by ip_address"); + $ip_records = array(); + $additionl_ip_records = 0; + $n = 0; + if(is_array($records)) { + foreach($records as $rec) { + /* + * don't insert the main-ip again! + */ + if ($rec['ip_address'] != $server_config["ip_address"]) + { + $ip_records[$n] = array( + 'id' => $n, + 'ip_address' => $rec['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($rec['ip_address'],$server_config["netmask"]) + ); + $additionl_ip_records = 1; + $n++; + } + } + } + + /* + * If we have more than 1 IP we have to add the main-ip at the end + * of the network-ip-list. If we don't do so, there may be problems + * in multi-server-settings (with the acces from other server to the + * main-server) because the LAST IP in the list is the IP mysql uses + * to determine the host, the user is logging in from. + */ + if ($additionl_ip_records != 0) + { + $swap["ip_address"] = $ip_records[$n-1]["ip_address"]; + $swap["netmask"] = $ip_records[$n-1]["netmask"]; + $swap["gateway"] = $ip_records[$n-1]["gateway"]; + + $ip_records[$n-1] = array( + 'id' => $n-1, + 'ip_address' => $server_config['ip_address'], + 'netmask' => $server_config["netmask"], + 'gateway' => $server_config["gateway"], + 'broadcast' => $this->broadcast($server_config['ip_address'],$server_config["netmask"]) + ); + $network_tpl->setVar('ip_address',$swap["ip_address"]); + $network_tpl->setVar('netmask',$swap["netmask"]); + $network_tpl->setVar('gateway',$swap["gateway"]); + $network_tpl->setVar('broadcast',$this->broadcast($swap["ip_address"],$swap["netmask"])); + } + + $network_tpl->setVar('additionl_ip_records',$additionl_ip_records); + $network_tpl->setLoop('interfaces',$ip_records); + file_put_contents('/etc/conf.d/net',$network_tpl->grab()); + unset($network_tpl); + + $app->log("Changed Network settings",LOGLEVEL_DEBUG); + exec('/etc/init.d/net.eth0 restart'); + } + else { + $app->log("Network configuration not available for this linux distribution.",LOGLEVEL_DEBUG); + } + + } else { + $app->log("Network configuration disabled in server settings.",LOGLEVEL_WARN); + } + + } + + function network($ip, $netmask){ + $netmask = $this->netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $netmask); + $netmask_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + for($i=0;$i<32;$i++){ + $network_bin .= substr($netmask_bin,$i,1) * substr($ip_bin,$i,1); + } + $network_bin = wordwrap($network_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($network_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function broadcast($ip, $netmask){ + $netmask = $this->netmask($netmask); + $binary_netmask = $this->binary_netmask($netmask); + list($f1,$f2,$f3,$f4) = explode(".", $ip); + $ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $broadcast_bin = str_pad(substr($ip_bin, 0, $binary_netmask),32,"1",STR_PAD_RIGHT); + $broadcast_bin = wordwrap($broadcast_bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($broadcast_bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + $bin = str_pad($parts[0], 32, "0", STR_PAD_RIGHT); + $bin = wordwrap($bin, 8, ".", 1); + list($f1,$f2,$f3,$f4) = explode(".", trim($bin)); + return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); + } + + function binary_netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); + $bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT); + $parts = explode("0", $bin); + return substr_count($parts[0], "1"); + } + +} // end class + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/postfix_filter_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/postfix_filter_plugin.inc.php new file mode 100644 index 000000000..6b5ed5373 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/postfix_filter_plugin.inc.php @@ -0,0 +1,153 @@ +plugins->registerEvent('mail_content_filter_insert','postfix_filter_plugin','insert'); + $app->plugins->registerEvent('mail_content_filter_update','postfix_filter_plugin','update'); + $app->plugins->registerEvent('mail_content_filter_delete','postfix_filter_plugin','delete'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + function update($event_name,$data) { + global $app, $conf; + + $type = $data["new"]["type"]; + if($type != '') { + $sql = "SELECT * FROM mail_content_filter WHERE server_id = ".intval($conf["server_id"])." AND type = '".$app->db->quote($type)."' AND active = 'y'"; + $rules = $app->db->queryAllRecords($sql); + $content = ''; + foreach($rules as $rule) { + $content .= $rule["pattern"]."\n"; + $content .= " ".$rule["action"]." ".$rule["data"]."\n"; + } + + if($type == 'header') { + file_put_contents('/etc/postfix/header_checks',$content); + $app->log("Writing /etc/postfix/header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'mime_header') { + file_put_contents('/etc/postfix/mime_header_checks',$content); + $app->log("Writing /etc/postfix/mime_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'nested_header') { + file_put_contents('/etc/postfix/nested_header_checks',$content); + $app->log("Writing /etc/postfix/nested_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'body') { + file_put_contents('/etc/postfix/body_checks',$content); + $app->log("Writing /etc/postfix/body_checks",LOGLEVEL_DEBUG); + } + } + + $type = $data["old"]["type"]; + if($type != '') { + $sql = "SELECT * FROM mail_content_filter WHERE server_id = ".intval($conf["server_id"])." AND type = '".$app->db->quote($type)."' AND active = 'y'"; + $rules = $app->db->queryAllRecords($sql); + $content = ''; + foreach($rules as $rule) { + $content .= $rule["pattern"]."\n"; + $content .= " ".$rule["action"]." ".$rule["data"]."\n"; + } + + if($type == 'header') { + file_put_contents('/etc/postfix/header_checks',$content); + $app->log("Writing /etc/postfix/header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'mime_header') { + file_put_contents('/etc/postfix/mime_header_checks',$content); + $app->log("Writing /etc/postfix/mime_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'nested_header') { + file_put_contents('/etc/postfix/nested_header_checks',$content); + $app->log("Writing /etc/postfix/nested_header_checks",LOGLEVEL_DEBUG); + } + + if($type == 'body') { + file_put_contents('/etc/postfix/body_checks',$content); + $app->log("Writing /etc/postfix/body_checks",LOGLEVEL_DEBUG); + } + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/postfix_server_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/postfix_server_plugin.inc.php new file mode 100644 index 000000000..f506ce32a --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/postfix_server_plugin.inc.php @@ -0,0 +1,116 @@ +plugins->registerEvent('server_insert','postfix_server_plugin','insert'); + $app->plugins->registerEvent('server_update','postfix_server_plugin','update'); + + + + } + + function insert($event_name,$data) { + global $app, $conf; + + $this->update($event_name,$data); + + } + + // The purpose of this plugin is to rewrite the main.cf file + function update($event_name,$data) { + global $app, $conf; + + // get the config + $app->uses("getconf"); + $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); + + copy('/etc/postfix/main.cf','/etc/postfix/main.cf~'); + + if($mail_config["relayhost"] != '') { + exec("postconf -e 'relayhost = ".$mail_config["relayhost"]."'"); + if($mail_config["relayhost_user"] != '' && $mail_config["relayhost_password"] != '') { + exec("postconf -e 'smtp_sasl_auth_enable = yes'"); + } else { + exec("postconf -e 'smtp_sasl_auth_enable = no'"); + } + exec("postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'"); + exec("postconf -e 'smtp_sasl_security_options ='"); + + // Store the sasl passwd + $content = $mail_config["relayhost"]." ".$mail_config["relayhost_user"].":".$mail_config["relayhost_password"]; + file_put_contents('/etc/postfix/sasl_passwd',$content); + exec("chown root:root /etc/postfix/sasl_passwd"); + exec("chmod 600 /etc/postfix/sasl_passwd"); + exec("postmap /etc/postfix/sasl_passwd"); + exec("/etc/init.d/postfix restart"); + + } else { + exec("postconf -e 'relayhost ='"); + } + + exec("postconf -e 'mailbox_size_limit = ".intval($mail_config["mailbox_size_limit"]*1024*1024)."'"); + exec("postconf -e 'message_size_limit = ".intval($mail_config["message_size_limit"]*1024*1024)."'"); + + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/shelluser_base_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/shelluser_base_plugin.inc.php new file mode 100644 index 000000000..ed7fdc635 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/shelluser_base_plugin.inc.php @@ -0,0 +1,189 @@ +plugins->registerEvent('shell_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('shell_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('shell_user_delete',$this->plugin_name,'delete'); + + + } + + + function insert($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['puser'])) { + // Get the UID of the parent user + $uid = intval($app->system->getuid($data['new']['puser'])); + if($uid > $this->min_uid) { + $command = 'useradd'; + $command .= ' -d '.escapeshellcmd($data['new']['dir']); + $command .= ' -g '.escapeshellcmd($data['new']['pgroup']); + $command .= ' -o '; // non unique + if($data['new']['password'] != '') $command .= ' -p '.escapeshellcmd($data['new']['password']); + $command .= ' -s '.escapeshellcmd($data['new']['shell']); + $command .= ' -u '.escapeshellcmd($uid); + $command .= ' '.escapeshellcmd($data['new']['username']); + + exec($command); + $app->log("Executed command: ".$command,LOGLEVEL_DEBUG); + $app->log("Added shelluser: ".$data['new']['username'],LOGLEVEL_DEBUG); + + //* Create .bash_history file + exec('touch '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chmod 755 '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chown '.escapeshellcmd($data['new']['username']).':'.escapeshellcmd($data['new']['pgroup']).' '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + + //* Disable shell user temporarily if we use jailkit + if($data['new']['chroot'] == 'jailkit') { + $command = 'usermod -s /bin/false -L '.escapeshellcmd($data['new']['username']); + exec($command); + $app->log("Disabling shelluser temporarily: ".$command,LOGLEVEL_DEBUG); + } + + } else { + $app->log("UID = $uid for shelluser:".$data['new']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("Skippung insert of user:".$data['new']['username'].", parent user ".$data['new']['puser']." does not exist.",LOGLEVEL_WARN); + } + } + + function update($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['puser'])) { + // Get the UID of the parent user + $uid = intval($app->system->getuid($data['new']['puser'])); + if($uid > $this->min_uid) { + // Check if the user that we want to update exists, if not, we insert it + if($app->system->is_user($data['old']['username'])) { + $command = 'usermod'; + $command .= ' --home '.escapeshellcmd($data['new']['dir']); + $command .= ' --gid '.escapeshellcmd($data['new']['pgroup']); + // $command .= ' --non-unique '; + $command .= ' --password '.escapeshellcmd($data['new']['password']); + if($data['new']['chroot'] != 'jailkit') $command .= ' --shell '.escapeshellcmd($data['new']['shell']); + // $command .= ' --uid '.escapeshellcmd($uid); + $command .= ' --login '.escapeshellcmd($data['new']['username']); + $command .= ' '.escapeshellcmd($data['old']['username']); + + exec($command); + $app->log("Executed command: $command ",LOGLEVEL_DEBUG); + $app->log("Updated shelluser: ".$data['old']['username'],LOGLEVEL_DEBUG); + + + //* Create .bash_history file + if(!is_file($data['new']['dir']).'/.bash_history') { + exec('touch '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chmod 755 '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + exec('chown '.escapeshellcmd($data['new']['username']).':'.escapeshellcmd($data['new']['pgroup']).' '.escapeshellcmd($data['new']['dir']).'/.bash_history'); + } + + } else { + // The user does not exist, so we insert it now + $this->insert($event_name,$data); + } + } else { + $app->log("UID = $uid for shelluser:".$data['new']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("Skippung update for user:".$data['new']['username'].", parent user ".$data['new']['puser']." does not exist.",LOGLEVEL_WARN); + } + } + + function delete($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['old']['username'])) { + // Get the UID of the user + $userid = intval($app->system->getuid($data['old']['username'])); + if($userid > $this->min_uid) { + // We delete only non jailkit users, jailkit users will be deleted by the jailkit plugin. + if ($data['old']['chroot'] != "jailkit") { + $command = 'userdel -f'; + $command .= ' '.escapeshellcmd($data['old']['username']); + + exec($command); + $app->log("Deleted shelluser: ".$data['old']['username'],LOGLEVEL_DEBUG); + } + + } else { + $app->log("UID = $userid for shelluser:".$data['old']['username']." not allowed.",LOGLEVEL_ERROR); + } + } else { + $app->log("User:".$data['new']['username']." does not exist in in /etc/passwd, skipping delete.",LOGLEVEL_WARN); + } + + } + + + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/shelluser_jailkit_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/shelluser_jailkit_plugin.inc.php new file mode 100644 index 000000000..e5665fc11 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/shelluser_jailkit_plugin.inc.php @@ -0,0 +1,303 @@ +plugins->registerEvent('shell_user_insert',$this->plugin_name,'insert'); + $app->plugins->registerEvent('shell_user_update',$this->plugin_name,'update'); + $app->plugins->registerEvent('shell_user_delete',$this->plugin_name,'delete'); + + + } + + //* This function is called, when a shell user is inserted in the database + function insert($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['username'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['chroot'] == "jailkit") + { + // load the server configuration options + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + + $this->_add_jailkit_user(); + + $command .= 'usermod -U '.escapeshellcmd($data['new']['username']); + exec($command); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin -> insert username:".$data['new']['username'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin -> insert username:".$data['new']['username']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a shell user is updated in the database + function update($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if($app->system->is_user($data['new']['username'])) { + + /** + * Setup Jailkit Chroot System If Enabled + */ + if ($data['new']['chroot'] == "jailkit") + { + // load the server configuration options + $app->uses("getconf"); + $this->data = $data; + $this->app = $app; + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $this->_update_website_security_level(); + + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + + $this->_update_website_security_level(); + } + + $app->log("Jailkit Plugin -> update username:".$data['new']['username'],LOGLEVEL_DEBUG); + + } else { + $app->log("Jailkit Plugin -> update username:".$data['new']['username']." skipped, the user does not exist.",LOGLEVEL_WARN); + } + + } + + //* This function is called, when a shell user is deleted in the database + /** + * TODO: Remove chroot user home and from the chroot passwd file + */ + function delete($event_name,$data) { + global $app, $conf; + + $app->uses('system'); + + if ($data['old']['chroot'] == "jailkit") + { + $app->uses("getconf"); + $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + + $jailkit_chroot_userhome = $this->_get_home_dir($data['old']['username']); + + //commented out proved to be dangerous on config errors + //exec('rm -rf '.$data['old']['dir'].$jailkit_chroot_userhome); + + if(@is_dir($data['old']['dir'].$jailkit_chroot_userhome)) { + $command = 'userdel'; + $command .= ' '.escapeshellcmd($data['old']['username']); + exec($command); + $app->log("Jailkit Plugin -> delete chroot home:".$data['old']['dir'].$jailkit_chroot_userhome,LOGLEVEL_DEBUG); + } + + } + + $app->log("Jailkit Plugin -> delete username:".$data['old']['username'],LOGLEVEL_DEBUG); + + + } + + function _setup_jailkit_chroot() + { + //check if the chroot environment is created yet if not create it with a list of program sections from the config + if (!is_dir($this->data['new']['dir'].'/etc/jailkit')) + { + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_chroot.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_sections'].'\''; + exec($command); + + $this->app->log("Added jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + + $this->_add_jailkit_programs(); + + //add bash.bashrc script + //we need to collect the domain name to be used as the HOSTNAME in the bashrc script + $web = $this->app->db->queryOneRecord("SELECT domain FROM web_domain WHERE domain_id = ".intval($this->data['new']["parent_domain_id"])); + + $this->app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("bash.bashrc.master"); + + $tpl->setVar('jailkit_chroot',true); + $tpl->setVar('domain',$web['domain']); + $tpl->setVar('home_dir',$this->_get_home_dir("")); + + $bashrc = escapeshellcmd($this->data['new']['dir']).'/etc/bash.bashrc'; + if(@is_file($bashrc)) exec('rm '.$bashrc); + + file_put_contents($bashrc,$tpl->grab()); + unset($tpl); + + $this->app->log("Added bashrc scrpt : ".$bashrc,LOGLEVEL_DEBUG); + + $tpl = new tpl(); + $tpl->newTemplate("motd.master"); + + $tpl->setVar('domain',$web['domain']); + + $motd = escapeshellcmd($this->data['new']['dir']).'/var/run/motd'; + if(@is_file($motd)) exec('rm '.$motd); + + file_put_contents($motd,$tpl->grab()); + + } + } + + function _add_jailkit_programs() + { + //copy over further programs and its libraries + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_programs'].'\''; + exec($command); + + $this->app->log("Added programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG); + } + + function _get_home_dir($username) + { + return str_replace("[username]",escapeshellcmd($username),$this->jailkit_config["jailkit_chroot_home"]); + } + + function _add_jailkit_user() + { + //add the user to the chroot + $jailkit_chroot_userhome = $this->_get_home_dir($this->data['new']['username']); + $jailkit_chroot_puserhome = $this->_get_home_dir($this->data['new']['puser']); + + if(!is_dir($this->data['new']['dir'].'/etc')) mkdir($this->data['new']['dir'].'/etc'); + if(!is_file($this->data['new']['dir'].'/etc/passwd')) exec('touch '.$this->data['new']['dir'].'/etc/passwd'); + + // IMPORTANT! + // ALWAYS create the user. Even if the user was created before + // if we check if the user exists, then a update (no shell -> jailkit) will not work + // and the user has FULL ACCESS to the root of the server! + $command = '/usr/local/ispconfig/server/scripts/create_jailkit_user.sh'; + $command .= ' '.escapeshellcmd($this->data['new']['username']); + $command .= ' '.escapeshellcmd($this->data['new']['dir']); + $command .= ' '.$jailkit_chroot_userhome; + $command .= ' '.escapeshellcmd($this->data['new']['shell']); + $command .= ' '.$this->data['new']['puser']; + $command .= ' '.$jailkit_chroot_puserhome; + exec($command); + + $this->app->log("Added jailkit user to chroot with command: ".$command,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_userhome)); + exec("chown ".$this->data['new']['username'].":".$this->data['new']['pgroup']." ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_userhome)); + + $this->app->log("Added created jailkit user home in : ".$this->data['new']['dir'].$jailkit_chroot_userhome,LOGLEVEL_DEBUG); + + exec("mkdir -p ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_puserhome)); + exec("chown ".$this->data['new']['puser'].":".$this->data['new']['pgroup']." ".escapeshellcmd($this->data['new']['dir'].$jailkit_chroot_puserhome)); + + $this->app->log("Added created jailkit parent user home in : ".$this->data['new']['dir'].$jailkit_chroot_puserhome,LOGLEVEL_DEBUG); + } + + //* Update the website root directory permissions depending on the security level + function _update_website_security_level() { + global $app,$conf; + + // load the server configuration options + $app->uses("getconf"); + $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + + // Get the parent website of this shell user + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$this->data['new']['parent_domain_id']); + + //* If the security level is set to high + if($web_config['security_level'] == 20) { + $this->_exec("chmod 755 ".escapeshellcmd($web["document_root"])); + $this->_exec("chown root:root ".escapeshellcmd($web["document_root"])); + } + + } + + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/plugins-enabled/software_update_plugin.inc.php b/interface/ispconfig/server/plugins-enabled/software_update_plugin.inc.php new file mode 100644 index 000000000..08656c387 --- /dev/null +++ b/interface/ispconfig/server/plugins-enabled/software_update_plugin.inc.php @@ -0,0 +1,178 @@ +plugins->registerEvent('software_update_inst_insert',$this->plugin_name,'process'); + //$app->plugins->registerEvent('software_update_inst_update',$this->plugin_name,'process'); + //$app->plugins->registerEvent('software_update_inst_delete',$this->plugin_name,'process'); + + + } + + function set_install_status($inst_id, $status) { + global $app; + + $app->db->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'"); + $app->dbmaster->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'"); + } + + function process($event_name,$data) { + global $app, $conf; + + //* Get the info of the package: + $software_update_id = intval($data["new"]["software_update_id"]); + $software_update = $app->db->queryOneRecord("SELECT * FROM software_update WHERE software_update_id = '$software_update_id'"); + $software_package = $app->db->queryOneRecord("SELECT * FROM software_package WHERE package_name = '".$app->db->quote($software_update['package_name'])."'"); + + if($software_package['package_type'] == 'ispconfig' && !$conf['software_updates_enabled'] == true) { + $app->log('Software Updates not enabled on this server. To enable updates, set $conf["software_updates_enabled"] = true; in config.inc.php',LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $installuser = ''; + if($software_package['package_type'] == 'ispconfig') { + $installuser = ''; + } elseif ($software_package['package_type'] == 'app') { + $installuser = 'ispapps'; + } else { + $app->log('package_type not supported',LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $temp_dir = '/tmp/'.md5 (uniqid (rand())); + $app->log("The temp dir is $temp_dir",LOGLEVEL_DEBUG); + mkdir($temp_dir); + if($installuser != '') exec('chown '.$installuser.' '.$temp_dir); + + if(!is_dir($temp_dir)) { + $app->log("Unable to create temp directory.",LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } + + $cmd = "cd $temp_dir && wget ".$software_update["update_url"]; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + $app->log("Downloading the update file from: ".$software_update["update_url"],LOGLEVEL_DEBUG); + + $url_parts = parse_url($software_update["update_url"]); + $update_filename = basename($url_parts["path"]); + $app->log("The update filename is $update_filename",LOGLEVEL_DEBUG); + + if(is_file($temp_dir.'/'.$update_filename)) { + + //* Checking the md5sum + if(md5_file($temp_dir.'/'.$update_filename) != $software_update["update_md5"]) { + $app->log("The md5 sum of the downloaded file is incorrect. Update aborted.",LOGLEVEL_WARN); + exec("rm -rf $temp_dir"); + $app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + return false; + } else { + $app->log("md5sum of the downloaded file is verified.",LOGLEVEL_DEBUG); + } + + + //* unpacking the update + $cmd = "cd $temp_dir && unzip $update_filename"; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + + if(is_file($temp_dir.'/setup.sh')) { + // Execute the setup script + exec('chmod +x '.$temp_dir.'/setup.sh'); + $app->log("Executing setup.sh file in directory $temp_dir",LOGLEVEL_DEBUG); + $cmd = 'cd '.$temp_dir.' && ./setup.sh > package_install.log'; + if($installuser == '') { + exec($cmd); + } else { + exec("su -c ".escapeshellarg($cmd)." $installuser"); + } + + $log_data = @file_get_contents("{$temp_dir}/package_install.log"); + if(preg_match("'.*\[OK\]\s*$'is", $log_data)) { + $app->log("Installation successful",LOGLEVEL_DEBUG); + $app->log($log_data,LOGLEVEL_DEBUG); + $this->set_install_status($data["new"]["software_update_inst_id"], "installed"); + } else { + $app->log("Installation failed:\n\n" . $log_data,LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + } else { + $app->log("setup.sh file not found",LOGLEVEL_ERROR); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + } else { + $app->log("Download of the update file failed",LOGLEVEL_WARN); + $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); + } + + exec("rm -rf $temp_dir"); + $app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG); + } + + +} // end class + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/create_jailkit_chroot.sh b/interface/ispconfig/server/scripts/create_jailkit_chroot.sh new file mode 100644 index 000000000..7a7dcc8a6 --- /dev/null +++ b/interface/ispconfig/server/scripts/create_jailkit_chroot.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# Create the jailkit chroot + +# +# Usage: ./create_jailkit_chroot username 'basicshell editors' +# + + +# Sanity check + +if [ "$1" = "" ]; then + echo " Usage: ./create_jailkit_chroot username 'basicshell editors'" + exit +fi + +CHROOT_HOMEDIR=$1 +CHROOT_APP_SECTIONS=$2 + +## Change ownership of the chroot directory to root +chown root:root $CHROOT_HOMEDIR + +## Initialize the chroot into the specified directory with the specified applications +jk_init -f -k -j $CHROOT_HOMEDIR $CHROOT_APP_SECTIONS + +## Create the temp directory +if [ ! -d "$CHROOT_HOMEDIR/tmp" ] +then + mkdir $CHROOT_HOMEDIR/tmp +fi +chmod a+rwx $CHROOT_HOMEDIR/tmp + + +# mysql needs the socket in the chrooted environment +mkdir $CHROOT_HOMEDIR/var +mkdir $CHROOT_HOMEDIR/var/run +mkdir $CHROOT_HOMEDIR/var/run/mysqld + +# ln /var/run/mysqld/mysqld.sock $CHROOT_HOMEDIR/var/run/mysqld/mysqld.sock +if [ -e "/var/run/mysqld/mysqld.sock" ] +then + ln /var/run/mysqld/mysqld.sock $CHROOT_HOMEDIR/var/run/mysqld/mysqld.sock +fi diff --git a/interface/ispconfig/server/scripts/create_jailkit_programs.sh b/interface/ispconfig/server/scripts/create_jailkit_programs.sh new file mode 100644 index 000000000..887e0e27d --- /dev/null +++ b/interface/ispconfig/server/scripts/create_jailkit_programs.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Add specified programs and their libraries to the jailkit chroot + +# +# Usage: ./create_jailkit_programs /path/to/chroot '/usr/bin/program' +# + +# Sanity check + +if [ "$1" = "" ]; then + echo " Usage: ./create_jailkit_programs /path/to/chroot '/usr/bin/program'" + exit +fi + + +CHROOT_HOMEDIR=$1 +CHROOT_APP_PROGRAMS=$2 + +jk_cp -k $CHROOT_HOMEDIR $CHROOT_APP_PROGRAMS diff --git a/interface/ispconfig/server/scripts/create_jailkit_user.sh b/interface/ispconfig/server/scripts/create_jailkit_user.sh new file mode 100644 index 000000000..59416c02c --- /dev/null +++ b/interface/ispconfig/server/scripts/create_jailkit_user.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# Add user to the jailkit chroot + +# +# Usage: ./create_jailkit_user username /path/to/chroot/ /home/webuser /bin/bash web2 /home/web2 +# + +# Sanity check + +if [ "$1" = "" ]; then + echo " Usage: ./create_jailkit_user username /path/to/chroot/ /home/webuser /bin/bash" + exit +fi + + +CHROOT_USERNAME=$1 +CHROOT_HOMEDIR=$2 +CHROOT_USERHOMEDIR=$3 +CHROOT_SHELL=$4 +CHROOT_P_USER=$5 +CHROOT_P_USER_HOMEDIR=$6 + +### Add the chroot user ### +jk_jailuser -n -s $CHROOT_SHELL -j $CHROOT_HOMEDIR $CHROOT_USERNAME + +### Reconfigure the chroot home directory for the user ### +usermod --home=$CHROOT_HOMEDIR/.$CHROOT_USERHOMEDIR $CHROOT_USERNAME + +### We have to reconfigure the chroot home directory for the parent user ### +if [ "$CHROOT_P_USER" != "" ]; then + usermod --home=$CHROOT_HOMEDIR/.$CHROOT_P_USER_HOMEDIR $CHROOT_P_USER +fi \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/ispconfig_update.php b/interface/ispconfig/server/scripts/ispconfig_update.php new file mode 100644 index 000000000..6357c7d5e --- /dev/null +++ b/interface/ispconfig/server/scripts/ispconfig_update.php @@ -0,0 +1,109 @@ +> Update \n\n"; +echo "Please choose the update method. For production systems select 'stable'. \nThe update from svn is only for development systems and may break your current setup.\n\n"; + +$method = simple_query('Select update method', array('stable','svn'), 'stable'); + +if($method == 'stable') { + $new_version = @file_get_contents('http://www.ispconfig.org/downloads/ispconfig3_version.txt') or die('Unable to retrieve version file.'); + $new_version = trim($new_version); + if($new_version != ISPC_APP_VERSION) { + passthru('/usr/local/ispconfig/server/scripts/update_from_tgz.sh'); + exit; + } else { + echo "There are no updates available for ISPConfig ".ISPC_APP_VERSION."\n"; + } +} else { + passthru('/usr/local/ispconfig/server/scripts/update_from_svn.sh'); + exit; +} + + + +?> \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/ispconfig_update.sh b/interface/ispconfig/server/scripts/ispconfig_update.sh new file mode 100644 index 000000000..eeadcfd46 --- /dev/null +++ b/interface/ispconfig/server/scripts/ispconfig_update.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +php -q /usr/local/ispconfig/server/scripts/ispconfig_update.php \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/update_from_svn.sh b/interface/ispconfig/server/scripts/update_from_svn.sh new file mode 100644 index 000000000..9c55a4168 --- /dev/null +++ b/interface/ispconfig/server/scripts/update_from_svn.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +cd /tmp +svn export svn://svn.ispconfig.org/ispconfig3/trunk/ +cd trunk/install +php -q update.php +cd /tmp +rm -rf /tmp/trunk + +exit 0 \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/update_from_tgz.sh b/interface/ispconfig/server/scripts/update_from_tgz.sh new file mode 100644 index 000000000..2424f011c --- /dev/null +++ b/interface/ispconfig/server/scripts/update_from_tgz.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +cd /tmp + +if [ -f ISPConfig-3-stable.tar.gz ] +then +rm -f ISPConfig-3-stable.tar.gz +fi + +wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz +if [ -f ISPConfig-3-stable.tar.gz ] +then + tar xvfz ISPConfig-3-stable.tar.gz + cd ispconfig3_install/install/ + php -q update.php + rm -rf /tmp/ispconfig3_install/install + rm -f ISPConfig-3-stable.tar.gz +else + echo "Unable to download the update." +fi + +exit 0 \ No newline at end of file diff --git a/interface/ispconfig/server/scripts/vlogger b/interface/ispconfig/server/scripts/vlogger new file mode 100644 index 000000000..ce0ce027b --- /dev/null +++ b/interface/ispconfig/server/scripts/vlogger @@ -0,0 +1,574 @@ +#!/usr/bin/perl -T +# +# vlogger - smarter logging for apache +# steve j. kondik +# +# this script will take piped logs in STDIN, break off the first component +# and log the line into the proper directory under $LOGDIR. it will roll the +# logs over at midnight on-the-fly and maintain a symlink to the most recent log. +# +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library 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 +# Library General Public License for more details. +# +# +# CHANGELOG: +# 0.1 initial release +# 0.2 cleanups, added -e option for errorlogs, added strict stuff +# 0.3 cleanups, bugfixes, docs, added -r size rotation option +# 0.4 added dbi usage tracking option, code cleanups from cz@digitalfreaks.org +# 1.0 small bugfixes, first production release +# 1.1 bugfix release +# 1.2 support for mod_logio +# 1.3 various contributed bugfixes +# +# +# TODO: +# configurable file compression using Compress::Zlib, maybe. +# + +package vlogger; + +$ENV{PATH} = "/bin:/usr/bin"; + +my $VERSION = "1.3"; + +=head1 NAME + +vlogger - flexible log rotation and usage tracking in perl + +=head1 SYNOPSIS + +vlogger [OPTIONS]... [LOGDIR] + +=head1 DESCRIPTION + +Vlogger is designed to make webserver log rotation simple and easy to manage. +It deals with VirtualHost logs automatically, so only one directive is required +to manage all hosts on a webserver. Vlogger takes piped output from Apache or +another webserver, splits off the first field, and writes the logs to logfiles +in subdirectories. It uses a filehandle cache to avoid resource limitations. +It will start a new logfile at the beginning of a new day, and optionally start +new files when a certain filesize is reached. It can maintain a symlink to +the most recent log for easy access. Optionally, host parsing can be disabled +for use in ErrorLog directives. + +To use vlogger, you need to add a "%v" to the first part of your LogFormat: + +LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined + +Then call it from a customlog: + +CustomLog "| /usr/local/sbin/vlogger -s access.log -u www-logs -g www-logs /var/log/apache" combined + +=head1 OPTIONS + +Options are given in short format on the command line. + +-a + Do not autoflush files. This may improve performance but may break logfile +analyzers that depend on full entries in the logs. + +-e + ErrorLog mode. In this mode, the host parsing is disabled, and the file is +written out using the template under the specified LOGDIR. + +-n + Disables rotation. This option disables rotation altogether. + +-f MAXFILES + Maximum number of filehandles to keep open. Defaults to 100. Setting this +value too high may result in the system running out of file descriptors. +Setting it too low may affect performance. + +-u UID + Change user to UID when running as root. + +-g GID + Change group to GID when running as root. + +-t TEMPLATE + Filename template using Date::Format codes. Default is "%m%d%Y-access.log", +or "%m%d%Y-error.log". When using the -r option, the default becomes +"%m%d%Y-%T-access.log" or "%m%d%Y-%T-error.log". + +-s SYMLINK + Specifies the name of a symlink to the current file. + +-r SIZE + Rotate files when they reach SIZE. SIZE is given in bytes. + +-d CONFIG + Use the DBI usage tracker. + +-h + Displays help. + +-v + Prints version information. + +=head1 DBI USAGE TRACKER + + Vlogger can automatically keep track of per-virtualhost usage statistics in a +database. DBI and the relevant drivers (eg. DBD::mysql) needs to be installed for +this to work. Create a table in your database to hold the data. A "mysql_create.sql" +script is provided for using this feature with MySQL. Configure the dsn, user, pass +and dump values in the vlogger-dbi.conf file. The "dump" parameter controls how often +vlogger will dump its stats into the database (the default is 30 seconds). Copy this +file to somewhere convienient on your filesystem (like /etc/apache/vlogger-dbi.conf) and +start vlogger with "-d /etc/apache/vlogger-dbi.conf". You might want to use this feature +to easily bill customers on a daily/weekly/monthly basis for bandwidth usage. + +=head1 SEE ALSO +cronolog(1), httplog(1) + +=head1 BUGS +None, yet. + +=head1 AUTHORS +Steve J. Kondik + +WWW: http://n0rp.chemlab.org/vlogger + +=cut + +# a couple modules we need +use strict; +no strict "refs"; +use warnings; +use sigtrap qw(handler exitall HUP USR1 TERM INT PIPE); +use Date::Format; +use Getopt::Std; +use IO::Handle; + +# get command line options +our %OPTS; +getopts( 'f:t:s:hu:g:aeivr:d:', \%OPTS ); + +# print out version +if ( $OPTS{'v'} ) { + print "VLogger $VERSION (apache logfile parser)\n"; + print "Written by Steve J. Kondik \n\n"; + print "This is free software; see the source for copying conditions. There is NO\n"; + print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"; + exit; +} + +# print help +if ( $OPTS{'h'} || !$ARGV[0] ) { + usage(); + exit; +} + +# log directory +my $LOGDIR; +if ( $ARGV[0] ) { + if ( !-d $ARGV[0] ) { + print STDERR + "[vlogger] target directory $ARGV[0] does not exist - exiting.\n\n"; + exit; + } + $LOGDIR = $ARGV[0]; +} +$LOGDIR =~ /(.*)/; +$LOGDIR = $1; + +# change uid/gid if requested (and running as root) +if ( $> == "0" ) { + if ( $OPTS{'g'} ) { + my $guid = getgrnam( $OPTS{'g'} ); + if ( !defined $guid || $guid == 0 ) { + print STDERR + "[vlogger] cannot run as root or nonexistant group.\n\n"; + exit; + } + + $) = $guid; + $( = $guid; + if ( $) != $guid and $) != ( $guid - 2**32 ) ) { + die "fatal: setgid to gid $guid failed\n"; + } + } + + if ( $OPTS{'u'} ) { + my $uuid = getpwnam( $OPTS{'u'} ); + if ( !defined $uuid || $uuid == 0 ) { + print STDERR + "[vlogger] cannot run as root or nonexistant user.\n\n"; + exit; + } + + $> = $uuid; + $< = $uuid; + if ( $> != $uuid and $> != ( $uuid - 2**32 ) ) { + die "fatal: setuid to uid $uuid failed\n"; + } + } +} + +# set up dbi stuffs + +my $DBI_DSN; +my $DBI_USER; +my $DBI_PASS; +my $DBI_DUMP; +if ( $OPTS{'d'} ) { + if ( $OPTS{'e'} ) { + print "-d not valid with -e. exiting.\n"; + exit; + } + + eval "use DBI"; + + open CONF, $OPTS{'d'}; + while () { + chomp; + my @conf = split (/\s/); + if ( $conf[0] eq "dsn" ) { + $DBI_DSN = $conf[1]; + } + elsif ( $conf[0] eq "user" ) { + $DBI_USER = $conf[1]; + } + elsif ( $conf[0] eq "pass" ) { + $DBI_PASS = $conf[1]; + } + elsif ( $conf[0] eq "dump" ) { + $DBI_DUMP = $conf[1]; + } + } + close CONF; + + unless ( $DBI_DSN && $DBI_USER && $DBI_PASS && $DBI_DUMP ) { + print "All values for DBI configuration are not properly defined.\n\n"; + exit; + } + + # test the connection + eval { + my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS ) + or die "DBI Error: $!"; + $dbh->disconnect; + }; + if ($@) { + print "MySQL Connection problem\n"; + } + + # SIGALRM dumps the tracker hash + $SIG{ALRM} = \&dump_tracker; + + alarm $DBI_DUMP; + +} + +# max files to keep open +my $MAXFILES; +if ( $OPTS{'f'} ) { + $MAXFILES = $OPTS{'f'}; +} +else { + $MAXFILES = "100"; +} + +# filesize rotation +my $MAXSIZE; +if ( $OPTS{'r'} ) { + $MAXSIZE = $OPTS{'r'}; +} + +# filename template +my $TEMPLATE; +if ( $OPTS{'t'} ) { + $TEMPLATE = $OPTS{'t'}; + $TEMPLATE =~ /(.*)/; + $TEMPLATE = $1; + +} +elsif ( $OPTS{'e'} ) { + if ( $OPTS{'r'} ) { + $TEMPLATE = "%m%d%Y-%T-error.log"; + } + else { + $TEMPLATE = "%m%d%Y-error.log"; + } +} +else { + if ( $OPTS{'r'} ) { + $TEMPLATE = "%m%d%Y-%T-access.log"; + } + else { + $TEMPLATE = "%m%d%Y-access.log"; + } +} + +# symlink +if ( $OPTS{'s'} ) { + $OPTS{'s'} =~ /(.*)/; + $OPTS{'s'} = $1; +} + +# chroot to the logdir +chdir($LOGDIR); +#chroot("."); we better do not chroot as DBI requires to load a module on the fly -> error! + +my %logs = (); +my %tracker = (); +my $LASTDUMP = time(); + +# pick a mode +if ( $OPTS{'e'} ) { + + $0 = "vlogger (error log)"; + # errorlog mode + open ELOG, ">>" . time2str( $TEMPLATE, time() ) + or die ( "can't open $LOGDIR/" . time2str( $TEMPLATE, time() ) ); + + unless ( $OPTS{'a'} ) { + ELOG->autoflush(1); + } + if ( $OPTS{'s'} ) { + if ( -l $OPTS{'s'} ) { + unlink( $OPTS{'s'} ); + } + symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} ); + } + + my $LASTWRITE = time(); + + while ( my $log_line = ) { + unless ( $OPTS{'n'} ) { + if ( time2str( "%Y%m%d", time() ) > + time2str( "%Y%m%d", $LASTWRITE ) ) + { + + # open a new file + close ELOG; + open_errorlog(); + } + elsif ( $OPTS{'r'} ) { + + # check the size + my @filesize = ELOG->stat; + print $filesize[7] . "\n"; + if ( $filesize[7] > $MAXSIZE ) { + close ELOG; + open_errorlog(); + } + } + + $LASTWRITE = time(); + } + + # we dont need to do any other parsing at all, so write the line. + print ELOG $log_line; + } + +} +else { + + # accesslog mode + $0 = "vlogger (access log)"; + while ( my $log_line = ) { + + # parse out the first word (the vhost) + my @this_line = split ( /\s/, $log_line ); + my ($vhost) = $this_line[0]; + my $reqsize = $this_line[10]; + $vhost = lc($vhost) || "default"; + if ( $vhost =~ m#[/\\]# ) { $vhost = "default" } + $vhost =~ /(.*)/o; + $vhost = $1; + $vhost = 'default' unless $vhost; + + if ( $OPTS{'i'} ) { + $reqsize = $this_line[1] + $this_line[2]; + } + + # if we're writing to a log, and it rolls to a new day, close all files. + unless ( $OPTS{'n'} ) { + if ( $logs{$vhost} + && ( time2str( "%Y%m%d", time() ) > + time2str( "%Y%m%d", $logs{$vhost} ) ) ) + { + foreach my $key ( keys %logs ) { + close $key; + } + %logs = (); + } + elsif ( $OPTS{'r'} && $logs{$vhost} ) { + + # check the size + my @filesize = $vhost->stat; + if ( $filesize[7] > $MAXSIZE ) { + close $vhost; + delete( $logs{$vhost} ); + } + } + } + + # open a new log + if ( !$logs{$vhost} ) { + + # check how many files we have open, close the oldest one + if ( keys(%logs) > $MAXFILES ) { + my ( $key, $value ) = + sort { $logs{$a} <=> $logs{$b} } ( keys(%logs) ); + close $key; + delete( $logs{$key} ); + } + + # check if directory is there + unless ( -d "${vhost}" ) { + mkdir("${vhost}"); + } + + # open the file using the template + open $vhost, ">>${vhost}/" . time2str( $TEMPLATE, time() ) + or die ( "can't open $LOGDIR/${vhost}/" + . time2str( $TEMPLATE, time() ) ); + + # autoflush the handle unless -a + if ( !$OPTS{'a'} ) { + $vhost->autoflush(1); + } + + # make a symlink if -s + if ( $OPTS{'s'} ) { + chdir("${vhost}"); + if ( -l $OPTS{'s'} ) { + unlink( $OPTS{'s'} ); + } + symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} ); + chdir(".."); + } + } + + # update the timestamp and write the line + $logs{$vhost} = time(); + if ($OPTS{'i'}) { + $log_line =~ s/^\S*\s+\S*\s+\S*\s+//o; + } + else { + $log_line =~ s/^\S*\s+//o; + } + + if ( $reqsize =~ m/^\d*$/ && $reqsize > 0 ) { + $tracker{$vhost} += $reqsize; + } + + print $vhost $log_line; + + } +} + +# sub to close all files +sub closeall { + if ( $OPTS{'e'} ) { + close ELOG; + } + else { + foreach my $key ( keys %logs ) { + close $key; + } + %logs = (); + if ( $OPTS{'d'} ) { + vlogger::dump_tracker(); + } + } +} + +sub exitall { + vlogger::closeall; + exit; +} + +# sub to open new errorlog +sub open_errorlog { + open ELOG, ">>" . time2str( $TEMPLATE, time() ) + or die ( "can't open $LOGDIR/" . time2str( $TEMPLATE, time() ) ); + if ( $OPTS{'s'} ) { + if ( -l $OPTS{'s'} ) { + unlink( $OPTS{'s'} ); + } + symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} ); + } + + # autoflush it unless -a + unless ( $OPTS{'a'} ) { + ELOG->autoflush(1); + } +} + +# sub to update the database with the tracker data +sub dump_tracker { + eval { + if ( keys(%tracker) > 0 ) { + my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS ) + or warn "DBI Error: $!"; + foreach my $key ( keys(%tracker) ) { + my $ts = time2str( "%Y-%m-%d", time() ); + my $sth = + $dbh->prepare( "select * from web_traffic where hostname='" . $key + . "' and traffic_date='" . $ts . "'" ); + $sth->execute; + if ( $sth->rows ) { + my $query = + "update web_traffic set traffic_bytes=traffic_bytes+" + . $tracker{$key} + . " where hostname='" . $key + . "' and traffic_date='" . $ts . "'"; + $dbh->do($query); + } + else { + my $query = "insert into web_traffic (hostname, traffic_date, traffic_bytes) values ('$key', '$ts', '$tracker{$key}')"; + $dbh->do($query); + } + } + $dbh->disconnect; + %tracker = (); + } + alarm $DBI_DUMP; + }; + if ($@) { + print "Unable to store vlogger data in database\n"; + } +} + +# print usage info +sub usage { + print "Usage: vlogger [OPTIONS]... [LOGDIR]\n"; + print "Handles a piped logfile from a webserver, splitting it into it's\n"; + print "host components, and rotates the files daily.\n\n"; + print " -a do not autoflush files\n"; + print " -e errorlog mode\n"; + print " -n don't rotate files\n"; + print " -f MAXFILES max number of files to keep open\n"; + print " -u UID uid to switch to when running as root\n"; + print " -g GID gid to switch to when running as root\n"; + print " -t TEMPLATE filename template (see perldoc Date::Format)\n"; + print " -s SYMLINK maintain a symlink to most recent file\n"; + print " -r SIZE rotate when file reaches SIZE\n"; + print " -d CONFIG use DBI usage tracker (see perldoc vlogger)\n"; + print " -i extract mod_logio instead of filesize\n"; + print " -h display this help\n"; + print " -v output version information\n\n"; + print "TEMPLATE may be a filename with Date::Format codes. The default template\n"; + print "is %m%d%Y-access.log. SYMLINK is the name of a file that will be linked to\n"; + print "the most recent file inside the log directory. The default is access.log.\n"; + print "MAXFILES is the maximum number of filehandles to cache. This defaults to 100.\n"; + print "When running with -a, performance may improve, but this might confuse some\n"; + print "log analysis software that expects complete log entries at all times.\n"; + print "Errorlog mode is used when running with an Apache errorlog. In this mode,\n"; + print "virtualhost parsing is disabled, and a single file is written in LOGDIR\n"; + print "using the TEMPLATE (%m%d%Y-error.log is default for -e). When running with\n"; + print "-r, the template becomes %m%d%Y-%T-xxx.log. SIZE is given in bytes.\n\n"; + print "Report bugs to .\n"; +} + diff --git a/interface/ispconfig/server/server.php b/interface/ispconfig/server/server.php new file mode 100644 index 000000000..80a6b9f89 --- /dev/null +++ b/interface/ispconfig/server/server.php @@ -0,0 +1,148 @@ +db->queryOneRecord("SELECT * FROM server WHERE update = 1 AND server_id = ".$conf["server_id"]); +if($server_db_record == false) { + $app->log("Nothing to update for server_id ".$conf["server_id"]); + die(); +} else { + // Set update status to 0, so we dont start the update process twice + $app->db->query("UPDATE server SET update = 0 WHERE server_id = ".$conf["server_id"]); + $app->log("Begin update."); +} +*/ + +//* Load the server configuration +if($app->dbmaster->connect()) { + // get the dalaog_id of the last performed record + $server_db_record = $app->dbmaster->queryOneRecord("SELECT * FROM server WHERE server_id = ".$conf["server_id"]); + $conf['last_datalog_id'] = (int)$server_db_record['updated']; + $conf["mirror_server_id"] = (int)$server_db_record['mirror_server_id']; + // Load the ini_parser + $app->uses('ini_parser'); + // Get server configuration + $conf["serverconfig"] = $app->ini_parser->parse_ini_string(stripslashes($server_db_record["config"])); + // Set the loglevel + $conf["log_priority"] = intval($conf["serverconfig"]["server"]["loglevel"]); + + unset($server_db_record); +} + + +// Check if another process is running +if(is_file($conf["temppath"].$conf["fs_div"].".ispconfig_lock")){ + clearstatcache(); + for($i=0;$i<120;$i++){ // Wait max. 1200 sec, then proceed + if(is_file($conf["temppath"].$conf["fs_div"].".ispconfig_lock")){ + exec("ps aux | grep '/usr/local/ispconfig/server/server.php' | grep -v 'grep' | wc -l", $check); + if(intval($check[0]) > 1) { // 1 because this is 2nd instance! + $app->log("There is already an instance of server.php running. Exiting.", LOGLEVEL_DEBUG); + exit; + } + $app->log("There is already a lockfile set. Waiting another 10 seconds...", LOGLEVEL_DEBUG); + sleep(10); + clearstatcache(); + } + } +} + +// Set Lockfile +@touch($conf["temppath"].$conf["fs_div"].".ispconfig_lock"); +$app->log("Set Lock: ".$conf["temppath"].$conf["fs_div"].".ispconfig_lock", LOGLEVEL_DEBUG); + + +if($app->db->connect() && $app->dbmaster->connect()) { + + // Check if there is anything to update + if($conf["mirror_server_id"] > 0) { + $tmp_rec = $app->dbmaster->queryOneRecord("SELECT count(server_id) as number from sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = ".$conf["mirror_server_id"]." OR server_id = 0)"); + } else { + $tmp_rec = $app->dbmaster->queryOneRecord("SELECT count(server_id) as number from sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0)"); + } + + $tmp_num_records = $tmp_rec["number"]; + unset($tmp_rec); + + if($tmp_num_records > 0) { + /* + There is something to do, triggert by the database -> do it! + */ + // Write the Log + $app->log("Found $tmp_num_records changes, starting update process.", LOGLEVEL_DEBUG); + // Load required base-classes + $app->uses('modules,plugins,file,services'); + // Load the modules that are im the mods-enabled folder + $app->modules->loadModules('all'); + // Load the plugins that are in the plugins-enabled folder + $app->plugins->loadPlugins('all'); + // Go trough the sys_datalog table and call the processing functions + // in the modules that are hooked on to the table actions + $app->modules->processDatalog(); + // Restart services that need to be restarted after configuration + $app->services->processDelayedActions(); + } else { + /* + There is no trigger inside the database -> load only the core, maybe they have to do something + */ + // Write the log + $app->log('No Updated records found, starting only the core.', LOGLEVEL_DEBUG); + // Load required base-classes + $app->uses('modules,plugins,file,services'); + // Load the modules that are im the mods-core folder + $app->modules->loadModules('core'); + // Load the plugins that are in the plugins-core folder + $app->plugins->loadPlugins('core'); + } +} else { + if(!$app->db->connect()) { + $app->log("Unable to connect to local server.".$app->db->errorMessage,LOGLEVEL_WARN); + } else { + $app->log("Unable to connect to master server.".$app->dbmaster->errorMessage,LOGLEVEL_WARN); + } +} + +// Remove lock +@unlink($conf["temppath"].$conf["fs_div"].".ispconfig_lock"); +$app->log("Remove Lock: ".$conf["temppath"].$conf["fs_div"].".ispconfig_lock",LOGLEVEL_DEBUG); + + +die("finished.\n"); +?> diff --git a/interface/ispconfig/server/server.sh b/interface/ispconfig/server/server.sh new file mode 100644 index 000000000..cabfd6968 --- /dev/null +++ b/interface/ispconfig/server/server.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin + +. /etc/profile + +/usr/bin/php -q /usr/local/ispconfig/server/server.php \ No newline at end of file diff --git a/interface/ispconfig/vpproject/ispconfig.vpppath b/interface/ispconfig/vpproject/ispconfig.vpppath new file mode 100644 index 000000000..674693ddb --- /dev/null +++ b/interface/ispconfig/vpproject/ispconfig.vpppath @@ -0,0 +1 @@ +C:\Users\ajaouni\Desktop\uml\vpproject.vpp \ No newline at end of file -- GitLab