summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--GPL.txt339
-rw-r--r--README.md2
-rw-r--r--action.php5
-rw-r--r--addmedia.php12
-rw-r--r--admin.php693
-rw-r--r--admin_media.php149
-rw-r--r--admin_media_upload.php25
-rw-r--r--admin_module_blocks.php120
-rw-r--r--admin_module_menus.php168
-rw-r--r--admin_module_reports.php124
-rw-r--r--admin_module_sidebar.php167
-rw-r--r--admin_module_tabs.php150
-rw-r--r--admin_modules.php197
-rw-r--r--admin_pgv_to_wt.php4
-rw-r--r--admin_site_access.php117
-rw-r--r--admin_site_change.php6
-rw-r--r--admin_site_clean.php119
-rw-r--r--admin_site_config.php520
-rw-r--r--admin_site_info.php93
-rw-r--r--admin_site_logs.php139
-rw-r--r--admin_site_merge.php6
-rw-r--r--admin_site_readme.php8
-rw-r--r--admin_site_upgrade.php5
-rw-r--r--admin_trees_check.php27
-rw-r--r--admin_trees_config.php3254
-rw-r--r--admin_trees_manage.php569
-rw-r--r--admin_trees_merge.php17
-rw-r--r--admin_trees_renumber.php8
-rw-r--r--admin_users.php1017
-rw-r--r--admin_users_bulk.php41
-rw-r--r--edit_changes.php4
-rw-r--r--edit_interface.php5
-rw-r--r--edituser.php9
-rw-r--r--family.php2
-rw-r--r--fanchart.php6
-rw-r--r--help_text.php700
-rw-r--r--import.php35
-rw-r--r--includes/functions/functions_charts.php41
-rw-r--r--includes/functions/functions_mediadb.php4
-rw-r--r--includes/functions/functions_print.php359
-rw-r--r--includes/functions/functions_print_facts.php5
-rw-r--r--includes/functions/functions_print_lists.php2
-rw-r--r--includes/session.php97
-rw-r--r--index.php8
-rw-r--r--inverselink.php10
-rw-r--r--js/jquery.jeditable-1.7.3.js546
-rw-r--r--language/ar.po4
-rw-r--r--language/bg.po4
-rw-r--r--language/bs.po4
-rw-r--r--language/ca.po4
-rw-r--r--language/cs.po4
-rw-r--r--language/da.po4
-rw-r--r--language/de.po4
-rw-r--r--language/el.po4
-rw-r--r--language/en_GB.po4
-rw-r--r--language/en_US.po4
-rw-r--r--language/es.po4
-rw-r--r--language/et.po4
-rw-r--r--language/extra/af.po4
-rw-r--r--language/extra/dv.po4
-rw-r--r--language/extra/en_AU.po4
-rw-r--r--language/extra/fa.po4
-rw-r--r--language/extra/fo.po4
-rw-r--r--language/extra/fr_CA.po4
-rw-r--r--language/extra/gl.po4
-rw-r--r--language/extra/id.po4
-rw-r--r--language/extra/ja.po4
-rw-r--r--language/extra/ka.po4
-rw-r--r--language/extra/ko.po4
-rw-r--r--language/extra/lv.po4
-rw-r--r--language/extra/mi.po4
-rw-r--r--language/extra/ms.po4
-rw-r--r--language/extra/ne.po4
-rw-r--r--language/extra/oc.po4
-rw-r--r--language/extra/ro.po4
-rw-r--r--language/extra/sl.po4
-rw-r--r--language/extra/sr.po4
-rw-r--r--language/extra/sr@Latn.po4
-rw-r--r--language/extra/ta.po4
-rw-r--r--language/extra/tt.po4
-rw-r--r--language/extra/yi.po4
-rw-r--r--language/extra/zh_TW.po4
-rw-r--r--language/fi.po4
-rw-r--r--language/fr.po4
-rw-r--r--language/he.po4
-rw-r--r--language/hr.po4
-rw-r--r--language/hu.po4
-rw-r--r--language/is.po4
-rw-r--r--language/it.po4
-rw-r--r--language/lt.po4
-rw-r--r--language/mr.po4
-rw-r--r--language/nb.po4
-rw-r--r--language/nl.po4
-rw-r--r--language/nn.po4
-rw-r--r--language/pl.po4
-rw-r--r--language/pt.po4
-rw-r--r--language/pt_BR.po4
-rw-r--r--language/ru.po4
-rw-r--r--language/sk.po4
-rw-r--r--language/sv.po4
-rw-r--r--language/tr.po4
-rw-r--r--language/uk.po4
-rw-r--r--language/vi.po4
-rw-r--r--language/zh_CN.po4
-rw-r--r--library/WT/Auth.php4
-rw-r--r--library/WT/Controller/AdvancedSearch.php30
-rw-r--r--library/WT/Controller/Ajax.php7
-rw-r--r--library/WT/Controller/Ancestry.php35
-rw-r--r--library/WT/Controller/Base.php4
-rw-r--r--library/WT/Controller/Compact.php4
-rw-r--r--library/WT/Controller/Descendancy.php66
-rw-r--r--library/WT/Controller/Familybook.php31
-rw-r--r--library/WT/Controller/Fanchart.php51
-rw-r--r--library/WT/Controller/Hourglass.php37
-rw-r--r--library/WT/Controller/Individual.php7
-rw-r--r--library/WT/Controller/Page.php112
-rw-r--r--library/WT/Controller/Pedigree.php30
-rw-r--r--library/WT/Controller/Simple.php11
-rw-r--r--library/WT/Controller/Timeline.php17
-rw-r--r--library/WT/Fact.php21
-rw-r--r--library/WT/File.php4
-rw-r--r--library/WT/Filter.php6
-rw-r--r--library/WT/FlashMessages.php29
-rw-r--r--library/WT/Log.php4
-rw-r--r--library/WT/Menu.php55
-rw-r--r--library/WT/MenuBar.php509
-rw-r--r--library/WT/Report/HTML_Html.php8
-rw-r--r--library/WT/Report/HTML_Line.php14
-rw-r--r--library/WT/Report/HTML_TextBox.php3
-rw-r--r--library/WT/Stats.php86
-rw-r--r--library/WT/Theme.php86
-rw-r--r--library/WT/Theme/Administration.php200
-rw-r--r--library/WT/Theme/BaseTheme.php1692
-rw-r--r--library/WT/Theme/Clouds.php145
-rw-r--r--library/WT/Theme/Colors.php261
-rw-r--r--library/WT/Theme/Fab.php134
-rw-r--r--library/WT/Theme/Minimal.php123
-rw-r--r--library/WT/Theme/Webtrees.php103
-rw-r--r--library/WT/Theme/Xenea.php113
-rw-r--r--library/WT/User.php25
-rw-r--r--library/composer/autoload_classmap.php10
-rw-r--r--medialist.php50
-rw-r--r--modules_v3/GEDFact_assistant/_MEDIA/media_0_inverselink.php12
-rw-r--r--modules_v3/batch_update/admin_batch_update.php3
-rw-r--r--modules_v3/charts/module.php5
-rw-r--r--modules_v3/families/module.php12
-rw-r--r--modules_v3/gedcom_block/module.php5
-rw-r--r--modules_v3/gedcom_favorites/module.php29
-rw-r--r--modules_v3/gedcom_news/module.php5
-rw-r--r--modules_v3/gedcom_stats/module.php5
-rw-r--r--modules_v3/googlemap/module.php11
-rw-r--r--modules_v3/html/module.php8
-rw-r--r--modules_v3/lightbox/module.php9
-rw-r--r--modules_v3/logged_in/module.php5
-rw-r--r--modules_v3/login_block/module.php5
-rw-r--r--modules_v3/random_media/module.php5
-rw-r--r--modules_v3/recent_changes/module.php8
-rw-r--r--modules_v3/relatives/module.php9
-rw-r--r--modules_v3/review_changes/module.php8
-rw-r--r--modules_v3/theme_select/module.php12
-rw-r--r--modules_v3/todays_events/module.php8
-rw-r--r--modules_v3/todo/module.php8
-rw-r--r--modules_v3/top10_givnnames/module.php8
-rw-r--r--modules_v3/top10_pageviews/module.php8
-rw-r--r--modules_v3/top10_surnames/module.php8
-rw-r--r--modules_v3/upcoming_events/module.php8
-rw-r--r--modules_v3/user_blog/module.php8
-rw-r--r--modules_v3/user_messages/module.php10
-rw-r--r--modules_v3/user_welcome/module.php5
-rw-r--r--modules_v3/yahrzeit/module.php8
-rw-r--r--packages/bootstrap-3.3.1/css/bootstrap.min.css5
-rw-r--r--packages/bootstrap-3.3.1/js/bootstrap.min.js7
-rw-r--r--packages/bootstrap-rtl-3.2.0/css/bootstrap-rtl.min.css9
-rw-r--r--packages/datatables-1.10.4/css/jquery.dataTables.css476
-rw-r--r--packages/datatables-1.10.4/css/jquery.dataTables.min.css1
-rw-r--r--packages/datatables-1.10.4/css/jquery.dataTables_themeroller.css330
-rw-r--r--packages/datatables-1.10.4/images/Sorting icons.psdbin0 -> 27490 bytes
-rw-r--r--packages/datatables-1.10.4/images/back_disabled.pngbin0 -> 1361 bytes
-rw-r--r--packages/datatables-1.10.4/images/back_enabled.pngbin0 -> 1379 bytes
-rw-r--r--packages/datatables-1.10.4/images/back_enabled_hover.pngbin0 -> 1375 bytes
-rw-r--r--packages/datatables-1.10.4/images/favicon.icobin0 -> 894 bytes
-rw-r--r--packages/datatables-1.10.4/images/forward_disabled.pngbin0 -> 1363 bytes
-rw-r--r--packages/datatables-1.10.4/images/forward_enabled.pngbin0 -> 1380 bytes
-rw-r--r--packages/datatables-1.10.4/images/forward_enabled_hover.pngbin0 -> 1379 bytes
-rw-r--r--packages/datatables-1.10.4/images/sort_asc.pngbin0 -> 1118 bytes
-rw-r--r--packages/datatables-1.10.4/images/sort_asc_disabled.pngbin0 -> 2916 bytes
-rw-r--r--packages/datatables-1.10.4/images/sort_both.pngbin0 -> 1136 bytes
-rw-r--r--packages/datatables-1.10.4/images/sort_desc.pngbin0 -> 1127 bytes
-rw-r--r--packages/datatables-1.10.4/images/sort_desc_disabled.pngbin0 -> 1045 bytes
-rw-r--r--packages/datatables-1.10.4/js/jquery.dataTables.min.js157
-rw-r--r--packages/datatables-1.10.4/plugins/dataTables.bootstrap.css314
-rw-r--r--packages/datatables-1.10.4/plugins/dataTables.bootstrap.js186
-rw-r--r--packages/font-awesome-4.1.0/css/font-awesome.min.css4
-rw-r--r--packages/font-awesome-4.1.0/fonts/FontAwesome.otfbin0 -> 75188 bytes
-rw-r--r--packages/font-awesome-4.1.0/fonts/fontawesome-webfont.eotbin0 -> 72449 bytes
-rw-r--r--packages/font-awesome-4.1.0/fonts/fontawesome-webfont.svg504
-rw-r--r--packages/font-awesome-4.1.0/fonts/fontawesome-webfont.ttfbin0 -> 141564 bytes
-rw-r--r--packages/font-awesome-4.1.0/fonts/fontawesome-webfont.woffbin0 -> 83760 bytes
-rw-r--r--relationship.php26
-rw-r--r--save.php109
-rw-r--r--tests/includes/functions/FunctionsPrintTest.php54
-rw-r--r--tests/includes/functions/FunctionsTest.php11
-rw-r--r--tests/library/WT/MenuBarTest.php32
-rw-r--r--themes/_administration/css-1.6.2/paper_fibers.pngbin0 -> 74094 bytes
-rw-r--r--themes/_administration/css-1.6.2/paper_fibers_@2X.pngbin0 -> 43232 bytes
-rw-r--r--themes/_administration/css-1.6.2/style.css354
-rw-r--r--themes/_administration/footer.php26
-rw-r--r--themes/_administration/header.php164
-rw-r--r--themes/_administration/theme.php30
-rw-r--r--themes/_custom/theme.php104
-rw-r--r--themes/clouds/css-1.6.2/style.css3
-rw-r--r--themes/clouds/footer.php45
-rw-r--r--themes/clouds/header.php116
-rw-r--r--themes/clouds/templates/block_main_temp.php49
-rw-r--r--themes/clouds/templates/block_small_temp.php51
-rw-r--r--themes/clouds/templates/compactbox_template.php45
-rw-r--r--themes/clouds/templates/personbox_template.php52
-rw-r--r--themes/clouds/theme.php112
-rw-r--r--themes/colors/css-1.6.2/style.css3
-rw-r--r--themes/colors/footer.php45
-rw-r--r--themes/colors/header.php126
-rw-r--r--themes/colors/templates/block_main_temp.php49
-rw-r--r--themes/colors/templates/block_small_temp.php51
-rw-r--r--themes/colors/templates/compactbox_template.php45
-rw-r--r--themes/colors/templates/personbox_template.php52
-rw-r--r--themes/colors/theme.php193
-rw-r--r--themes/fab/css-1.6.2/style.css3
-rw-r--r--themes/fab/footer.php36
-rw-r--r--themes/fab/header.php103
-rw-r--r--themes/fab/templates/block_main_temp.php35
-rw-r--r--themes/fab/templates/block_small_temp.php35
-rw-r--r--themes/fab/templates/compactbox_template.php45
-rw-r--r--themes/fab/templates/personbox_template.php52
-rw-r--r--themes/fab/theme.php90
-rw-r--r--themes/minimal/css-1.6.2/style.css3
-rw-r--r--themes/minimal/footer.php40
-rw-r--r--themes/minimal/header.php103
-rw-r--r--themes/minimal/templates/block_main_temp.php43
-rw-r--r--themes/minimal/templates/block_small_temp.php43
-rw-r--r--themes/minimal/templates/compactbox_template.php45
-rw-r--r--themes/minimal/templates/personbox_template.php52
-rw-r--r--themes/minimal/theme.php93
-rw-r--r--themes/webtrees/css-1.6.2/style.css3
-rw-r--r--themes/webtrees/footer.php46
-rw-r--r--themes/webtrees/header.php96
-rw-r--r--themes/webtrees/templates/block_main_temp.php43
-rw-r--r--themes/webtrees/templates/block_small_temp.php43
-rw-r--r--themes/webtrees/templates/compactbox_template.php45
-rw-r--r--themes/webtrees/templates/personbox_template.php52
-rw-r--r--themes/webtrees/theme.php94
-rw-r--r--themes/xenea/css-1.6.2/style.css9
-rw-r--r--themes/xenea/footer.php45
-rw-r--r--themes/xenea/header.php108
-rw-r--r--themes/xenea/templates/block_main_temp.php43
-rw-r--r--themes/xenea/templates/block_small_temp.php43
-rw-r--r--themes/xenea/templates/compactbox_template.php45
-rw-r--r--themes/xenea/templates/personbox_template.php52
-rw-r--r--themes/xenea/theme.php91
-rw-r--r--timeline.php16
259 files changed, 10804 insertions, 9359 deletions
diff --git a/GPL.txt b/GPL.txt
deleted file mode 100644
index d159169d10..0000000000
--- a/GPL.txt
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/README.md b/README.md
index 2ad7278002..60344ed1a5 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@ 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.
-See the GPL.txt included with this software for more detailed licensing
+See the file LICENSE.md included with this software for more detailed licensing
information.
diff --git a/action.php b/action.php
index bb6c47c000..366b048dd7 100644
--- a/action.php
+++ b/action.php
@@ -20,7 +20,7 @@
// the correct response for both success/error.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 Greg Roach
+// Copyright (C) 2015 Greg Roach
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -38,6 +38,7 @@
use WT\Auth;
use WT\Log;
+use WT\Theme;
use WT\User;
define('WT_SCRIPT_NAME', 'action.php');
@@ -243,7 +244,7 @@ case 'reject-changes':
case 'theme':
// Change the current theme
$theme = WT_Filter::post('theme');
- if (WT_Site::getPreference('ALLOW_USER_THEMES') && in_array($theme, get_theme_names())) {
+ if (WT_Site::getPreference('ALLOW_USER_THEMES') && array_key_exists($theme, Theme::themeNames())) {
$WT_SESSION->theme_id = $theme;
// Remember our selection
Auth::user()->setPreference('theme', $theme);
diff --git a/addmedia.php b/addmedia.php
index d76709867b..5563b1a24e 100644
--- a/addmedia.php
+++ b/addmedia.php
@@ -477,10 +477,11 @@ if ($gedfile == 'FILE') {
echo '<td class="optionbox wrap wrap">';
if (WT_USER_GEDCOM_ADMIN) {
echo '<input name="filename" type="text" value="' . WT_Filter::escapeHtml($fileName) . '" size="40"';
- if ($isExternal)
+ if ($isExternal) {
echo '>';
- else
+ } else {
echo '><p class="sub">' . WT_I18N::translate('Do not change to keep original filename.') . '</p>';
+ }
} else {
echo $fileName;
echo '<input name="filename" type="hidden" value="' . WT_Filter::escapeHtml($fileName) . '" size="40">';
@@ -498,15 +499,18 @@ if (!$isExternal) {
$mediaFolders = WT_Query_Media::folderList();
echo '<span dir="ltr"><select name="folder_list" onchange="document.newmedia.folder.value=this.options[this.selectedIndex].value;">';
echo '<option';
- if ($folder == '') echo ' selected="selected"';
+ if ($folder == '') {
+ echo ' selected="selected"';
+ }
echo ' value=""> ', WT_I18N::translate('Choose: '), ' </option>';
if (Auth::isAdmin()) {
echo '<option value="other" disabled>', WT_I18N::translate('Other folder… please type in'), "</option>";
}
foreach ($mediaFolders as $f) {
echo '<option value="', $f, '"';
- if ($folder == $f)
+ if ($folder == $f) {
echo ' selected="selected"';
+ }
echo '>', $f, "</option>";
}
echo '</select></span>';
diff --git a/admin.php b/admin.php
index 936b6685f8..cf7c89a0e8 100644
--- a/admin.php
+++ b/admin.php
@@ -2,7 +2,7 @@
// Welcome page for the administration module
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -96,7 +96,12 @@ $user_languages = WT_DB::prepare(
$stats = new WT_Stats(WT_GEDCOM);
?>
-<div id="content_container" style="visibility: hidden;">
+<ol class="breadcrumb small">
+ <li class="active"><?php echo WT_I18N::translate('Administration'); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
+
+<div>
<div id="x">
<h2><?php echo WT_WEBTREES, ' ', WT_VERSION; ?></h2>
<div id="about">
@@ -294,379 +299,381 @@ $stats = new WT_Stats(WT_GEDCOM);
function old_paths() {
return array(
// Removed in 1.0.2
- WT_ROOT.'language/en.mo',
+ WT_ROOT . 'language/en.mo',
// Removed in 1.0.3
- WT_ROOT.'themechange.php',
+ WT_ROOT . 'themechange.php',
// Removed in 1.0.4
// Removed in 1.0.5
// Removed in 1.0.6
- WT_ROOT.'includes/extras',
+ WT_ROOT . 'includes/extras',
// Removed in 1.1.0
- WT_ROOT.'addremotelink.php',
- WT_ROOT.'addsearchlink.php',
- WT_ROOT.'client.php',
- WT_ROOT.'dir_editor.php',
- WT_ROOT.'editconfig_gedcom.php',
- WT_ROOT.'editgedcoms.php',
- WT_ROOT.'edit_merge.php',
- WT_ROOT.'genservice.php',
- WT_ROOT.'includes/classes',
- WT_ROOT.'includes/controllers',
- WT_ROOT.'includes/family_nav.php',
- WT_ROOT.'includes/functions/functions_lang.php',
- WT_ROOT.'includes/functions/functions_tools.php',
- WT_ROOT.'js/conio',
- WT_ROOT.'logs.php',
- WT_ROOT.'manageservers.php',
- WT_ROOT.'media.php',
- WT_ROOT.'module_admin.php',
+ WT_ROOT . 'addremotelink.php',
+ WT_ROOT . 'addsearchlink.php',
+ WT_ROOT . 'client.php',
+ WT_ROOT . 'dir_editor.php',
+ WT_ROOT . 'editconfig_gedcom.php',
+ WT_ROOT . 'editgedcoms.php',
+ WT_ROOT . 'edit_merge.php',
+ WT_ROOT . 'genservice.php',
+ WT_ROOT . 'includes/classes',
+ WT_ROOT . 'includes/controllers',
+ WT_ROOT . 'includes/family_nav.php',
+ WT_ROOT . 'includes/functions/functions_lang.php',
+ WT_ROOT . 'includes/functions/functions_tools.php',
+ WT_ROOT . 'js/conio',
+ WT_ROOT . 'logs.php',
+ WT_ROOT . 'manageservers.php',
+ WT_ROOT . 'media.php',
+ WT_ROOT . 'module_admin.php',
//WT_ROOT.'modules', // Do not delete - users may have stored custom modules/data here
- WT_ROOT.'opensearch.php',
- WT_ROOT.'PEAR.php',
- WT_ROOT.'pgv_to_wt.php',
- WT_ROOT.'places',
+ WT_ROOT . 'opensearch.php',
+ WT_ROOT . 'PEAR.php',
+ WT_ROOT . 'pgv_to_wt.php',
+ WT_ROOT . 'places',
//WT_ROOT.'robots.txt', // Do not delete this - it may contain user data
- WT_ROOT.'serviceClientTest.php',
- WT_ROOT.'siteconfig.php',
- WT_ROOT.'SOAP',
- WT_ROOT.'themes/clouds/mozilla.css',
- WT_ROOT.'themes/clouds/netscape.css',
- WT_ROOT.'themes/colors/mozilla.css',
- WT_ROOT.'themes/colors/netscape.css',
- WT_ROOT.'themes/fab/mozilla.css',
- WT_ROOT.'themes/fab/netscape.css',
- WT_ROOT.'themes/minimal/mozilla.css',
- WT_ROOT.'themes/minimal/netscape.css',
- WT_ROOT.'themes/webtrees/mozilla.css',
- WT_ROOT.'themes/webtrees/netscape.css',
- WT_ROOT.'themes/webtrees/style_rtl.css',
- WT_ROOT.'themes/xenea/mozilla.css',
- WT_ROOT.'themes/xenea/netscape.css',
- WT_ROOT.'uploadmedia.php',
- WT_ROOT.'useradmin.php',
- WT_ROOT.'webservice',
- WT_ROOT.'wtinfo.php',
+ WT_ROOT . 'serviceClientTest.php',
+ WT_ROOT . 'siteconfig.php',
+ WT_ROOT . 'SOAP',
+ WT_ROOT . 'themes/clouds/mozilla.css',
+ WT_ROOT . 'themes/clouds/netscape.css',
+ WT_ROOT . 'themes/colors/mozilla.css',
+ WT_ROOT . 'themes/colors/netscape.css',
+ WT_ROOT . 'themes/fab/mozilla.css',
+ WT_ROOT . 'themes/fab/netscape.css',
+ WT_ROOT . 'themes/minimal/mozilla.css',
+ WT_ROOT . 'themes/minimal/netscape.css',
+ WT_ROOT . 'themes/webtrees/mozilla.css',
+ WT_ROOT . 'themes/webtrees/netscape.css',
+ WT_ROOT . 'themes/webtrees/style_rtl.css',
+ WT_ROOT . 'themes/xenea/mozilla.css',
+ WT_ROOT . 'themes/xenea/netscape.css',
+ WT_ROOT . 'uploadmedia.php',
+ WT_ROOT . 'useradmin.php',
+ WT_ROOT . 'webservice',
+ WT_ROOT . 'wtinfo.php',
// Removed in 1.1.1
// Removed in 1.1.2
- WT_ROOT.'js/treenav.js',
- WT_ROOT.'library/WT/TreeNav.php',
- WT_ROOT.'treenav.php',
+ WT_ROOT . 'js/treenav.js',
+ WT_ROOT . 'library/WT/TreeNav.php',
+ WT_ROOT . 'treenav.php',
// Removed in 1.2.0
- WT_ROOT.'themes/clouds/jquery',
- WT_ROOT.'themes/colors/jquery',
- WT_ROOT.'themes/fab/jquery',
- WT_ROOT.'themes/minimal/jquery',
- WT_ROOT.'themes/webtrees/jquery',
- WT_ROOT.'themes/xenea/jquery',
+ WT_ROOT . 'themes/clouds/jquery',
+ WT_ROOT . 'themes/colors/jquery',
+ WT_ROOT . 'themes/fab/jquery',
+ WT_ROOT . 'themes/minimal/jquery',
+ WT_ROOT . 'themes/webtrees/jquery',
+ WT_ROOT . 'themes/xenea/jquery',
// Removed in 1.2.1
// Removed in 1.2.2
- WT_ROOT.'themes/clouds/chrome.css',
- WT_ROOT.'themes/clouds/opera.css',
- WT_ROOT.'themes/clouds/print.css',
- WT_ROOT.'themes/clouds/style_rtl.css',
- WT_ROOT.'themes/colors/chrome.css',
- WT_ROOT.'themes/colors/opera.css',
- WT_ROOT.'themes/colors/print.css',
- WT_ROOT.'themes/colors/style_rtl.css',
- WT_ROOT.'themes/fab/chrome.css',
- WT_ROOT.'themes/fab/opera.css',
- WT_ROOT.'themes/minimal/chrome.css',
- WT_ROOT.'themes/minimal/opera.css',
- WT_ROOT.'themes/minimal/print.css',
- WT_ROOT.'themes/minimal/style_rtl.css',
- WT_ROOT.'themes/xenea/chrome.css',
- WT_ROOT.'themes/xenea/opera.css',
- WT_ROOT.'themes/xenea/print.css',
- WT_ROOT.'themes/xenea/style_rtl.css',
+ WT_ROOT . 'themes/clouds/chrome.css',
+ WT_ROOT . 'themes/clouds/opera.css',
+ WT_ROOT . 'themes/clouds/print.css',
+ WT_ROOT . 'themes/clouds/style_rtl.css',
+ WT_ROOT . 'themes/colors/chrome.css',
+ WT_ROOT . 'themes/colors/opera.css',
+ WT_ROOT . 'themes/colors/print.css',
+ WT_ROOT . 'themes/colors/style_rtl.css',
+ WT_ROOT . 'themes/fab/chrome.css',
+ WT_ROOT . 'themes/fab/opera.css',
+ WT_ROOT . 'themes/minimal/chrome.css',
+ WT_ROOT . 'themes/minimal/opera.css',
+ WT_ROOT . 'themes/minimal/print.css',
+ WT_ROOT . 'themes/minimal/style_rtl.css',
+ WT_ROOT . 'themes/xenea/chrome.css',
+ WT_ROOT . 'themes/xenea/opera.css',
+ WT_ROOT . 'themes/xenea/print.css',
+ WT_ROOT . 'themes/xenea/style_rtl.css',
// Removed in 1.2.3
//WT_ROOT.'modules_v2', // Do not delete - users may have stored custom modules/data here
// Removed in 1.2.4
- WT_ROOT.'includes/cssparser.inc.php',
- WT_ROOT.'js/strings.js',
- WT_ROOT.'modules_v3/gedcom_favorites/help_text.php',
- WT_ROOT.'modules_v3/GEDFact_assistant/_MEDIA/media_3_find.php',
- WT_ROOT.'modules_v3/GEDFact_assistant/_MEDIA/media_3_search_add.php',
- WT_ROOT.'modules_v3/GEDFact_assistant/_MEDIA/media_5_input.js',
- WT_ROOT.'modules_v3/GEDFact_assistant/_MEDIA/media_5_input.php',
- WT_ROOT.'modules_v3/GEDFact_assistant/_MEDIA/media_7_parse_addLinksTbl.php',
- WT_ROOT.'modules_v3/GEDFact_assistant/_MEDIA/media_query_1a.php',
- WT_ROOT.'modules_v3/GEDFact_assistant/_MEDIA/media_query_2a.php',
- WT_ROOT.'modules_v3/GEDFact_assistant/_MEDIA/media_query_3a.php',
- WT_ROOT.'modules_v3/lightbox/css/album_page_RTL2.css',
- WT_ROOT.'modules_v3/lightbox/css/album_page_RTL.css',
- WT_ROOT.'modules_v3/lightbox/css/album_page_RTL_ff.css',
- WT_ROOT.'modules_v3/lightbox/css/clearbox_music.css',
- WT_ROOT.'modules_v3/lightbox/css/clearbox_music_RTL.css',
- WT_ROOT.'modules_v3/user_favorites/db_schema',
- WT_ROOT.'modules_v3/user_favorites/help_text.php',
- WT_ROOT.'search_engine.php',
- WT_ROOT.'themes/clouds/modules.css',
- WT_ROOT.'themes/colors/modules.css',
- WT_ROOT.'themes/fab/modules.css',
- WT_ROOT.'themes/minimal/modules.css',
- WT_ROOT.'themes/webtrees/modules.css',
- WT_ROOT.'themes/xenea/modules.css',
+ WT_ROOT . 'includes/cssparser.inc.php',
+ WT_ROOT . 'js/strings.js',
+ WT_ROOT . 'modules_v3/gedcom_favorites/help_text.php',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_MEDIA/media_3_find.php',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_MEDIA/media_3_search_add.php',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_MEDIA/media_5_input.js',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_MEDIA/media_5_input.php',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_MEDIA/media_7_parse_addLinksTbl.php',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_MEDIA/media_query_1a.php',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_MEDIA/media_query_2a.php',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_MEDIA/media_query_3a.php',
+ WT_ROOT . 'modules_v3/lightbox/css/album_page_RTL2.css',
+ WT_ROOT . 'modules_v3/lightbox/css/album_page_RTL.css',
+ WT_ROOT . 'modules_v3/lightbox/css/album_page_RTL_ff.css',
+ WT_ROOT . 'modules_v3/lightbox/css/clearbox_music.css',
+ WT_ROOT . 'modules_v3/lightbox/css/clearbox_music_RTL.css',
+ WT_ROOT . 'modules_v3/user_favorites/db_schema',
+ WT_ROOT . 'modules_v3/user_favorites/help_text.php',
+ WT_ROOT . 'search_engine.php',
+ WT_ROOT . 'themes/clouds/modules.css',
+ WT_ROOT . 'themes/colors/modules.css',
+ WT_ROOT . 'themes/fab/modules.css',
+ WT_ROOT . 'themes/minimal/modules.css',
+ WT_ROOT . 'themes/webtrees/modules.css',
+ WT_ROOT . 'themes/xenea/modules.css',
// Removed in 1.2.5
- WT_ROOT.'includes/media_reorder_count.php',
- WT_ROOT.'includes/media_tab_head.php',
- WT_ROOT.'js/behaviour.js.htm',
- WT_ROOT.'js/bennolan',
- WT_ROOT.'js/bosrup',
- WT_ROOT.'js/kryogenix',
- WT_ROOT.'js/overlib.js.htm',
- WT_ROOT.'js/scriptaculous',
- WT_ROOT.'js/scriptaculous.js.htm',
- WT_ROOT.'js/sorttable.js.htm',
- WT_ROOT.'library/WT/JS.php',
- WT_ROOT.'modules_v3/clippings/index.php',
- WT_ROOT.'modules_v3/googlemap/css/googlemap_style.css',
- WT_ROOT.'modules_v3/googlemap/css/wt_v3_places_edit.css',
- WT_ROOT.'modules_v3/googlemap/index.php',
- WT_ROOT.'modules_v3/lightbox/index.php',
- WT_ROOT.'modules_v3/recent_changes/help_text.php',
- WT_ROOT.'modules_v3/todays_events/help_text.php',
- WT_ROOT.'sidebar.php',
+ WT_ROOT . 'includes/media_reorder_count.php',
+ WT_ROOT . 'includes/media_tab_head.php',
+ WT_ROOT . 'js/behaviour.js.htm',
+ WT_ROOT . 'js/bennolan',
+ WT_ROOT . 'js/bosrup',
+ WT_ROOT . 'js/kryogenix',
+ WT_ROOT . 'js/overlib.js.htm',
+ WT_ROOT . 'js/scriptaculous',
+ WT_ROOT . 'js/scriptaculous.js.htm',
+ WT_ROOT . 'js/sorttable.js.htm',
+ WT_ROOT . 'library/WT/JS.php',
+ WT_ROOT . 'modules_v3/clippings/index.php',
+ WT_ROOT . 'modules_v3/googlemap/css/googlemap_style.css',
+ WT_ROOT . 'modules_v3/googlemap/css/wt_v3_places_edit.css',
+ WT_ROOT . 'modules_v3/googlemap/index.php',
+ WT_ROOT . 'modules_v3/lightbox/index.php',
+ WT_ROOT . 'modules_v3/recent_changes/help_text.php',
+ WT_ROOT . 'modules_v3/todays_events/help_text.php',
+ WT_ROOT . 'sidebar.php',
// Removed in 1.2.6
- WT_ROOT.'modules_v3/sitemap/admin_index.php',
- WT_ROOT.'modules_v3/sitemap/help_text.php',
- WT_ROOT.'modules_v3/tree/css/styles',
- WT_ROOT.'modules_v3/tree/css/treebottom.gif',
- WT_ROOT.'modules_v3/tree/css/treebottomleft.gif',
- WT_ROOT.'modules_v3/tree/css/treebottomright.gif',
- WT_ROOT.'modules_v3/tree/css/tree.jpg',
- WT_ROOT.'modules_v3/tree/css/treeleft.gif',
- WT_ROOT.'modules_v3/tree/css/treeright.gif',
- WT_ROOT.'modules_v3/tree/css/treetop.gif',
- WT_ROOT.'modules_v3/tree/css/treetopleft.gif',
- WT_ROOT.'modules_v3/tree/css/treetopright.gif',
- WT_ROOT.'modules_v3/tree/css/treeview_print.css',
- WT_ROOT.'modules_v3/tree/help_text.php',
- WT_ROOT.'modules_v3/tree/images/print.png',
+ WT_ROOT . 'modules_v3/sitemap/admin_index.php',
+ WT_ROOT . 'modules_v3/sitemap/help_text.php',
+ WT_ROOT . 'modules_v3/tree/css/styles',
+ WT_ROOT . 'modules_v3/tree/css/treebottom.gif',
+ WT_ROOT . 'modules_v3/tree/css/treebottomleft.gif',
+ WT_ROOT . 'modules_v3/tree/css/treebottomright.gif',
+ WT_ROOT . 'modules_v3/tree/css/tree.jpg',
+ WT_ROOT . 'modules_v3/tree/css/treeleft.gif',
+ WT_ROOT . 'modules_v3/tree/css/treeright.gif',
+ WT_ROOT . 'modules_v3/tree/css/treetop.gif',
+ WT_ROOT . 'modules_v3/tree/css/treetopleft.gif',
+ WT_ROOT . 'modules_v3/tree/css/treetopright.gif',
+ WT_ROOT . 'modules_v3/tree/css/treeview_print.css',
+ WT_ROOT . 'modules_v3/tree/help_text.php',
+ WT_ROOT . 'modules_v3/tree/images/print.png',
// Removed in 1.2.7
- WT_ROOT.'login_register.php',
- WT_ROOT.'modules_v3/top10_givnnames/help_text.php',
- WT_ROOT.'modules_v3/top10_surnames/help_text.php',
+ WT_ROOT . 'login_register.php',
+ WT_ROOT . 'modules_v3/top10_givnnames/help_text.php',
+ WT_ROOT . 'modules_v3/top10_surnames/help_text.php',
// Removed in 1.3.0
- WT_ROOT.'admin_site_ipaddress.php',
- WT_ROOT.'downloadgedcom.php',
- WT_ROOT.'export_gedcom.php',
- WT_ROOT.'gedcheck.php',
- WT_ROOT.'images',
- WT_ROOT.'includes/dmsounds_UTF8.php',
- WT_ROOT.'includes/functions/functions_name.php',
- WT_ROOT.'includes/grampsxml.rng',
- WT_ROOT.'includes/session_spider.php',
- WT_ROOT.'js/autocomplete.js.htm',
- WT_ROOT.'js/prototype',
- WT_ROOT.'js/prototype.js.htm',
- WT_ROOT.'modules_v3/googlemap/admin_editconfig.php',
- WT_ROOT.'modules_v3/googlemap/admin_placecheck.php',
- WT_ROOT.'modules_v3/googlemap/flags.php',
- WT_ROOT.'modules_v3/googlemap/images/pedigree_map.gif',
- WT_ROOT.'modules_v3/googlemap/pedigree_map.php',
- WT_ROOT.'modules_v3/lightbox/admin_config.php',
- WT_ROOT.'modules_v3/lightbox/album.php',
- WT_ROOT.'modules_v3/tree/css/vline.jpg',
+ WT_ROOT . 'admin_site_ipaddress.php',
+ WT_ROOT . 'downloadgedcom.php',
+ WT_ROOT . 'export_gedcom.php',
+ WT_ROOT . 'gedcheck.php',
+ WT_ROOT . 'images',
+ WT_ROOT . 'includes/dmsounds_UTF8.php',
+ WT_ROOT . 'includes/functions/functions_name.php',
+ WT_ROOT . 'includes/grampsxml.rng',
+ WT_ROOT . 'includes/session_spider.php',
+ WT_ROOT . 'js/autocomplete.js.htm',
+ WT_ROOT . 'js/prototype',
+ WT_ROOT . 'js/prototype.js.htm',
+ WT_ROOT . 'modules_v3/googlemap/admin_editconfig.php',
+ WT_ROOT . 'modules_v3/googlemap/admin_placecheck.php',
+ WT_ROOT . 'modules_v3/googlemap/flags.php',
+ WT_ROOT . 'modules_v3/googlemap/images/pedigree_map.gif',
+ WT_ROOT . 'modules_v3/googlemap/pedigree_map.php',
+ WT_ROOT . 'modules_v3/lightbox/admin_config.php',
+ WT_ROOT . 'modules_v3/lightbox/album.php',
+ WT_ROOT . 'modules_v3/tree/css/vline.jpg',
// Removed in 1.3.1
- WT_ROOT.'imageflush.php',
- WT_ROOT.'includes/functions/functions_places.php',
- WT_ROOT.'js/html5.js',
- WT_ROOT.'modules_v3/googlemap/wt_v3_pedigree_map.js.php',
- WT_ROOT.'modules_v3/lightbox/js/tip_balloon_RTL.js',
+ WT_ROOT . 'imageflush.php',
+ WT_ROOT . 'includes/functions/functions_places.php',
+ WT_ROOT . 'js/html5.js',
+ WT_ROOT . 'modules_v3/googlemap/wt_v3_pedigree_map.js.php',
+ WT_ROOT . 'modules_v3/lightbox/js/tip_balloon_RTL.js',
// Removed in 1.3.2
- WT_ROOT.'includes/set_gedcom_defaults.php',
- WT_ROOT.'modules_v3/address_report',
- WT_ROOT.'modules_v3/lightbox/functions/lb_horiz_sort.php',
- WT_ROOT.'modules_v3/random_media/help_text.php',
+ WT_ROOT . 'includes/set_gedcom_defaults.php',
+ WT_ROOT . 'modules_v3/address_report',
+ WT_ROOT . 'modules_v3/lightbox/functions/lb_horiz_sort.php',
+ WT_ROOT . 'modules_v3/random_media/help_text.php',
// Removed in 1.4.0
- WT_ROOT.'imageview.php',
- WT_ROOT.'includes/functions/functions_media_reorder.php',
- WT_ROOT.'js/jquery',
- WT_ROOT.'js/jw_player',
- WT_ROOT.'js/modernizr.custom-2.6.1.js',
- WT_ROOT.'js/webtrees.js',
- WT_ROOT.'media/MediaInfo.txt',
- WT_ROOT.'media/thumbs/ThumbsInfo.txt',
- WT_ROOT.'modules_v3/GEDFact_assistant/css/media_0_inverselink.css',
- WT_ROOT.'modules_v3/lightbox/help_text.php',
- WT_ROOT.'modules_v3/lightbox/images/blank.gif',
- WT_ROOT.'modules_v3/lightbox/images/close_1.gif',
- WT_ROOT.'modules_v3/lightbox/images/image_add.gif',
- WT_ROOT.'modules_v3/lightbox/images/image_copy.gif',
- WT_ROOT.'modules_v3/lightbox/images/image_delete.gif',
- WT_ROOT.'modules_v3/lightbox/images/image_edit.gif',
- WT_ROOT.'modules_v3/lightbox/images/image_link.gif',
- WT_ROOT.'modules_v3/lightbox/images/images.gif',
- WT_ROOT.'modules_v3/lightbox/images/image_view.gif',
- WT_ROOT.'modules_v3/lightbox/images/loading.gif',
- WT_ROOT.'modules_v3/lightbox/images/next.gif',
- WT_ROOT.'modules_v3/lightbox/images/nextlabel.gif',
- WT_ROOT.'modules_v3/lightbox/images/norm_2.gif',
- WT_ROOT.'modules_v3/lightbox/images/overlay.png',
- WT_ROOT.'modules_v3/lightbox/images/prev.gif',
- WT_ROOT.'modules_v3/lightbox/images/prevlabel.gif',
- WT_ROOT.'modules_v3/lightbox/images/private.gif',
- WT_ROOT.'modules_v3/lightbox/images/slideshow.jpg',
- WT_ROOT.'modules_v3/lightbox/images/transp80px.gif',
- WT_ROOT.'modules_v3/lightbox/images/zoom_1.gif',
- WT_ROOT.'modules_v3/lightbox/js',
- WT_ROOT.'modules_v3/lightbox/music',
- WT_ROOT.'modules_v3/lightbox/pic',
- WT_ROOT.'themes/_administration/jquery',
- WT_ROOT.'themes/webtrees/chrome.css',
+ WT_ROOT . 'imageview.php',
+ WT_ROOT . 'includes/functions/functions_media_reorder.php',
+ WT_ROOT . 'js/jquery',
+ WT_ROOT . 'js/jw_player',
+ WT_ROOT . 'js/modernizr.custom-2.6.1.js',
+ WT_ROOT . 'js/webtrees.js',
+ WT_ROOT . 'media/MediaInfo.txt',
+ WT_ROOT . 'media/thumbs/ThumbsInfo.txt',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/css/media_0_inverselink.css',
+ WT_ROOT . 'modules_v3/lightbox/help_text.php',
+ WT_ROOT . 'modules_v3/lightbox/images/blank.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/close_1.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/image_add.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/image_copy.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/image_delete.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/image_edit.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/image_link.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/images.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/image_view.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/loading.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/next.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/nextlabel.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/norm_2.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/overlay.png',
+ WT_ROOT . 'modules_v3/lightbox/images/prev.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/prevlabel.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/private.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/slideshow.jpg',
+ WT_ROOT . 'modules_v3/lightbox/images/transp80px.gif',
+ WT_ROOT . 'modules_v3/lightbox/images/zoom_1.gif',
+ WT_ROOT . 'modules_v3/lightbox/js',
+ WT_ROOT . 'modules_v3/lightbox/music',
+ WT_ROOT . 'modules_v3/lightbox/pic',
+ WT_ROOT . 'themes/_administration/jquery',
+ WT_ROOT . 'themes/webtrees/chrome.css',
// Removed in 1.4.1
- WT_ROOT.'js/webtrees-1.4.0.js',
- WT_ROOT.'modules_v3/lightbox/images/image_edit.png',
- WT_ROOT.'modules_v3/lightbox/images/image_view.png',
+ WT_ROOT . 'js/webtrees-1.4.0.js',
+ WT_ROOT . 'modules_v3/lightbox/images/image_edit.png',
+ WT_ROOT . 'modules_v3/lightbox/images/image_view.png',
// Removed in 1.4.2
- WT_ROOT.'modules_v3/lightbox/images/image_view.png',
- WT_ROOT.'js/jquery.colorbox-1.4.3.js',
- WT_ROOT.'js/jquery-ui-1.10.0.js',
- WT_ROOT.'js/webtrees-1.4.1.js',
- WT_ROOT.'modules_v3/top10_pageviews/help_text.php',
- WT_ROOT.'themes/_administration/jquery-ui-1.10.0',
- WT_ROOT.'themes/clouds/jquery-ui-1.10.0',
- WT_ROOT.'themes/colors/jquery-ui-1.10.0',
- WT_ROOT.'themes/fab/jquery-ui-1.10.0',
- WT_ROOT.'themes/minimal/jquery-ui-1.10.0',
- WT_ROOT.'themes/webtrees/jquery-ui-1.10.0',
- WT_ROOT.'themes/xenea/jquery-ui-1.10.0',
+ WT_ROOT . 'modules_v3/lightbox/images/image_view.png',
+ WT_ROOT . 'js/jquery.colorbox-1.4.3.js',
+ WT_ROOT . 'js/jquery-ui-1.10.0.js',
+ WT_ROOT . 'js/webtrees-1.4.1.js',
+ WT_ROOT . 'modules_v3/top10_pageviews/help_text.php',
+ WT_ROOT . 'themes/_administration/jquery-ui-1.10.0',
+ WT_ROOT . 'themes/clouds/jquery-ui-1.10.0',
+ WT_ROOT . 'themes/colors/jquery-ui-1.10.0',
+ WT_ROOT . 'themes/fab/jquery-ui-1.10.0',
+ WT_ROOT . 'themes/minimal/jquery-ui-1.10.0',
+ WT_ROOT . 'themes/webtrees/jquery-ui-1.10.0',
+ WT_ROOT . 'themes/xenea/jquery-ui-1.10.0',
// Removed in 1.5.0
- WT_ROOT.'includes/functions/functions_mail.php',
- WT_ROOT.'includes/functions/functions_privacy.php',
- WT_ROOT.'includes/media_reorder.php',
- WT_ROOT.'includes/old_messages.php',
- WT_ROOT.'js/jquery-1.9.1.js',
- WT_ROOT.'js/jquery.cookie-1.3.1.js',
- WT_ROOT.'js/webtrees-1.4.2.js',
- WT_ROOT.'library/WT/Event.php',
- WT_ROOT.'library/WT/Person.php',
- WT_ROOT.'library/phpmailer',
- WT_ROOT.'modules_v3/GEDFact_assistant/_CENS/census_note_decode.php',
- WT_ROOT.'modules_v3/GEDFact_assistant/_CENS/census_asst_date.php',
- WT_ROOT.'modules_v3/googlemap/wt_v3_googlemap.js.php',
- WT_ROOT.'modules_v3/lightbox/functions/lightbox_print_media.php',
- WT_ROOT.'modules_v3/upcoming_events/help_text.php',
- WT_ROOT.'modules_v3/stories/help_text.php',
- WT_ROOT.'modules_v3/user_messages/help_text.php',
- WT_ROOT.'themes/_administration/favicon.png',
- WT_ROOT.'themes/_administration/images',
- WT_ROOT.'themes/_administration/msie.css',
- WT_ROOT.'themes/_administration/style.css',
- WT_ROOT.'themes/clouds/favicon.png',
- WT_ROOT.'themes/clouds/images',
- WT_ROOT.'themes/clouds/msie.css',
- WT_ROOT.'themes/clouds/style.css',
- WT_ROOT.'themes/colors/css',
- WT_ROOT.'themes/colors/favicon.png',
- WT_ROOT.'themes/colors/images',
- WT_ROOT.'themes/colors/ipad.css',
- WT_ROOT.'themes/colors/msie.css',
- WT_ROOT.'themes/fab/favicon.png',
- WT_ROOT.'themes/fab/images',
- WT_ROOT.'themes/fab/msie.css',
- WT_ROOT.'themes/fab/style.css',
- WT_ROOT.'themes/minimal/favicon.png',
- WT_ROOT.'themes/minimal/images',
- WT_ROOT.'themes/minimal/msie.css',
- WT_ROOT.'themes/minimal/style.css',
- WT_ROOT.'themes/webtrees/favicon.png',
- WT_ROOT.'themes/webtrees/images',
- WT_ROOT.'themes/webtrees/msie.css',
- WT_ROOT.'themes/webtrees/style.css',
- WT_ROOT.'themes/xenea/favicon.png',
- WT_ROOT.'themes/xenea/images',
- WT_ROOT.'themes/xenea/msie.css',
- WT_ROOT.'themes/xenea/style.css',
+ WT_ROOT . 'includes/functions/functions_mail.php',
+ WT_ROOT . 'includes/functions/functions_privacy.php',
+ WT_ROOT . 'includes/media_reorder.php',
+ WT_ROOT . 'includes/old_messages.php',
+ WT_ROOT . 'js/jquery-1.9.1.js',
+ WT_ROOT . 'js/jquery.cookie-1.3.1.js',
+ WT_ROOT . 'js/webtrees-1.4.2.js',
+ WT_ROOT . 'library/WT/Event.php',
+ WT_ROOT . 'library/WT/Person.php',
+ WT_ROOT . 'library/phpmailer',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_CENS/census_note_decode.php',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_CENS/census_asst_date.php',
+ WT_ROOT . 'modules_v3/googlemap/wt_v3_googlemap.js.php',
+ WT_ROOT . 'modules_v3/lightbox/functions/lightbox_print_media.php',
+ WT_ROOT . 'modules_v3/upcoming_events/help_text.php',
+ WT_ROOT . 'modules_v3/stories/help_text.php',
+ WT_ROOT . 'modules_v3/user_messages/help_text.php',
+ WT_ROOT . 'themes/_administration/favicon.png',
+ WT_ROOT . 'themes/_administration/images',
+ WT_ROOT . 'themes/_administration/msie.css',
+ WT_ROOT . 'themes/_administration/style.css',
+ WT_ROOT . 'themes/clouds/favicon.png',
+ WT_ROOT . 'themes/clouds/images',
+ WT_ROOT . 'themes/clouds/msie.css',
+ WT_ROOT . 'themes/clouds/style.css',
+ WT_ROOT . 'themes/colors/css',
+ WT_ROOT . 'themes/colors/favicon.png',
+ WT_ROOT . 'themes/colors/images',
+ WT_ROOT . 'themes/colors/ipad.css',
+ WT_ROOT . 'themes/colors/msie.css',
+ WT_ROOT . 'themes/fab/favicon.png',
+ WT_ROOT . 'themes/fab/images',
+ WT_ROOT . 'themes/fab/msie.css',
+ WT_ROOT . 'themes/fab/style.css',
+ WT_ROOT . 'themes/minimal/favicon.png',
+ WT_ROOT . 'themes/minimal/images',
+ WT_ROOT . 'themes/minimal/msie.css',
+ WT_ROOT . 'themes/minimal/style.css',
+ WT_ROOT . 'themes/webtrees/favicon.png',
+ WT_ROOT . 'themes/webtrees/images',
+ WT_ROOT . 'themes/webtrees/msie.css',
+ WT_ROOT . 'themes/webtrees/style.css',
+ WT_ROOT . 'themes/xenea/favicon.png',
+ WT_ROOT . 'themes/xenea/images',
+ WT_ROOT . 'themes/xenea/msie.css',
+ WT_ROOT . 'themes/xenea/style.css',
// Removed in 1.5.1
- WT_ROOT.'js/webtrees-1.5.0.js',
- WT_ROOT.'themes/_administration/css-1.5.0',
- WT_ROOT.'themes/clouds/css-1.5.0',
- WT_ROOT.'themes/colors/css-1.5.0',
- WT_ROOT.'themes/fab/css-1.5.0',
- WT_ROOT.'themes/minimal/css-1.5.0',
- WT_ROOT.'themes/webtrees/css-1.5.0',
- WT_ROOT.'themes/xenea/css-1.5.0',
+ WT_ROOT . 'js/webtrees-1.5.0.js',
+ WT_ROOT . 'themes/_administration/css-1.5.0',
+ WT_ROOT . 'themes/clouds/css-1.5.0',
+ WT_ROOT . 'themes/colors/css-1.5.0',
+ WT_ROOT . 'themes/fab/css-1.5.0',
+ WT_ROOT . 'themes/minimal/css-1.5.0',
+ WT_ROOT . 'themes/webtrees/css-1.5.0',
+ WT_ROOT . 'themes/xenea/css-1.5.0',
// Removed in 1.5.2
- WT_ROOT.'js/webtrees-1.5.1.js',
- WT_ROOT.'themes/_administration/css-1.5.1',
- WT_ROOT.'themes/clouds/css-1.5.1',
- WT_ROOT.'themes/colors/css-1.5.1',
- WT_ROOT.'themes/fab/css-1.5.1',
- WT_ROOT.'themes/minimal/css-1.5.1',
- WT_ROOT.'themes/webtrees/css-1.5.1',
- WT_ROOT.'themes/xenea/css-1.5.1',
+ WT_ROOT . 'js/webtrees-1.5.1.js',
+ WT_ROOT . 'themes/_administration/css-1.5.1',
+ WT_ROOT . 'themes/clouds/css-1.5.1',
+ WT_ROOT . 'themes/colors/css-1.5.1',
+ WT_ROOT . 'themes/fab/css-1.5.1',
+ WT_ROOT . 'themes/minimal/css-1.5.1',
+ WT_ROOT . 'themes/webtrees/css-1.5.1',
+ WT_ROOT . 'themes/xenea/css-1.5.1',
// Removed in 1.5.3
- WT_ROOT.'js/jquery-1.10.2.js',
- WT_ROOT.'js/jquery-ui-1.10.3.js',
- WT_ROOT.'js/webtrees-1.5.2.js',
- WT_ROOT.'library/htmlpurifier-4.6.0',
+ WT_ROOT . 'js/jquery-1.10.2.js',
+ WT_ROOT . 'js/jquery-ui-1.10.3.js',
+ WT_ROOT . 'js/webtrees-1.5.2.js',
+ WT_ROOT . 'library/htmlpurifier-4.6.0',
//WT_ROOT.'library/Michelf', On windows, this would delete library/michelf
- WT_ROOT.'library/tcpdf',
- WT_ROOT.'library/Zend',
- WT_ROOT.'modules_v3/GEDFact_assistant/_CENS/census_asst_help.php',
- WT_ROOT.'modules_v3/googlemap/admin_places.php',
- WT_ROOT.'modules_v3/googlemap/defaultconfig.php',
- WT_ROOT.'modules_v3/googlemap/googlemap.php',
- WT_ROOT.'modules_v3/googlemap/placehierarchy.php',
- WT_ROOT.'modules_v3/googlemap/places_edit.php',
- WT_ROOT.'modules_v3/googlemap/util.js',
- WT_ROOT.'modules_v3/googlemap/wt_v3_places_edit.js.php',
- WT_ROOT.'modules_v3/googlemap/wt_v3_places_edit_overlays.js.php',
- WT_ROOT.'modules_v3/googlemap/wt_v3_street_view.php',
- WT_ROOT.'readme.html',
- WT_ROOT.'themes/_administration/css-1.5.2',
- WT_ROOT.'themes/clouds/css-1.5.2',
- WT_ROOT.'themes/colors/css-1.5.2',
- WT_ROOT.'themes/fab/css-1.5.2',
- WT_ROOT.'themes/minimal/css-1.5.2',
- WT_ROOT.'themes/webtrees/css-1.5.2',
- WT_ROOT.'themes/xenea/css-1.5.2',
+ WT_ROOT . 'library/tcpdf',
+ WT_ROOT . 'library/Zend',
+ WT_ROOT . 'modules_v3/GEDFact_assistant/_CENS/census_asst_help.php',
+ WT_ROOT . 'modules_v3/googlemap/admin_places.php',
+ WT_ROOT . 'modules_v3/googlemap/defaultconfig.php',
+ WT_ROOT . 'modules_v3/googlemap/googlemap.php',
+ WT_ROOT . 'modules_v3/googlemap/placehierarchy.php',
+ WT_ROOT . 'modules_v3/googlemap/places_edit.php',
+ WT_ROOT . 'modules_v3/googlemap/util.js',
+ WT_ROOT . 'modules_v3/googlemap/wt_v3_places_edit.js.php',
+ WT_ROOT . 'modules_v3/googlemap/wt_v3_places_edit_overlays.js.php',
+ WT_ROOT . 'modules_v3/googlemap/wt_v3_street_view.php',
+ WT_ROOT . 'readme.html',
+ WT_ROOT . 'themes/_administration/css-1.5.2',
+ WT_ROOT . 'themes/clouds/css-1.5.2',
+ WT_ROOT . 'themes/colors/css-1.5.2',
+ WT_ROOT . 'themes/fab/css-1.5.2',
+ WT_ROOT . 'themes/minimal/css-1.5.2',
+ WT_ROOT . 'themes/webtrees/css-1.5.2',
+ WT_ROOT . 'themes/xenea/css-1.5.2',
// Removed in 1.6.0
- WT_ROOT.'downloadbackup.php',
- WT_ROOT.'includes/functions/functions_utf-8.php',
- WT_ROOT.'js/jquery.colorbox-1.4.15.js',
- WT_ROOT.'js/jquery.cookie-1.4.0.js',
- WT_ROOT.'js/jquery.datatables-1.9.4.js',
- WT_ROOT.'js/jquery.jeditable-1.7.1.js',
- WT_ROOT.'js/jquery.wheelzoom-1.1.2.js',
- WT_ROOT.'js/jquery-1.11.0.js',
- WT_ROOT.'js/webtrees-1.5.3.js',
- WT_ROOT.'library/WT/Debug.php',
- WT_ROOT.'modules_v3/ckeditor/ckeditor-4.3.2-custom',
- WT_ROOT.'site-php-version.php',
- WT_ROOT.'themes/_administration/css-1.5.3',
- WT_ROOT.'themes/clouds/css-1.5.3',
- WT_ROOT.'themes/colors/css-1.5.3',
- WT_ROOT.'themes/fab/css-1.5.3',
- WT_ROOT.'themes/minimal/css-1.5.3',
- WT_ROOT.'themes/webtrees/css-1.5.3',
- WT_ROOT.'themes/xenea/css-1.5.3',
+ WT_ROOT . 'downloadbackup.php',
+ WT_ROOT . 'includes/functions/functions_utf-8.php',
+ WT_ROOT . 'js/jquery.colorbox-1.4.15.js',
+ WT_ROOT . 'js/jquery.cookie-1.4.0.js',
+ WT_ROOT . 'js/jquery.datatables-1.9.4.js',
+ WT_ROOT . 'js/jquery.jeditable-1.7.1.js',
+ WT_ROOT . 'js/jquery.wheelzoom-1.1.2.js',
+ WT_ROOT . 'js/jquery-1.11.0.js',
+ WT_ROOT . 'js/webtrees-1.5.3.js',
+ WT_ROOT . 'library/WT/Debug.php',
+ WT_ROOT . 'modules_v3/ckeditor/ckeditor-4.3.2-custom',
+ WT_ROOT . 'site-php-version.php',
+ WT_ROOT . 'themes/_administration/css-1.5.3',
+ WT_ROOT . 'themes/clouds/css-1.5.3',
+ WT_ROOT . 'themes/colors/css-1.5.3',
+ WT_ROOT . 'themes/fab/css-1.5.3',
+ WT_ROOT . 'themes/minimal/css-1.5.3',
+ WT_ROOT . 'themes/webtrees/css-1.5.3',
+ WT_ROOT . 'themes/xenea/css-1.5.3',
// Removed in 1.6.1
- WT_ROOT.'includes/authentication.php',
+ WT_ROOT . 'includes/authentication.php',
// Removed in 1.6.2
- WT_ROOT.'js/jquery.colorbox-1.5.9.js',
- WT_ROOT.'js/jquery-ui-1.10.4.js',
- WT_ROOT.'js/modernizr.custom-2.6.2.js',
- WT_ROOT.'js/webtrees-1.6.0.js',
- WT_ROOT.'themes/_administration/css-1.6.0',
- WT_ROOT.'themes/_administration/jquery-ui-1.10.3',
- WT_ROOT.'themes/clouds/css-1.6.0',
- WT_ROOT.'themes/clouds/jquery-ui-1.10.3',
- WT_ROOT.'themes/colors/css-1.6.0',
- WT_ROOT.'themes/colors/jquery-ui-1.10.3',
- WT_ROOT.'themes/fab/css-1.6.0',
- WT_ROOT.'themes/fab/jquery-ui-1.10.3',
- WT_ROOT.'themes/minimal/css-1.6.0',
- WT_ROOT.'themes/minimal/jquery-ui-1.10.3',
- WT_ROOT.'themes/webtrees/css-1.6.0',
- WT_ROOT.'themes/webtrees/jquery-ui-1.10.3',
- WT_ROOT.'themes/xenea/css-1.6.0',
- WT_ROOT.'themes/xenea/jquery-ui-1.10.3',
- WT_ROOT.'themes/_administration/css-1.6.0',
- WT_ROOT.'themes/_administration/jquery-ui-1.10.3',
+ WT_ROOT . 'js/jquery.colorbox-1.5.9.js',
+ WT_ROOT . 'js/jquery-ui-1.10.4.js',
+ WT_ROOT . 'js/modernizr.custom-2.6.2.js',
+ WT_ROOT . 'js/webtrees-1.6.0.js',
+ WT_ROOT . 'themes/_administration/css-1.6.0',
+ WT_ROOT . 'themes/_administration/jquery-ui-1.10.3',
+ WT_ROOT . 'themes/clouds/css-1.6.0',
+ WT_ROOT . 'themes/clouds/jquery-ui-1.10.3',
+ WT_ROOT . 'themes/colors/css-1.6.0',
+ WT_ROOT . 'themes/colors/jquery-ui-1.10.3',
+ WT_ROOT . 'themes/fab/css-1.6.0',
+ WT_ROOT . 'themes/fab/jquery-ui-1.10.3',
+ WT_ROOT . 'themes/minimal/css-1.6.0',
+ WT_ROOT . 'themes/minimal/jquery-ui-1.10.3',
+ WT_ROOT . 'themes/webtrees/css-1.6.0',
+ WT_ROOT . 'themes/webtrees/jquery-ui-1.10.3',
+ WT_ROOT . 'themes/xenea/css-1.6.0',
+ WT_ROOT . 'themes/xenea/jquery-ui-1.10.3',
+ WT_ROOT . 'themes/_administration/css-1.6.0',
+ WT_ROOT . 'themes/_administration/jquery-ui-1.10.3',
// Removed in 1.6.3
- WT_ROOT.'js/jquery-1.11.1.js',
- WT_ROOT.'js/jquery.datatables-1.10.3.js',
+ WT_ROOT . 'js/jquery-1.11.1.js',
+ WT_ROOT . 'js/jquery.datatables-1.10.3.js',
+ // Removed in 1.7.0
+ WT_ROOT . 'library/WT/MenuBar.php',
);
}
diff --git a/admin_media.php b/admin_media.php
index c448b90e0e..8a426723e7 100644
--- a/admin_media.php
+++ b/admin_media.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -92,16 +92,16 @@ case 'load_json':
case 'local':
// Filtered rows
$SELECT1 =
- "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS TRIM(LEADING ? FROM m_filename) AS media_path, m_id AS xref, m_titl, m_file AS gedcom_id, m_gedcom AS gedcom" .
- " FROM `##media`" .
- " JOIN `##gedcom_setting` ON (m_file = gedcom_id AND setting_name = 'MEDIA_DIRECTORY')" .
- " JOIN `##gedcom` USING (gedcom_id)" .
- " WHERE setting_value=?" .
- " AND m_filename LIKE CONCAT(?, '%')" .
- " AND (SUBSTRING_INDEX(m_filename, '/', -1) LIKE CONCAT('%', ?, '%')" .
- " OR m_titl LIKE CONCAT('%', ?, '%'))" .
- " AND m_filename NOT LIKE 'http://%'" .
- " AND m_filename NOT LIKE 'https://%'";
+ "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS TRIM(LEADING ? FROM m_filename) AS media_path, m_id AS xref, m_titl, m_file AS gedcom_id, m_gedcom AS gedcom" .
+ " FROM `##media`" .
+ " JOIN `##gedcom_setting` ON (m_file = gedcom_id AND setting_name = 'MEDIA_DIRECTORY')" .
+ " JOIN `##gedcom` USING (gedcom_id)" .
+ " WHERE setting_value=?" .
+ " AND m_filename LIKE CONCAT(?, '%')" .
+ " AND (SUBSTRING_INDEX(m_filename, '/', -1) LIKE CONCAT('%', ?, '%')" .
+ " OR m_titl LIKE CONCAT('%', ?, '%'))" .
+ " AND m_filename NOT LIKE 'http://%'" .
+ " AND m_filename NOT LIKE 'https://%'";
$ARGS1 = array(
$media_path,
$media_folder,
@@ -111,13 +111,13 @@ case 'load_json':
);
// Unfiltered rows
$SELECT2 =
- "SELECT SQL_CACHE COUNT(*)" .
- " FROM `##media`" .
- " JOIN `##gedcom_setting` ON (m_file = gedcom_id AND setting_name = 'MEDIA_DIRECTORY')" .
- " WHERE setting_value=?" .
- " AND m_filename LIKE CONCAT(?, '%')" .
- " AND m_filename NOT LIKE 'http://%'" .
- " AND m_filename NOT LIKE 'https://%'";
+ "SELECT SQL_CACHE COUNT(*)" .
+ " FROM `##media`" .
+ " JOIN `##gedcom_setting` ON (m_file = gedcom_id AND setting_name = 'MEDIA_DIRECTORY')" .
+ " WHERE setting_value=?" .
+ " AND m_filename LIKE CONCAT(?, '%')" .
+ " AND m_filename NOT LIKE 'http://%'" .
+ " AND m_filename NOT LIKE 'https://%'";
$ARGS2 = array(
$media_folder,
$media_path
@@ -176,19 +176,19 @@ case 'load_json':
case 'external':
// Filtered rows
$SELECT1 =
- "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS m_filename, m_id AS xref, m_titl, m_file AS gedcom_id, m_gedcom AS gedcom" .
- " FROM `##media`" .
- " WHERE (m_filename LIKE 'http://%' OR m_filename LIKE 'https://%')" .
- " AND (m_filename LIKE CONCAT('%', ?, '%') OR m_titl LIKE CONCAT('%', ?, '%'))";
+ "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS m_filename, m_id AS xref, m_titl, m_file AS gedcom_id, m_gedcom AS gedcom" .
+ " FROM `##media`" .
+ " WHERE (m_filename LIKE 'http://%' OR m_filename LIKE 'https://%')" .
+ " AND (m_filename LIKE CONCAT('%', ?, '%') OR m_titl LIKE CONCAT('%', ?, '%'))";
$ARGS1 = array(
WT_Filter::escapeLike($search),
WT_Filter::escapeLike($search)
);
// Unfiltered rows
$SELECT2 =
- "SELECT SQL_CACHE COUNT(*)" .
- " FROM `##media`" .
- " WHERE (m_filename LIKE 'http://%' OR m_filename LIKE 'https://%')";
+ "SELECT SQL_CACHE COUNT(*)" .
+ " FROM `##media`" .
+ " WHERE (m_filename LIKE 'http://%' OR m_filename LIKE 'https://%')";
$ARGS2 = array();
if ($length>0) {
@@ -228,7 +228,7 @@ case 'load_json':
foreach ($rows as $row) {
$media = WT_Media::getInstance($row->xref, $row->gedcom_id, $row->gedcom);
$data[] = array(
- WT_Gedcom_Tag::getLabelValue('URL', $row->m_filename),
+ WT_Gedcom_Tag::getLabelValue('URL', $row->m_filename),
$media->displayImage(),
mediaObjectInfo($media),
);
@@ -312,7 +312,8 @@ case 'load_json':
}
header('Content-type: application/json');
- echo json_encode(array( // See http://www.datatables.net/usage/server-side
+ // See http://www.datatables.net/usage/server-side
+ echo json_encode(array(
'draw' => WT_Filter::getInteger('draw'), // String, but always an integer
'recordsTotal' => $recordsTotal,
'recordsFiltered' => $recordsFiltered,
@@ -492,14 +493,12 @@ function mediaObjectInfo(WT_Media $media) {
'<b>' . $name . '</b>' .
'<div><i>' . WT_Filter::escapeHtml($media->getNote()) . '</i></div>' .
'<br>' .
- '<a href="' . $media->getHtmlUrl() . '">' . WT_I18N::translate('View') . '</a>';
-
- $html .=
- ' - ' .
- '<a onclick="window.open(\'addmedia.php?action=editmedia&amp;pid=' . $xref . '&ged=' . WT_Filter::escapeJs($gedcom) . '\', \'_blank\', edit_window_specs)" href="#">' . WT_I18N::Translate('Edit') . '</a>' .
- ' - ' .
- '<a onclick="return delete_media(\'' . WT_Filter::escapeJs(WT_I18N::translate('Are you sure you want to delete “%s”?', strip_tags($media->getFullName()))) . '\', \'' . $media->getXref() . '\', \'' . WT_Filter::escapeJs($gedcom) . '\');" href="#">' . WT_I18N::Translate('Delete') . '</a>' .
- ' - ';
+ '<a href="' . $media->getHtmlUrl() . '">' . WT_I18N::translate('View') . '</a>' .
+ ' - ' .
+ '<a onclick="window.open(\'addmedia.php?action=editmedia&amp;pid=' . $xref . '&ged=' . WT_Filter::escapeJs($gedcom) . '\', \'_blank\', edit_window_specs)" href="#">' . WT_I18N::Translate('Edit') . '</a>' .
+ ' - ' .
+ '<a onclick="return delete_media(\'' . WT_Filter::escapeJs(WT_I18N::translate('Are you sure you want to delete “%s”?', strip_tags($media->getFullName()))) . '\', \'' . $media->getXref() . '\', \'' . WT_Filter::escapeJs($gedcom) . '\');" href="#">' . WT_I18N::Translate('Delete') . '</a>' .
+ ' - ';
if (array_key_exists('GEDFact_assistant', WT_Module::getActiveModules())) {
$html .= '<a onclick="return ilinkitem(\'' . $xref . '\', \'manage\', \'' . $gedcom . '\')" href="#">' . WT_I18N::Translate('Manage links') . '</a>';
@@ -537,10 +536,12 @@ function mediaObjectInfo(WT_Media $media) {
foreach ($media->linkedSources('OBJE') as $link) {
$linked[] = '<a href="' . $link->getHtmlUrl() . '">' . $link->getFullName() . '</a>';
}
- foreach ($media->linkedNotes('OBJE') as $link) { // Invalid GEDCOM - you cannot link a NOTE to an OBJE
+ foreach ($media->linkedNotes('OBJE') as $link) {
+ // Invalid GEDCOM - you cannot link a NOTE to an OBJE
$linked[] = '<a href="' . $link->getHtmlUrl() . '">' . $link->getFullName() . '</a>';
}
- foreach ($media->linkedRepositories('OBJE') as $link) { // Invalid GEDCOM - you cannot link a REPO to an OBJE
+ foreach ($media->linkedRepositories('OBJE') as $link) {
+ // Invalid GEDCOM - you cannot link a REPO to an OBJE
$linked[] = '<a href="' . $link->getHtmlUrl() . '">' . $link->getFullName() . '</a>';
}
if ($linked) {
@@ -570,6 +571,7 @@ $controller
->restrictAccess(Auth::isAdmin())
->setPageTitle(WT_I18N::translate('Media'))
->addExternalJavascript(WT_JQUERY_DATATABLES_URL)
+ ->addExternalJavascript(WT_DATATABLES_BOOTSTRAP_JS_URL)
->pageHeader()
->addInlineJavascript('
jQuery("#media-table-' . $table_id . '").dataTable({
@@ -591,7 +593,13 @@ $controller
]
});
');
+
?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
<form method="get" action="<?php echo WT_SCRIPT_NAME; ?>">
<table class="media_items">
@@ -612,41 +620,40 @@ $controller
</td>
<td>
<?php
- switch ($files) {
- case 'local':
- case 'unused':
- $extra = 'onchange="this.form.submit();"';
- echo
- '<span dir="ltr">', // The full path will be LTR or mixed LTR/RTL. Force LTR.
- WT_DATA_DIR;
- // Don’t show a list of media folders if it just contains one folder
- if (count($media_folders)>1) {
- echo '&nbsp;', select_edit_control('media_folder', $media_folders, null, $media_folder, $extra);
- } else {
- echo $media_folder, '<input type="hidden" name="media_folder" value="', WT_Filter::escapeHtml($media_folder), '">';
- }
- // Don’t show a list of subfolders if it just contains one subfolder
- if (count($media_paths)>1) {
- echo '&nbsp;', select_edit_control('media_path', $media_paths, null, $media_path, $extra);
- } else {
- echo $media_path, '<input type="hidden" name="media_path" value="', WT_Filter::escapeHtml($media_path), '">';
- }
- echo
- '</span>',
- '<div>',
- '<input type="radio" name="subfolders" value="include"', ($subfolders=='include' ? ' checked="checked"' : ''), ' onchange="this.form.submit();">',
- WT_I18N::translate('Include subfolders'),
- '<br>',
- '<input type="radio" name="subfolders" value="exclude"', ($subfolders=='exclude' ? ' checked="checked"' : ''), ' onchange="this.form.submit();">',
- WT_I18N::translate('Exclude subfolders'),
- '</div>';
- break;
- case 'external':
- echo WT_I18N::translate('External media files have a URL instead of a filename.');
- echo '<input type="hidden" name="media_folder" value="', WT_Filter::escapeHtml($media_folder), '">';
- echo '<input type="hidden" name="media_path" value="', WT_Filter::escapeHtml($media_path), '">';
- break;
+ switch ($files) {
+ case 'local':
+ case 'unused':
+ echo
+ '<span dir="ltr">', // The full path will be LTR or mixed LTR/RTL. Force LTR.
+ WT_DATA_DIR;
+ // Don’t show a list of media folders if it just contains one folder
+ if (count($media_folders)>1) {
+ echo '&nbsp;', select_edit_control('media_folder', $media_folders, null, $media_folder, 'onchange="this.form.submit();"');
+ } else {
+ echo $media_folder, '<input type="hidden" name="media_folder" value="', WT_Filter::escapeHtml($media_folder), '">';
+ }
+ // Don’t show a list of subfolders if it just contains one subfolder
+ if (count($media_paths) > 1) {
+ echo '&nbsp;', select_edit_control('media_path', $media_paths, null, $media_path, 'onchange="this.form.submit();"');
+ } else {
+ echo $media_path, '<input type="hidden" name="media_path" value="', WT_Filter::escapeHtml($media_path), '">';
}
+ echo
+ '</span>',
+ '<div>',
+ '<input type="radio" name="subfolders" value="include"', ($subfolders=='include' ? ' checked="checked"' : ''), ' onchange="this.form.submit();">',
+ WT_I18N::translate('Include subfolders'),
+ '<br>',
+ '<input type="radio" name="subfolders" value="exclude"', ($subfolders=='exclude' ? ' checked="checked"' : ''), ' onchange="this.form.submit();">',
+ WT_I18N::translate('Exclude subfolders'),
+ '</div>';
+ break;
+ case 'external':
+ echo WT_I18N::translate('External media files have a URL instead of a filename.');
+ echo '<input type="hidden" name="media_folder" value="', WT_Filter::escapeHtml($media_folder), '">';
+ echo '<input type="hidden" name="media_path" value="', WT_Filter::escapeHtml($media_path), '">';
+ break;
+ }
?>
</td>
</tr>
diff --git a/admin_media_upload.php b/admin_media_upload.php
index e9164d7ef7..f4168612c8 100644
--- a/admin_media_upload.php
+++ b/admin_media_upload.php
@@ -2,7 +2,7 @@
// Allow admin users to upload media files using a web interface.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team.
@@ -153,7 +153,7 @@ if ($action == "upload") {
$thumbFile = preg_replace('/\.[a-z0-9]{3,5}$/', '.' . $extension, $fileName);
$serverFileName = WT_DATA_DIR . $MEDIA_DIRECTORY . 'thumbs/' . $folderName . $thumbFile;
if (move_uploaded_file($_FILES['thumbnail' . $i]['tmp_name'], $serverFileName)) {
- WT_FlashMessages::addMessage(WT_I18N::translate('The file %s was uploaded.', '<span class="filename">' . $serverFileName . '</span>'));
+ WT_FlashMessages::addMessage(WT_I18N::translate('The file %s was uploaded.', '<span class="filename">' . $serverFileName . '</span>'));
Log::addMediaLog('Thumbnail file ' . $serverFileName . ' uploaded');
}
}
@@ -169,7 +169,18 @@ $mediaFolders = WT_Query_Media::folderListAll();
// Determine file size limit
// TODO: do we need to check post_max_size size too?
$filesize = ini_get('upload_max_filesize');
-if (empty($filesize)) $filesize = "2M";
+if (empty($filesize)) {
+ $filesize = "2M";
+}
+
+?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
+<?php
+
// Print the form
echo '<form name="uploadmedia" enctype="multipart/form-data" method="post" action="', WT_SCRIPT_NAME, '">';
@@ -199,7 +210,9 @@ for ($i=1; $i<6; $i++) {
echo '</td>';
echo '<td>';
echo '<input name="filename', $i, '" type="text" size="40">';
- if ($i==1) echo "<br><sub>", WT_I18N::translate('Do not change to keep original filename.'), "</sub>";
+ if ($i == 1) {
+ echo "<br><sub>", WT_I18N::translate('Do not change to keep original filename.'), "</sub>";
+ }
echo '</td></tr>';
} else {
echo '<tr style="display:none;"><td><input type="hidden" name="filename', $i, '" value=""></td></tr>';
@@ -214,7 +227,9 @@ for ($i=1; $i<6; $i++) {
echo '<span dir="ltr"><select name="folder_list', $i, '" onchange="document.uploadmedia.folder', $i, '.value=this.options[this.selectedIndex].value;">';
echo '<option';
echo ' value="/"> ', WT_I18N::translate('Choose: '), ' </option>';
- if (Auth::isAdmin()) echo '<option value="other" disabled>', WT_I18N::translate('Other folder… please type in'), "</option>";
+ if (Auth::isAdmin()) {
+ echo '<option value="other" disabled>', WT_I18N::translate('Other folder… please type in'), "</option>";
+ }
foreach ($mediaFolders as $f) {
echo '<option value="', WT_Filter::escapeHtml($f), '">', WT_Filter::escapeHtml($f), "</option>";
}
diff --git a/admin_module_blocks.php b/admin_module_blocks.php
index c3a2b8bd16..bd29e4bb61 100644
--- a/admin_module_blocks.php
+++ b/admin_module_blocks.php
@@ -2,7 +2,7 @@
// Module Administration User Interface.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,76 +22,84 @@ use WT\Auth;
define('WT_SCRIPT_NAME', 'admin_module_blocks.php');
require 'includes/session.php';
-require WT_ROOT.'includes/functions/functions_edit.php';
+require WT_ROOT . 'includes/functions/functions_edit.php';
$controller = new WT_Controller_Page();
$controller
->restrictAccess(Auth::isAdmin())
- ->setPageTitle(WT_I18N::translate('Module administration') . ' — ' . WT_I18N::translate('Blocks'))
- ->pageHeader();
-
-$modules=WT_Module::getActiveBlocks(WT_GED_ID, WT_PRIV_HIDE);
+ ->setPageTitle(WT_I18N::translate('Blocks'));
-$action = WT_Filter::post('action');
+$modules = WT_Module::getActiveBlocks(WT_GED_ID, WT_PRIV_HIDE);
+$action = WT_Filter::post('action');
-if ($action=='update_mods' && WT_Filter::checkCsrf()) {
- foreach ($modules as $module_name=>$module) {
+if ($action === 'update_mods' && WT_Filter::checkCsrf()) {
+ foreach ($modules as $module) {
foreach (WT_Tree::getAll() as $tree) {
- $value = WT_Filter::post("blockaccess-{$module_name}-{$tree->tree_id}", WT_REGEX_INTEGER, $module->defaultAccessLevel());
+ $access_level = WT_Filter::post('access-' . $module_name. '-' . $tree->tree_id, WT_REGEX_INTEGER, $module->defaultAccessLevel());
WT_DB::prepare(
"REPLACE INTO `##module_privacy` (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'block', ?)"
- )->execute(array($module_name, $tree->tree_id, $value));
+ )->execute(array($module->getName(), $tree->tree_id, $access_level));
}
}
+
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
+
+ return;
}
+$controller
+ ->pageHeader();
+
?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li><a href="admin_modules.php"><?php echo WT_I18N::translate('Module administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
<h2><?php echo $controller->getPageTitle(); ?></h2>
-<div id="blocks" align="center">
- <form method="post">
- <input type="hidden" name="action" value="update_mods">
- <?php echo WT_Filter::getCsrf(); ?>
- <table id="blocks_table" class="modules_table">
- <thead>
- <tr>
- <th><?php echo WT_I18N::translate('Block'); ?></th>
- <th><?php echo WT_I18N::translate('Description'); ?></th>
- <th><?php echo WT_I18N::translate('Access level'); ?></th>
- </tr>
- </thead>
- <tbody>
- <?php
- $order = 1;
- foreach ($modules as $module_name=>$module) {
- ?>
- <tr>
- <td><?php echo $module->getTitle(); ?></td>
- <td><?php echo $module->getDescription(); ?></td>
- <td>
- <table class="modules_table2">
- <?php
- foreach (WT_Tree::getAll() as $tree) {
- $varname = 'blockaccess-'.$module->getName().'-'.$tree->tree_id;
- $access_level=WT_DB::prepare(
- "SELECT access_level FROM `##module_privacy` WHERE gedcom_id=? AND module_name=? AND component='block'"
- )->execute(array($tree->tree_id, $module->getName()))->fetchOne();
- if ($access_level===null) {
- $access_level=$module->defaultAccessLevel();
- }
- echo '<tr><td>', $tree->tree_title_html, '</td><td>';
- echo edit_field_access_level($varname, $access_level);
+<form method="post">
+ <input type="hidden" name="action" value="update_mods">
+ <?php echo WT_Filter::getCsrf(); ?>
+ <table class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="col-xs-2"><?php echo WT_I18N::translate('Block'); ?></th>
+ <th class="col-xs-5"><?php echo WT_I18N::translate('Description'); ?></th>
+ <th class="col-xs-5"><?php echo WT_I18N::translate('Access level'); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($modules as $module_name => $module): ?>
+ <tr>
+ <td class="col-xs-2">
+ <?php if ($module instanceof WT_Module_Config): ?>
+ <a href="<?php echo $module->getConfigLink(); ?>"><?php echo $module->getTitle(); ?> <i class="fa fa-cogs"></i></a>
+ <?php else: ?>
+ <?php echo $module->getTitle(); ?>
+ <?php endif; ?>
+ </td>
+ <td class="col-xs-5"><?php echo $module->getDescription(); ?></td>
+ <td class="col-xs-5">
+ <table class="table">
+ <?php
+ foreach (WT_Tree::getAll() as $tree) {
+ $varname = 'access-' . $module->getName() . '-' . $tree->tree_id;
+ $access_level = WT_DB::prepare(
+ "SELECT access_level FROM `##module_privacy` WHERE gedcom_id=? AND module_name=? AND component='block'"
+ )->execute(array($tree->tree_id, $module->getName()))->fetchOne();
+ if ($access_level === null) {
+ $access_level = $module->defaultAccessLevel();
}
+ echo '<tr><td>', $tree->tree_title_html, '</td><td>';
+ echo edit_field_access_level($varname, $access_level);
+ }
?>
- </table>
- </td>
- </tr>
- <?php
- $order++;
- }
- ?>
- </tbody>
- </table>
- <input type="submit" value="<?php echo WT_I18N::translate('save'); ?>">
- </form>
-</div>
+ </table>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ <button class="btn btn-primary" type="submit"><?php echo WT_I18N::translate('save'); ?></button>
+</form>
diff --git a/admin_module_menus.php b/admin_module_menus.php
index 8e8d7189fc..3742a99963 100644
--- a/admin_module_menus.php
+++ b/admin_module_menus.php
@@ -2,7 +2,7 @@
// Module Administration User Interface.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,97 +22,109 @@ use WT\Auth;
define('WT_SCRIPT_NAME', 'admin_module_menus.php');
require 'includes/session.php';
-require WT_ROOT.'includes/functions/functions_edit.php';
+require WT_ROOT . 'includes/functions/functions_edit.php';
$controller = new WT_Controller_Page();
$controller
->restrictAccess(Auth::isAdmin())
- ->setPageTitle(WT_I18N::translate('Module administration') . ' — ' . WT_I18N::translate('Menus'))
- ->pageHeader()
- ->addInlineJavascript('
- jQuery("#menus_table").sortable({items: ".sortme", forceHelperSize: true, forcePlaceholderSize: true, opacity: 0.7, cursor: "move", axis: "y"});
-
- //-- update the order numbers after drag-n-drop sorting is complete
- jQuery("#menus_table").bind("sortupdate", function(event, ui) {
- jQuery("#"+jQuery(this).attr("id")+" input").each(
- function (index, value) {
- value.value = index+1;
- }
- );
- });
- ');
+ ->setPageTitle(WT_I18N::translate('Menus'));
-$modules=WT_Module::getActiveMenus(WT_GED_ID, WT_PRIV_HIDE);
+$modules = WT_Module::getActiveMenus(WT_GED_ID, WT_PRIV_HIDE);
+$action = WT_Filter::post('action');
-$action = WT_Filter::post('action');
-
-if ($action=='update_mods' && WT_Filter::checkCsrf()) {
- foreach ($modules as $module_name=>$module) {
+if ($action === 'update_mods' && WT_Filter::checkCsrf()) {
+ foreach ($modules as $module) {
foreach (WT_Tree::getAll() as $tree) {
- $access_level = WT_Filter::post("menuaccess-{$module_name}-{$tree->tree_id}", WT_REGEX_INTEGER, $module->defaultAccessLevel());
+ $access_level = WT_Filter::post('access-' . $module_name. '-' . $tree->tree_id, WT_REGEX_INTEGER, $module->defaultAccessLevel());
WT_DB::prepare(
"REPLACE INTO `##module_privacy` (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'menu', ?)"
- )->execute(array($module_name, $tree->tree_id, $access_level));
+ )->execute(array($module->getName(), $tree->tree_id, $access_level));
}
- $order = WT_Filter::post('menuorder-'.$module_name);
+ $order = WT_Filter::post('order-' . $module->getName());
WT_DB::prepare(
- "UPDATE `##module` SET menu_order=? WHERE module_name=?"
- )->execute(array($order, $module_name));
- $module->order=$order; // Make the new order take effect immediately
+ "UPDATE `##module` SET menu_order = ? WHERE module_name = ?"
+ )->execute(array($order, $module->getName()));
}
- uasort($modules, function(WT_Module $x, WT_Module $y) { return $x->order - $y->order; });
+
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
+
+ return;
}
+$controller
+ ->addInlineJavascript('
+ jQuery("#module_table").sortable({
+ items: ".sortme",
+ forceHelperSize: true,
+ forcePlaceholderSize: true,
+ opacity: 0.7,
+ cursor: "move",
+ axis: "y",
+ update: function(event, ui) {
+ jQuery("input", jQuery(this)).each(
+ function (index, element) {
+ element.value = index + 1;
+ }
+ );
+ }
+ });
+ ')
+ ->pageHeader();
+
?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li><a href="admin_modules.php"><?php echo WT_I18N::translate('Module administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
<h2><?php echo $controller->getPageTitle(); ?></h2>
-<div id="menus" align="center">
- <form method="post">
- <input type="hidden" name="action" value="update_mods">
- <?php echo WT_Filter::getCsrf(); ?>
- <table id="menus_table" class="modules_table">
- <thead>
- <tr>
- <th><?php echo WT_I18N::translate('Menu'); ?></th>
- <th><?php echo WT_I18N::translate('Description'); ?></th>
- <th><?php echo WT_I18N::translate('Order'); ?></th>
- <th><?php echo WT_I18N::translate('Access level'); ?></th>
- </tr>
- </thead>
- <tbody>
- <?php
- $order = 1;
- foreach ($modules as $module_name=>$module) {
- ?>
- <tr class="sortme">
- <td><?php echo $module->getTitle(); ?></td>
- <td><?php echo $module->getDescription(); ?></td>
- <td><input type="text" size="3" value="<?php echo $order; ?>" name="menuorder-<?php echo $module->getName(); ?>">
- </td>
- <td>
- <table class="modules_table2">
- <?php
- foreach (WT_Tree::getAll() as $tree) {
- $varname = 'menuaccess-'.$module_name.'-'.$tree->tree_id;
- $access_level=WT_DB::prepare(
- "SELECT access_level FROM `##module_privacy` WHERE gedcom_id=? AND module_name=? AND component='menu'"
- )->execute(array($tree->tree_id, $module_name))->fetchOne();
- if ($access_level===null) {
- $access_level=$module->defaultAccessLevel();
- }
- echo '<tr><td>', $tree->tree_title_html, '</td><td>';
- echo edit_field_access_level($varname, $access_level);
- }
- ?>
- </table>
- </td>
- </tr>
- <?php
- $order++;
- }
- ?>
- </tbody>
- </table>
- <input type="submit" value="<?php echo WT_I18N::translate('save'); ?>">
- </form>
-</div>
+<form method="post">
+ <input type="hidden" name="action" value="update_mods">
+ <?php echo WT_Filter::getCsrf(); ?>
+ <table id="module_table" class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="col-xs-1"><?php echo WT_I18N::translate('Menu'); ?></th>
+ <th class="col-xs-5"><?php echo WT_I18N::translate('Description'); ?></th>
+ <th class="col-xs-1"><?php echo WT_I18N::translate('Order'); ?></th>
+ <th class="col-xs-5"><?php echo WT_I18N::translate('Access level'); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php $order = 0; ?>
+ <?php foreach ($modules as $module_name => $module): ?>
+ <?php $order++; ?>
+ <tr class="sortme">
+ <td class="col-xs-1">
+ <?php if ($module instanceof WT_Module_Config): ?>
+ <a href="<?php echo $module->getConfigLink(); ?>"><?php echo $module->getTitle(); ?> <i class="fa fa-cogs"></i></a>
+ <?php else: ?>
+ <?php echo $module->getTitle(); ?>
+ <?php endif; ?>
+ </td>
+ <td class="col-xs-5"><?php echo $module->getDescription(); ?></td>
+ <td class="col-xs-1"><input type="text" size="3" value="<?php echo $order; ?>" name="order-<?php echo $module->getName(); ?>"></td>
+ <td class="col-xs-5">
+ <table class="table">
+ <?php
+ foreach (WT_Tree::getAll() as $tree) {
+ $varname = 'access-' . $module->getName() . '-' . $tree->tree_id;
+ $access_level = WT_DB::prepare(
+ "SELECT access_level FROM `##module_privacy` WHERE gedcom_id = ? AND module_name = ? AND component = 'menu'"
+ )->execute(array($tree->tree_id, $module->getName()))->fetchOne();
+ if ($access_level === null) {
+ $access_level = $module->defaultAccessLevel();
+ }
+ echo '<tr><td>', $tree->tree_title_html, '</td><td>';
+ echo edit_field_access_level($varname, $access_level);
+ }
+ ?>
+ </table>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ <button class="btn btn-primary" type="submit"><?php echo WT_I18N::translate('save'); ?></button>
+</form>
diff --git a/admin_module_reports.php b/admin_module_reports.php
index 2676158281..04bdc792f6 100644
--- a/admin_module_reports.php
+++ b/admin_module_reports.php
@@ -2,7 +2,7 @@
// Module Administration User Interface.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,76 +22,84 @@ use WT\Auth;
define('WT_SCRIPT_NAME', 'admin_module_reports.php');
require 'includes/session.php';
-require WT_ROOT.'includes/functions/functions_edit.php';
+require WT_ROOT . 'includes/functions/functions_edit.php';
$controller = new WT_Controller_Page();
$controller
->restrictAccess(Auth::isAdmin())
- ->setPageTitle(WT_I18N::translate('Module administration') . ' — ' . WT_I18N::translate('Reports'))
- ->pageHeader();
-
-$modules=WT_Module::getActiveReports(WT_GED_ID, WT_PRIV_HIDE);
+ ->setPageTitle(WT_I18N::translate('Reports'));
-$action = WT_Filter::post('action');
+$modules = WT_Module::getActiveReports(WT_GED_ID, WT_PRIV_HIDE);
+$action = WT_Filter::post('action');
-if ($action=='update_mods' && WT_Filter::checkCsrf()) {
- foreach ($modules as $module_name=>$module) {
+if ($action === 'update_mods' && WT_Filter::checkCsrf()) {
+ foreach ($modules as $module) {
foreach (WT_Tree::getAll() as $tree) {
- $value = WT_Filter::post("reportaccess-{$module_name}-{$tree->tree_id}", WT_REGEX_INTEGER, $module->defaultAccessLevel());
+ $access_level = WT_Filter::post('access-' . $module_name. '-' . $tree->tree_id, WT_REGEX_INTEGER, $module->defaultAccessLevel());
WT_DB::prepare(
"REPLACE INTO `##module_privacy` (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'report', ?)"
- )->execute(array($module_name, $tree->tree_id, $value));
+ )->execute(array($module->getName(), $tree->tree_id, $access_level));
}
}
+
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
+
+ return;
}
+$controller
+ ->pageHeader();
+
?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li><a href="admin_modules.php"><?php echo WT_I18N::translate('Module administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
<h2><?php echo $controller->getPageTitle(); ?></h2>
-<div id="reports" align="center">
- <form method="post">
- <input type="hidden" name="action" value="update_mods">
- <?php echo WT_Filter::getCsrf(); ?>
- <table id="reports_table" class="modules_table">
- <thead>
- <tr>
- <th><?php echo WT_I18N::translate('Report'); ?></th>
- <th><?php echo WT_I18N::translate('Description'); ?></th>
- <th><?php echo WT_I18N::translate('Access level'); ?></th>
- </tr>
- </thead>
- <tbody>
- <?php
- $order = 1;
- foreach ($modules as $module_name=>$module) {
- ?>
- <tr>
- <td><?php echo $module->getTitle(); ?></td>
- <td><?php echo $module->getDescription(); ?></td>
- <td>
- <table class="modules_table2">
- <?php
- foreach (WT_Tree::getAll() as $tree) {
- $varname = 'reportaccess-'.$module_name.'-'.$tree->tree_id;
- $access_level=WT_DB::prepare(
- "SELECT access_level FROM `##module_privacy` WHERE gedcom_id=? AND module_name=? AND component='report'"
- )->execute(array($tree->tree_id, $module_name))->fetchOne();
- if ($access_level===null) {
- $access_level=$module->defaultAccessLevel();
- }
- echo '<tr><td>', $tree->tree_title_html, '</td><td>';
- echo edit_field_access_level($varname, $access_level);
- }
- ?>
- </table>
- </td>
- </tr>
- <?php
- $order++;
- }
- ?>
- </tbody>
- </table>
- <input type="submit" value="<?php echo WT_I18N::translate('save'); ?>">
- </form>
-</div>
+<form method="post">
+ <input type="hidden" name="action" value="update_mods">
+ <?php echo WT_Filter::getCsrf(); ?>
+ <table class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="col-xs-2"><?php echo WT_I18N::translate('Report'); ?></th>
+ <th class="col-xs-5"><?php echo WT_I18N::translate('Description'); ?></th>
+ <th class="col-xs-5"><?php echo WT_I18N::translate('Access level'); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($modules as $module_name => $module): ?>
+ <tr>
+ <td class="col-xs-2">
+ <?php if ($module instanceof WT_Module_Config): ?>
+ <a href="<?php echo $module->getConfigLink(); ?>"><?php echo $module->getTitle(); ?> <i class="fa fa-cogs"></i></a>
+ <?php else: ?>
+ <?php echo $module->getTitle(); ?>
+ <?php endif; ?>
+ </td>
+ <td class="col-xs-5"><?php echo $module->getDescription(); ?></td>
+ <td class="col-xs-5">
+ <table class="table">
+ <?php
+ foreach (WT_Tree::getAll() as $tree) {
+ $varname = 'access-' . $module->getName() . '-' . $tree->tree_id;
+ $access_level = WT_DB::prepare(
+ "SELECT access_level FROM `##module_privacy` WHERE gedcom_id=? AND module_name=? AND component='report'"
+ )->execute(array($tree->tree_id, $module->getName()))->fetchOne();
+ if ($access_level === null) {
+ $access_level = $module->defaultAccessLevel();
+ }
+ echo '<tr><td>', $tree->tree_title_html, '</td><td>';
+ echo edit_field_access_level($varname, $access_level);
+ }
+ ?>
+ </table>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ <button class="btn btn-primary" type="submit"><?php echo WT_I18N::translate('save'); ?></button>
+</form>
diff --git a/admin_module_sidebar.php b/admin_module_sidebar.php
index 9b1f6c9c0b..28f2458384 100644
--- a/admin_module_sidebar.php
+++ b/admin_module_sidebar.php
@@ -2,7 +2,7 @@
// Module Administration User Interface.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,96 +22,109 @@ use WT\Auth;
define('WT_SCRIPT_NAME', 'admin_module_sidebar.php');
require 'includes/session.php';
-require WT_ROOT.'includes/functions/functions_edit.php';
+require WT_ROOT . 'includes/functions/functions_edit.php';
$controller = new WT_Controller_Page();
$controller
->restrictAccess(Auth::isAdmin())
- ->setPageTitle(WT_I18N::translate('Module administration') . ' — ' . WT_I18N::translate('Sidebars'))
- ->pageHeader()
- ->addInlineJavascript('
- jQuery("#sidebars_table").sortable({items: ".sortme", forceHelperSize: true, forcePlaceholderSize: true, opacity: 0.7, cursor: "move", axis: "y"});
-
- //-- update the order numbers after drag-n-drop sorting is complete
- jQuery("#sidebars_table").bind("sortupdate", function(event, ui) {
- jQuery("#"+jQuery(this).attr("id")+" input").each(
- function (index, value) {
- value.value = index+1;
- }
- );
- });
- ');
+ ->setPageTitle(WT_I18N::translate('Sidebars'));
-$modules=WT_Module::getActiveSidebars(WT_GED_ID, WT_PRIV_HIDE);
+$modules = WT_Module::getActiveSidebars(WT_GED_ID, WT_PRIV_HIDE);
+$action = WT_Filter::post('action');
-$action = WT_Filter::post('action');
-
-if ($action=='update_mods' && WT_Filter::checkCsrf()) {
- foreach ($modules as $module_name=>$module) {
+if ($action === 'update_mods' && WT_Filter::checkCsrf()) {
+ foreach ($modules as $module) {
foreach (WT_Tree::getAll() as $tree) {
- $access_level = WT_Filter::post("sidebaraccess-{$module_name}-{$tree->tree_id}", WT_REGEX_INTEGER, $module->defaultAccessLevel());
+ $access_level = WT_Filter::post('access-' . $module_name. '-' . $tree->tree_id, WT_REGEX_INTEGER, $module->defaultAccessLevel());
WT_DB::prepare(
"REPLACE INTO `##module_privacy` (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'sidebar', ?)"
- )->execute(array($module_name, $tree->tree_id, $access_level));
+ )->execute(array($module->getName(), $tree->tree_id, $access_level));
}
- $order = WT_Filter::post('sidebarorder-'.$module_name);
+ $order = WT_Filter::post('order-' . $module->getName());
WT_DB::prepare(
- "UPDATE `##module` SET sidebar_order=? WHERE module_name=?"
- )->execute(array($order, $module_name));
- $module->order=$order; // Make the new order take effect immediately
+ "UPDATE `##module` SET sidebar_order = ? WHERE module_name = ?"
+ )->execute(array($order, $module->getName()));
}
- uasort($modules, function(WT_Module $x, WT_Module $y) { return $x->order - $y->order; });
+
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
+
+ return;
}
+$controller
+ ->addInlineJavascript('
+ jQuery("#module_table").sortable({
+ items: ".sortme",
+ forceHelperSize: true,
+ forcePlaceholderSize: true,
+ opacity: 0.7,
+ cursor: "move",
+ axis: "y",
+ update: function(event, ui) {
+ jQuery("input", jQuery(this)).each(
+ function (index, element) {
+ element.value = index + 1;
+ }
+ );
+ }
+ });
+ ')
+ ->pageHeader();
+
?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li><a href="admin_modules.php"><?php echo WT_I18N::translate('Module administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
<h2><?php echo $controller->getPageTitle(); ?></h2>
-<div id="sidebars" align="center">
- <form method="post">
- <input type="hidden" name="action" value="update_mods">
- <?php echo WT_Filter::getCsrf(); ?>
- <table id="sidebars_table" class="modules_table">
- <thead>
- <tr>
- <th><?php echo WT_I18N::translate('Sidebar'); ?></th>
- <th><?php echo WT_I18N::translate('Description'); ?></th>
- <th><?php echo WT_I18N::translate('Order'); ?></th>
- <th><?php echo WT_I18N::translate('Access level'); ?></th>
- </tr>
- </thead>
- <tbody>
- <?php
- $order = 1;
- foreach ($modules as $module_name=>$module) {
- ?>
- <tr class="sortme">
- <td ><?php echo $module->getTitle(); ?></td>
- <td><?php echo $module->getDescription(); ?></td>
- <td><input type="text" size="3" value="<?php echo $order; ?>" name="sidebarorder-<?php echo $module->getName(); ?>"></td>
- <td>
- <table class="modules_table2">
- <?php
- foreach (WT_Tree::getAll() as $tree) {
- $varname = 'sidebaraccess-'.$module_name.'-'.$tree->tree_id;
- $access_level=WT_DB::prepare(
- "SELECT access_level FROM `##module_privacy` WHERE gedcom_id=? AND module_name=? AND component='sidebar'"
- )->execute(array($tree->tree_id, $module_name))->fetchOne();
- if ($access_level===null) {
- $access_level=$module->defaultAccessLevel();
- }
- echo '<tr><td>', $tree->tree_title_html, '</td><td>';
- echo edit_field_access_level($varname, $access_level);
- }
- ?>
- </table>
- </td>
- </tr>
- <?php
- $order++;
- }
- ?>
- </tbody>
- </table>
- <input type="submit" value="<?php echo WT_I18N::translate('save'); ?>">
- </form>
-</div>
+<form method="post">
+ <input type="hidden" name="action" value="update_mods">
+ <?php echo WT_Filter::getCsrf(); ?>
+ <table id="module_table" class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="col-xs-1"><?php echo WT_I18N::translate('Sidebar'); ?></th>
+ <th class="col-xs-5"><?php echo WT_I18N::translate('Description'); ?></th>
+ <th class="col-xs-1"><?php echo WT_I18N::translate('Order'); ?></th>
+ <th class="col-xs-5"><?php echo WT_I18N::translate('Access level'); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php $order = 0; ?>
+ <?php foreach ($modules as $module_name => $module): ?>
+ <?php $order++; ?>
+ <tr class="sortme">
+ <td class="col-xs-1">
+ <?php if ($module instanceof WT_Module_Config): ?>
+ <a href="<?php echo $module->getConfigLink(); ?>"><?php echo $module->getTitle(); ?> <i class="fa fa-cogs"></i></a>
+ <?php else: ?>
+ <?php echo $module->getTitle(); ?>
+ <?php endif; ?>
+ </td>
+ <td class="col-xs-5"><?php echo $module->getDescription(); ?></td>
+ <td class="col-xs-1"><input type="text" size="3" value="<?php echo $order; ?>" name="order-<?php echo $module->getName(); ?>"></td>
+ <td class="col-xs-5">
+ <table class="table">
+ <?php
+ foreach (WT_Tree::getAll() as $tree) {
+ $varname = 'access-' . $module->getName() . '-' . $tree->tree_id;
+ $access_level = WT_DB::prepare(
+ "SELECT access_level FROM `##module_privacy` WHERE gedcom_id=? AND module_name=? AND component='sidebar'"
+ )->execute(array($tree->tree_id, $module->getName()))->fetchOne();
+ if ($access_level === null) {
+ $access_level = $module->defaultAccessLevel();
+ }
+ echo '<tr><td>', $tree->tree_title_html, '</td><td>';
+ echo edit_field_access_level($varname, $access_level);
+ }
+ ?>
+ </table>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ <button class="btn btn-primary" type="submit"><?php echo WT_I18N::translate('save'); ?></button>
+</form>
diff --git a/admin_module_tabs.php b/admin_module_tabs.php
index bf73eda7b2..bdee21a2a2 100644
--- a/admin_module_tabs.php
+++ b/admin_module_tabs.php
@@ -2,7 +2,7 @@
// Module Administration User Interface.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,97 +22,109 @@ use WT\Auth;
define('WT_SCRIPT_NAME', 'admin_module_tabs.php');
require 'includes/session.php';
-require WT_ROOT.'includes/functions/functions_edit.php';
+require WT_ROOT . 'includes/functions/functions_edit.php';
$controller = new WT_Controller_Page();
$controller
->restrictAccess(Auth::isAdmin())
- ->setPageTitle(WT_I18N::translate('Module administration') . ' — ' . WT_I18N::translate('Tabs'))
- ->pageHeader()
- ->addInlineJavascript('
- jQuery("#tabs_table").sortable({items: ".sortme", forceHelperSize: true, forcePlaceholderSize: true, opacity: 0.7, cursor: "move", axis: "y"});
-
- //-- update the order numbers after drag-n-drop sorting is complete
- jQuery("#tabs_table").bind("sortupdate", function(event, ui) {
- jQuery("#"+jQuery(this).attr("id")+" input").each(
- function (index, value) {
- value.value = index+1;
- }
- );
- });
- ');
+ ->setPageTitle(WT_I18N::translate('Tabs'));
-$modules=WT_Module::getActiveTabs(WT_GED_ID, WT_PRIV_HIDE);
+$modules = WT_Module::getActiveTabs(WT_GED_ID, WT_PRIV_HIDE);
+$action = WT_Filter::post('action');
-$action = WT_Filter::post('action');
-
-if ($action=='update_mods' && WT_Filter::checkCsrf()) {
- foreach ($modules as $module_name=>$module) {
+if ($action === 'update_mods' && WT_Filter::checkCsrf()) {
+ foreach ($modules as $module) {
foreach (WT_Tree::getAll() as $tree) {
- $access_level = WT_Filter::post("tabaccess-{$module_name}-{$tree->tree_id}", WT_REGEX_INTEGER, $module->defaultAccessLevel());
+ $access_level = WT_Filter::post('access-' . $module_name. '-' . $tree->tree_id, WT_REGEX_INTEGER, $module->defaultAccessLevel());
WT_DB::prepare(
"REPLACE INTO `##module_privacy` (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'tab', ?)"
- )->execute(array($module_name, $tree->tree_id, $access_level));
+ )->execute(array($module->getName(), $tree->tree_id, $access_level));
}
- $order = WT_Filter::post('taborder-'.$module_name);
+ $order = WT_Filter::post('order-' . $module->getName());
WT_DB::prepare(
"UPDATE `##module` SET tab_order=? WHERE module_name=?"
- )->execute(array($order, $module_name));
- $module->order=$order; // Make the new order take effect immediately
+ )->execute(array($order, $module->getName()));
}
- uasort($modules, function(WT_Module $x, WT_Module $y) { return $x->order - $y->order; });
+
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
+
+ return;
}
+$controller
+ ->addInlineJavascript('
+ jQuery("#module_table").sortable({
+ items: ".sortme",
+ forceHelperSize: true,
+ forcePlaceholderSize: true,
+ opacity: 0.7,
+ cursor: "move",
+ axis: "y",
+ update: function(event, ui) {
+ jQuery("input", jQuery(this)).each(
+ function (index, element) {
+ element.value = index + 1;
+ }
+ );
+ }
+ });
+ ')
+ ->pageHeader();
+
?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li><a href="admin_modules.php"><?php echo WT_I18N::translate('Module administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
<h2><?php echo $controller->getPageTitle(); ?></h2>
-<div id="tabs" align="center">
- <form method="post">
- <input type="hidden" name="action" value="update_mods">
- <?php echo WT_Filter::getCsrf(); ?>
- <table id="tabs_table" class="modules_table">
- <thead>
- <tr>
- <th><?php echo WT_I18N::translate('Tab'); ?></th>
- <th><?php echo WT_I18N::translate('Description'); ?></th>
- <th><?php echo WT_I18N::translate('Order'); ?></th>
- <th><?php echo WT_I18N::translate('Access level'); ?></th>
- </tr>
- </thead>
- <tbody>
- <?php
- $order = 1;
- foreach ($modules as $module_name=>$module) {
- ?>
- <tr class="sortme">
- <td><?php echo $module->getTitle(); ?></td>
- <td><?php echo $module->getDescription(); ?></td>
- <td><input type="text" size="3" value="<?php echo $order; ?>" name="taborder-<?php echo $module->getName(); ?>">
- </td>
- <td>
- <table class="modules_table2">
+<form method="post">
+ <input type="hidden" name="action" value="update_mods">
+ <?php echo WT_Filter::getCsrf(); ?>
+ <table id="module_table" class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="col-xs-1"><?php echo WT_I18N::translate('Tab'); ?></th>
+ <th class="col-xs-5"><?php echo WT_I18N::translate('Description'); ?></th>
+ <th class="col-xs-1"><?php echo WT_I18N::translate('Order'); ?></th>
+ <th class="col-xs-5"><?php echo WT_I18N::translate('Access level'); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php $order = 0; ?>
+ <?php foreach ($modules as $module_name => $module): ?>
+ <?php $order++; ?>
+ <tr class="sortme">
+ <td class="col-xs-1">
+ <?php if ($module instanceof WT_Module_Config): ?>
+ <a href="<?php echo $module->getConfigLink(); ?>"><?php echo $module->getTitle(); ?> <i class="fa fa-cogs"></i></a>
+ <?php else: ?>
+ <?php echo $module->getTitle(); ?>
+ <?php endif; ?>
+ </td>
+ <td class="col-xs-5"><?php echo $module->getDescription(); ?></td>
+ <td class="col-xs-1"><input type="text" size="3" value="<?php echo $order; ?>" name="order-<?php echo $module->getName(); ?>"></td>
+ <td class="col-xs-5">
+ <table class="table">
<?php
foreach (WT_Tree::getAll() as $tree) {
- $varname = 'tabaccess-'.$module_name.'-'.$tree->tree_id;
- $access_level=WT_DB::prepare(
- "SELECT access_level FROM `##module_privacy` WHERE gedcom_id=? AND module_name=? AND component='tab'"
- )->execute(array($tree->tree_id, $module_name))->fetchOne();
- if ($access_level===null) {
- $access_level=$module->defaultAccessLevel();
+ $varname = 'access-' . $module->getName() . '-' . $tree->tree_id;
+ $access_level = WT_DB::prepare(
+ "SELECT access_level FROM `##module_privacy` WHERE gedcom_id = ? AND module_name = ? AND component = 'tab'"
+ )->execute(array($tree->tree_id, $module->getName()))->fetchOne();
+ if ($access_level === null) {
+ $access_level = $module->defaultAccessLevel();
}
echo '<tr><td>', $tree->tree_title_html, '</td><td>';
echo edit_field_access_level($varname, $access_level);
}
?>
</table>
- </td>
- </tr>
- <?php
- $order++;
- }
- ?>
- </tbody>
- </table>
- <input type="submit" value="<?php echo WT_I18N::translate('save'); ?>">
- </form>
-</div>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ <button class="btn btn-primary" type="submit"><?php echo WT_I18N::translate('save'); ?></button>
+</form>
diff --git a/admin_modules.php b/admin_modules.php
index 17a9c34a7a..78655b3af6 100644
--- a/admin_modules.php
+++ b/admin_modules.php
@@ -2,7 +2,7 @@
// Module Administration User Interface.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,81 +22,94 @@ use WT\Auth;
define('WT_SCRIPT_NAME', 'admin_modules.php');
require 'includes/session.php';
-require WT_ROOT.'includes/functions/functions_edit.php';
+require WT_ROOT . 'includes/functions/functions_edit.php';
$controller = new WT_Controller_Page();
$controller
->restrictAccess(Auth::isAdmin())
->setPageTitle(WT_I18N::translate('Module administration'));
-$modules = WT_Module::getInstalledModules('disabled');
-
+$modules = WT_Module::getInstalledModules('disabled');
$module_status = WT_DB::prepare("SELECT module_name, status FROM `##module`")->fetchAssoc();
-switch (WT_Filter::post('action')) {
-case 'update_mods':
- if (WT_Filter::checkCsrf()) {
- foreach ($modules as $module_name=>$status) {
- $new_status=WT_Filter::post("status-{$module_name}", '[01]');
- if ($new_status!==null) {
- $new_status=$new_status ? 'enabled' : 'disabled';
- if ($new_status!=$status) {
- WT_DB::prepare("UPDATE `##module` SET status=? WHERE module_name=?")->execute(array($new_status, $module_name));
- $module_status[$module_name]=$new_status;
+if (WT_Filter::post('action') === 'update_mods' && WT_Filter::checkCsrf()) {
+ foreach ($modules as $module) {
+ $new_status = WT_Filter::post('status-' . $module->getName(), '[01]');
+ if ($new_status !== null) {
+ $new_status = $new_status ? 'enabled' : 'disabled';
+ $old_status = $module_status[$module->getName()];
+ if ($new_status !== $old_status) {
+ WT_DB::prepare("UPDATE `##module` SET status=? WHERE module_name=?")->execute(array($new_status, $module->getName()));
+ if ($new_status === 'disabled') {
+ WT_FlashMessages::addMessage(WT_I18N::translate('The module “%s” has been disabled.', $module->getTitle()), 'success');
+ } else {
+ WT_FlashMessages::addMessage(WT_I18N::translate('The module “%s” has been enabled.', $module->getTitle()), 'success');
}
}
}
}
header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . 'admin_modules.php');
- exit;
+
+ return;
}
-switch (WT_Filter::get('action')) {
-case 'delete_module':
- $module_name=WT_Filter::get('module_name');
+if (WT_Filter::post('action') === 'delete' && WT_Filter::checkCsrf()) {
+ $module_name = WT_Filter::post('module_name');
WT_DB::prepare(
- "DELETE `##block_setting`".
- " FROM `##block_setting`".
- " JOIN `##block` USING (block_id)".
- " JOIN `##module` USING (module_name)".
+ "DELETE `##block_setting`" .
+ " FROM `##block_setting`" .
+ " JOIN `##block` USING (block_id)" .
+ " JOIN `##module` USING (module_name)" .
" WHERE module_name=?"
)->execute(array($module_name));
WT_DB::prepare(
- "DELETE `##block`".
- " FROM `##block`".
- " JOIN `##module` USING (module_name)".
+ "DELETE `##block`" .
+ " FROM `##block`" .
+ " JOIN `##module` USING (module_name)" .
" WHERE module_name=?"
)->execute(array($module_name));
WT_DB::prepare("DELETE FROM `##module_setting` WHERE module_name=?")->execute(array($module_name));
WT_DB::prepare("DELETE FROM `##module_privacy` WHERE module_name=?")->execute(array($module_name));
WT_DB::prepare("DELETE FROM `##module` WHERE module_name=?")->execute(array($module_name));
+ WT_FlashMessages::addMessage(WT_I18N::translate('The preferences for the module “%s” have been deleted.', $module_name), 'success');
+
header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . 'admin_modules.php');
exit;
}
+// Module can’t be found on disk?
+// Don't delete it automatically. It may be temporarily missing, after a re-installation, etc.
+foreach ($module_status as $module_name => $status) {
+ if (!array_key_exists($module_name, $modules)) {
+ $html =
+ WT_I18N::translate('Preferences exist for the module “%s”, but this module no longer exists.', '<span dir="ltr">' . $module_name . '</span>') .
+ '<form method="post" class="form-inline">' .
+ WT_Filter::getCsrf() .
+ '<input type="hidden" name="action" value="delete">' .
+ '<input type="hidden" name="module_name" value="' . $module_name . '">' .
+ '<button type="submit" class="btn btn-link">' . WT_I18N::translate('Delete the preferences for this module.') . '</button>' .
+ '</form>';
+ WT_FlashMessages::addMessage($html, 'warning');
+ }
+}
+
$controller
->pageHeader()
->addExternalJavascript(WT_JQUERY_DATATABLES_URL)
+ ->addExternalJavascript(WT_DATATABLES_BOOTSTRAP_JS_URL)
->addInlineJavascript('
function reindexMods(id) {
- jQuery("#"+id+" input").each(
+ jQuery("#" + id + " input").each(
function (index, value) {
value.value = index+1;
});
}
-
jQuery("#installed_table").dataTable( {
- dom: \'<"H"pf<"dt-clear">irl>t<"F"pl>\',
- '.WT_I18N::datatablesI18N().',
- jQueryUI: true,
- autoWidth: false,
+ paging: false,
+ '.WT_I18N::datatablesI18N() . ',
sorting: [[ 1, "asc" ]],
- pageLength: 10,
- pagingType: "full_numbers",
- stateSave: true,
- stateDuration: 180,
columns : [
{ sortable: false, class: "center" },
null,
@@ -113,57 +126,63 @@ $controller
');
?>
-<div align="center">
- <div id="tabs">
- <form method="post" action="<?php echo WT_SCRIPT_NAME; ?>">
- <input type="hidden" name="action" value="update_mods">
- <?php echo WT_Filter::getCsrf(); ?>
- <table id="installed_table" border="0" cellpadding="0" cellspacing="1">
- <thead>
- <tr>
- <th><?php echo WT_I18N::translate('Enabled'); ?></th>
- <th width="100px"><?php echo WT_I18N::translate('Module'); ?></th>
- <th><?php echo WT_I18N::translate('Description'); ?></th>
- <th><?php echo WT_I18N::translate('Menu'); ?></th>
- <th><?php echo WT_I18N::translate('Tab'); ?></th>
- <th><?php echo WT_I18N::translate('Sidebar'); ?></th>
- <th><?php echo WT_I18N::translate('Block'); ?></th>
- <th><?php echo WT_I18N::translate('Chart'); ?></th>
- <th><?php echo WT_I18N::translate('Report'); ?></th>
- <th><?php echo WT_I18N::translate('Theme'); ?></th>
- </tr>
- </thead>
- <tbody>
- <?php
- foreach ($module_status as $module_name=>$status) {
- if (array_key_exists($module_name, $modules)) {
- $module=$modules[$module_name];
- echo
- '<tr><td>', two_state_checkbox('status-'.$module_name, $status=='enabled'), '</td>',
- '<td>', $module->getTitle(), '</td>',
- '<td>', $module->getDescription(), '</td>',
- '<td>', $module instanceof WT_Module_Menu ? WT_I18N::translate('Menu') : '-', '</td>',
- '<td>', $module instanceof WT_Module_Tab ? WT_I18N::translate('Tab') : '-', '</td>',
- '<td>', $module instanceof WT_Module_Sidebar ? WT_I18N::translate('Sidebar') : '-', '</td>',
- '<td>', $module instanceof WT_Module_Block ? (($module->isUserBlock() ? '<div>'.WT_I18N::translate('My page').'</div>' : '').($module->isGedcomBlock() ? '<div>'.WT_I18N::translate('Home page').'</div>' : '')) : '-', '</td>',
- '<td>', $module instanceof WT_Module_Chart ? WT_I18N::translate('Chart') : '-', '</td>',
- '<td>', $module instanceof WT_Module_Report ? WT_I18N::translate('Report') : '-', '</td>',
- '<td>', $module instanceof WT_Module_Theme ? WT_I18N::translate('Theme') : '-', '</td>',
- '</tr>';
- } else {
- // Module can’t be found on disk?
- // Don't delete it automatically. It may be temporarily missing, after a re-installation, etc.
- echo
- '<tr class="error"><td></td><td>', $module_name, '</td><td>',
- '<a href="'.WT_SCRIPT_NAME.'?action=delete_module&amp;module_name='.$module_name.'">',
- WT_I18N::translate('This module cannot be found. Delete its configuration settings.'),
- '</a></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>';
- }
- }
- ?>
- </tbody>
- </table>
- <input type="submit" value="<?php echo WT_I18N::translate('save'); ?>">
- </form>
- </div>
-</div>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
+
+<form method="post" action="<?php echo WT_SCRIPT_NAME; ?>">
+ <input type="hidden" name="action" value="update_mods">
+ <?php echo WT_Filter::getCsrf(); ?>
+ <table class="table table-bordered table-hover table-condensed table-module-administration">
+ <caption class="sr-only">
+ <?php echo WT_I18N::translate('Module administration'); ?>
+ </caption>
+ <thead>
+ <tr>
+ <th><?php echo WT_I18N::translate('Enabled'); ?></th>
+ <th><?php echo WT_I18N::translate('Module'); ?></th>
+ <th><?php echo WT_I18N::translate('Description'); ?></th>
+ <th class="hidden-xs"><a href="admin_module_menus.php"><?php echo WT_I18N::translate('Menus'); ?></a></th>
+ <th class="hidden-xs"><a href="admin_module_tabs.php"><?php echo WT_I18N::translate('Tabs'); ?></a></th>
+ <th class="hidden-xs"><a href="admin_module_sidebar.php"><?php echo WT_I18N::translate('Sidebars'); ?></a></th>
+ <th class="hidden-xs"><a href="admin_module_blocks.php"><?php echo WT_I18N::translate('Blocks'); ?></a></th>
+ <th class="hidden"><?php echo WT_I18N::translate('Charts'); ?></th>
+ <th class="hidden-xs"><a href="admin_module_reports.php"><?php echo WT_I18N::translate('Reports'); ?></a></th>
+ <th class="hidden"><?php echo WT_I18N::translate('Themes'); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ foreach ($module_status as $module_name => $status) {
+ if (array_key_exists($module_name, $modules)) {
+ $module = $modules[$module_name];
+ echo
+ '<tr><td class="text-center">', two_state_checkbox('status-' . $module_name, $status === 'enabled'), '</td>',
+ '<td>';
+ if ($module instanceof WT_Module_Config) {
+ echo '<a href="', $module->getConfigLink(), '">';
+ }
+ echo $module->getTitle();
+ if ($module instanceof WT_Module_Config) {
+ echo ' <i class="fa fa-cogs"></i></a>';
+ }
+ echo
+ '</td>',
+ '<td>', $module->getDescription(), '</td>',
+ '<td class="text-center text-muted hidden-xs">', $module instanceof WT_Module_Menu ? '<i class="fa fa-list-ul" title="' . WT_I18N::translate('Menu') . '"></i>' : '-', '</td>',
+ '<td class="text-center text-muted hidden-xs">', $module instanceof WT_Module_Tab ? '<i class="fa fa-folder" title="' . WT_I18N::translate('Tab') . '"></i>' : '-', '</td>',
+ '<td class="text-center text-muted hidden-xs">', $module instanceof WT_Module_Sidebar ? '<i class="fa fa-th-large" title="' . WT_I18N::translate('Sidebar') . '"></i>' : '-', '</td>',
+ '<td class="text-center text-muted hidden-xs">', $module instanceof WT_Module_Block ? (($module->isUserBlock() ? '<i class="fa fa-user" title="' . WT_I18N::translate('My page') . '"></i>' : '') . ($module->isGedcomBlock() ? '<i class="fa fa-tree" title="' . WT_I18N::translate('Home page') . '"></i>' : '')) : '-', '</td>',
+ '<td class="text-center text-muted hidden">', $module instanceof WT_Module_Chart ? '<i class="fa fa-check" title="' . WT_I18N::translate('Chart') . '"></i>' : '-', '</td>',
+ '<td class="text-center text-muted hidden-xs">', $module instanceof WT_Module_Report ? '<i class="fa fa-file" title="' . WT_I18N::translate('Report') . '"></i>' : '-', '</td>',
+ '<td class="text-center text-muted hidden">', $module instanceof WT_Module_Theme ? '<i class="fa fa-check" title="' . WT_I18N::translate('Theme') . '"></i>' : '-', '</td>',
+ '</tr>';
+ }
+ }
+ ?>
+ </tbody>
+ </table>
+ <button class="btn btn-primary" type="submit"><?php echo WT_I18N::translate('save'); ?></button>
+</form>
diff --git a/admin_pgv_to_wt.php b/admin_pgv_to_wt.php
index e8244baa82..b228b1e101 100644
--- a/admin_pgv_to_wt.php
+++ b/admin_pgv_to_wt.php
@@ -2,7 +2,7 @@
// PGV to webtrees transfer wizard
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -577,7 +577,7 @@ $GEDCOMS=WT_DB::prepare(
foreach ($GEDCOMS as $GEDCOM=>$GED_DATA) {
$config=$GED_DATA['config'];
if ($PGV_SCHEMA_VERSION>=12) {
- $config=str_replace('${INDEX_DIRECTORY}', $INDEX_DIRECTORY.DIRECTORY_SEPARATOR, $config);
+ $config=str_replace('${INDEX_DIRECTORY}', $INDEX_DIRECTORY.DIRECTORY_SEPARATOR, $config);
} else {
$config=str_replace($INDEX_DIRECTORY, $INDEX_DIRECTORY.DIRECTORY_SEPARATOR, $config);
}
diff --git a/admin_site_access.php b/admin_site_access.php
index 4404fe6845..84ec8d0403 100644
--- a/admin_site_access.php
+++ b/admin_site_access.php
@@ -2,7 +2,7 @@
// Restrict/allow site access based on IP address and user-agent string
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,13 +22,13 @@ use WT\Auth;
define('WT_SCRIPT_NAME', 'admin_site_access.php');
require './includes/session.php';
-require WT_ROOT.'includes/functions/functions_edit.php';
+require WT_ROOT . 'includes/functions/functions_edit.php';
$controller = new WT_Controller_Page();
$controller
->restrictAccess(Auth::isAdmin())
->addExternalJavascript(WT_JQUERY_DATATABLES_URL)
- ->addExternalJavascript(WT_JQUERY_JEDITABLE_URL)
+ ->addExternalJavascript(WT_DATATABLES_BOOTSTRAP_JS_URL)
->setPageTitle(WT_I18N::translate('Site access rules'));
$action = WT_Filter::get('action');
@@ -51,25 +51,25 @@ case 'load_rules':
$start = WT_Filter::getInteger('start');
$length = WT_Filter::getInteger('length');
- $sql=
- "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS".
- " INET_NTOA(ip_address_start), ip_address_start, INET_NTOA(ip_address_end), ip_address_end, user_agent_pattern, rule, comment, site_access_rule_id".
- " FROM `##site_access_rule`".
+ $sql =
+ "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS" .
+ " INET_NTOA(ip_address_start), ip_address_start, INET_NTOA(ip_address_end), ip_address_end, user_agent_pattern, rule, comment, site_access_rule_id" .
+ " FROM `##site_access_rule`" .
" WHERE rule<>'unknown'";
- $args=array();
+ $args = array();
if ($search) {
- $sql.=
- " AND (INET_ATON(?) BETWEEN ip_address_start AND ip_address_end".
- " OR INET_NTOA(ip_address_start) LIKE CONCAT('%', ?, '%')".
- " OR INET_NTOA(ip_address_end) LIKE CONCAT('%', ?, '%')".
- " OR user_agent_pattern LIKE CONCAT('%', ?, '%')".
+ $sql .=
+ " AND (INET_ATON(?) BETWEEN ip_address_start AND ip_address_end" .
+ " OR INET_NTOA(ip_address_start) LIKE CONCAT('%', ?, '%')" .
+ " OR INET_NTOA(ip_address_end) LIKE CONCAT('%', ?, '%')" .
+ " OR user_agent_pattern LIKE CONCAT('%', ?, '%')" .
" OR comment LIKE CONCAT('%', ?, '%'))";
- $args[]=$search;
- $args[]=$search;
- $args[]=$search;
- $args[]=$search;
- $args[]=$search;
+ $args[] = $search;
+ $args[] = $search;
+ $args[] = $search;
+ $args[] = $search;
+ $args[] = $search;
}
$order = WT_Filter::getArray('order');
@@ -94,8 +94,8 @@ case 'load_rules':
$sql .= 'ORDER BY 1 ASC';
}
- if ($length>0) {
- $sql.=" LIMIT " . $start . ',' . $length;
+ if ($length > 0) {
+ $sql .= " LIMIT " . $start . ',' . $length;
}
// This becomes a JSON list, not a JSON array, so we need numeric keys.
@@ -112,8 +112,8 @@ case 'load_rules':
'deny' => /* I18N: An access rule - deny access to the site */ WT_I18N::translate('deny'),
'robot' => /* I18N: http://en.wikipedia.org/wiki/Web_crawler */ WT_I18N::translate('robot'),
), null, $datum[5]);
- $datum[6] = edit_field_inline('site_access_rule-comment-'.$site_access_rule_id, $datum[6]);
- $datum[7] = '<i class="icon-delete" onclick="if (confirm(\'' . WT_Filter::escapeHtml(WT_I18N::translate('Are you sure you want to delete “%s”?', strip_tags($user_agent))).'\')) { document.location=\'' . WT_SCRIPT_NAME . '?action=delete&amp;site_access_rule_id=' . $site_access_rule_id . '\'; }"></i>';
+ $datum[6] = edit_field_inline('site_access_rule-comment-' . $site_access_rule_id, $datum[6]);
+ $datum[7] = '<button class="btn btn-danger" onclick="if (confirm(\'' . WT_Filter::escapeHtml(WT_I18N::translate('Are you sure you want to delete “%s”?', strip_tags($user_agent))) . '\')) { document.location=\'' . WT_SCRIPT_NAME . '?action=delete&amp;site_access_rule_id=' . $site_access_rule_id . '\'; }"><i class="fa fa-trash-o"></i></button>';
}
// Total filtered/unfiltered rows
@@ -121,7 +121,8 @@ case 'load_rules':
$recordsTotal = WT_DB::prepare("SELECT COUNT(*) FROM `##site_access_rule` WHERE rule <> 'unknown'")->fetchOne();
header('Content-type: application/json');
- echo json_encode(array( // See http://www.datatables.net/usage/server-side
+ // See http://www.datatables.net/usage/server-side
+ echo json_encode(array(
'draw' => WT_Filter::getInteger('draw'), // Always an integer
'recordsTotal' => $recordsTotal,
'recordsFiltered' => $recordsFiltered,
@@ -136,16 +137,16 @@ case 'load_unknown':
$start = WT_Filter::getInteger('start');
$length = WT_Filter::getInteger('length');
- $sql=
- "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS".
- " INET_NTOA(ip_address_start), ip_address_start, user_agent_pattern, DATE(updated) AS updated, site_access_rule_id".
- " FROM `##site_access_rule`".
+ $sql =
+ "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS" .
+ " INET_NTOA(ip_address_start), ip_address_start, user_agent_pattern, DATE(updated) AS updated, site_access_rule_id" .
+ " FROM `##site_access_rule`" .
" WHERE rule='unknown'";
$args = array();
if ($search) {
$sql .=
- " AND (INET_ATON(ip_address_start) LIKE CONCAT('%', ?, '%')".
+ " AND (INET_ATON(ip_address_start) LIKE CONCAT('%', ?, '%')" .
" OR user_agent_pattern LIKE CONCAT('%', ?, '%'))";
$args[] = $search;
$args[] = $search;
@@ -174,7 +175,7 @@ case 'load_unknown':
}
- if ($length>0) {
+ if ($length > 0) {
$sql .= " LIMIT " . $start . ',' . $length;
}
@@ -182,10 +183,10 @@ case 'load_unknown':
$data = WT_DB::prepare($sql)->execute($args)->fetchAll(PDO::FETCH_NUM);
// Reformat the data for display
foreach ($data as &$datum) {
- $site_access_rule_id=$datum[4];
- $datum[4] = '<i class="icon-yes" onclick="document.location=\'' . WT_SCRIPT_NAME . '?action=allow&amp;site_access_rule_id=' . $site_access_rule_id . '\';"></i>';
- $datum[5] = '<i class="icon-yes" onclick="document.location=\'' . WT_SCRIPT_NAME . '?action=deny&amp;site_access_rule_id=' . $site_access_rule_id . '\';"></i>';
- $datum[6] = '<i class="icon-yes" onclick="document.location=\'' . WT_SCRIPT_NAME . '?action=robot&amp;site_access_rule_id=' . $site_access_rule_id . '\';"></i>';
+ $site_access_rule_id = $datum[4];
+ $datum[4] = '<button class="btn btn-primary" onclick="document.location=\'' . WT_SCRIPT_NAME . '?action=allow&amp;site_access_rule_id=' . $site_access_rule_id . '\';"><i class="fa fa-check"></i></button>';
+ $datum[5] = '<button class="btn btn-primary" onclick="document.location=\'' . WT_SCRIPT_NAME . '?action=deny&amp;site_access_rule_id=' . $site_access_rule_id . '\';"><i class="fa fa-ban"></i></button>';
+ $datum[6] = '<button class="btn btn-primary" onclick="document.location=\'' . WT_SCRIPT_NAME . '?action=robot&amp;site_access_rule_id=' . $site_access_rule_id . '\';"><i class="fa fa-android"></i></button>';
}
// Total filtered/unfiltered rows
@@ -193,7 +194,8 @@ case 'load_unknown':
$recordsTotal = WT_DB::prepare("SELECT COUNT(*) FROM `##site_access_rule` WHERE rule = 'unknown'")->fetchOne();
header('Content-type: application/json');
- echo json_encode(array( // See http://www.datatables.net/usage/server-side
+ // See http://www.datatables.net/usage/server-side
+ echo json_encode(array(
'draw' => WT_Filter::getInteger('draw'), // Always an integer
'recordsTotal' => $recordsTotal,
'recordsFiltered' => $recordsFiltered,
@@ -207,15 +209,11 @@ $controller
->addInlineJavascript('
jQuery.fn.dataTableExt.oSort["unicode-asc" ]=function(a,b) {return a.replace(/<[^<]*>/, "").localeCompare(b.replace(/<[^<]*>/, ""))};
jQuery.fn.dataTableExt.oSort["unicode-desc"]=function(a,b) {return b.replace(/<[^<]*>/, "").localeCompare(a.replace(/<[^<]*>/, ""))};
- jQuery("#site_access_rules").dataTable({
- dom: \'<"H"pf<"dt-clear">irl>t<"F"pl>\',
- ajax: "'.WT_SERVER_NAME.WT_SCRIPT_PATH.WT_SCRIPT_NAME.'?action=load_rules",
+ jQuery(".table-site-access-rules").dataTable({
+ ajax: "' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=load_rules",
serverSide: true,
- '.WT_I18N::datatablesI18N().',
- jQueryUI: true,
- autoWidth: false,
+ '.WT_I18N::datatablesI18N() . ',
processing: true,
- pagingType: "full_numbers",
stateSave: true,
stateDuration: 180,
columns: [
@@ -228,25 +226,15 @@ $controller
/* 6 rule */ { },
/* 7 <delete> */ { sortable: false, class: "center" }
],
- fnDrawCallback: function() {
- // Our JSON responses include Javascript as well as HTML. This does not get
- // executed, So extract it, and execute it
- jQuery("#site_access_rules script").each(function() {
- eval(this.text);
- });
- }
});
- jQuery("#unknown_site_visitors").dataTable({
- dom: \'<"H"pf<"dt-clear">irl>t<"F"pl>\',
- ajax: "'.WT_SERVER_NAME.WT_SCRIPT_PATH.WT_SCRIPT_NAME.'?action=load_unknown",
+
+ jQuery(".table-unknown-site-visitors").dataTable({
+ ajax: "' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=load_unknown",
serverSide: true,
- '.WT_I18N::datatablesI18N().',
- jQueryUI: true,
- autoWidth: false,
+ '.WT_I18N::datatablesI18N() . ',
processing: true,
stateSave: true,
stateDuration: 180,
- pagingType: "full_numbers",
columns: [
/* 0 ip_address */ { dataSort: 1, class: "ip_address" },
/* 0 ip_address (sort) */ { type: "num", visible: false },
@@ -262,20 +250,25 @@ $controller
// Delete any "unknown" visitors that are now "known".
// This could happen every time we create/update a rule.
WT_DB::exec(
- "DELETE unknown".
- " FROM `##site_access_rule` AS unknown".
- " JOIN `##site_access_rule` AS known ON (unknown.user_agent_pattern LIKE known.user_agent_pattern)".
- " WHERE unknown.rule='unknown' AND known.rule<>'unknown'".
+ "DELETE unknown" .
+ " FROM `##site_access_rule` AS unknown" .
+ " JOIN `##site_access_rule` AS known ON (unknown.user_agent_pattern LIKE known.user_agent_pattern)" .
+ " WHERE unknown.rule='unknown' AND known.rule<>'unknown'" .
" AND unknown.ip_address_start BETWEEN known.ip_address_start AND known.ip_address_end"
);
?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
-<h2><?php echo /* I18N: http://en.wikipedia.org/wiki/User_agent */ WT_I18N::translate('Restrict access to the site, using IP addresses and user-agent strings'); ?></h2>
+<p><?php echo /* I18N: http://en.wikipedia.org/wiki/User_agent */ WT_I18N::translate('Restrict access to the site, using IP addresses and user-agent strings'); ?></p>
<p><?php echo WT_I18N::translate('The following rules are used to decide whether a visitor is a human being (allow full access), a search-engine robot (allow restricted access) or an unwanted crawler (deny all access).'); ?></p>
-<table id="site_access_rules" style="width:100%;">
+<table class="table table-hover table-condensed table-bordered table-site-access-rules">
<thead>
<tr>
<th><?php echo /* I18N [...] of a range of addresses */ WT_I18N::translate('Start IP address'); ?></th>
@@ -292,7 +285,7 @@ WT_DB::exec(
<p><?php echo WT_I18N::translate('The following visitors were not recognized, and were assumed to be search engines.'); ?></p>
-<table id="unknown_site_visitors" style="width:100%;">
+<table class="table table-hover table-condensed table-bordered table-unknown-site-visitors">
<thead>
<tr>
<th rowspan="2"><?php /* I18N: http://en.wikipedia.org/wiki/IP_address */ echo WT_I18N::translate('IP address'); ?></th>
diff --git a/admin_site_change.php b/admin_site_change.php
index cb92309e96..9ac14b8f25 100644
--- a/admin_site_change.php
+++ b/admin_site_change.php
@@ -2,7 +2,7 @@
// Change log viewer.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -205,7 +205,8 @@ case 'load_json':
$recordsTotal = WT_DB::prepare($SELECT2.$WHERE)->execute($args)->fetchOne();
header('Content-type: application/json');
- echo json_encode(array( // See http://www.datatables.net/usage/server-side
+ // See http://www.datatables.net/usage/server-side
+ echo json_encode(array(
'draw' => WT_Filter::getInteger('draw'), // Always an integer
'recordsTotal' => $recordsTotal,
'recordsFiltered' => $recordsFiltered,
@@ -217,6 +218,7 @@ case 'load_json':
$controller
->pageHeader()
->addExternalJavascript(WT_JQUERY_DATATABLES_URL)
+ ->addExternalJavascript(WT_DATATABLES_BOOTSTRAP_JS_URL)
->addInlineJavascript('
jQuery("#log_list").dataTable( {
"dom": \'<"H"pf<"dt-clear">irl>t<"F"pl>\',
diff --git a/admin_site_clean.php b/admin_site_clean.php
index 61d73d165e..85e248dd2c 100644
--- a/admin_site_clean.php
+++ b/admin_site_clean.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2010 PGV Development Team.
@@ -20,75 +20,96 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use Rhumsaa\Uuid\Uuid;
define('WT_SCRIPT_NAME', 'admin_site_clean.php');
require './includes/session.php';
+
+$to_delete = WT_Filter::postArray('to_delete');
+if ($to_delete && WT_Filter::checkCsrf()) {
+ foreach ($to_delete as $path) {
+ $is_dir = is_dir(WT_DATA_DIR . $path);
+ if (WT_File::delete(WT_DATA_DIR . $path)) {
+ if ($is_dir) {
+ WT_FlashMessages::addMessage(WT_I18N::translate('The folder %s was deleted.', WT_Filter::escapeHtml($path)), 'success');
+ } else {
+ WT_FlashMessages::addMessage(WT_I18N::translate('The file %s was deleted.', WT_Filter::escapeHtml($path)), 'success');
+ }
+ } else {
+ if ($is_dir) {
+ WT_FlashMessages::addMessage(WT_I18N::translate('The folder %s could not be deleted.', WT_Filter::escapeHtml($path)), 'danger');
+ } else {
+ WT_FlashMessages::addMessage(WT_I18N::translate('The file %s could not be deleted.', WT_Filter::escapeHtml($path)), 'danger');
+ }
+ }
+ }
+
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
+
+ return;
+}
+
$controller = new WT_Controller_Page();
$controller
->restrictAccess(Auth::isAdmin())
->setPageTitle(/* I18N: The “Data folder” is a configuration setting */ WT_I18N::translate('Clean up data folder'))
->pageHeader();
-require WT_ROOT.'includes/functions/functions_edit.php';
+$do_not_delete = array('index.php', 'config.ini.php');
-// Vars
-$ajaxdeleted = false;
-$locked_by_context = array('index.php', 'config.ini.php');
-
-// If we are storing the media in the data folder (this is the
-// defaultl), then don’t delete it.
-// Need to consider the settings for all gedcoms
+// If we are storing the media in the data folder (this is the default), then don’t delete it.
foreach (WT_Tree::getAll() as $tree) {
- $MEDIA_DIRECTORY=$tree->getPreference('MEDIA_DIRECTORY');
+ $MEDIA_DIRECTORY = $tree->getPreference('MEDIA_DIRECTORY');
- if (substr($MEDIA_DIRECTORY, 0, 3) !='../') {
+ if (substr($MEDIA_DIRECTORY, 0, 3) != '../') {
// Just need to add the first part of the path
$tmp = explode('/', $MEDIA_DIRECTORY);
- $locked_by_context[] = $tmp[0];
+ $do_not_delete[] = $tmp[0];
}
}
-echo
- '<h3>', $controller->getPageTitle(), '</h3>',
- '<p>',
- WT_I18N::translate('Files marked with %s are required for proper operation and cannot be removed.', '<i class="icon-resn-confidential"></i>'),
- '</p>';
+$locked_icon = '<i class="fa fa-ban text-danger"></i>';
-//post back
-if (isset($_REQUEST['to_delete'])) {
- echo '<div class="error">', WT_I18N::translate('Deleted files:'), '</div>';
- foreach ($_REQUEST['to_delete'] as $k=>$v) {
- WT_File::delete(WT_DATA_DIR.$v);
- echo '<div class="error">', $v, '</div>';
+$dir = dir(WT_DATA_DIR);
+$entries = array();
+while (false !== ($entry = $dir->read())) {
+ if ($entry[0] != '.') {
+ $entries[] = $entry;
}
}
-echo '<form name="delete_form" method="post" action="?">';
-echo '<div id="cleanup"><ul>';
-
-$dir=dir(WT_DATA_DIR);
-$entries=array();
-while (false !== ($entry=$dir->read())) {
- $entries[]=$entry;
-}
sort($entries);
-foreach ($entries as $entry) {
- if ($entry[0] != '.') {
- if (in_array($entry, $locked_by_context)) {
- echo "<li class=\"facts_value\" name=\"$entry\" id=\"lock_$entry\" >";
- echo '<i class="icon-resn-confidential"></i> <span>', $entry, '</span>';
- } else {
- echo "<li class=\"facts_value\" name=\"$entry\" id=\"li_$entry\" >";
- echo '<input type="checkbox" name="to_delete[]" value="', $entry, '">', $entry;
- $element[] = "li_".$entry;
+
+?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
+
+<p>
+ <?php echo WT_I18N::translate('Files marked with %s are required for proper operation and cannot be removed.', $locked_icon); ?>
+</p>
+
+<form method="post">
+ <?php echo WT_Filter::getCsrf(); ?>
+ <ul class="fa-ul">
+ <?php
+ foreach ($entries as $entry) {
+ if (in_array($entry, $do_not_delete)) {
+ echo '<li><i class="fa-li fa fa-ban text-danger"></i>', WT_Filter::escapeHtml($entry), '</li>';
+ } else {
+ $uuid = 'label-' . Uuid::uuid4();
+ echo '<li><i class="fa-li fa fa-trash-o"></i>';
+ echo '<label>';
+ echo WT_Filter::escapeHtml($entry);
+ echo ' <input type="checkbox" name="to_delete[]" value="', WT_Filter::escapeHtml($entry), '">';
+ echo '</label></li>';
+ }
}
- echo '</li>';
- }
-}
-$dir->close();
-echo
- '</ul>',
- '<button type="submit">', WT_I18N::translate('Delete'), '</button>',
- '</div>',
- '</form>';
+ $dir->close();
+ ?>
+ </ul>
+ <button class="btn btn-primary" type="submit"><?php echo /* I18N: Button label */ WT_I18N::translate('Delete'); ?></button>
+</form>
diff --git a/admin_site_config.php b/admin_site_config.php
index 8b1a473a02..888219b555 100644
--- a/admin_site_config.php
+++ b/admin_site_config.php
@@ -2,7 +2,7 @@
// A form to edit site configuration.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -19,18 +19,14 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
define('WT_SCRIPT_NAME', 'admin_site_config.php');
require './includes/session.php';
-require WT_ROOT.'includes/functions/functions_edit.php';
+require WT_ROOT . 'includes/functions/functions_edit.php';
$controller = new WT_Controller_Page();
-$controller
- ->restrictAccess(Auth::isAdmin())
- ->addExternalJavascript(WT_JQUERY_JEDITABLE_URL)
- ->addInlineJavascript('jQuery("#tabs").tabs();')
- ->setPageTitle(WT_I18N::translate('Site configuration'))
- ->pageHeader();
+$controller->restrictAccess(Auth::isAdmin());
// Lists of options for <select> controls.
$SMTP_SSL_OPTIONS = array(
@@ -50,127 +46,433 @@ $WELCOME_TEXT_AUTH_MODE_OPTIONS = array(
4 => WT_I18N::translate('Choose user defined welcome text typed below'),
);
+switch (WT_Filter::post('action')) {
+case 'site':
+ if (WT_Filter::checkCsrf()) {
+ $INDEX_DIRECTORY = WT_Filter::post('INDEX_DIRECTORY');
+ if (substr($INDEX_DIRECTORY, -1) !== '/') {
+ $INDEX_DIRECTORY .= '/';
+ }
+ if (WT_File::mkdir($INDEX_DIRECTORY)) {
+ WT_Site::setPreference('INDEX_DIRECTORY', $INDEX_DIRECTORY);
+ } else {
+ WT_FlashMessages::addMessage(WT_I18N::translate('The folder %s does not exist, and it could not be created.', WT_Filter::escapeHtml($INDEX_DIRECTORY)), 'danger');
+ }
+ WT_Site::setPreference('MEMORY_LIMIT', WT_Filter::post('MEMORY_LIMIT'));
+ WT_Site::setPreference('MAX_EXECUTION_TIME', WT_Filter::post('MAX_EXECUTION_TIME'));
+ WT_Site::setPreference('ALLOW_USER_THEMES', WT_Filter::postBool('ALLOW_USER_THEMES'));
+ WT_Site::setPreference('THEME_DIR', WT_Filter::post('THEME_DIR'));
+ WT_Site::setPreference('ALLOW_CHANGE_GEDCOM', WT_Filter::postBool('ALLOW_CHANGE_GEDCOM'));
+ WT_Site::setPreference('SESSION_TIME', WT_Filter::post('SESSION_TIME'));
+ WT_Site::setPreference('SERVER_URL', WT_Filter::post('SERVER_URL'));
+ }
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=site');
+
+ return;
+case 'email':
+ if (WT_Filter::checkCsrf()) {
+ WT_Site::setPreference('SMTP_ACTIVE', WT_Filter::post('SMTP_ACTIVE'));
+ WT_Site::setPreference('SMTP_FROM_NAME', WT_Filter::post('SMTP_FROM_NAME'));
+ WT_Site::setPreference('SMTP_HOST', WT_Filter::post('SMTP_HOST'));
+ WT_Site::setPreference('SMTP_PORT', WT_Filter::post('SMTP_PORT'));
+ WT_Site::setPreference('SMTP_AUTH', WT_Filter::post('SMTP_AUTH'));
+ WT_Site::setPreference('SMTP_AUTH_USER', WT_Filter::post('SMTP_AUTH_USER'));
+ WT_Site::setPreference('SMTP_AUTH_PASS', WT_Filter::post('SMTP_AUTH_PASS'));
+ WT_Site::setPreference('SMTP_SSL', WT_Filter::post('SMTP_SSL'));
+ WT_Site::setPreference('SMTP_HELO', WT_Filter::post('SMTP_HELO'));
+ }
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=email');
+
+ return;
+case 'login':
+ if (WT_Filter::checkCsrf()) {
+ WT_Site::setPreference('LOGIN_URL', WT_Filter::post('LOGIN_URL'));
+ WT_Site::setPreference('WELCOME_TEXT_AUTH_MODE', WT_Filter::post('WELCOME_TEXT_AUTH_MODE'));
+ WT_Site::setPreference('WELCOME_TEXT_AUTH_MODE_' . WT_LOCALE, WT_Filter::post('WELCOME_TEXT_AUTH_MODE_4'));
+ WT_Site::setPreference('USE_REGISTRATION_MODULE', WT_Filter::post('USE_REGISTRATION_MODULE'));
+ WT_Site::setPreference('LOGIN_URL', WT_Filter::post('LOGIN_URL'));
+ WT_Site::setPreference('LOGIN_URL', WT_Filter::post('LOGIN_URL'));
+ WT_Site::setPreference('LOGIN_URL', WT_Filter::post('LOGIN_URL'));
+ WT_Site::setPreference('LOGIN_URL', WT_Filter::post('LOGIN_URL'));
+ WT_Site::setPreference('LOGIN_URL', WT_Filter::post('LOGIN_URL'));
+ }
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?action=login');
+
+ return;
+}
+
+switch (WT_Filter::get('action')) {
+case 'site':
+ $controller->setPageTitle(WT_I18N::translate('Site preferences'));
+ break;
+case 'email':
+ $controller->setPageTitle(WT_I18N::translate('Sending email'));
+ break;
+case 'login':
+ $controller->setPageTitle(WT_I18N::translate('Login and registration'));
+ break;
+default:
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . 'admin.php');
+
+ return;
+}
+
+$controller->pageHeader();
+
?>
-<div id="site-config">
- <div id="tabs">
- <ul>
- <li>
- <a href="#site"><span><?php echo WT_I18N::translate('Site configuration'); ?></span></a>
- </li>
- <li>
- <a href="#mail"><span><?php echo WT_I18N::translate('Mail configuration'); ?></span></a>
- </li>
- <li>
- <a href="#login"><span><?php echo WT_I18N::translate('Login'); ?></span></a>
- </li>
- </ul>
- <div id="site">
- <table>
- <tr>
- <td>
- <dl>
- <dt><?php echo WT_I18N::translate('Data folder'), help_link('INDEX_DIRECTORY'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-INDEX_DIRECTORY', WT_Site::getPreference('INDEX_DIRECTORY'), $controller); ?></dd>
- <dt><?php echo WT_I18N::translate('Memory limit'), help_link('MEMORY_LIMIT'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-MEMORY_LIMIT', WT_Site::getPreference('MEMORY_LIMIT'), $controller); ?></dd>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
- <dt><?php echo WT_I18N::translate('PHP time limit'), help_link('MAX_EXECUTION_TIME'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-MAX_EXECUTION_TIME', WT_Site::getPreference('MAX_EXECUTION_TIME'), $controller); ?></dd>
+<form method="post" class="form-horizontal">
+ <?php echo WT_Filter::getCsrf(); ?>
- <dt><?php echo WT_I18N::translate('Allow users to select their own theme'), help_link('ALLOW_USER_THEMES'); ?></dt>
- <dd><?php echo edit_field_yes_no_inline('site_setting-ALLOW_USER_THEMES', WT_Site::getPreference('ALLOW_USER_THEMES'), $controller); ?></dd>
+ <?php if (WT_Filter::get('action') === 'site'): ?>
+ <input type="hidden" name="action" value="site">
- <dt><?php echo WT_I18N::translate('Default theme'), help_link('THEME'); ?></dt>
- <dd><?php echo select_edit_control_inline('site_setting-THEME_DIR', array_flip(get_theme_names()), null, WT_Site::getPreference('THEME_DIR'), $controller); ?></dd>
+ <!-- INDEX_DIRECTORY -->
+ <div class="form-group">
+ <label for="INDEX_DIRECTORY" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Data folder'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="text" class="form-control" id="INDEX_DIRECTORY" name="INDEX_DIRECTORY" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('INDEX_DIRECTORY')); ?>" maxlength="255">
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the "Data folder" site configuration setting */ WT_I18N::translate('This folder will be used by webtrees to store media files, GEDCOM files, temporary files, etc. These files may contain private data, and should not be made available over the internet.'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo /* I18N: “Apache” is a software program. */ WT_I18N::translate('To protect this private data, webtrees uses an Apache configuration file (.htaccess) which blocks all access to this folder. If your web-server does not support .htaccess files, and you cannot restrict access to this folder, then you can select another folder, away from your web documents.'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('If you select a different folder, you must also move all files (except config.ini.php, index.php, and .htaccess) from the existing folder to the new folder.'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('The folder can be specified in full (e.g. /home/user_name/webtrees_data/) or relative to the installation folder (e.g. ../../webtrees_data/).'); ?>
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Show list of family trees'), help_link('ALLOW_CHANGE_GEDCOM'); ?></dt>
- <dd><?php echo edit_field_yes_no_inline('site_setting-ALLOW_CHANGE_GEDCOM', WT_Site::getPreference('ALLOW_CHANGE_GEDCOM'), $controller); ?></dd>
+ <!-- MEMORY_LIMIT -->
+ <div class="form-group">
+ <label for="MEMORY_LIMIT" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Memory limit'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="text" class="form-control" id="MEMORY_LIMIT" name="MEMORY_LIMIT" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('MEMORY_LIMIT')); ?>" pattern="[0-9]+[KMG]" placeholder="<?php echo get_cfg_var('memory_limit'); ?>" maxlength="255">
+ <p class="small text-muted">
+ <?php echo /* I18N: %s is an amount of memory, such as 32MB */ WT_I18N::translate('By default, your server allows scripts to use %s of memory.', get_cfg_var('memory_limit')); ?>
+ <?php echo WT_I18N::translate('You can request a higher or lower limit, although the server may ignore this request.'); ?>
+ <?php echo WT_I18N::translate('If you leave this setting empty, the default value will be used.'); ?>
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Session timeout'), help_link('SESSION_TIME'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-SESSION_TIME', WT_Site::getPreference('SESSION_TIME'), $controller); ?></dd>
+ <!-- MAX_EXECUTION_TIME -->
+ <div class="form-group">
+ <label for="MAX_EXECUTION_TIME" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('PHP time limit'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="text" class="form-control" id="MAX_EXECUTION_TIME" name="MAX_EXECUTION_TIME" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('MAX_EXECUTION_TIME')); ?>" pattern="[0-9]*" placeholder="<?php echo get_cfg_var('max_execution_time'); ?>" maxlength="255">
+ <p class="small text-muted">
+ <?php echo WT_I18N::plural(
+ 'By default, your server allows scripts to run for %s second.',
+ 'By default, your server allows scripts to run for %s seconds.',
+ get_cfg_var('max_execution_time'), get_cfg_var('max_execution_time'));
+ ?>
+ <?php echo WT_I18N::translate('You can request a higher or lower limit, although the server may ignore this request.'); ?>
+ <?php echo WT_I18N::translate('If you leave this setting empty, the default value will be used.'); ?>
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Website URL'), help_link('SERVER_URL'); ?></dt>
- <dd><?php echo select_edit_control_inline('site_setting-SERVER_URL', array(WT_SERVER_NAME.WT_SCRIPT_PATH=>WT_SERVER_NAME.WT_SCRIPT_PATH), '', WT_Site::getPreference('SERVER_URL'), $controller); ?></dd>
- </dl>
- </td>
- </tr>
- </table>
+ <!-- THEME_DIR -->
+ <div class="form-group">
+ <label for="THEME_DIR" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Default theme'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('THEME_DIR', Theme::themeNames(), null, WT_Site::getPreference('THEME_DIR'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the "Default theme" site configuration setting */ WT_I18N::translate('You can change the appearance of webtrees using “themes”. Each theme has a different style, layout, color scheme, etc.'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('Themes can be selected at three levels: user, GEDCOM, and site. User settings take priority over GEDCOM settings, which in turn take priority over the site setting. Selecting “default theme” at user level will give the setting for the current GEDCOM. Selecting “default theme” at GEDCOM level will give the site setting.'); ?>
+ </p>
+ </div>
</div>
- <div id="mail">
- <table>
- <tr>
- <td>
- <dl>
- <dt><?php echo WT_I18N::translate('Messages'), help_link('SMTP_ACTIVE'); ?></dt>
- <dd><?php echo select_edit_control_inline('site_setting-SMTP_ACTIVE', $SMTP_ACTIVE_OPTIONS, null, WT_Site::getPreference('SMTP_ACTIVE'), $controller); ?></dd>
- <dt><?php echo WT_I18N::translate('Sender name'), help_link('SMTP_FROM_NAME'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-SMTP_FROM_NAME', WT_Site::getPreference('SMTP_FROM_NAME'), $controller); ?></dd>
- </dl>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('SMTP mail server'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <dl>
- <dt><?php echo WT_I18N::translate('Server name'), help_link('SMTP_HOST'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-SMTP_HOST', WT_Site::getPreference('SMTP_HOST'), $controller); ?></dd>
- <dt><?php echo WT_I18N::translate('Port number'), help_link('SMTP_PORT'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-SMTP_PORT', WT_Site::getPreference('SMTP_PORT'), $controller); ?></dd>
+ <!-- ALLOW_USER_THEMES -->
+ <div class="form-group">
+ <label for="ALLOW_USER_THEMES" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Allow users to select their own theme'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo edit_field_yes_no('ALLOW_USER_THEMES', WT_Site::getPreference('ALLOW_USER_THEMES')); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Allow users to select their own theme” site configuration setting */ WT_I18N::translate('Gives users the option of selecting their own theme.'); ?>
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Use password'), help_link('SMTP_AUTH'); ?></dt>
- <dd><?php echo edit_field_yes_no_inline('site_setting-SMTP_AUTH', WT_Site::getPreference('SMTP_AUTH'), $controller); ?></dd>
+ <!-- ALLOW_CHANGE_GEDCOM -->
+ <div class="form-group">
+ <label for="ALLOW_CHANGE_GEDCOM" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Show list of family trees'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo edit_field_yes_no('ALLOW_CHANGE_GEDCOM', WT_Site::getPreference('ALLOW_CHANGE_GEDCOM')); ?>
+ <p class="small text-muted">
+ <?php /* I18N: Help text for the “Show list of family trees” site configuration setting */ WT_I18N::translate('For sites with more than one family tree, this option will show the list of family trees in the main menu, the search pages, etc.'); ?>
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Username'), help_link('SMTP_AUTH_USER'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-SMTP_AUTH_USER', WT_Site::getPreference('SMTP_AUTH_USER'), $controller); ?></dd>
+ <!-- SESSION_TIME -->
+ <div class="form-group">
+ <label for="SESSION_TIME" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Session timeout'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="text" class="form-control" id="SESSION_TIME" name="SESSION_TIME" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('SESSION_TIME')); ?>" pattern="[0-9]*" placeholder="7200" maxlength="255">
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Session timeout” site configuration setting */ WT_I18N::translate('The time in seconds that a webtrees session remains active before requiring a login. The default is 7200, which is 2 hours.'); ?>
+ <?php echo WT_I18N::translate('If you leave this setting empty, the default value will be used.'); ?>
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Password'), help_link('SMTP_AUTH_PASS'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-SMTP_AUTH_PASS', '' /* Don't show password. save.php has special code for this. */, $controller); ?></dd>
+ <!-- SERVER_URL -->
+ <div class="form-group">
+ <label for="SERVER_URL" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Website URL'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('SERVER_URL', array(WT_SERVER_NAME.WT_SCRIPT_PATH=>WT_SERVER_NAME.WT_SCRIPT_PATH), '', WT_Site::getPreference('SERVER_URL'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the "Website URL" site configuration setting */ WT_I18N::translate('If your site can be reached using more than one URL, such as <b>http://www.example.com/webtrees/</b> and <b>http://webtrees.example.com/</b>, you can specify the preferred URL. Requests for the other URLs will be redirected to the preferred one.'); ?>
+ <?php echo WT_I18N::translate('If you leave this setting empty, the default value will be used.'); ?>
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Secure connection'), help_link('SMTP_SSL'); ?></dt>
- <dd><?php echo select_edit_control_inline('site_setting-SMTP_SSL', $SMTP_SSL_OPTIONS, null, WT_Site::getPreference('SMTP_SSL'), $controller); ?></dd>
+ <?php elseif (WT_Filter::get('action') === 'email'): ?>
+ <input type="hidden" name="action" value="email">
- <dt><?php echo WT_I18N::translate('Sending server name'), help_link('SMTP_HELO'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-SMTP_HELO', WT_Site::getPreference('SMTP_HELO'), $controller); ?></dd>
- </dl>
- </td>
- </tr>
- </table>
- <p>
- <?php echo WT_I18N::translate('To use a Google mail account, use the following settings: server=smtp.gmail.com, port=587, security=tls, username=xxxxx@gmail.com, password=[your gmail password]'); ?>
- </p>
+ <!-- SMTP_ACTIVE -->
+ <div class="form-group">
+ <label for="SMTP_ACTIVE" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Messages'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('SMTP_ACTIVE', $SMTP_ACTIVE_OPTIONS, null, WT_Site::getPreference('SMTP_ACTIVE'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Messages” site configuration setting */ WT_I18N::translate('webtrees needs to send emails, such as password reminders and site notifications. To do this, it can use this server’s built in PHP mail facility (which is not always available) or an external SMTP (mail-relay) service, for which you will need to provide the connection details.'); ?>
+ </p>
+ </div>
</div>
- <div id="login">
- <table>
- <tr>
- <td>
- <dl>
- <dt><?php echo WT_I18N::translate('Login URL'), help_link('LOGIN_URL'); ?></dt>
- <dd><?php echo edit_field_inline('site_setting-LOGIN_URL', WT_Site::getPreference('LOGIN_URL'), $controller); ?></dd>
- <dt><?php echo WT_I18N::translate('Welcome text on login page'), help_link('WELCOME_TEXT_AUTH_MODE'); ?></dt>
- <dd><?php echo select_edit_control_inline('site_setting-WELCOME_TEXT_AUTH_MODE', $WELCOME_TEXT_AUTH_MODE_OPTIONS, null, WT_Site::getPreference('WELCOME_TEXT_AUTH_MODE'), $controller); ?></dd>
+ <!-- SMTP_FROM_NAME -->
+ <div class="form-group">
+ <label for="SMTP_FROM_NAME" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Sender name'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="email" class="form-control" id="SMTP_FROM_NAME" name="SMTP_FROM_NAME" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('SMTP_FROM_NAME')); ?>" placeholder="no-reply@localhost" maxlength="255">
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Sender name” site configuration setting */ WT_I18N::translate('This name is used in the “From” field, when sending automatic emails from this server.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('SMTP mail server'); ?></h3>
+
+ <!-- SMTP_HOST -->
+ <div class="form-group">
+ <label for="SMTP_HOST" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Server name'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="text" class="form-control" id="SMTP_HOST" name="SMTP_HOST" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('SMTP_HOST')); ?>" placeholder="smtp.example.com" maxlength="255" pattern="[a-z0-9-]+(\.[a-z0-9-]+)*">
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Server name” site configuration setting */ WT_I18N::translate('This is the name of the SMTP server. “localhost” means that the mail service is running on the same computer as your web server.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- SMTP_PORT -->
+ <div class="form-group">
+ <label for="SMTP_PORT" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Port number'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="text" class="form-control" id="SMTP_PORT" name="SMTP_PORT" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('SMTP_PORT')); ?>" pattern="[0-9]*" placeholder="25" maxlength="5">
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the "Port number" site configuration setting */ WT_I18N::translate('By default, SMTP works on port 25.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- SMTP_AUTH -->
+ <div class="form-group">
+ <label for="SMTP_AUTH" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Use password'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo edit_field_yes_no('SMTP_AUTH', WT_Site::getPreference('SMTP_AUTH')); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Use password” site configuration setting */ WT_I18N::translate('Most SMTP servers require a password.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- SMTP_AUTH_USER -->
+ <div class="form-group">
+ <label for="SMTP_AUTH_USER" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Username'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="text" class="form-control" id="SMTP_AUTH_USER" name="SMTP_AUTH_USER" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('SMTP_AUTH_USER')); ?>" maxlength="255">
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the "Username" site configuration setting */ WT_I18N::translate('The user name required for authentication with the SMTP server.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- SMTP_AUTH_PASS -->
+ <div class="form-group">
+ <label for="SMTP_AUTH_PASS" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Password'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="password" class="form-control" id="SMTP_AUTH_PASS" name="SMTP_AUTH_PASS" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('SMTP_AUTH_PASS')); ?>">
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the "Password" site configuration setting */ WT_I18N::translate('The password required for authentication with the SMTP server.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- SMTP_SSL -->
+ <div class="form-group">
+ <label for="SMTP_SSL" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Secure connection'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('SMTP_SSL', $SMTP_SSL_OPTIONS, null, WT_Site::getPreference('SMTP_SSL'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Secure connection” site configuration setting */ WT_I18N::translate('Most servers do not use secure connections.'); ?>
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Custom welcome text'), ' — ', WT_LOCALE, help_link('WELCOME_TEXT_AUTH_MODE_CUST'); ?></dt>
- <dd><?php echo edit_text_inline('site_setting-WELCOME_TEXT_AUTH_MODE_4', WT_Site::getPreference('WELCOME_TEXT_AUTH_MODE_'.WT_LOCALE), $controller); ?></dd>
+ <!-- SMTP_HELO -->
+ <div class="form-group">
+ <label for="SMTP_HELO" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Sending server name'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="text" class="form-control" id="SMTP_HELO" name="SMTP_HELO" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('SMTP_HELO')); ?>" placeholder="localhost" maxlength="255" pattern="[a-z0-9-]+(\.[a-z0-9-]+)*">
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the "Sending server name" site configuration setting */ WT_I18N::translate('Many mail servers require that the sending server identifies itself correctly, using a valid domain name.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div class="col-sm-offset-3 col-sm-9">
+ <p class="alert alert-info">
+ <?php echo WT_I18N::translate('To use a Google mail account, use the following settings: server=smtp.gmail.com, port=587, security=tls, username=xxxxx@gmail.com, password=[your gmail password]'); ?>
+ </p>
+ </div>
+ </div>
+
+ <?php elseif (WT_Filter::get('action') === 'login'): ?>
+ <input type="hidden" name="action" value="login">
+
+ <!-- LOGIN_URL -->
+ <div class="form-group">
+ <label for="LOGIN_URL" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Login URL'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="text" class="form-control" id="LOGIN_URL" name="LOGIN_URL" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('LOGIN_URL')); ?>" maxlength="255">
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the "Login URL" site configuration setting */ WT_I18N::translate('You only need to enter a Login URL if you want to redirect to a different site or location when your users login. This is very useful if you need to switch from http to https when your users login. Include the full URL to <i>login.php</i>. For example, https://www.yourserver.com/webtrees/login.php .'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- WELCOME_TEXT_AUTH_MODE -->
+ <div class="form-group">
+ <label for="WELCOME_TEXT_AUTH_MODE" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Welcome text on login page'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('WELCOME_TEXT_AUTH_MODE', $WELCOME_TEXT_AUTH_MODE_OPTIONS, null, WT_Site::getPreference('WELCOME_TEXT_AUTH_MODE'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ </p>
+ </div>
+ </div>
+
+ <!-- LOGIN_URL -->
+ <div class="form-group">
+ <label for="WELCOME_TEXT_AUTH_MODE_4" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Custom welcome text'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input type="text" class="form-control" id="WELCOME_TEXT_AUTH_MODE_4" name="WELCOME_TEXT_AUTH_MODE_4" value="<?php echo WT_Filter::escapeHtml(WT_Site::getPreference('WELCOME_TEXT_AUTH_MODE_' . WT_LOCALE)); ?>" maxlength="255">
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the "Custom welcome text" site configuration setting */ WT_I18N::translate('To set this text for other languages, you must switch to that language, and visit this page again.'); ?>
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Allow visitors to request account registration'), help_link('USE_REGISTRATION_MODULE'); ?></dt>
- <dd><?php echo edit_field_yes_no_inline('site_setting-USE_REGISTRATION_MODULE', WT_Site::getPreference('USE_REGISTRATION_MODULE'), $controller); ?></dd>
+ <!-- USE_REGISTRATION_MODULE -->
+ <div class="form-group">
+ <label for="USE_REGISTRATION_MODULE" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Allow visitors to request account registration'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo edit_field_yes_no('USE_REGISTRATION_MODULE', WT_Site::getPreference('USE_REGISTRATION_MODULE')); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Allow visitors to request account registration” site configuration setting */ WT_I18N::translate('Gives visitors the option of registering themselves for an account on the site.<br><br>The visitor will receive an email message with a code to verify his application for an account. After verification, an administrator will have to approve the registration before it becomes active.'); ?>
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Require an administrator to approve new user registrations'), help_link('REQUIRE_ADMIN_AUTH_REGISTRATION'); ?></dt>
- <dd><?php echo edit_field_yes_no_inline('site_setting-REQUIRE_ADMIN_AUTH_REGISTRATION', WT_Site::getPreference('REQUIRE_ADMIN_AUTH_REGISTRATION'), $controller); ?></dd>
+ <!-- USE_REGISTRATION_MODULE -->
+ <div class="form-group">
+ <label for="REQUIRE_ADMIN_AUTH_REGISTRATION" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Require an administrator to approve new user registrations'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo edit_field_yes_no('REQUIRE_ADMIN_AUTH_REGISTRATION', WT_Site::getPreference('REQUIRE_ADMIN_AUTH_REGISTRATION')); ?>
+ <p class="small text-muted">
+ </p>
+ </div>
+ </div>
+
+ <!-- USE_REGISTRATION_MODULE -->
+ <div class="form-group">
+ <label for="SHOW_REGISTER_CAUTION" class="col-sm-3 control-label">
+ <?php echo /* I18N: A site configuration setting */ WT_I18N::translate('Show acceptable use agreement on “Request new user account” page'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo edit_field_yes_no('SHOW_REGISTER_CAUTION', WT_Site::getPreference('SHOW_REGISTER_CAUTION')); ?>
+ <p class="small text-muted">
+ </p>
+ </div>
+ </div>
- <dt><?php echo WT_I18N::translate('Show acceptable use agreement on “Request new user account” page'), help_link('SHOW_REGISTER_CAUTION'); ?></dt>
- <dd><?php echo edit_field_yes_no_inline('site_setting-SHOW_REGISTER_CAUTION', WT_Site::getPreference('SHOW_REGISTER_CAUTION'), $controller); ?></dd>
- </dl>
- </td>
- </tr>
- </table>
+ <?php endif; ?>
+ <div class="form-group">
+ <div class="col-sm-offset-3 col-sm-9">
+ <button type="submit" class="btn btn-primary">
+ <?php echo WT_I18N::translate('save'); ?>
+ </button>
</div>
</div>
-</div>
+</form>
diff --git a/admin_site_info.php b/admin_site_info.php
index 2a9d576869..26d288011e 100644
--- a/admin_site_info.php
+++ b/admin_site_info.php
@@ -4,7 +4,7 @@
// Provides links for administrators to get to other administrative areas of the site
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team.
@@ -31,33 +31,82 @@ require './includes/session.php';
$controller = new WT_Controller_Page();
$controller
->restrictAccess(Auth::isAdmin())
- ->setPageTitle(WT_I18N::translate('PHP information'))
+ ->setPageTitle(WT_I18N::translate('Server information'))
->pageHeader();
+$variables = WT_DB::prepare("SHOW VARIABLES")->fetchAssoc();
+array_walk($variables, function(&$x) { $x = str_replace(',', ', ', $x); });
+
ob_start();
phpinfo();
-$php_info = ob_get_clean();
+preg_match ('%<style type="text/css">(.*?)</style>.*?(<body>.*</body>)%s', ob_get_clean(), $matches);
+$style = $matches[1];
+$html = $matches[2];
-$php_info = str_replace(" width=\"600\"", " width=\"\"", $php_info);
-$php_info = str_replace("</body></html>", "", $php_info);
-$php_info = str_replace("<table", "<table class=\"php_info ltr\"", $php_info);
-$php_info = str_replace("td class=\"e\"", "td", $php_info);
-$php_info = str_replace("td class=\"v\"", "td", $php_info);
-$php_info = str_replace("tr class=\"v\"", "tr", $php_info);
-$php_info = str_replace("tr class=\"h\"", "tr", $php_info);
+?>
-$php_info = str_replace(";", "; ", $php_info);
-$php_info = str_replace(",", ", ", $php_info);
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
-// Put logo in table header
-$logo_offset = strpos($php_info, "<td>");
-$php_info = substr_replace($php_info, "<td colspan=\"3\" class=\"center\">", $logo_offset, 4);
-$logo_width_offset = strpos($php_info, "width=\"\"");
-$php_info = substr_replace($php_info, "", $logo_width_offset, 8);
-$php_info = str_replace(" width=\"\"", "", $php_info);
+<div class="row">
+ <div class="col-xs-12">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h3 class="panel-title">
+ <?php echo WT_I18N::translate('PHP information'); ?>
+ </h3>
+ </div>
+ <div class="panel-body">
+ <style type="text/css" scoped>
+ <?php echo $style; ?>
+ table { width: 100%; }
+ td.v { word-break: break-all; }
+ </style>
+ <?php echo $html; ?>
+ </div>
+ </div>
+ </div>
+</div>
-$offset = strpos($php_info, "<table");
-$php_info = substr($php_info, $offset);
+<div class="row">
+ <div class="col-md-12">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h3 class="panel-title">
+ <?php echo WT_I18N::translate('MySQL variables'); ?>
+ </h3>
+ </div>
+ <div class="panel-body">
+ <dl>
+ <?php foreach ($variables as $variable => $value): ?>
+ <dt><?php echo WT_Filter::escapeHtml($variable); ?></dt>
+ <dd><?php echo WT_Filter::escapeHtml($value); ?></dd>
+ <?php endforeach; ?>
+ </dl>
+ </div>
+ </div>
+ </div>
+</div>
-echo '<div id="page_help">', help_link('phpinfo'), '</div>';
-echo '<div class="php_info">', $php_info, '</div>';
+<div class="row">
+ <div class="col-md-12">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h3 class="panel-title">
+ <?php echo WT_I18N::translate('Time'); ?>
+ </h3>
+ </div>
+ <div class="panel-body">
+ <?php echo /* I18N: The local time on the server */ WT_I18N::translate('Server time'); ?> —
+ <?php echo format_timestamp(WT_SERVER_TIMESTAMP); ?><br>
+ <?php echo /* I18N: The local time on the client/browser */ WT_I18N::translate('Client time'); ?> —
+ <?php echo format_timestamp(WT_CLIENT_TIMESTAMP); ?><br>
+ <?php echo /* I18N: Timezone - http://en.wikipedia.org/wiki/UTC */ WT_I18N::translate('UTC'); ?> —
+ <?php echo format_timestamp(WT_TIMESTAMP); ?>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/admin_site_logs.php b/admin_site_logs.php
index 17e7b10b7b..16478dd747 100644
--- a/admin_site_logs.php
+++ b/admin_site_logs.php
@@ -2,7 +2,7 @@
// Log viewer.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -176,7 +176,8 @@ case 'load_json':
$recordsTotal=WT_DB::prepare($SELECT2.$WHERE)->execute($args)->fetchOne();
header('Content-type: application/json');
- echo json_encode(array( // See http://www.datatables.net/usage/server-side
+ // See http://www.datatables.net/usage/server-side
+ echo json_encode(array(
'sEcho' => WT_Filter::getInteger('sEcho'), // Always an integer
'recordsTotal' => $recordsTotal,
'recordsFiltered' => $recordsFiltered,
@@ -188,18 +189,15 @@ case 'load_json':
$controller
->pageHeader()
->addExternalJavascript(WT_JQUERY_DATATABLES_URL)
+ ->addExternalJavascript(WT_DATATABLES_BOOTSTRAP_JS_URL)
->addInlineJavascript('
- jQuery("#log_list").dataTable( {
- dom: \'<"H"pf<"dt-clear">irl>t<"F"pl>\',
+ jQuery(".table-site-logs").dataTable( {
processing: true,
serverSide: true,
ajax: "'.WT_SERVER_NAME.WT_SCRIPT_PATH.WT_SCRIPT_NAME.'?action=load_json&from='.$from.'&to='.$to.'&type='.$type.'&text='.rawurlencode($text).'&ip='.rawurlencode($ip).'&user='.rawurlencode($user).'&gedc='.rawurlencode($gedc).'",
'.WT_I18N::datatablesI18N(array(10,20,50,100,500,1000,-1)).',
- jQueryUI: true,
- autoWidth: false,
sorting: [[ 0, "desc" ]],
- pageLength: ' . Auth::user()->getPreference('admin_site_log_page_size', 20) . ',
- pagingType: "full_numbers"
+ pageLength: ' . Auth::user()->getPreference('admin_site_log_page_size', 20) . '
});
');
@@ -217,56 +215,77 @@ foreach (User::all() as $tmp_user) {
$users_array[$tmp_user->getUserName()] = $tmp_user->getUserName();
}
-echo
- '<form name="logs" method="get" action="'.WT_SCRIPT_NAME.'">',
- '<input type="hidden" name="action" value="show">',
- '<table class="site_logs">',
- '<tr>',
- '<td colspan="6">',
- // I18N: %s are both user-input date fields
- WT_I18N::translate('From %s to %s', '<input class="log-date" name="from" value="'.WT_Filter::escapeHtml($from).'">', '<input class="log-date" name="to" value="'.WT_Filter::escapeHtml($to).'">'),
- '</td>',
- '</tr><tr>',
- '<td>',
- WT_I18N::translate('Type'), '<br>', select_edit_control('type', array(''=>'', 'auth'=>'auth','config'=>'config','debug'=>'debug','edit'=>'edit','error'=>'error','media'=>'media','search'=>'search'), null, $type, ''),
- '</td>',
- '<td>',
- WT_I18N::translate('Message'), '<br><input class="log-filter" name="text" value="', WT_Filter::escapeHtml($text), '"> ',
- '</td>',
- '<td>',
- WT_I18N::translate('IP address'), '<br><input class="log-filter" name="ip" value="', WT_Filter::escapeHtml($ip), '"> ',
- '</td>',
- '<td>',
- WT_I18N::translate('User'), '<br>', select_edit_control('user', $users_array, '', $user, ''),
- '</td>',
- '<td>',
- WT_I18N::translate('Family tree'), '<br>', select_edit_control('gedc', WT_Tree::getNameList(), '', $gedc, Auth::isAdmin() ? '' : 'disabled'),
- '</td>',
- '</tr><tr>',
- '<td colspan="6">',
- '<input type="submit" value="', WT_I18N::translate('Filter'), '">',
- '<input type="submit" value="', WT_I18N::translate('Export'), '" onclick="document.logs.action.value=\'export\';return true;" ', ($action=='show' ? '' : 'disabled="disabled"'),'>',
- '<input type="submit" value="', WT_I18N::translate('Delete'), '" onclick="if (confirm(\'', WT_Filter::escapeHtml(WT_I18N::translate('Permanently delete these records?')) , '\')) {document.logs.action.value=\'delete\';return true;} else {return false;}" ', ($action=='show' ? '' : 'disabled="disabled"'),'>',
- '</td>',
- '</tr>',
- '</table>',
- '</form>';
+?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
-if ($action) {
- echo
- '<br>',
- '<table id="log_list">',
- '<thead>',
- '<tr>',
- '<th>', WT_I18N::translate('Timestamp'), '</th>',
- '<th>', WT_I18N::translate('Type'), '</th>',
- '<th>', WT_I18N::translate('Message'), '</th>',
- '<th>', WT_I18N::translate('IP address'), '</th>',
- '<th>', WT_I18N::translate('User'), '</th>',
- '<th>', WT_I18N::translate('Family tree'), '</th>',
- '</tr>',
- '</thead>',
- '<tbody>',
- '</tbody>',
- '</table>';
-}
+<form name="logs">
+ <input type="hidden" name="action" value="show">
+ <table class="table table-site-logs-options">
+ <tbody>
+ <tr>
+ <td colspan="6">
+ <?php echo /* I18N: %s are both user-input date fields */ WT_I18N::translate('From %s to %s', '<input class="log-date" name="from" value="'.WT_Filter::escapeHtml($from).'">', '<input class="log-date" name="to" value="'.WT_Filter::escapeHtml($to).'">'); ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <?php echo WT_I18N::translate('Type'), '<br>', select_edit_control('type', array(''=>'', 'auth'=>'auth','config'=>'config','debug'=>'debug','edit'=>'edit','error'=>'error','media'=>'media','search'=>'search'), null, $type, ''); ?>
+ </td>
+ <td>
+ <?php echo WT_I18N::translate('Message'); ?>
+ <br>
+ <input class="log-filter" name="text" value="<?php echo WT_Filter::escapeHtml($text); ?>">
+ </td>
+ <td>
+ <?php echo WT_I18N::translate('IP address'); ?>
+ <br>
+ <input class="log-filter" name="ip" value="<?php WT_Filter::escapeHtml($ip); ?>">
+ </td>
+ <td>
+ <?php echo WT_I18N::translate('User'); ?>
+ <br>
+ <?php echo select_edit_control('user', $users_array, '', $user, ''); ?>
+ </td>
+ <td>
+ <?php echo WT_I18N::translate('Family tree'); ?>
+ <br>
+ <?php echo select_edit_control('gedc', WT_Tree::getNameList(), '', $gedc, Auth::isAdmin() ? '' : 'disabled'); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="6">
+ <button type="submit" class="btn btn-primary">
+ <?php echo WT_I18N::translate('Filter'); ?>
+ </button>
+ <button type="button" class="btn btn-primary" onclick="document.logs.action.value='export';return true;" <?php echo $action === 'show' ? '' : 'disabled'; ?>>
+ <?php echo WT_I18N::translate('Export'); ?>
+ </button>
+ <button type="button" class="btn btn-primary" onclick="if (confirm('<?php echo WT_I18N::translate('Permanently delete these records?'); ?>')) {document.logs.action.value='delete'; return true;} else {return false;}" <?php echo $action === 'show' ? '' : 'disabled'; ?>>
+ <?php echo WT_I18N::translate('Delete'); ?>
+ </button>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</form>
+
+<?php if ($action): ?>
+<table class="table table-bordered table-condensed table-hover table-striped table-site-logs">
+ <thead>
+ <tr>
+ <th><?php echo WT_I18N::translate('Timestamp'); ?></th>
+ <th><?php echo WT_I18N::translate('Type'); ?></th>
+ <th><?php echo WT_I18N::translate('Message'); ?></th>
+ <th><?php echo WT_I18N::translate('IP address'); ?></th>
+ <th><?php echo WT_I18N::translate('User'); ?></th>
+ <th><?php echo WT_I18N::translate('Family tree'); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>
+</table>
+<?php endif; ?>
diff --git a/admin_site_merge.php b/admin_site_merge.php
index 381d983fe5..c07178a72f 100644
--- a/admin_site_merge.php
+++ b/admin_site_merge.php
@@ -4,7 +4,7 @@
// This page will allow you to merge 2 gedcom records
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2010 PGV Development Team.
@@ -61,8 +61,8 @@ if ($action!='choose') {
echo '<span class="error">', WT_I18N::translate('Unable to find record with ID'), ':</span> ', $gid2, ', ', $ged2;
$action='choose';
} elseif ($rec1::RECORD_TYPE != $rec2::RECORD_TYPE) {
- echo '<span class="error">', WT_I18N::translate('Records are not the same type. Cannot merge records that are not the same type.'), '</span>';
- $action='choose';
+ echo '<span class="error">', WT_I18N::translate('Records are not the same type. Cannot merge records that are not the same type.'), '</span>';
+ $action='choose';
} else {
$facts1 = array();
$facts2 = array();
diff --git a/admin_site_readme.php b/admin_site_readme.php
index 466d994301..cca63945d0 100644
--- a/admin_site_readme.php
+++ b/admin_site_readme.php
@@ -2,7 +2,7 @@
// UI for online updating of the config file.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -36,6 +36,12 @@ $readme = file_get_contents('README.md');
$readme = preg_replace('/.*(?=# webtrees)/s', '', $readme);
?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
+
<div class="markdown" dir="ltr" lang="en">
<?php echo MarkdownExtra::defaultTransform($readme); ?>
</div>
diff --git a/admin_site_upgrade.php b/admin_site_upgrade.php
index 1acde30662..29647cdd17 100644
--- a/admin_site_upgrade.php
+++ b/admin_site_upgrade.php
@@ -2,7 +2,7 @@
// Welcome page for the administration module
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -19,6 +19,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
define('WT_SCRIPT_NAME', 'admin_site_upgrade.php');
@@ -214,7 +215,7 @@ echo '</li>';
echo '<li>', /* I18N: The system is about to [...] */ WT_I18N::translate('Check for custom themes…');
$custom_themes = false;
-foreach (get_theme_names() as $theme_name => $theme_id) {
+foreach (Theme::themeNames() as $theme_id => $theme_name) {
switch($theme_id) {
case 'clouds':
case 'colors':
diff --git a/admin_trees_check.php b/admin_trees_check.php
index 05f29fc102..6fde003870 100644
--- a/admin_trees_check.php
+++ b/admin_trees_check.php
@@ -2,7 +2,7 @@
// Check a family tree for structural errors.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 Greg Roach
+// Copyright (C) 2015 Greg Roach
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -30,16 +30,6 @@ $controller
->setPageTitle(WT_I18N::translate('Check for errors'))
->pageHeader();
-echo '<form method="get" action="', WT_SCRIPT_NAME, '">';
-echo '<input type="hidden" name="go" value="1">';
-echo select_edit_control('ged', WT_Tree::getNameList(), null, WT_GEDCOM);
-echo '<input type="submit" value="', $controller->getPageTitle(), '">';
-echo '</form>';
-
-if (!WT_Filter::get('go')) {
- exit;
-}
-
// We need to work with raw GEDCOM data, as we are looking for errors
// which may prevent the WT_GedcomRecord objects from working...
@@ -208,14 +198,13 @@ foreach ($all_links as $xref1 => $links) {
* @return string
*/
function link_message($type1, $xref1, $type2, $xref2) {
- return
- /* I18N: The placeholders are GEDCOM XREFs and tags. e.g. “INDI I123 contains a FAMC link to F234.” */ WT_I18N::translate(
- '%1$s %2$s has a %3$s link to %4$s.',
- format_type($type1),
- format_link($xref1),
- format_type($type2),
- format_link($xref2)
- );
+ return /* I18N: The placeholders are GEDCOM XREFs and tags. e.g. “INDI I123 contains a FAMC link to F234.” */ WT_I18N::translate(
+ '%1$s %2$s has a %3$s link to %4$s.',
+ format_type($type1),
+ format_link($xref1),
+ format_type($type2),
+ format_link($xref2)
+ );
}
/**
diff --git a/admin_trees_config.php b/admin_trees_config.php
index be930912f8..16beb41941 100644
--- a/admin_trees_config.php
+++ b/admin_trees_config.php
@@ -2,7 +2,7 @@
// UI for online updating of the GEDCOM config file.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2010 PGV Development Team.
@@ -26,13 +26,14 @@ use WT\User;
define('WT_SCRIPT_NAME', 'admin_trees_config.php');
+// Temporary
+if (!function_exists('with')) { function with($x) { return $x; } }
+
require './includes/session.php';
require WT_ROOT.'includes/functions/functions_edit.php';
$controller = new WT_Controller_Page();
-$controller
- ->restrictAccess(Auth::isManager())
- ->setPageTitle(WT_I18N::translate('Family tree configuration'));
+$controller->restrictAccess(Auth::isManager());
$PRIVACY_CONSTANTS = array(
'none' => WT_I18N::translate('Show to visitors'),
@@ -41,40 +42,214 @@ $PRIVACY_CONSTANTS = array(
'hidden' => WT_I18N::translate('Hide from everyone')
);
-switch (WT_Filter::post('action')) {
-case 'delete':
- if (!WT_Filter::checkCsrf()) {
- break;
+$calendars = array(
+ 'none' => WT_I18N::translate('No calendar conversion'),
+ 'gregorian' => WT_Date_Gregorian::calendarName(),
+ 'julian' => WT_Date_Julian::calendarName(),
+ 'french' => WT_Date_French::calendarName(),
+ 'jewish' => WT_Date_Jewish::calendarName(),
+ 'hijri' => WT_Date_Hijri::calendarName(),
+ 'jalali' => WT_Date_Jalali::calendarName(),
+);
+
+$no_yes = array(
+ 0 => WT_I18N::translate('no'),
+ 1 => WT_I18N::translate('yes'),
+);
+
+$hide_show = array(
+ 0 => WT_I18N::translate('hide'),
+ 1 => WT_I18N::translate('show'),
+);
+
+$privacy = array(
+ WT_PRIV_PUBLIC => WT_I18N::translate('Show to public'),
+ WT_PRIV_USER => WT_I18N::translate('Show to members'),
+ WT_PRIV_NONE => WT_I18N::translate('Show to managers'),
+ WT_PRIV_HIDE => WT_I18N::translate('Hide from everyone'),
+);
+
+$surname_list_styles = array(
+ 'style1' => /* I18N: Layout option for lists of surnames */ WT_I18N::translate('list'),
+ 'style2' => /* I18N: Layout option for lists of surnames */ WT_I18N::translate('table'),
+ 'style3' => /* I18N: Layout option for lists of surnames */ WT_I18N::translate('tag cloud'),
+);
+
+$layouts = array(
+ 0 => /* I18N: page orientation */ WT_I18N::translate('Portrait'),
+ 1 => /* I18N: page orientation */ WT_I18N::translate('Landscape'),
+);
+
+$first_last = array(
+ 'first' => /* I18N: The first entry in a list */ WT_I18N::translate('first'),
+ 'last' => /* I18N: The last entry in a list */ WT_I18N::translate('last'),
+);
+
+$one_to_nine = array();
+for ($n=1; $n<=9; ++$n) {
+ $one_to_nine[] = WT_I18N::number($n);
+}
+
+$formats = array(
+ '' => /* I18N: None of the other options */ WT_I18N::translate('none'),
+ 'markdown' => /* I18N: https://en.wikipedia.org/wiki/Markdown */ WT_I18N::translate('markdown')
+);
+
+$surname_traditions = array(
+ 'paternal' =>
+ WT_I18N::translate_c('Surname tradition', 'paternal') .
+ ' — ' . /* I18N: In the paternal surname tradition, ... */ WT_I18N::translate('Children take their father’s surname.') .
+ ' ' . /* I18N: In the paternal surname tradition, ... */ WT_I18N::translate('Wives take their husband’s surname.'),
+ /* I18N: A system where children take their father’s surname */ 'patrilineal' =>
+ WT_I18N::translate('patrilineal') .
+ ' — ' . /* I18N: In the patrilineal surname tradition, ... */ WT_I18N::translate('Children take their father’s surname.'),
+ /* I18N: A system where children take their mother’s surname */ 'matrilineal' =>
+ WT_I18N::translate('matrilineal') .
+ ' — ' . /* I18N: In the matrilineal surname tradition, ... */ WT_I18N::translate('Children take their mother’s surname.'),
+ 'spanish' =>
+ WT_I18N::translate_c('Surname tradition', 'Spanish') .
+ ' — ' . /* I18N: In the Spanish surname tradition, ... */ WT_I18N::translate('Children take one surname from the father and one surname from the mother.'),
+ 'portuguese' =>
+ WT_I18N::translate_c('Surname tradition', 'Portuguese') .
+ ' — ' . /* I18N: In the Portuguese surname tradition, ... */ WT_I18N::translate('Children take one surname from the mother and one surname from the father.'),
+ 'icelandic' =>
+ WT_I18N::translate_c('Surname tradition', 'Icelandic') .
+ ' — ' . /* I18N: In the Icelandic surname tradition, ... */ WT_I18N::translate('Children take a patronym instead of a surname.'),
+ 'polish' =>
+ WT_I18N::translate_c('Surname tradition', 'Polish') .
+ ' — ' . /* I18N: In the Polish surname tradition, ... */ WT_I18N::translate('Children take
+their father’s surname.') .
+ ' ' . /* I18N: In the Polish surname tradition, ... */ WT_I18N::translate('Wives take their husband’s surname.') .
+ ' ' . /* I18N: In the Polish surname tradition, ... */ WT_I18N::translate('Surnames are inflected to indicate an individual’s gender.'),
+ 'lithuanian' =>
+ WT_I18N::translate_c('Surname tradition', 'Lithuanian') .
+ ' — ' . /* I18N: In the Lithuanian surname tradition, ... */ WT_I18N::translate('Children take their father’s surname.') .
+ ' ' . /* I18N: In the Lithuanian surname tradition, ... */ WT_I18N::translate('Wives take their husband’s surname.') .
+ ' ' . /* I18N: In the Lithuanian surname tradition, ... */ WT_I18N::translate('Surnames are inflected to indicate an individual’s gender and marital status.'),
+ 'none' =>
+ WT_I18N::translate_c('Surname tradition', 'none')
+);
+
+$source_types = array(
+ 0 => WT_I18N::translate('none'),
+ 1 => WT_I18N::translate('facts'),
+ 2 => WT_I18N::translate('records'),
+);
+
+$no_yes = array(
+ 0 => WT_I18N::translate('no'),
+ 1 => WT_I18N::translate('yes'),
+);
+
+$disable_enable = array(
+ 0 => WT_I18N::translate('disable'),
+ 1 => WT_I18N::translate('enable'),
+);
+
+$PRIVACY_CONSTANTS = array(
+ 'none' => WT_I18N::translate('Show to visitors'),
+ 'privacy' => WT_I18N::translate('Show to members'),
+ 'confidential' => WT_I18N::translate('Show to managers'),
+ 'hidden' => WT_I18N::translate('Hide from everyone')
+);
+
+$privacy = array(
+ WT_PRIV_PUBLIC => WT_I18N::translate('Show to public'),
+ WT_PRIV_USER => WT_I18N::translate('Show to members'),
+ WT_PRIV_NONE => WT_I18N::translate('Show to managers'),
+ WT_PRIV_HIDE => WT_I18N::translate('Hide from everyone'),
+);
+
+$tags = array_unique(array_merge(
+ explode(',', $WT_TREE->getPreference('INDI_FACTS_ADD')), explode(',', $WT_TREE->getPreference('INDI_FACTS_UNIQUE')),
+ explode(',', $WT_TREE->getPreference('FAM_FACTS_ADD' )), explode(',', $WT_TREE->getPreference('FAM_FACTS_UNIQUE' )),
+ explode(',', $WT_TREE->getPreference('NOTE_FACTS_ADD')), explode(',', $WT_TREE->getPreference('NOTE_FACTS_UNIQUE')),
+ explode(',', $WT_TREE->getPreference('SOUR_FACTS_ADD')), explode(',', $WT_TREE->getPreference('SOUR_FACTS_UNIQUE')),
+ explode(',', $WT_TREE->getPreference('REPO_FACTS_ADD')), explode(',', $WT_TREE->getPreference('REPO_FACTS_UNIQUE')),
+ array('SOUR', 'REPO', 'OBJE', '_PRIM', 'NOTE', 'SUBM', 'SUBN', '_UID', 'CHAN')
+));
+
+$all_tags = array();
+foreach ($tags as $tag) {
+ if ($tag) {
+ $all_tags[$tag] = WT_Gedcom_Tag::getLabel($tag);
}
- WT_DB::prepare(
- "DELETE FROM `##default_resn` WHERE default_resn_id=?"
- )->execute(array(WT_Filter::post('default_resn_id')));
- // Reload the page, so that the new privacy restrictions are reflected in the header
- header('Location: '.WT_SERVER_NAME.WT_SCRIPT_PATH.WT_SCRIPT_NAME.'#privacy');
- exit;
-case 'add':
- if (!WT_Filter::checkCsrf()) {
- break;
+}
+
+uasort($all_tags, array('WT_I18N', 'strcasecmp'));
+
+$resns = WT_DB::prepare(
+ "SELECT default_resn_id, tag_type, xref, resn".
+ " FROM `##default_resn`".
+ " LEFT JOIN `##name` ON (gedcom_id=n_file AND xref=n_id AND n_num=0)".
+ " WHERE gedcom_id=?".
+ " ORDER BY xref IS NULL, n_sort, xref, tag_type"
+)->execute(array(WT_GED_ID))->fetchAll();
+
+foreach ($resns as $resn) {
+ $resn->record = WT_GedcomRecord::getInstance($resn->xref);
+ if ($resn->tag_type) {
+ $resn->tag_label = WT_Gedcom_Tag::getLabel($resn->tag_type);
+ } else {
+ $resn->tag_label = '&nbsp;';
}
- if ((WT_Filter::post('xref') || WT_Filter::post('tag_type')) && WT_Filter::post('resn')) {
- if (WT_Filter::post('xref')=='') {
- WT_DB::prepare(
- "DELETE FROM `##default_resn` WHERE gedcom_id=? AND tag_type=? AND xref IS NULL"
- )->execute(array(WT_GED_ID, WT_Filter::post('tag_type')));
- }
- if (WT_Filter::post('tag_type')=='') {
+}
+
+// We have two fields in one
+$CALENDAR_FORMATS = explode('_and_', $WT_TREE->getPreference('CALENDAR_FORMAT') . '_and_');
+
+// Split into separate fields
+$relatives_events = explode(',', $WT_TREE->getPreference('SHOW_RELATIVES_EVENTS'));
+
+switch (WT_Filter::post('action')) {
+case 'privacy':
+ foreach (WT_Filter::postArray('delete', WT_REGEX_INTEGER) as $delete_resn) {
+ WT_DB::prepare(
+ "DELETE FROM `##default_resn` WHERE default_resn_id=?"
+ )->execute(array($delete_resn));
+ }
+
+ $xrefs = WT_Filter::postArray('xref', WT_REGEX_XREF);
+ $tag_types = WT_Filter::postArray('tag_type', WT_REGEX_TAG);
+ $resns = WT_Filter::postArray('resn');
+
+ foreach ($xrefs as $n => $xref) {
+ $tag_type = $tag_types[$n];
+ $resn = $resns[$n];
+
+ if ($tag_type || $xref) {
+ // Delete any existing data
+ if ($xref === '') {
+ WT_DB::prepare(
+ "DELETE FROM `##default_resn` WHERE gedcom_id=? AND tag_type=? AND xref IS NULL"
+ )->execute(array(WT_GED_ID, $tag_type));
+ }
+ if ($tag_type === '') {
+ WT_DB::prepare(
+ "DELETE FROM `##default_resn` WHERE gedcom_id=? AND xref=? AND tag_type IS NULL"
+ )->execute(array(WT_GED_ID, $xref));
+ }
+ // Add (or update) the new data
WT_DB::prepare(
- "DELETE FROM `##default_resn` WHERE gedcom_id=? AND xref=? AND tag_type IS NULL"
- )->execute(array(WT_GED_ID, WT_Filter::post('xref')));
+ "REPLACE INTO `##default_resn` (gedcom_id, xref, tag_type, resn) VALUES (?, NULLIF(?, ''), NULLIF(?, ''), ?)"
+ )->execute(array(WT_GED_ID, $xref, $tag_type, $resn));
}
- WT_DB::prepare(
- "REPLACE INTO `##default_resn` (gedcom_id, xref, tag_type, resn) VALUES (?, NULLIF(?, ''), NULLIF(?, ''), ?)"
- )->execute(array(WT_GED_ID, WT_Filter::post('xref', WT_REGEX_XREF), WT_Filter::post('tag_type'), WT_Filter::post('resn')));
}
- // Reload the page, so that the new privacy restrictions are reflected in the header
- header('Location: '.WT_SERVER_NAME.WT_SCRIPT_PATH.WT_SCRIPT_NAME.'#privacy');
- exit;
-case 'update':
+
+ $WT_TREE->setPreference('HIDE_LIVE_PEOPLE', WT_Filter::postBool('HIDE_LIVE_PEOPLE'));
+ $WT_TREE->setPreference('KEEP_ALIVE_YEARS_BIRTH', WT_Filter::post('KEEP_ALIVE_YEARS_BIRTH', WT_REGEX_INTEGER, 0));
+ $WT_TREE->setPreference('KEEP_ALIVE_YEARS_DEATH', WT_Filter::post('KEEP_ALIVE_YEARS_DEATH', WT_REGEX_INTEGER, 0));
+ $WT_TREE->setPreference('MAX_ALIVE_AGE', WT_Filter::post('MAX_ALIVE_AGE', WT_REGEX_INTEGER, 100));
+ $WT_TREE->setPreference('REQUIRE_AUTHENTICATION', WT_Filter::postBool('REQUIRE_AUTHENTICATION'));
+ $WT_TREE->setPreference('SHOW_DEAD_PEOPLE', WT_Filter::post('SHOW_DEAD_PEOPLE'));
+ $WT_TREE->setPreference('SHOW_LIVING_NAMES', WT_Filter::post('SHOW_LIVING_NAMES'));
+ $WT_TREE->setPreference('SHOW_PRIVATE_RELATIONSHIPS', WT_Filter::post('SHOW_PRIVATE_RELATIONSHIPS'));
+
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . 'admin_trees_manage.php?ged=' . $WT_TREE->tree_name);
+
+ return;
+
+case 'general':
if (!WT_Filter::checkCsrf()) {
break;
}
@@ -154,7 +329,7 @@ case 'update':
$WT_TREE->setPreference('SHOW_PEDIGREE_PLACES', WT_Filter::post('SHOW_PEDIGREE_PLACES'));
$WT_TREE->setPreference('SHOW_PEDIGREE_PLACES_SUFFIX', WT_Filter::postBool('SHOW_PEDIGREE_PLACES_SUFFIX'));
$WT_TREE->setPreference('SHOW_PRIVATE_RELATIONSHIPS', WT_Filter::post('SHOW_PRIVATE_RELATIONSHIPS'));
- $WT_TREE->setPreference('SHOW_RELATIVES_EVENTS', WT_Filter::post('SHOW_RELATIVES_EVENTS'));
+ $WT_TREE->setPreference('SHOW_RELATIVES_EVENTS', implode(',', WT_Filter::post('SHOW_RELATIVES_EVENTS')));
$WT_TREE->setPreference('SHOW_STATS', WT_Filter::postBool('SHOW_STATS'));
$WT_TREE->setPreference('SOURCE_ID_PREFIX', WT_Filter::post('SOURCE_ID_PREFIX'));
$WT_TREE->setPreference('SOUR_FACTS_ADD', str_replace(' ', '', WT_Filter::post('SOUR_FACTS_ADD')));
@@ -202,1116 +377,1971 @@ case 'update':
}
}
- // Reload the page, so that the settings take effect immediately.
Zend_Session::writeClose();
- header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?ged=' . $gedcom);
- exit;
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . 'admin_trees_manage.php');
+
+ return;
+}
+
+switch (WT_Filter::get('action')) {
+case 'privacy':
+ $controller
+ ->setPageTitle(WT_Filter::escapeHtml($WT_TREE->tree_title) . ' — ' . WT_I18N::translate('Privacy'))
+ ->addInlineJavascript('
+ jQuery("#default-resn input[type=checkbox]").on("click", function() {
+ if ($(this).prop("checked")) {
+ jQuery($(this).closest("tr").addClass("text-muted"));
+ } else {
+ jQuery($(this).closest("tr").removeClass("text-muted"));
+ }
+ });
+ jQuery("#add-resn").on("click", function() {
+ jQuery("#default-resn tbody").prepend(jQuery("#new-resn-template").html()); autocomplete();
+ });
+ ');
+ break;
+case 'general':
+ $controller->setPageTitle(WT_Filter::escapeHtml($WT_TREE->tree_title) . ' — ' . WT_I18N::translate('Preferences'));
+ break;
+default:
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . 'admin.php');
+
+ return;
}
$controller
->pageHeader()
- ->addInlineJavascript('jQuery("#tabs").tabs(); jQuery("#tabs").css("display", "inline");')
->addExternalJavascript(WT_STATIC_URL . 'js/autocomplete.js')
->addInlineJavascript('autocomplete();');
-
?>
-<form enctype="multipart/form-data" method="post" id="configform" name="configform" action="<?php echo WT_SCRIPT_NAME; ?>">
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li><a href="admin_trees_manage.php"><?php echo WT_I18N::translate('Manage family trees'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
+
+<form class="form-horizontal" method="POST" role="form">
<?php echo WT_Filter::getCsrf(); ?>
- <input type="hidden" name="action" value="update">
<input type="hidden" name="ged" value="<?php echo WT_Filter::escapeHtml(WT_GEDCOM); ?>">
- <div id="tabs">
- <ul>
- <li><a href="#file-options"><span><?php echo WT_I18N::translate('General'); ?></span></a></li>
- <li><a href="#privacy"><span><?php echo WT_I18N::translate('Privacy'); ?></span></a></li>
- <li><a href="#config-media"><span><?php echo WT_I18N::translate('Media'); ?></span></a></li>
- <li><a href="#layout-options"><span><?php echo WT_I18N::translate('Layout'); ?></span></a></li>
- <li><a href="#hide-show"><span><?php echo WT_I18N::translate('Hide &amp; show'); ?></span></a></li>
- <li><a href="#edit-options"><span><?php echo WT_I18N::translate('Edit options'); ?></span></a></li>
- </ul>
- <!-- GENERAL -->
- <div id="file-options">
- <table>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Family tree title'); ?>
- </td>
- <td>
- <input type="text" name="gedcom_title" dir="ltr" value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('title')); ?>" size="50" maxlength="255">
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('URL'); ?>
- </td>
- <td>
- <?php echo WT_SERVER_NAME, WT_SCRIPT_PATH ?>index.php?ged=<input type="text" name="gedcom" dir="ltr" value="<?php echo WT_Filter::escapeHtml(WT_GEDCOM); ?>" size="20" maxlength="255">
- </td>
- </tr>
- <tr>
- <td><?php echo WT_I18N::translate('Language'), help_link('LANGUAGE'); ?></td>
- <td><?php echo edit_field_language('GEDCOMLANG', $WT_TREE->getPreference('LANGUAGE')); ?></td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Default individual'), help_link('default_individual'); ?>
- </td>
- <td class="wrap">
- <input data-autocomplete-type="INDI" type="text" name="PEDIGREE_ROOT_ID" id="PEDIGREE_ROOT_ID" value="<?php echo $WT_TREE->getPreference('PEDIGREE_ROOT_ID'); ?>" size="5" maxlength="20">
- <?php
- echo print_findindi_link('PEDIGREE_ROOT_ID');
- $person=WT_Individual::getInstance($WT_TREE->getPreference('PEDIGREE_ROOT_ID'));
- if ($person) {
- echo ' <span class="list_item">', $person->getFullName(), ' ', $person->format_first_major_fact(WT_EVENTS_BIRT, 1), '</span>';
- } else {
- echo ' <span class="error">', WT_I18N::translate('Unable to find record with ID'), '</span>';
- }
- ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Calendar conversion'), help_link('CALENDAR_FORMAT'); ?>
- </td>
- <td>
- <select id="CALENDAR_FORMAT0" name="CALENDAR_FORMAT0">
- <?php
- $CALENDAR_FORMATS=explode('_and_', $CALENDAR_FORMAT);
- if (count($CALENDAR_FORMATS)==1) {
- $CALENDAR_FORMATS[]='none';
- }
- foreach (array(
- 'none' =>WT_I18N::translate('No calendar conversion'),
- 'gregorian'=>WT_Date_Gregorian::calendarName(),
- 'julian' =>WT_Date_Julian::calendarName(),
- 'french' =>WT_Date_French::calendarName(),
- 'jewish' =>WT_Date_Jewish::calendarName(),
- 'hijri' =>WT_Date_Hijri::calendarName(),
- 'jalali' =>WT_Date_Jalali::calendarName(),
- ) as $cal=>$name) {
- echo '<option value="', $cal, '"';
- if ($CALENDAR_FORMATS[0]==$cal) {
- echo ' selected="selected"';
- }
- echo '>', $name, '</option>';
- }
- ?>
- </select>
+ <?php if (WT_Filter::get('action') === 'privacy'): ?>
- <select id="CALENDAR_FORMAT1" name="CALENDAR_FORMAT1">
- <?php
- foreach (array(
- 'none' =>WT_I18N::translate('No calendar conversion'),
- 'gregorian'=>WT_Date_Gregorian::calendarName(),
- 'julian' =>WT_Date_Julian::calendarName(),
- 'french' =>WT_Date_French::calendarName(),
- 'jewish' =>WT_Date_Jewish::calendarName(),
- 'hijri' =>WT_Date_Hijri::calendarName(),
- 'jalali' =>WT_Date_Jalali::calendarName(),
- ) as $cal=>$name) {
- echo '<option value="', $cal, '"';
- if ($CALENDAR_FORMATS[1]==$cal) {
- echo ' selected="selected"';
- }
- echo '>', $name, '</option>';
- }
- ?>
- </select></td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Use RIN number instead of GEDCOM ID'), help_link('USE_RIN'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('USE_RIN', $WT_TREE->getPreference('USE_RIN')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Automatically create globally unique IDs'), help_link('GENERATE_GUID'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('GENERATE_UIDS', $WT_TREE->getPreference('GENERATE_UIDS')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Add spaces where notes were wrapped'), help_link('WORD_WRAPPED_NOTES'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('WORD_WRAPPED_NOTES', $WT_TREE->getPreference('WORD_WRAPPED_NOTES')); ?>
- </td>
- </tr>
- </table>
- <table>
- <tr>
- <th colspan="6"><?php echo WT_I18N::translate('ID settings'); ?></th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Individual ID prefix'), help_link('GEDCOM_ID_PREFIX'); ?>
- </td>
- <td>
- <input type="text" name="GEDCOM_ID_PREFIX" dir="ltr" value="<?php echo $WT_TREE->getPreference('GEDCOM_ID_PREFIX'); ?>" size="5" maxlength="20">
- </td>
- <td>
- <?php echo WT_I18N::translate('Family ID prefix'), help_link('FAM_ID_PREFIX'); ?>
- </td>
- <td>
- <input type="text" name="FAM_ID_PREFIX" dir="ltr" value="<?php echo $WT_TREE->getPreference('FAM_ID_PREFIX'); ?>" size="5" maxlength="20">
- </td>
- <td>
- <?php echo WT_I18N::translate('Source ID prefix'), help_link('SOURCE_ID_PREFIX'); ?>
- </td>
- <td>
- <input type="text" name="SOURCE_ID_PREFIX" dir="ltr" value="<?php echo $WT_TREE->getPreference('SOURCE_ID_PREFIX'); ?>" size="5" maxlength="20">
- </td>
- </tr>
- <tr>
- <td><?php echo WT_I18N::translate('Repository ID prefix'), help_link('REPO_ID_PREFIX'); ?></td>
- <td><input type="text" name="REPO_ID_PREFIX" dir="ltr" value="<?php echo $WT_TREE->getPreference('REPO_ID_PREFIX'); ?>" size="5" maxlength="20">
- </td>
- <td><?php echo WT_I18N::translate('Media ID prefix'), help_link('MEDIA_ID_PREFIX'); ?></td>
- <td><input type="text" name="MEDIA_ID_PREFIX" dir="ltr" value="<?php echo $WT_TREE->getPreference('MEDIA_ID_PREFIX'); ?>" size="5" maxlength="20">
- </td>
- <td><?php echo WT_I18N::translate('Note ID prefix'), help_link('NOTE_ID_PREFIX'); ?></td>
- <td><input type="text" name="NOTE_ID_PREFIX" dir="ltr" value="<?php echo $WT_TREE->getPreference('NOTE_ID_PREFIX'); ?>" size="5" maxlength="20">
- </td>
- </tr>
- </table>
- <table>
- <tr>
- <th colspan="2"><?php echo WT_I18N::translate('Contact information'); ?></th>
- </tr>
- <tr>
- <?php
- if (empty($WEBTREES_EMAIL)) {
- $WEBTREES_EMAIL = "webtrees-noreply@".preg_replace("/^www\./i", "", $_SERVER["SERVER_NAME"]);
- }
- ?>
- <td>
- <?php echo WT_I18N::translate('webtrees reply address'), help_link('WEBTREES_EMAIL'); ?>
- </td>
- <td><input type="text" name="WEBTREES_EMAIL" value="<?php echo $WEBTREES_EMAIL; ?>" size="50" maxlength="255" dir="ltr"></td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Genealogy contact'), help_link('CONTACT_USER_ID'); ?>
- </td>
- <td><select name="CONTACT_USER_ID"><option value=""></option>
- <?php
- $CONTACT_USER_ID = $WT_TREE->getPreference('CONTACT_USER_ID');
- foreach (User::all() as $user) {
- if (Auth::isMember($WT_TREE, $user)) {
- echo '<option value="' . $user->getUserId() . '"';
- if ($CONTACT_USER_ID === $user->getUserId()) {
- echo ' selected="selected"';
- }
- echo '>' . WT_Filter::escapeHtml($user->getRealName()) . ' - ' . WT_Filter::escapeHtml($user->getUserName()) . '</option>';
- }
- }
- ?>
- </select>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Technical help contact'), help_link('WEBMASTER_USER_ID'); ?>
- </td>
- <td><select name="WEBMASTER_USER_ID"><option value=""></option>
- <?php
- $WEBMASTER_USER_ID = $WT_TREE->getPreference('WEBMASTER_USER_ID');
- foreach (User::all() as $user) {
- if (Auth::isMember($WT_TREE, $user)) {
- echo '<option value="' . $user->getUserId() . '"';
- if ($WEBMASTER_USER_ID === $user->getUserId()) {
- echo ' selected="selected"';
- }
- echo '>' . WT_Filter::escapeHtml($user->getRealName()) . ' - ' . WT_Filter::escapeHtml($user->getUserName()) . '</option>';
- }
- }
- ?>
- </select>
- </td>
- </tr>
- </table>
- <table>
- <tr>
- <th colspan="2"><?php echo WT_I18N::translate('Web site and META tag settings'); ?></th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Add to TITLE header tag'), help_link('META_TITLE'); ?>
- </td>
- <td>
- <input type="text" dir="ltr" name="META_TITLE" value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('META_TITLE')); ?>" size="40" maxlength="255">
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Description META tag'), help_link('META_DESCRIPTION'); ?>
- </td>
- <td>
- <input type="text" dir="ltr" name="META_DESCRIPTION" value="<?php echo $WT_TREE->getPreference('META_DESCRIPTION'); ?>" size="40" maxlength="255">
- <br>
- <?php echo WT_I18N::translate('Leave this field empty to use the name of the family tree.'); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('User options'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Theme dropdown selector for theme changes'), help_link('ALLOW_THEME_DROPDOWN'); ?>
- </td>
- <td>
- <?php echo radio_buttons('ALLOW_THEME_DROPDOWN', array(false=>WT_I18N::translate('hide'), true=>WT_I18N::translate('show')), $WT_TREE->getPreference('ALLOW_THEME_DROPDOWN')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Default theme'), help_link('THEME'); ?>
- </td>
- <td>
- <select name="THEME_DIR">
- <?php
- echo '<option value="">', WT_Filter::escapeHtml(WT_I18N::translate('<default theme>')), '</option>';
- $current_theme_id = $WT_TREE->getPreference('THEME_DIR');
- foreach (get_theme_names() as $theme_name => $theme_id) {
- echo '<option value="', $theme_id, '"';
- if ($theme_id === $current_theme_id) {
- echo ' selected="selected"';
- }
- echo '>', $theme_name, '</option>';
- }
- ?>
- </select>
- </td>
- </tr>
- </table>
- </div>
- <!-- PRIVACY OPTIONS -->
- <div id="privacy">
- <table>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Require visitor authentication'), help_link('REQUIRE_AUTHENTICATION'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('REQUIRE_AUTHENTICATION', $WT_TREE->getPreference('REQUIRE_AUTHENTICATION')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Privacy options'), help_link('HIDE_LIVE_PEOPLE'); ?>
- </td>
- <td>
- <?php echo radio_buttons('HIDE_LIVE_PEOPLE', array(false=>WT_I18N::translate('disable'), true=>WT_I18N::translate('enable')), $WT_TREE->getPreference('HIDE_LIVE_PEOPLE')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Show dead individuals'), help_link('SHOW_DEAD_PEOPLE'); ?>
- </td>
- <td>
- <?php echo edit_field_access_level("SHOW_DEAD_PEOPLE", $WT_TREE->getPreference('SHOW_DEAD_PEOPLE')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php /* I18N: ... [who were] born in the last XX years or died in the last YY years */ echo WT_I18N::translate('Extend privacy to dead individuals'), help_link('KEEP_ALIVE'); ?>
- </td>
- <td>
- <?php
- echo
- /* I18N: Extend privacy to dead people [who were] ... */ WT_I18N::translate(
- 'born in the last %1$s years or died in the last %2$s years',
- '<input type="text" name="KEEP_ALIVE_YEARS_BIRTH" value="'.$WT_TREE->getPreference('KEEP_ALIVE_YEARS_BIRTH').'" size="5" maxlength="3">',
- '<input type="text" name="KEEP_ALIVE_YEARS_DEATH" value="'.$WT_TREE->getPreference('KEEP_ALIVE_YEARS_DEATH').'" size="5" maxlength="3">'
- ); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Names of private individuals'), help_link('SHOW_LIVING_NAMES'); ?>
- </td>
- <td>
- <?php echo edit_field_access_level("SHOW_LIVING_NAMES", $WT_TREE->getPreference('SHOW_LIVING_NAMES')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Show private relationships'), help_link('SHOW_PRIVATE_RELATIONSHIPS'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('SHOW_PRIVATE_RELATIONSHIPS', $WT_TREE->getPreference('SHOW_PRIVATE_RELATIONSHIPS')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Age at which to assume an individual is dead'), help_link('MAX_ALIVE_AGE'); ?>
- </td>
- <td>
- <input type="text" name="MAX_ALIVE_AGE" value="<?php echo $WT_TREE->getPreference('MAX_ALIVE_AGE'); ?>" size="5" maxlength="3">
- </td>
- </tr>
- </table>
- <br>
- <table>
- <tr>
- <th colspan="4">
- <?php echo WT_I18N::translate('Privacy restrictions - these apply to records and facts that do not contain a GEDCOM RESN tag'); ?>
- </th>
- </tr>
- <?php
+ <input type="hidden" name="action" value="privacy">
- $all_tags=array();
- $tags=array_unique(array_merge(
- explode(',', $WT_TREE->getPreference('INDI_FACTS_ADD')), explode(',', $WT_TREE->getPreference('INDI_FACTS_UNIQUE')),
- explode(',', $WT_TREE->getPreference('FAM_FACTS_ADD' )), explode(',', $WT_TREE->getPreference('FAM_FACTS_UNIQUE' )),
- explode(',', $WT_TREE->getPreference('NOTE_FACTS_ADD')), explode(',', $WT_TREE->getPreference('NOTE_FACTS_UNIQUE')),
- explode(',', $WT_TREE->getPreference('SOUR_FACTS_ADD')), explode(',', $WT_TREE->getPreference('SOUR_FACTS_UNIQUE')),
- explode(',', $WT_TREE->getPreference('REPO_FACTS_ADD')), explode(',', $WT_TREE->getPreference('REPO_FACTS_UNIQUE')),
- array('SOUR', 'REPO', 'OBJE', '_PRIM', 'NOTE', 'SUBM', 'SUBN', '_UID', 'CHAN')
- ));
+ <!-- REQUIRE_AUTHENTICATION -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Require visitor authentication'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('REQUIRE_AUTHENTICATION', $no_yes, $WT_TREE->getPreference('REQUIRE_AUTHENTICATION'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Require visitor authentication” configuration setting */ WT_I18N::translate('Enabling this option will force all visitors to login before they can view any data on the site.'); ?>
+ </p>
+ </div>
+ </fieldset>
- foreach ($tags as $tag) {
- if ($tag) {
- $all_tags[$tag]=WT_Gedcom_Tag::getLabel($tag);
- }
- }
+ <!-- HIDE_LIVE_PEOPLE -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Privacy options'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('HIDE_LIVE_PEOPLE', $disable_enable, $WT_TREE->getPreference('HIDE_LIVE_PEOPLE'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Privacy options” configuration setting */ WT_I18N::translate('This option will enable all privacy settings and hide the details of living individuals, as defined or modified on the Privacy tab of each GEDCOM’s configuration page.'); ?>
+ </p>
+ </div>
+ </fieldset>
- uasort($all_tags, array('WT_I18N', 'strcasecmp'));
+ <!-- SHOW_DEAD_PEOPLE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="SHOW_DEAD_PEOPLE">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Show dead individuals'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('SHOW_DEAD_PEOPLE', $privacy, null, $WT_TREE->getPreference('SHOW_DEAD_PEOPLE'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Show dead individuals” configuration setting */ WT_I18N::translate('Set the privacy access level for all dead individuals.'); ?>
+ </p>
+ </div>
+ </div>
- echo '<tr><td>';
- echo '<input type="text" class="pedigree_form" name="xref" id="xref" size="6" maxlength="20">';
- echo ' ', print_findindi_link('xref');
- echo ' ', print_findfamily_link('xref');
- echo ' ', print_findsource_link('xref');
- echo ' ', print_findrepository_link('xref');
- echo ' ', print_findnote_link('xref');
- echo ' ', print_findmedia_link('xref', '1media');
- echo '</td><td>';
- echo select_edit_control('tag_type', $all_tags, '', null, null);
- echo '</td><td>';
- echo select_edit_control('resn', $PRIVACY_CONSTANTS, null, 'privacy', null);
- echo '</td><td>';
- echo '<input type="button" value="', WT_I18N::translate('Add'), '" onClick="document.configform.elements[\'action\'].value=\'add\';document.configform.submit();">';
- echo '<input type="hidden" name="default_resn_id" value="">'; // value set by JS
- echo '</td></tr>';
- $rows=WT_DB::prepare(
- "SELECT default_resn_id, tag_type, xref, resn".
- " FROM `##default_resn`".
- " LEFT JOIN `##name` ON (gedcom_id=n_file AND xref=n_id AND n_num=0)".
- " WHERE gedcom_id=?".
- " ORDER BY xref IS NULL, n_sort, xref, tag_type"
- )->execute(array(WT_GED_ID))->fetchAll();
- foreach ($rows as $row) {
- echo '<tr><td>';
- if ($row->xref) {
- $record=WT_GedcomRecord::getInstance($row->xref);
- if ($record) {
- echo '<a href="', $record->getHtmlUrl(), '">', $record->getFullName(), '</a>';
- } else {
- echo WT_I18N::translate('this record does not exist');
- }
- } else {
- echo '&nbsp;';
- }
- echo '</td><td>';
- if ($row->tag_type) {
- // I18N: e.g. Marriage (MARR)
- echo WT_Gedcom_Tag::getLabel($row->tag_type);
- } else {
- echo '&nbsp;';
- }
- echo '</td><td>';
- echo $PRIVACY_CONSTANTS[$row->resn];
- echo '</td><td>';
- echo '<input type="button" value="', WT_I18N::translate('Delete'), '" onClick="document.configform.elements[\'action\'].value=\'delete\';document.configform.elements[\'default_resn_id\'].value=\''.$row->default_resn_id.'\';document.configform.submit();">';
- echo '</td></tr>';
- }
- echo '</table>';
- ?>
+ <!-- KEEP_ALIVE_YEARS_BIRTH / KEEP_ALIVE_YEARS_DEATH -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting. ... [who were] born in the last XX years or died in the last YY years */ WT_I18N::translate('Extend privacy to dead individuals'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php
+ echo
+ /* I18N: Extend privacy to dead people [who were] ... */ WT_I18N::translate(
+ 'born in the last %1$s years or died in the last %2$s years',
+ '<input type="text" name="KEEP_ALIVE_YEARS_BIRTH" value="'.$WT_TREE->getPreference('KEEP_ALIVE_YEARS_BIRTH').'" size="5" maxlength="3">',
+ '<input type="text" name="KEEP_ALIVE_YEARS_DEATH" value="'.$WT_TREE->getPreference('KEEP_ALIVE_YEARS_DEATH').'" size="5" maxlength="3">'
+ ); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Extend privacy to dead individuals” configuration setting */ WT_I18N::translate('In some countries, privacy laws apply not only to living individuals, but also to those who have died recently. This option will allow you to extend the privacy rules for living individuals to those who were born or died within a specified number of years. Leave these values empty to disable this feature.'); ?>
+ </p>
</div>
- <!-- MULTIMEDIA -->
- <div id="config-media">
- <table>
- <tr>
- <th colspan="2"><?php echo WT_I18N::translate('Media folders'); ?></th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Media folder'), help_link('MEDIA_DIRECTORY'); ?>
- </td>
- <td>
- <?php echo WT_DATA_DIR; ?><input type="text" name="MEDIA_DIRECTORY" value="<?php echo $WT_TREE->getPreference('MEDIA_DIRECTORY'); ?>" dir="ltr" size="15" maxlength="255">
- </td>
- </tr>
- <tr>
- <td>
- <?php echo /* I18N: A media path (e.g. c:\aaa\bbb\ccc\ddd.jpeg) in a GEDCOM file */ WT_I18N::translate('GEDCOM media path'), help_link('GEDCOM_MEDIA_PATH'); ?>
- </td>
- <td>
- <input type="text" name="GEDCOM_MEDIA_PATH" value="<?php echo $WT_TREE->getPreference('GEDCOM_MEDIA_PATH'); ?>" dir="ltr" size="30" maxlength="255">
- </td>
- </tr>
- <tr>
- <th colspan="2"><?php echo WT_I18N::translate('Media files'); ?></th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Who can upload new media files?'), help_link('MEDIA_UPLOAD'); ?>
- </td>
- <td>
- <?php echo select_edit_control('MEDIA_UPLOAD', array(WT_PRIV_USER=>WT_I18N::translate('Show to members'),
- WT_PRIV_NONE=>WT_I18N::translate('Show to managers'), WT_PRIV_HIDE=>WT_I18N::translate('Hide from everyone')), null, $WT_TREE->getPreference('MEDIA_UPLOAD')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Show download link in media viewer'), help_link('SHOW_MEDIA_DOWNLOAD'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('SHOW_MEDIA_DOWNLOAD', $WT_TREE->getPreference('SHOW_MEDIA_DOWNLOAD')); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2"><?php echo /* I18N: Small versions of images */ WT_I18N::translate('Thumbnail images'); ?></th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Width of generated thumbnails'), help_link('THUMBNAIL_WIDTH'); ?>
- </td>
- <td>
- <input type="text" name="THUMBNAIL_WIDTH" value="<?php echo $WT_TREE->getPreference('THUMBNAIL_WIDTH'); ?>" size="5" maxlength="4">
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Use silhouettes'), help_link('USE_SILHOUETTE'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('USE_SILHOUETTE', $WT_TREE->getPreference('USE_SILHOUETTE')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Show highlight images in individual boxes'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('SHOW_HIGHLIGHT_IMAGES', $WT_TREE->getPreference('SHOW_HIGHLIGHT_IMAGES')); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo /* I18N: Copyright messages, added to images */ WT_I18N::translate('Watermarks'), help_link('Watermarks'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Add watermarks to thumbnails?'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('WATERMARK_THUMB', $WT_TREE->getPreference('WATERMARK_THUMB')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Store watermarked full size images on server?'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('SAVE_WATERMARK_IMAGE', $WT_TREE->getPreference('SAVE_WATERMARK_IMAGE')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Store watermarked thumbnails on server?'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('SAVE_WATERMARK_THUMB', $WT_TREE->getPreference('SAVE_WATERMARK_THUMB')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Images without watermarks'); ?>
- </td>
- <td>
- <?php echo edit_field_access_level("SHOW_NO_WATERMARK", $WT_TREE->getPreference('SHOW_NO_WATERMARK')); ?>
- </td>
- </tr>
- </table>
+ </fieldset>
+
+ <!-- SHOW_LIVING_NAMES -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="SHOW_LIVING_NAMES">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Names of private individuals'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('SHOW_LIVING_NAMES', $privacy, null, $WT_TREE->getPreference('SHOW_LIVING_NAMES'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Names of private individuals” configuration setting */ WT_I18N::translate('This option will show the names (but no other details) of private individuals. Individuals are private if they are still alive or if a privacy restriction has been added to their individual record. To hide a specific name, add a privacy restriction to that name record.'); ?>
+ </p>
</div>
- <!-- LAYOUT -->
- <div id="layout-options">
- <table>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Names'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Min. no. of occurrences to be a “common surname”'), help_link('COMMON_NAMES_THRESHOLD'); ?>
- </td>
- <td>
- <input type="text" name="COMMON_NAMES_THRESHOLD" value="<?php echo $WT_TREE->getPreference('COMMON_NAMES_THRESHOLD'); ?>" size="5" maxlength="5">
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Names to add to common surnames (comma separated)'), help_link('COMMON_NAMES_ADD'); ?>
- </td>
- <td>
- <input type="text" name="COMMON_NAMES_ADD" dir="ltr" value="<?php echo $WT_TREE->getPreference('COMMON_NAMES_ADD'); ?>" size="50" maxlength="255">
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Names to remove from common surnames (comma separated)'), help_link('COMMON_NAMES_REMOVE'); ?>
- </td>
- <td>
- <input type="text" name="COMMON_NAMES_REMOVE" dir="ltr" value="<?php echo $WT_TREE->getPreference('COMMON_NAMES_REMOVE'); ?>" size="50" maxlength="255">
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Lists'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Surname list style'); ?>
- </td>
- <td>
- <select name="SURNAME_LIST_STYLE">
- <option value="style1" <?php if ($WT_TREE->getPreference('SURNAME_LIST_STYLE') == 'style1') echo "selected=\"selected\""; ?>><?php echo WT_I18N::translate('list'); ?></option>
- <option value="style2" <?php if ($WT_TREE->getPreference('SURNAME_LIST_STYLE') === 'style2') echo "selected=\"selected\""; ?>><?php echo WT_I18N::translate('table'); ?></option>
- <option value="style3" <?php if ($WT_TREE->getPreference('SURNAME_LIST_STYLE') === 'style3') echo "selected=\"selected\""; ?>><?php echo WT_I18N::translate('tag cloud'); ?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Maximum number of surnames on individual list'), help_link('SUBLIST_TRIGGER_I'); ?>
- </td>
- <td>
- <input type="text" name="SUBLIST_TRIGGER_I" value="<?php echo $WT_TREE->getPreference('SUBLIST_TRIGGER_I'); ?>" size="5" maxlength="5">
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Estimated dates for birth and death'), help_link('SHOW_EST_LIST_DATES'); ?>
- </td>
- <td>
- <?php echo radio_buttons('SHOW_EST_LIST_DATES', array(false=>WT_I18N::translate('hide'), true=>WT_I18N::translate('show')), $WT_TREE->getPreference('SHOW_EST_LIST_DATES')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('The date and time of the last update'); ?>
- </td>
- <td>
- <?php echo radio_buttons('SHOW_LAST_CHANGE', array(false=>WT_I18N::translate('hide'), true=>WT_I18N::translate('show')), $WT_TREE->getPreference('SHOW_LAST_CHANGE')); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Charts'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Default pedigree chart layout'), help_link('PEDIGREE_LAYOUT'); ?>
- </td>
- <td>
- <select name="PEDIGREE_LAYOUT">
- <option value="yes" <?php if ($WT_TREE->getPreference('PEDIGREE_LAYOUT')) echo "selected=\"selected\""; ?>><?php echo WT_I18N::translate('Landscape'); ?></option>
- <option value="no" <?php if (!$WT_TREE->getPreference('PEDIGREE_LAYOUT')) echo "selected=\"selected\""; ?>><?php echo WT_I18N::translate('Portrait'); ?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Default pedigree generations'), help_link('DEFAULT_PEDIGREE_GENERATIONS'); ?>
- </td>
- <td>
- <input type="text" name="DEFAULT_PEDIGREE_GENERATIONS" value="<?php echo $WT_TREE->getPreference('DEFAULT_PEDIGREE_GENERATIONS'); ?>" size="5" maxlength="3">
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Maximum pedigree generations'), help_link('MAX_PEDIGREE_GENERATIONS'); ?>
- </td>
- <td>
- <input type="text" name="MAX_PEDIGREE_GENERATIONS" value="<?php echo $WT_TREE->getPreference('MAX_PEDIGREE_GENERATIONS'); ?>" size="5" maxlength="3">
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Maximum descendancy generations'), help_link('MAX_DESCENDANCY_GENERATIONS'); ?>
- </td>
- <td>
- <input type="text" name="MAX_DESCENDANCY_GENERATIONS" value="<?php echo $WT_TREE->getPreference('MAX_DESCENDANCY_GENERATIONS'); ?>" size="5" maxlength="3">
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Individual pages'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Automatically expand list of events of close relatives'), help_link('EXPAND_RELATIVES_EVENTS'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('EXPAND_RELATIVES_EVENTS', $WT_TREE->getPreference('EXPAND_RELATIVES_EVENTS')); ?>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <?php echo WT_I18N::translate('Show events of close relatives on individual page'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <input type="hidden" name="SHOW_RELATIVES_EVENTS" value="<?php echo $WT_TREE->getPreference('SHOW_RELATIVES_EVENTS'); ?>">
- <table id="relatives">
- <?php
- $rel_events=array(
- array('_BIRT_GCHI', '_MARR_GCHI', '_DEAT_GCHI'),
- array('_BIRT_CHIL', '_MARR_CHIL', '_DEAT_CHIL'),
- array('_BIRT_SIBL', '_MARR_SIBL', '_DEAT_SIBL'),
- array(null, null, '_DEAT_SPOU'),
- array(null, '_MARR_PARE', '_DEAT_PARE'),
- array(null, null, '_DEAT_GPAR'),
- );
- foreach ($rel_events as $row) {
- echo '<tr>';
- foreach ($row as $col) {
- echo '<td>';
- if (is_null($col)) {
- echo '&nbsp;';
- } else {
- echo "<input type=\"checkbox\" name=\"SHOW_RELATIVES_EVENTS_checkbox\" value=\"".$col."\"";
- if (strstr($WT_TREE->getPreference('SHOW_RELATIVES_EVENTS'), $col)) {
- echo " checked=\"checked\"";
- }
- echo " onchange=\"var old=document.configform.SHOW_RELATIVES_EVENTS.value; if (this.checked) old+=','+this.value; else old=old.replace(/".$col."/g,''); old=old.replace(/[,]+/gi,','); old=old.replace(/^[,]/gi,''); old=old.replace(/[,]$/gi,''); document.configform.SHOW_RELATIVES_EVENTS.value=old\"> ";
- echo WT_Gedcom_Tag::getLabel($col);
- }
- echo '</td>';
- }
- echo '</tr>';
- }
- ?>
- </table>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Places'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Abbreviate place names'), help_link('SHOW_PEDIGREE_PLACES'); ?>
- </td>
- <td>
- <?php
- echo /* I18N: The placeholders are edit controls. Show the [first/last] [1/2/3/4/5] parts of a place name */ WT_I18N::translate(
- 'Show the %1$s %2$s parts of a place name.',
- select_edit_control('SHOW_PEDIGREE_PLACES_SUFFIX',
- array(
- false=>WT_I18N::translate_c('Show the [first/last] [N] parts of a place name.', 'first'),
- true =>WT_I18N::translate_c('Show the [first/last] [N] parts of a place name.', 'last')
- ),
- null,
- $WT_TREE->getPreference('SHOW_PEDIGREE_PLACES_SUFFIX')
- ),
- select_edit_control('SHOW_PEDIGREE_PLACES',
- array(
- 1=>WT_I18N::number(1),
- 2=>WT_I18N::number(2),
- 3=>WT_I18N::number(3),
- 4=>WT_I18N::number(4),
- 5=>WT_I18N::number(5),
- 6=>WT_I18N::number(6),
- 7=>WT_I18N::number(7),
- 8=>WT_I18N::number(8),
- 9=>WT_I18N::number(9),
- ),
- null,
- $WT_TREE->getPreference('SHOW_PEDIGREE_PLACES')
- )
- );
- ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_Gedcom_Tag::getLabel('TEXT'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Format text and notes'), help_link('FORMAT_TEXT'); ?>
- </td>
- <td>
- <?php
- echo select_edit_control('FORMAT_TEXT',
- array(
- '' => WT_I18N::translate('none'),
- 'markdown' => /* I18N: https://en.wikipedia.org/wiki/Markdown */ WT_I18N::translate('markdown')
- ),
- null,
- $WT_TREE->getPreference('FORMAT_TEXT')
- );
- ?>
- </td>
- </tr>
- </table>
+ </div>
+
+ <!-- SHOW_PRIVATE_RELATIONSHIPS -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Show private relationships'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_PRIVATE_RELATIONSHIPS', $disable_enable, $WT_TREE->getPreference('SHOW_PRIVATE_RELATIONSHIPS'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Show private relationships” configuration setting */ WT_I18N::translate('This option will retain family links in private records. This means that you will see empty “private” boxes on the pedigree chart and on other charts with private individuals.'); ?>
+ </p>
</div>
- <!-- HIDE & SHOW -->
- <div id="hide-show">
- <table>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Charts'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Show chart details by default'), help_link('PEDIGREE_FULL_DETAILS'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('PEDIGREE_FULL_DETAILS', $WT_TREE->getPreference('PEDIGREE_FULL_DETAILS')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Gender icon on charts'), help_link('PEDIGREE_SHOW_GENDER'); ?>
- </td>
- <td>
- <?php echo radio_buttons('PEDIGREE_SHOW_GENDER', array(false=>WT_I18N::translate('hide'), true=>WT_I18N::translate('show')), $WT_TREE->getPreference('PEDIGREE_SHOW_GENDER')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Age of parents next to child’s birthdate'), help_link('SHOW_PARENTS_AGE'); ?>
- </td>
- <td>
- <?php echo radio_buttons('SHOW_PARENTS_AGE', array(false=>WT_I18N::translate('hide'), true=>WT_I18N::translate('show')), $WT_TREE->getPreference('SHOW_PARENTS_AGE')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('LDS ordinance codes in chart boxes'), help_link('SHOW_LDS_AT_GLANCE'); ?>
- </td>
- <td>
- <?php echo radio_buttons('SHOW_LDS_AT_GLANCE', array(false=>WT_I18N::translate('hide'), true=>WT_I18N::translate('show')), $WT_TREE->getPreference('SHOW_LDS_AT_GLANCE')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Other facts to show in charts'), help_link('CHART_BOX_TAGS'); ?>
- </td>
- <td>
- <input type="text" id="CHART_BOX_TAGS" name="CHART_BOX_TAGS" value="<?php echo $WT_TREE->getPreference('CHART_BOX_TAGS'); ?>" dir="ltr" size="50" maxlength="255"><?php echo print_findfact_link('CHART_BOX_TAGS'); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Individual pages'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Fact icons'), help_link('SHOW_FACT_ICONS'); ?>
- </td>
- <td>
- <?php echo radio_buttons('SHOW_FACT_ICONS', array(false=>WT_I18N::translate('hide'), true=>WT_I18N::translate('show')), $WT_TREE->getPreference('SHOW_FACT_ICONS')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Automatically expand notes'), help_link('EXPAND_NOTES'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('EXPAND_NOTES', $WT_TREE->getPreference('EXPAND_NOTES')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Automatically expand sources'), help_link('EXPAND_SOURCES'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('EXPAND_SOURCES', $WT_TREE->getPreference('EXPAND_SOURCES')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Show all notes and source references on notes and sources tabs'), help_link('SHOW_LEVEL2_NOTES'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('SHOW_LEVEL2_NOTES', $WT_TREE->getPreference('SHOW_LEVEL2_NOTES')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Date differences'), help_link('SHOW_AGE_DIFF'); ?>
- </td>
- <td>
- <?php echo radio_buttons('SHOW_AGE_DIFF', array(false=>WT_I18N::translate('hide'), true=>WT_I18N::translate('show')), $WT_TREE->getPreference('SHOW_AGE_DIFF')); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('General'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Allow users to see raw GEDCOM records'), help_link('SHOW_GEDCOM_RECORD'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('SHOW_GEDCOM_RECORD', $WT_TREE->getPreference('SHOW_GEDCOM_RECORD')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('GEDCOM errors'), help_link('HIDE_GEDCOM_ERRORS'); ?>
- </td>
- <td>
- <?php echo radio_buttons('HIDE_GEDCOM_ERRORS', array(true=>WT_I18N::translate('hide'), false=>WT_I18N::translate('show')), $WT_TREE->getPreference('HIDE_GEDCOM_ERRORS')); /* Note: name of object is reverse of description */ ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Hit counters'), help_link('SHOW_COUNTER'); ?>
- </td>
- <td>
- <?php echo radio_buttons('SHOW_COUNTER', array(false=>WT_I18N::translate('hide'), true=>WT_I18N::translate('show')), $WT_TREE->getPreference('SHOW_COUNTER')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Execution statistics'), help_link('SHOW_STATS'); ?>
- </td>
- <td>
- <?php echo radio_buttons('SHOW_STATS', array(false=>WT_I18N::translate('hide'), true=>WT_I18N::translate('show')), $WT_TREE->getPreference('SHOW_STATS')); ?>
- </td>
- </tr>
- </table>
+ </fieldset>
+
+ <!-- MAX_ALIVE_AGE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="MAX_ALIVE_AGE">
+ <?php echo WT_I18N::translate('Age at which to assume an individual is dead'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="MAX_ALIVE_AGE"
+ maxlength="5"
+ name="MAX_ALIVE_AGE"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('MAX_ALIVE_AGE')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Age at which to assume an individual is dead” configuration setting */ WT_I18N::translate('If this individual has any events other than death, burial, or cremation more recent than this number of years, he is considered to be “alive”. Children’s birth dates are considered to be such events for this purpose.'); ?>
+ </p>
</div>
- <!-- EDIT -->
- <div id="edit-options">
- <table>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Facts for individual records'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('All individual facts'), help_link('INDI_FACTS_ADD'); ?>
- </td>
- <td>
- <input type="text" id="INDI_FACTS_ADD" name="INDI_FACTS_ADD" value="<?php echo $WT_TREE->getPreference('INDI_FACTS_ADD'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('INDI_FACTS_ADD'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Unique individual facts'), help_link('INDI_FACTS_UNIQUE'); ?>
- </td>
- <td>
- <input type="text" id="INDI_FACTS_UNIQUE" name="INDI_FACTS_UNIQUE" value="<?php echo $WT_TREE->getPreference('INDI_FACTS_UNIQUE'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('INDI_FACTS_UNIQUE'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Facts for new individuals'), help_link('QUICK_REQUIRED_FACTS'); ?>
- </td>
- <td>
- <input type="text" id="QUICK_REQUIRED_FACTS" name="QUICK_REQUIRED_FACTS" value="<?php echo $WT_TREE->getPreference('QUICK_REQUIRED_FACTS'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('QUICK_REQUIRED_FACTS'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Quick individual facts'), help_link('INDI_FACTS_QUICK'); ?>
- </td>
- <td>
- <input type="text" id="INDI_FACTS_QUICK" name="INDI_FACTS_QUICK" value="<?php echo $WT_TREE->getPreference('INDI_FACTS_QUICK'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('INDI_FACTS_QUICK'); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Facts for family records'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('All family facts'), help_link('FAM_FACTS_ADD'); ?>
- </td>
- <td>
- <input type="text" id="FAM_FACTS_ADD" name="FAM_FACTS_ADD" value="<?php echo $WT_TREE->getPreference('FAM_FACTS_ADD'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('FAM_FACTS_ADD'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Unique family facts'), help_link('FAM_FACTS_UNIQUE'); ?>
- </td>
- <td>
- <input type="text" id="FAM_FACTS_UNIQUE" name="FAM_FACTS_UNIQUE" value="<?php echo $WT_TREE->getPreference('FAM_FACTS_UNIQUE'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('FAM_FACTS_UNIQUE'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Facts for new families'), help_link('QUICK_REQUIRED_FAMFACTS'); ?>
- </td>
- <td>
- <input type="text" id="QUICK_REQUIRED_FAMFACTS" name="QUICK_REQUIRED_FAMFACTS" value="<?php echo $WT_TREE->getPreference('QUICK_REQUIRED_FAMFACTS'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('QUICK_REQUIRED_FAMFACTS'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Quick family facts'), help_link('FAM_FACTS_QUICK'); ?>
- </td>
- <td>
- <input type="text" id="FAM_FACTS_QUICK" name="FAM_FACTS_QUICK" value="<?php echo $WT_TREE->getPreference('FAM_FACTS_QUICK'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('FAM_FACTS_QUICK'); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Facts for source records'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('All source facts'), help_link('SOUR_FACTS_ADD'); ?>
- </td>
- <td>
- <input type="text" id="SOUR_FACTS_ADD" name="SOUR_FACTS_ADD" value="<?php echo $WT_TREE->getPreference('SOUR_FACTS_ADD'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('SOUR_FACTS_ADD'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Unique source facts'), help_link('SOUR_FACTS_UNIQUE'); ?>
- </td>
- <td>
- <input type="text" id="SOUR_FACTS_UNIQUE" name="SOUR_FACTS_UNIQUE" value="<?php echo $WT_TREE->getPreference('SOUR_FACTS_UNIQUE'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('SOUR_FACTS_UNIQUE'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Quick source facts'), help_link('SOUR_FACTS_QUICK'); ?>
- </td>
- <td>
- <input type="text" id="SOUR_FACTS_QUICK" name="SOUR_FACTS_QUICK" value="<?php echo $WT_TREE->getPreference('SOUR_FACTS_QUICK'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('SOUR_FACTS_QUICK'); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Facts for repository records'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('All repository facts'), help_link('REPO_FACTS_ADD'); ?>
- </td>
- <td>
- <input type="text" id="REPO_FACTS_ADD" name="REPO_FACTS_ADD" value="<?php echo $WT_TREE->getPreference('REPO_FACTS_ADD'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('REPO_FACTS_ADD'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Unique repository facts'), help_link('REPO_FACTS_UNIQUE'); ?>
- </td>
- <td>
- <input type="text" id="REPO_FACTS_UNIQUE" name="REPO_FACTS_UNIQUE" value="<?php echo $WT_TREE->getPreference('REPO_FACTS_UNIQUE'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('REPO_FACTS_UNIQUE'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Quick repository facts'), help_link('REPO_FACTS_QUICK'); ?>
- </td>
- <td>
- <input type="text" id="REPO_FACTS_QUICK" name="REPO_FACTS_QUICK" value="<?php echo $WT_TREE->getPreference('REPO_FACTS_QUICK'); ?>" size="60" maxlength="255" dir="ltr"><?php echo print_findfact_link('REPO_FACTS_QUICK'); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Advanced fact settings'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Advanced name facts'), help_link('ADVANCED_NAME_FACTS'); ?>
- </td>
- <td>
- <input type="text" id="ADVANCED_NAME_FACTS" name="ADVANCED_NAME_FACTS" value="<?php echo $WT_TREE->getPreference('ADVANCED_NAME_FACTS'); ?>" size="40" maxlength="255" dir="ltr"><?php echo print_findfact_link('ADVANCED_NAME_FACTS'); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Advanced place name facts'), help_link('ADVANCED_PLAC_FACTS'); ?>
- </td>
- <td>
- <input type="text" id="ADVANCED_PLAC_FACTS" name="ADVANCED_PLAC_FACTS" value="<?php echo $WT_TREE->getPreference('ADVANCED_PLAC_FACTS'); ?>" size="40" maxlength="255" dir="ltr"><?php echo print_findfact_link('ADVANCED_PLAC_FACTS'); ?>
- </td>
- </tr>
- <tr>
- <th colspan="2">
- <?php echo WT_I18N::translate('Other settings'); ?>
- </th>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Surname tradition'), help_link('SURNAME_TRADITION'); ?>
- </td>
- <td>
- <?php echo select_edit_control('SURNAME_TRADITION', array('paternal'=>WT_I18N::translate_c('Surname tradition', 'paternal'), 'patrilineal'=>WT_I18N::translate('patrilineal'), 'matrilineal'=>WT_I18N::translate('matrilineal'), 'spanish'=>WT_I18N::translate_c('Surname tradition', 'Spanish'), 'portuguese'=>WT_I18N::translate_c('Surname tradition', 'Portuguese'), 'icelandic'=>WT_I18N::translate_c('Surname tradition', 'Icelandic'), 'polish'=>WT_I18N::translate_c('Surname tradition', 'Polish'), 'lithuanian'=>WT_I18N::translate_c('Surname tradition', 'Lithuanian'), 'none'=>WT_I18N::translate_c('Surname tradition', 'none')), null, $WT_TREE->getPreference('SURNAME_TRADITION')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Use full source citations'), help_link('FULL_SOURCES'); ?>
- </td>
- <td>
- <?php echo edit_field_yes_no('FULL_SOURCES', $WT_TREE->getPreference('FULL_SOURCES')); ?>
- </td>
- </tr>
- <tr>
- <td>
- <?php echo WT_I18N::translate('Source type'), help_link('PREFER_LEVEL2_SOURCES'); ?>
- </td>
- <td>
- <?php echo select_edit_control('PREFER_LEVEL2_SOURCES', array(0=>WT_I18N::translate('none'), 1=>WT_I18N::translate('facts'), 2=>WT_I18N::translate('records')), null, $WT_TREE->getPreference('PREFER_LEVEL2_SOURCES')); ?>
- </td>
- </tr>
+ </div>
+
+ <h2><?php echo WT_I18N::translate('Privacy restrictions - these apply to records and facts that do not contain a GEDCOM RESN tag'); ?></h2>
+
+ <script id="new-resn-template" type="text/html">
+ <tr>
+ <td>
+ <input data-autocomplete-type="IFSRO" id="xref" maxlength="20" name="xref[]" type="text">
+ </td>
+ <td>
+ <?php echo select_edit_control('tag_type[]', $all_tags, '', null, null); ?>
+ </td>
+ <td>
+ <?php echo select_edit_control('resn[]', $PRIVACY_CONSTANTS, null, 'privacy', null); ?>
+ </td>
+ <td>
+ &nbsp;
+ </td>
+ </tr>
+ </script>
+
+ <table class="table table-bordered table-hover" id="default-resn">
+ <caption class="sr-only">
+ <?php echo WT_I18N::translate('Privacy restrictions - these apply to records and facts that do not contain a GEDCOM RESN tag'); ?>
+ </caption>
+ <thead>
+ <tr>
+ <th>
+ <?php echo WT_I18N::translate('Record'); ?>
+ </th>
+ <th>
+ <?php echo WT_I18N::translate('Fact or event'); ?>
+ </th>
+ <th>
+ <?php echo WT_I18N::translate('Access level'); ?>
+ </th>
+ <th>
+ <button class="btn btn-primary" id="add-resn" type="button">
+ <?php echo WT_I18N::translate('Add'); ?>
+ </button>
+ </th>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td colspan="3">
+ &nbsp;
+ </td>
+ <td>
+ <button type="submit" class="btn btn-primary"><?php echo WT_I18N::translate('save'); ?></button>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+ <?php foreach ($resns as $resn): ?>
<tr>
<td>
- <?php echo /* I18N: GeoNames is the www.geonames.org website */ WT_I18N::translate('Use the GeoNames database for autocomplete on places'), help_link('GEONAMES_ACCOUNT'); ?>
+ <?php if ($resn->record): ?>
+ <a href="<?php echo $resn->record->getHtmlUrl(); ?>"><?php echo $resn->record->getFullName(); ?></a>
+ <?php elseif ($resn->xref): ?>
+ <?php echo $resn->xref , ' — ', WT_I18N::translate('this record does not exist'); ?>
+ <?php else: ?>
+ &nbsp;
+ <?php endif; ?>
</td>
<td>
- <input type="text" id="GEONAMES_ACCOUNT" name="GEONAMES_ACCOUNT" value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('GEONAMES_ACCOUNT')); ?>" size="40" maxlength="255" dir="ltr" placeholder="<?php echo WT_I18N::translate('Username'); ?>">
+ <?php echo $resn->tag_label; ?>
</td>
- </tr>
- <tr>
<td>
- <?php echo WT_I18N::translate('Do not update the “last change” record'), help_link('no_update_CHAN'); ?>
+ <?php echo $PRIVACY_CONSTANTS[$resn->resn]; ?>
</td>
<td>
- <?php echo edit_field_yes_no('NO_UPDATE_CHAN', $WT_TREE->getPreference('NO_UPDATE_CHAN')); ?>
+ <label for="delete-<?php echo $resn->default_resn_id; ?>">
+ <?php echo WT_I18N::translate('Delete'); ?>
+ <input id="delete-<?php echo $resn->default_resn_id; ?>" name="delete[]" type="checkbox" value="<?php echo $resn->default_resn_id; ?>">
+ </label>
</td>
</tr>
- </table>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+
+ <?php elseif (WT_Filter::get('action') === 'general'): ?>
+
+ <input type="hidden" name="action" value="general">
+
+ <h3><?php echo WT_I18N::translate('General'); ?></h3>
+
+ <!-- TREE TITLE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="title">
+ <?php echo WT_I18N::translate('Family tree title'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="title"
+ maxlength="255"
+ name="title"
+ required
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('title')); ?>"
+ >
+ </div>
+ </div>
+
+ <!-- TREE URL / FILENAME -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="gedcom">
+ <?php echo WT_I18N::translate('URL'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <span class="input-group-addon">
+ <?php echo WT_SERVER_NAME, WT_SCRIPT_PATH; ?>?ged=
+ </span>
+ <input
+ class="form-control"
+ dir="ltr"
+ id="gedcom"
+ maxlength="255"
+ name="gedcom"
+ required
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml(WT_GEDCOM); ?>"
+ >
+ </div>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('Avoid spaces and puncutation. A surname might be a good choice.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- LANGUAGE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="LANGUAGE">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Language'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('LANGUAGE', WT_I18N::installed_languages(), null, $WT_TREE->getPreference('LANGUAGE'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Language” configuration setting */ WT_I18N::translate('If a visitor to the site has not specified a preferred language in their browser configuration, or they have specified an unsupported language, then this language will be used. Typically, this setting applies to search engines.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- PEDIGREE_ROOT_ID -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="PEDIGREE_ROOT_ID">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Default individual'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ data-autocomplete-type="INDI"
+ dir="ltr"
+ id="PEDIGREE_ROOT_ID"
+ maxlength="20"
+ name="PEDIGREE_ROOT_ID"
+ type="text"
+ value="<?php echo $WT_TREE->getPreference('PEDIGREE_ROOT_ID'); ?>"
+ >
+ <span class="input-group-addon">
+ <?php
+ $person=WT_Individual::getInstance($WT_TREE->getPreference('PEDIGREE_ROOT_ID'));
+ if ($person) {
+ echo $person->getFullName(), ' ', $person->getLifeSpan();
+ } else {
+ echo WT_I18N::translate('Unable to find record with ID');
+ }
+ ?>
+ </span>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Default individual” configuration setting */ WT_I18N::translate('This individual will be selected by default when viewing charts and reports.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- CALENDAR_FORMAT -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Calendar conversion') ?>
+ <label class="sr-only" for="CALENDAR_FORMAT0">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Calendar conversion'); ?> 1
+ </label>
+ <label class="sr-only" for="CALENDAR_FORMAT1">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Calendar conversion'); ?> 2
+ </label>
+ </legend>
+ <div class="col-sm-9">
+ <div class=row">
+ <div class="col-sm-6" style="padding-left: 0;">
+ <?php echo select_edit_control('CALENDAR_FORMAT0', $calendars, null, $CALENDAR_FORMATS[0], 'class="form-control"'); ?>
+ </div>
+ <div class="col-sm-6" style="padding-right: 0;">
+ <?php echo select_edit_control('CALENDAR_FORMAT1', $calendars, null, $CALENDAR_FORMATS[1], 'class="form-control"'); ?>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Calendar conversion” configuration setting */ WT_I18N::translate('Different calendar systems are used in different parts of the world, and many other calendar systems have been used in the past. Where possible, you should enter dates using the calendar in which the event was originally recorded. You can then specify a conversion, to show these dates in a more familiar calendar. If you regularly use two calendars, you can specify two conversions and dates will be converted to both the selected calendars.'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Calendar conversion” configuration setting */ WT_I18N::translate('Dates are only converted if they are valid for the calendar. For example, only dates between %1$s and %2$s will be converted to the French calendar and only dates after %3$s will be converted to the Gregorian calendar.', with(new WT_Date('22 SEP 1792'))->Display(false, null, array()), with(new WT_Date('31 DEC 1805'))->Display(false, null, array()), with(new WT_Date('15 OCT 1582'))->Display(false, null, array())); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Calendar conversion” configuration setting */ WT_I18N::translate('In some calendars, days start at midnight. In other calendars, days start at sunset. The conversion process does not take account of the time, so for any event that occurs between sunset and midnight, the conversion between these types of calendar will be one day out.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- USE_RIN -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Use RIN number instead of GEDCOM ID'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('USE_RIN', $no_yes, $WT_TREE->getPreference('USE_RIN'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Use RIN number instead of GEDCOM ID” configuration setting */ WT_I18N::translate('Set to <b>Yes</b> to use the RIN number instead of the GEDCOM ID when asked for individual IDs in configuration files, user settings, and charts. This is useful for genealogy programs that do not consistently export GEDCOMs with the same ID assigned to each individual but always use the same RIN.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- GENERATE_UIDS -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Automatically create globally unique IDs'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('GENERATE_UIDS', $no_yes, $WT_TREE->getPreference('GENERATE_UIDS'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Automatically create globally unique IDs” configuration setting */ WT_I18N::translate('<b>GUID</b> in this context is an acronym for “Globally Unique ID”.<br><br>GUIDs are intended to help identify each individual in a manner that is repeatable, so that central organizations such as the Family History Center of the LDS church in Salt Lake City, or even compatible programs running on your own server, can determine whether they are dealing with the same individual no matter where the GEDCOM originates. The goal of the Family History Center is to have a central repository of genealogical data and expose it through web services. This will enable any program to access the data and update their data within it.<br><br>If you do not intend to share this GEDCOM with anyone else, you do not need to let webtrees create these GUIDs; however, doing so will do no harm other than increasing the size of your GEDCOM.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- WORD_WRAPPED_NOTES -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Add spaces where notes were wrapped'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('WORD_WRAPPED_NOTES', $no_yes, $WT_TREE->getPreference('WORD_WRAPPED_NOTES'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Add spaces where notes were wrapped” configuration setting */ WT_I18N::translate('Some genealogy programs wrap notes at word boundaries while others wrap notes anywhere. This can cause webtrees to run words together. Setting this to <b>Yes</b> will add a space between words where they are wrapped in the original GEDCOM during the import process. If you have already imported the file you will need to re-import it.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- XXXXX_ID_PREFIX -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('ID settings'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <div class="row">
+ <!-- GEDCOM_ID_PREFIX -->
+ <div class="col-sm-4">
+ <div class="input-group">
+ <label class="input-group-addon" for="GEDCOM_ID_PREFIX">
+ <?php echo WT_I18N::translate('Individual ID prefix'); ?>
+ </label>
+ <input
+ class="form-control"
+ dir="ltr"
+ id="GEDCOM_ID_PREFIX"
+ maxlength="10"
+ name="GEDCOM_ID_PREFIX"
+ type="text"
+ value="<?php echo $WT_TREE->getPreference('GEDCOM_ID_PREFIX'); ?>"
+ >
+ </div>
+ </div>
+ <!-- FAM_ID_PREFIX -->
+ <div class="col-sm-4">
+ <div class="input-group">
+ <label class="input-group-addon" for="FAM_ID_PREFIX">
+ <?php echo WT_I18N::translate('Family ID prefix'); ?>
+ </label>
+ <input
+ class="form-control"
+ dir="ltr"
+ id="FAM_ID_PREFIX"
+ maxlength="10"
+ name="FAM_ID_PREFIX"
+ type="text"
+ value="<?php echo $WT_TREE->getPreference('FAM_ID_PREFIX'); ?>"
+ >
+ </div>
+ </div>
+ <!-- SOURCE_ID_PREFIX -->
+ <div class="col-sm-4">
+ <div class="input-group">
+ <label class="input-group-addon" for="SOURCE_ID_PREFIX">
+ <?php echo WT_I18N::translate('Source ID prefix'); ?>
+ </label>
+ <input
+ class="form-control"
+ dir="ltr"
+ id="SOURCE_ID_PREFIX"
+ maxlength="10"
+ name="SOURCE_ID_PREFIX"
+ type="text"
+ value="<?php echo $WT_TREE->getPreference('SOURCE_ID_PREFIX'); ?>"
+ >
+ </div>
+ </div>
+ <!-- REPO_ID_PREFIX -->
+ <div class="col-sm-4">
+ <div class="input-group">
+ <label class="input-group-addon" for="REPO_ID_PREFIX">
+ <?php echo WT_I18N::translate('Repository ID prefix'); ?>
+ </label>
+ <input
+ class="form-control"
+ dir="ltr"
+ id="REPO_ID_PREFIX"
+ maxlength="10"
+ name="REPO_ID_PREFIX"
+ type="text"
+ value="<?php echo $WT_TREE->getPreference('REPO_ID_PREFIX'); ?>"
+ >
+ </div>
+ </div>
+ <!-- MEDIA_ID_PREFIX -->
+ <div class="col-sm-4">
+ <div class="input-group">
+ <label class="input-group-addon" for="MEDIA_ID_PREFIX">
+ <?php echo WT_I18N::translate('Media ID prefix'); ?>
+ </label>
+ <input
+ class="form-control"
+ dir="ltr"
+ id="MEDIA_ID_PREFIX"
+ maxlength="10"
+ name="MEDIA_ID_PREFIX"
+ type="text"
+ value="<?php echo $WT_TREE->getPreference('MEDIA_ID_PREFIX'); ?>"
+ >
+ </div>
+ </div>
+ <!-- NOTE_ID_PREFIX -->
+ <div class="col-sm-4">
+ <div class="input-group">
+ <label class="input-group-addon" for="NOTE_ID_PREFIX">
+ <?php echo WT_I18N::translate('Note ID prefix'); ?>
+ </label>
+ <input
+ class="form-control"
+ dir="ltr"
+ id="NOTE_ID_PREFIX"
+ maxlength="10"
+ name="NOTE_ID_PREFIX"
+ type="text"
+ value="<?php echo $WT_TREE->getPreference('NOTE_ID_PREFIX'); ?>"
+ >
+ </div>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “ID settings” configuration setting */ WT_I18N::translate('When new records are created, they are given an internal ID number. You can specify the prefix used for each type of record.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <h3><?php echo WT_I18N::translate('Contact information'); ?></h3>
+
+ <!-- WEBTREES_EMAIL -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="WEBTREES_EMAIL">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('webtrees reply address'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="WEBTREES_EMAIL"
+ maxlength="255"
+ name="WEBTREES_EMAIL"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('WEBTREES_EMAIL')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “webtrees reply address” configuration setting */ WT_I18N::translate('E-mail address to be used in the “From:” field of e-mails that webtrees creates automatically.<br><br>webtrees can automatically create e-mails to notify administrators of changes that need to be reviewed. webtrees also sends notification e-mails to users who have requested an account.<br><br>Usually, the “From:” field of these automatically created e-mails is something like <i>From: webtrees-noreply@yoursite</i> to show that no response to the e-mail is required. To guard against spam or other e-mail abuse, some e-mail systems require each message’s “From:” field to reflect a valid e-mail account and will not accept messages that are apparently from account <i>webtrees-noreply</i>.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- CONTACT_USER_ID -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="CONTACT_USER_ID">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Genealogy contact'); ?>
+ </label>
+ <div class="col-sm-9">
+ <select id="CONTACT_USER_ID" name="CONTACT_USER_ID" class="form-control">
+ <option value=""></option>
+ <?php foreach (User::all() as $user): ?>
+ <?php if (Auth::isMember($WT_TREE, $user)): ?>
+ <option value="<?php echo $user->getUserId(); ?>" selected="<?php echo $WT_TREE->getPreference('CONTACT_USER_ID') === $user->getUserId() ? 'selected' : ''; ?>">
+ <?php echo WT_Filter::escapeHtml($user->getRealName()) . ' - ' . WT_Filter::escapeHtml($user->getUserName()); ?>
+ </option>
+ <?php endif; ?>
+ <?php endforeach; ?>
+ </select>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Genealogy contact” configuration setting */ WT_I18N::translate('The individual to contact about the genealogical data on this site.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- WEBMASTER_USER_ID -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="WEBMASTER_USER_ID">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Technical help contact'); ?>
+ </label>
+ <div class="col-sm-9">
+ <select id="WEBMASTER_USER_ID" name="WEBMASTER_USER_ID" class="form-control">
+ <option value=""></option>
+ <?php foreach (User::all() as $user): ?>
+ <?php if (Auth::isMember($WT_TREE, $user)): ?>
+ <option value="<?php echo $user->getUserId(); ?>" selected="<?php echo $WT_TREE->getPreference('WEBMASTER_USER_ID') === $user->getUserId() ? 'selected' : ''; ?>">
+ <?php echo WT_Filter::escapeHtml($user->getRealName()) . ' - ' . WT_Filter::escapeHtml($user->getUserName()); ?>
+ </option>
+ <?php endif; ?>
+ <?php endforeach; ?>
+ </select>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Technical help contact” configuration setting */ WT_I18N::translate('The individual to be contacted about technical questions or errors encountered on your site.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Web site and META tag settings'); ?></h3>
+
+ <!-- META_TITLE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="META_TITLE">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Add to TITLE header tag'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="META_TITLE"
+ maxlength="255"
+ name="META_TITLE"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('META_TITLE')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Add to TITLE header tag” configuration setting */ WT_I18N::translate('This text will be appended to each page title. It will be shown in the browser’s title bar, bookmarks, etc.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- META_DESCRIPTION -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="META_DESCRIPTION">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Description META tag'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="META_DESCRIPTION"
+ maxlength="255"
+ name="META_DESCRIPTION"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('META_DESCRIPTION')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Description META tag” configuration setting */ WT_I18N::translate('The value to place in the “meta description” tag in the HTML page header. Leave this field empty to use the name of the family tree.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('User options'); ?></h3>
+ <!-- ALLOW_THEME_DROPDOWN -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Theme dropdown selector for theme changes'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('ALLOW_THEME_DROPDOWN', $hide_show, $WT_TREE->getPreference('ALLOW_THEME_DROPDOWN'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Theme dropdown selector for theme changes” configuration setting */ WT_I18N::translate('Gives users the option of selecting their own theme from a menu.<br><br>Even with this option set, the theme currently in effect may not provide for such a menu. To be effective, this option requires the <b>Allow users to select their own theme</b> option to be set as well.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- THEME_DIR -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="THEME_DIR">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Default theme'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('THEME_DIR', get_theme_names(), WT_I18N::translate('<default theme>'), $WT_TREE->getPreference('THEME_DIR'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Default theme” configuration setting */ WT_I18N::translate('You can change the appearance of webtrees using “themes”. Each theme has a different style, layout, color scheme, etc.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Media'); ?></h3>
+ <h3><?php echo WT_I18N::translate('Media folders'); ?></h3>
+
+ <!-- MEDIA_DIRECTORY -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="MEDIA_DIRECTORY">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Media folder'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <span class="input-group-addon">
+ <?php echo WT_DATA_DIR; ?>
+ </span>
+ <input
+ class="form-control"
+ dir="ltr"
+ id="MEDIA_DIRECTORY"
+ maxlength="255"
+ name="MEDIA_DIRECTORY"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('MEDIA_DIRECTORY')); ?>"
+ >
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Media folder” configuration setting */ WT_I18N::translate('This folder will be used to store the media files for this family tree.'); ?>
+ <?php echo /* I18N: Help text for the “Media folder” configuration setting */ WT_I18N::translate('If you select a different folder, you must also move any media files from the existing folder to the new one.'); ?>
+ <?php echo /* I18N: Help text for the “Media folder” configuration setting */ WT_I18N::translate('If two family trees use the same media folder, then they will be able to share media files. If they use different media folders, then their media files will be kept separate.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- GEDCOM_MEDIA_PATH -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="GEDCOM_MEDIA_PATH">
+ <?php echo /* I18N: /* I18N: A configuration setting. A media path (e.g. c:\aaa\bbb\ccc\ddd.jpeg) in a GEDCOM file */ WT_I18N::translate('GEDCOM media path'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="GEDCOM_MEDIA_PATH"
+ maxlength="255"
+ name="GEDCOM_MEDIA_PATH"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('GEDCOM_MEDIA_PATH')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “GEDCOM media path” configuration setting. A “path” is something like “C:\Documents\My_User\Genealogy\Photos\Gravestones\John_Smith.jpeg” */ WT_I18N::translate('Some genealogy applications create GEDCOM files that contain media filenames with full paths. These paths will not exist on the web-server. To allow webtrees to find the file, the first part of the path must be removed.'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “GEDCOM media path” configuration setting. %s are all folder names; “GEDCOM media path” is a configuration setting */ WT_I18N::translate('For example, if the GEDCOM file contains %1$s and webtrees expects to find %2$s in the media folder, then the GEDCOM media path would be %3$s.', '<span class="filename">/home/fab/documents/family/photo.jpeg</span>', '<span class="filename">family/photo.jpeg</span>', '<span class="filename">/home/fab/documents/</span>'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “GEDCOM media path” configuration setting */ WT_I18N::translate('This setting is only used when you read or write GEDCOM files.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Media files'); ?></h3>
+
+ <!-- MEDIA_UPLOAD -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="MEDIA_UPLOAD">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Who can upload new media files'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('MEDIA_UPLOAD', array(WT_PRIV_USER=>WT_I18N::translate('Show to members'),
+ WT_PRIV_NONE=>WT_I18N::translate('Show to managers'), WT_PRIV_HIDE=>WT_I18N::translate('Hide from everyone')), null, $WT_TREE->getPreference('MEDIA_UPLOAD'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Who can upload new media files” configuration setting */ WT_I18N::translate('If you are concerned that users might upload inappropriate images, you can restrict media uploads to managers only.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- SHOW_MEDIA_DOWNLOAD -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Show download link in media viewer'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_MEDIA_DOWNLOAD', $no_yes, $WT_TREE->getPreference('SHOW_MEDIA_DOWNLOAD'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Show download link in media viewer” configuration setting */ WT_I18N::translate('The Media Viewer can show a link which, when clicked, will download the media file to the local PC.<br><br>You may want to hide the download link for security reasons.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <h3><?php echo WT_I18N::translate('Thumbnail images'); ?></h3>
+
+ <!-- THUMBNAIL_WIDTH -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="THUMBNAIL_WIDTH">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Width of generated thumbnails'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ id="THUMBNAIL_WIDTH"
+ maxlength="4"
+ name="THUMBNAIL_WIDTH"
+ required
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('THUMBNAIL_WIDTH')); ?>"
+ >
+ <span class="input-group-addon">
+ <?php echo /* Image sizes are measured in pixels */ WT_I18N::translate('pixels'); ?>
+ </span>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Width of generated thumbnails” configuration setting */ WT_I18N::translate('This is the width (in pixels) that the program will use when automatically generating thumbnails. The default setting is 100.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- USE_SILHOUETTE -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Use silhouettes'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('USE_SILHOUETTE', $no_yes, $WT_TREE->getPreference('USE_SILHOUETTE'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Use silhouettes” configuration setting */ WT_I18N::translate('Use silhouette images when no highlighted image for that individual has been specified. The images used are specific to the gender of the individual in question.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- SHOW_HIGHLIGHT_IMAGES -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo WT_I18N::translate('Show highlight images in individual boxes'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_HIGHLIGHT_IMAGES', $no_yes, $WT_TREE->getPreference('SHOW_HIGHLIGHT_IMAGES'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ </p>
+ </div>
+ </fieldset>
+
+ <h3><?php echo WT_I18N::translate('Watermarks'); ?></h3>
+
+ <!-- WATERMARK_THUMB -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Add watermarks to thumbnails'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('WATERMARK_THUMB', $no_yes, $WT_TREE->getPreference('WATERMARK_THUMB'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Add watermarks to thumbnails” configuration setting */ WT_I18N::translate('A watermark is text that is added to an image, to discourage others from copying it without permission.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- SAVE_WATERMARK_IMAGE -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Store watermarked full size images on server'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SAVE_WATERMARK_IMAGE', $no_yes, $WT_TREE->getPreference('SAVE_WATERMARK_IMAGE'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Store watermarked full size images on server” configuration setting */ WT_I18N::translate('Watermarks can be slow to generate for large images. Busy sites may prefer to generate them once and store the watermarked image on the server.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- SAVE_WATERMARK_THUMB -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Store watermarked thumbnails on server'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SAVE_WATERMARK_THUMB', $no_yes, $WT_TREE->getPreference('SAVE_WATERMARK_THUMB'), 'class="radio-inline"'); ?>
+ </div>
+ </fieldset>
+
+ <!-- SHOW_NO_WATERMARK -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="SHOW_NO_WATERMARK">
+ <?php echo WT_I18N::translate('Images without watermarks'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('SHOW_NO_WATERMARK', $privacy, null, $WT_TREE->getPreference('MEDIA_UPLOAD'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Images without watermarks” configuration setting */ WT_I18N::translate('Watermarks are optional and normally shown just to visitors.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Layout'); ?></h3>
+
+ <h3><?php echo WT_I18N::translate('Names'); ?></h3>
+
+ <!-- COMMON_NAMES_THRESHOLD -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="COMMON_NAMES_THRESHOLD">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Min. no. of occurrences to be a “common surname”'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="COMMON_NAMES_THRESHOLD"
+ maxlength="5"
+ name="COMMON_NAMES_THRESHOLD"
+ required
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('COMMON_NAMES_THRESHOLD')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Min. no. of occurrences to be a ‘common surname’” configuration setting */ WT_I18N::translate('This is the number of times that a surname must occur before it shows up in the Common Surname list on the “Home page”.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- COMMON_NAMES_ADD -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="COMMON_NAMES_ADD">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Names to add to common surnames (comma separated)'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="COMMON_NAMES_ADD"
+ maxlength="5"
+ name="COMMON_NAMES_ADD"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('COMMON_NAMES_ADD')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Names to add to common surnames (comma separated)” configuration setting */ WT_I18N::translate('If the number of times that a certain surname occurs is lower than the threshold, it will not appear in the list. It can be added here manually. If more than one surname is entered, they must be separated by a comma. Surnames are case-sensitive.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- COMMON_NAMES_REMOVE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="COMMON_NAMES_REMOVE">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Names to remove from common surnames (comma separated)'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="COMMON_NAMES_REMOVE"
+ maxlength="5"
+ name="COMMON_NAMES_REMOVE"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('COMMON_NAMES_REMOVE')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Names to remove from common surnames (comma separated)” configuration setting */ WT_I18N::translate('If you want to remove a surname from the Common Surname list without increasing the threshold value, you can do that by entering the surname here. If more than one surname is entered, they must be separated by a comma. Surnames are case-sensitive. Surnames entered here will also be removed from the “Top surnames” list on the “Home page”.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Lists'); ?></h3>
+
+ <!-- SURNAME_LIST_STYLE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="SURNAME_LIST_STYLE">
+ <?php echo WT_I18N::translate('Surname list style'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('SURNAME_LIST_STYLE', $surname_list_styles, null, $WT_TREE->getPreference('SURNAME_LIST_STYLE'), 'class="form-control"'); ?>
+ <p class="small text-muted">
+ </p>
+ </div>
+ </div>
+
+ <!-- SUBLIST_TRIGGER_I -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="SUBLIST_TRIGGER_I">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Maximum number of surnames on individual list'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="SUBLIST_TRIGGER_I"
+ maxlength="5"
+ name="SUBLIST_TRIGGER_I"
+ required
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('SUBLIST_TRIGGER_I')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Maximum number of surnames on individual list” configuration setting */ WT_I18N::translate('Long lists of individuals with the same surname can be broken into smaller sub-lists according to the first letter of the individual’s given name.<br><br>This option determines when sub-listing of surnames will occur. To disable sub-listing completely, set this option to zero.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- SHOW_EST_LIST_DATES -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Estimated dates for birth and death'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_EST_LIST_DATES', $hide_show, $WT_TREE->getPreference('SHOW_EST_LIST_DATES'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Estimated dates for birth and death” configuration setting */ WT_I18N::translate('This option controls whether or not to show estimated dates for birth and death instead of leaving blanks on individual lists and charts for individuals whose dates are not known.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- SHOW_LAST_CHANGE -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo WT_I18N::translate('The date and time of the last update'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_LAST_CHANGE', $hide_show, $WT_TREE->getPreference('SHOW_LAST_CHANGE'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ </p>
+ </div>
+ </fieldset>
+
+ <h3><?php echo WT_I18N::translate('Charts'); ?></h3>
+
+ <!-- PEDIGREE_LAYOUT -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Default pedigree chart layout'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('PEDIGREE_LAYOUT', $layouts, $WT_TREE->getPreference('PEDIGREE_LAYOUT'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- DEFAULT_PEDIGREE_GENERATIONS -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="DEFAULT_PEDIGREE_GENERATIONS">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Default pedigree generations'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="DEFAULT_PEDIGREE_GENERATIONS"
+ maxlength="5"
+ name="DEFAULT_PEDIGREE_GENERATIONS"
+ required
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('DEFAULT_PEDIGREE_GENERATIONS')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Default pedigree generations” configuration setting */ WT_I18N::translate('Set the maximum number of generations to display on pedigree charts.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- MAX_PEDIGREE_GENERATIONS -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="MAX_PEDIGREE_GENERATIONS">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Maximum pedigree generations'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="MAX_PEDIGREE_GENERATIONS"
+ maxlength="5"
+ name="MAX_PEDIGREE_GENERATIONS"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('MAX_PEDIGREE_GENERATIONS')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Maximum pedigree generations” configuration setting */ WT_I18N::translate('Set the maximum number of generations to display on descendancy charts.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- MAX_DESCENDANCY_GENERATIONS -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="MAX_DESCENDANCY_GENERATIONS">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Maximum descendancy generations'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ id="MAX_DESCENDANCY_GENERATIONS"
+ maxlength="5"
+ name="MAX_DESCENDANCY_GENERATIONS"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('MAX_DESCENDANCY_GENERATIONS')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Maximum descendancy generations” configuration setting */ WT_I18N::translate('Set the maximum number of generations to display on descendancy charts.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Individual pages'); ?></h3>
+
+ <!-- EXPAND_RELATIVES_EVENTS -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Automatically expand list of events of close relatives'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('EXPAND_RELATIVES_EVENTS', $no_yes, $WT_TREE->getPreference('EXPAND_RELATIVES_EVENTS'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Automatically expand list of events of close relatives” configuration setting */ WT_I18N::translate('This option controls whether or not to automatically expand the <i>Events of close relatives</i> list.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- SHOW_RELATIVES_EVENTS -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo WT_I18N::translate('Show events of close relatives on individual page'); ?>
+ </legend>
+ <div class="col-sm-3">
+ <div class="checkbox">
+ <label for="_BIRT_GCHI">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_BIRT_GCHI" value="_BIRT_GCHI" <?php echo in_array('_BIRT_GCHI', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_BIRT_GCHI'); ?>
+ </label>
+ </div>
+ <div class="checkbox">
+ <label for="_BIRT_CHIL">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_BIRT_CHIL" value="_BIRT_CHIL" <?php echo in_array('_BIRT_CHIL', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_BIRT_CHIL'); ?>
+ </label>
+ </div>
+ <div class="checkbox">
+ <label for="_BIRT_SIBL">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_BIRT_SIBL" value="_BIRT_SIBL" <?php echo in_array('_BIRT_SIBL', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_BIRT_SIBL'); ?>
+ </label>
+ </div>
+ </div>
+ <div class="col-sm-3">
+ <div class="checkbox">
+ <label for="_MARR_GCHI">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_MARR_GCHI" value="_MARR_GCHI" <?php echo in_array('_MARR_GCHI', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_MARR_GCHI'); ?>
+ </label>
+ </div>
+ <div class="checkbox">
+ <label for="_MARR_CHIL">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_MARR_CHIL" value="_MARR_CHIL" <?php echo in_array('_MARR_CHIL', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_MARR_CHIL'); ?>
+ </label>
+ </div>
+ <div class="checkbox">
+ <label for="_MARR_SIBL">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_MARR_SIBL" value="_MARR_SIBL" <?php echo in_array('_MARR_SIBL', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_MARR_SIBL'); ?>
+ </label>
+ </div>
+ <div class="checkbox">
+ <label for="_MARR_PARE">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_MARR_PARE" value="_MARR_PARE" <?php echo in_array('_MARR_PARE', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_MARR_PARE'); ?>
+ </label>
+ </div>
</div>
+ <div class="col-sm-3">
+ <div class="checkbox">
+ <label for="_DEAT_GCHI">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_DEAT_GCHI" value="_DEAT_GCHI" <?php echo in_array('_DEAT_GCHI', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_DEAT_GCHI'); ?>
+ </label>
+ </div>
+ <div class="checkbox">
+ <label for="_DEAT_CHIL">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_DEAT_CHIL" value="_DEAT_CHIL" <?php echo in_array('_DEAT_CHIL', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_DEAT_CHIL'); ?>
+ </label>
+ </div>
+ <div class="checkbox">
+ <label for="_DEAT_SIBL">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_DEAT_SIBL" value="_DEAT_SIBL" <?php echo in_array('_DEAT_SIBL', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_DEAT_SIBL'); ?>
+ </label>
+ </div>
+ <div class="checkbox">
+ <label for="_DEAT_PARE">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_DEAT_PARE" value="_DEAT_PARE" <?php echo in_array('_DEAT_PARE', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_DEAT_PARE'); ?>
+ </label>
+ </div>
+ <div class="checkbox">
+ <label for="_DEAT_SPOU">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_DEAT_SPOU" value="_DEAT_SPOU" <?php echo in_array('_DEAT_SPOU', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_DEAT_SPOU'); ?>
+ </label>
+ </div>
+ <div class="checkbox">
+ <label for="_DEAT_GPAR">
+ <input name="SHOW_RELATIVES_EVENTS[]" type="checkbox" id="_DEAT_GPAR" value="_DEAT_GPAR" <?php echo in_array('_DEAT_GPAR', $relatives_events) ? ' checked="checked"' : ''; ?>>
+ <?php echo WT_Gedcom_Tag::getLabel('_DEAT_GPAR'); ?>
+ </label>
+ </div>
+ </div>
+ </fieldset>
+
+ <h3><?php echo WT_I18N::translate('Places'); ?></h3>
+
+ <!-- SHOW_PEDIGREE_PLACES -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Abbreviate place names'); ?>
+ <label class="sr-only" for="SHOW_PEDIGREE_PLACES_SUFFIX">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Abbreviate place names'); ?>
+ <?php echo WT_I18N::translate('first'); ?> /<?php echo WT_I18N::translate('last'); ?>
+ </label>
+ <label class="sr-only" for="SHOW_PEDIGREE_PLACES">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Abbreviate place names'); ?>
+ </label>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo /* I18N: The placeholders are edit controls. Show the [first/last] [1/2/3/4/5] parts of a place name */ WT_I18N::translate(
+ 'Show the %1$s %2$s parts of a place name.',
+ select_edit_control('SHOW_PEDIGREE_PLACES_SUFFIX',
+ array(
+ false=>WT_I18N::translate_c('Show the [first/last] [N] parts of a place name.', 'first'),
+ true =>WT_I18N::translate_c('Show the [first/last] [N] parts of a place name.', 'last')
+ ), null, $WT_TREE->getPreference('SHOW_PEDIGREE_PLACES_SUFFIX')
+ ),
+ select_edit_control('SHOW_PEDIGREE_PLACES', $one_to_nine, null, $WT_TREE->getPreference('SHOW_PEDIGREE_PLACES'))
+ ); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Abbreviate place names” configuration setting */ WT_I18N::translate('Place names are frequently too long to fit on charts, lists, etc. They can be abbreviated by showing just the first few parts of the name, such as <i>village, county</i>, or the last few part of it, such as <i>region, country</i>.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <h3><?php echo WT_Gedcom_Tag::getLabel('TEXT'); ?></h3>
+
+ <!-- FORMAT_TEXT -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Format text and notes'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('FORMAT_TEXT', $formats, $WT_TREE->getPreference('FORMAT_TEXT'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Format text and notes” configuration setting */ WT_I18N::translate('To ensure compatibility with other genealogy applications, notes, text, and transcripts should be recorded in simple, unformatted text. However, formatting is often desirable to aid presentation, comprehension, etc.'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Format text and notes” configuration setting */ WT_I18N::translate('Markdown is a simple system of formatting, used on websites such as Wikipedia. It uses unobtrusive punctuation characters to create headings and sub-headings, bold and italic text, lists, tables, etc.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <h3><?php echo WT_I18N::translate('Hide &amp; show'); ?></h3>
+
+ <h3><?php echo WT_I18N::translate('Charts'); ?></h3>
+
+ <!-- PEDIGREE_FULL_DETAILS -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Show chart details by default'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('PEDIGREE_FULL_DETAILS', $no_yes, $WT_TREE->getPreference('PEDIGREE_FULL_DETAILS'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Show chart details by default” configuration setting */ WT_I18N::translate('This is the initial setting for the “show details” option on the charts.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- PEDIGREE_SHOW_GENDER -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Gender icon on charts'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('PEDIGREE_SHOW_GENDER', $hide_show, $WT_TREE->getPreference('PEDIGREE_SHOW_GENDER'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Gender icon on charts” configuration setting */ WT_I18N::translate('This option controls whether or not to show the individual’s gender icon on charts.<br><br>Since the gender is also indicated by the color of the box, this option doesn’t conceal the gender. The option simply removes some duplicate information from the box.'); ?>
+ </p>
</div>
- <p>
- <input type="submit" value="<?php echo WT_I18N::translate('save'); ?>">
+ </fieldset>
+
+ <!-- SHOW_PARENTS_AGE -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Age of parents next to child’s birthdate'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_PARENTS_AGE', $hide_show, $WT_TREE->getPreference('SHOW_PARENTS_AGE'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Age of parents next to child’s birthdate” configuration setting */ WT_I18N::translate('This option controls whether or not to show age of father and mother next to child’s birthdate on charts.'); ?>
</p>
+ </div>
+ </fieldset>
+
+ <!-- SHOW_LDS_AT_GLANCE -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('LDS ordinance codes in chart boxes'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_LDS_AT_GLANCE', $hide_show, $WT_TREE->getPreference('SHOW_LDS_AT_GLANCE'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “LDS ordinance codes in chart boxes” configuration setting */ WT_I18N::translate('Setting this option to <b>Yes</b> will show status codes for LDS ordinances in chart boxes.<ul><li><b>B</b> - Baptism</li><li><b>E</b> - Endowed</li><li><b>S</b> - Sealed to spouse</li><li><b>P</b> - Sealed to parents</li></ul>An individual who has all of the ordinances done will have <b>BESP</b> printed after their name. Missing ordinances are indicated by <b>_</b> in place of the corresponding letter code. For example, <b>BE__</b> indicates missing <b>S</b> and <b>P</b> ordinances.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- CHART_BOX_TAGS -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="CHART_BOX_TAGS">
+ <?php echo WT_I18N::translate('Other facts to show in charts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="CHART_BOX_TAGS"
+ maxlength="255"
+ name="CHART_BOX_TAGS"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('CHART_BOX_TAGS')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('CHART_BOX_TAGS'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo /* I18N: button label */ WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Other facts to show in charts” configuration setting */ WT_I18N::translate('This should be a comma or space separated list of facts, in addition to birth and death, that you want to appear in chart boxes such as the pedigree chart. This list requires you to use fact tags as defined in the GEDCOM 5.5.1 standard. For example, if you wanted the occupation to show up in the box, you would add “OCCU” to this field.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Individual pages'); ?></h3>
+
+ <!-- SHOW_FACT_ICONS -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Fact icons'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_FACT_ICONS', $hide_show, $WT_TREE->getPreference('SHOW_FACT_ICONS'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Fact icons” configuration setting */ WT_I18N::translate('Set this to <b>Yes</b> to display icons near Fact names on the Personal Facts and Details page. Fact icons will be displayed only if they exist in the <i>images/facts</i> directory of the current theme.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- EXPAND_NOTES -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Automatically expand notes'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('EXPAND_NOTES', $no_yes, $WT_TREE->getPreference('EXPAND_NOTES'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Automatically expand notes” configuration setting */ WT_I18N::translate('This option controls whether or not to automatically display content of a <i>Note</i> record on the Individual page.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- EXPAND_SOURCES -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Automatically expand sources'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('EXPAND_SOURCES', $no_yes, $WT_TREE->getPreference('EXPAND_SOURCES'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Automatically expand sources” configuration setting */ WT_I18N::translate('This option controls whether or not to automatically display content of a <i>Source</i> record on the Individual page.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- SHOW_LEVEL2_NOTES -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Show all notes and source references on notes and sources tabs'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_LEVEL2_NOTES', $no_yes, $WT_TREE->getPreference('SHOW_LEVEL2_NOTES'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Show all notes and source references on notes and sources tabs” configuration setting */ WT_I18N::translate('This option controls whether Notes and Source references that are attached to Facts should be shown on the Notes and Sources tabs of the Individual page.<br><br>Ordinarily, the Notes and Sources tabs show only Notes and Source references that are attached directly to the individual’s database record. These are <i>level 1</i> Notes and Source references.<br><br>The <b>Yes</b> option causes these tabs to also show Notes and Source references that are part of the various Facts in the individual’s database record. These are <i>level 2</i> Notes and Source references because the various Facts are at level 1.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- SHOW_AGE_DIFF -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Date differences'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_AGE_DIFF', $hide_show, $WT_TREE->getPreference('SHOW_AGE_DIFF'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Date differences” configuration setting */ WT_I18N::translate('When this option is selected, webtrees will calculate the age differences between siblings, children, spouses, etc.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <h3><?php echo WT_I18N::translate('General'); ?></h3>
+
+ <!-- SHOW_GEDCOM_RECORD -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Allow users to see raw GEDCOM records'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_GEDCOM_RECORD', $no_yes, $WT_TREE->getPreference('SHOW_GEDCOM_RECORD'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Allow users to see raw GEDCOM records” configuration setting */ WT_I18N::translate('Setting this to <b>Yes</b> will place links on individuals, sources, and families to let users bring up another window containing the raw data taken right out of the GEDCOM file.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- HIDE_GEDCOM_ERRORS -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('GEDCOM errors'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('HIDE_GEDCOM_ERRORS', $hide_show, $WT_TREE->getPreference('HIDE_GEDCOM_ERRORS'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “GEDCOM errors” configuration setting */ WT_I18N::translate('Many genealogy programs create GEDCOM files with custom tags, and webtrees understands most of them. When unrecognized tags are found, this option lets you choose whether to ignore them or display a warning message.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- SHOW_COUNTER -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Hit counters'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_COUNTER', $hide_show, $WT_TREE->getPreference('SHOW_COUNTER'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Hit counters” configuration setting */ WT_I18N::translate('Show hit counters on portal and individual pages'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- SHOW_STATS -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Execution statistics'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SHOW_STATS', $hide_show, $WT_TREE->getPreference('SHOW_STATS'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Execution statistics” configuration setting */ WT_I18N::translate('Show runtime statistics and database queries at the bottom of every page.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <h3><?php echo WT_I18N::translate('Edit options'); ?></h3>
+
+ <h3><?php echo WT_I18N::translate('Facts for individual records'); ?></h3>
+
+ <!-- INDI_FACTS_ADD -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="INDI_FACTS_ADD">
+ <?php echo WT_I18N::translate('All individual facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="INDI_FACTS_ADD"
+ maxlength="255"
+ name="INDI_FACTS_ADD"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('INDI_FACTS_ADD')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('INDI_FACTS_ADD'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “All individual facts” configuration setting */ WT_I18N::translate('This is the list of GEDCOM facts that your users can add to individuals. You can modify this list by removing or adding fact names, even custom ones, as necessary. Fact names that appear in this list must not also appear in the “Unique individual facts” list.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- INDI_FACTS_UNIQUE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="INDI_FACTS_UNIQUE">
+ <?php echo WT_I18N::translate('Unique individual facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="INDI_FACTS_UNIQUE"
+ maxlength="255"
+ name="INDI_FACTS_UNIQUE"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('INDI_FACTS_UNIQUE')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('INDI_FACTS_UNIQUE'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Unique individual facts” configuration setting */ WT_I18N::translate('This is the list of GEDCOM facts that your users can only add once to individuals. For example, if BIRT is in this list, users will not be able to add more than one BIRT record to an individual. Fact names that appear in this list must not also appear in the “All individual facts” list.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- QUICK_REQUIRED_FACTS -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="QUICK_REQUIRED_FACTS">
+ <?php echo WT_I18N::translate('Facts for new individuals'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="QUICK_REQUIRED_FACTS"
+ maxlength="255"
+ name="QUICK_REQUIRED_FACTS"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('QUICK_REQUIRED_FACTS')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('QUICK_REQUIRED_FACTS'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Facts for new individuals” configuration setting */ WT_I18N::translate('This is a comma separated list of GEDCOM fact tags that will be shown when adding a new individual. For example, if BIRT is in the list, fields for birth date and birth place will be shown on the form.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- INDI_FACTS_QUICK -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="INDI_FACTS_QUICK">
+ <?php echo WT_I18N::translate('Quick individual facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="INDI_FACTS_QUICK"
+ maxlength="255"
+ name="INDI_FACTS_QUICK"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('INDI_FACTS_QUICK')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('INDI_FACTS_QUICK'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Quick individual facts” configuration setting */ WT_I18N::translate('This is the short list of GEDCOM individual facts that appears next to the full list and can be added with a single click.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Facts for family records'); ?></h3>
+
+ <!-- FAM_FACTS_ADD -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="FAM_FACTS_ADD">
+ <?php echo WT_I18N::translate('All family facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="FAM_FACTS_ADD"
+ maxlength="255"
+ name="FAM_FACTS_ADD"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('FAM_FACTS_ADD')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('FAM_FACTS_ADD'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “All family facts” configuration setting */ WT_I18N::translate('This is the list of GEDCOM facts that your users can add to families. You can modify this list by removing or adding fact names, even custom ones, as necessary. Fact names that appear in this list must not also appear in the “Unique family facts” list.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- FAM_FACTS_UNIQUE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="FAM_FACTS_UNIQUE">
+ <?php echo WT_I18N::translate('Unique family facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="FAM_FACTS_UNIQUE"
+ maxlength="255"
+ name="FAM_FACTS_UNIQUE"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('FAM_FACTS_UNIQUE')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('FAM_FACTS_UNIQUE'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Unique family facts” configuration setting */ WT_I18N::translate('This is the list of GEDCOM facts that your users can only add once to families. For example, if MARR is in this list, users will not be able to add more than one MARR record to a family. Fact names that appear in this list must not also appear in the “All family facts” list.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- QUICK_REQUIRED_FAMFACTS -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="QUICK_REQUIRED_FAMFACTS">
+ <?php echo WT_I18N::translate('Facts for new families'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="QUICK_REQUIRED_FAMFACTS"
+ maxlength="255"
+ name="QUICK_REQUIRED_FAMFACTS"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('QUICK_REQUIRED_FAMFACTS')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('QUICK_REQUIRED_FAMFACTS'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Facts for new families” configuration setting */ WT_I18N::translate('This is a comma separated list of GEDCOM fact tags that will be shown when adding a new family. For example, if MARR is in the list, then fields for marriage date and marriage place will be shown on the form.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- FAM_FACTS_QUICK -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="FAM_FACTS_QUICK">
+ <?php echo WT_I18N::translate('Quick family facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="FAM_FACTS_QUICK"
+ maxlength="255"
+ name="FAM_FACTS_QUICK"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('FAM_FACTS_QUICK')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('FAM_FACTS_QUICK'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Quick family facts” configuration setting */ WT_I18N::translate('This is the short list of GEDCOM family facts that appears next to the full list and can be added with a single click.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Facts for source records'); ?></h3>
+
+ <!-- SOUR_FACTS_ADD -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="SOUR_FACTS_ADD">
+ <?php echo WT_I18N::translate('All source facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="SOUR_FACTS_ADD"
+ maxlength="255"
+ name="SOUR_FACTS_ADD"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('SOUR_FACTS_ADD')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('SOUR_FACTS_ADD'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “All source facts” configuration setting */ WT_I18N::translate('This is the list of GEDCOM facts that your users can add to sources. You can modify this list by removing or adding fact names, even custom ones, as necessary. Fact names that appear in this list must not also appear in the “Unique source facts” list.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- SOUR_FACTS_UNIQUE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="SOUR_FACTS_UNIQUE">
+ <?php echo WT_I18N::translate('Unique source facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="SOUR_FACTS_UNIQUE"
+ maxlength="255"
+ name="SOUR_FACTS_UNIQUE"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('SOUR_FACTS_UNIQUE')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('SOUR_FACTS_UNIQUE'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Unique source facts” configuration setting */ WT_I18N::translate('This is the list of GEDCOM facts that your users can only add once to sources. For example, if TITL is in this list, users will not be able to add more than one TITL record to a source. Fact names that appear in this list must not also appear in the “All source facts” list.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- SOUR_FACTS_QUICK -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="SOUR_FACTS_QUICK">
+ <?php echo WT_I18N::translate('Quick source facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="SOUR_FACTS_QUICK"
+ maxlength="255"
+ name="SOUR_FACTS_QUICK"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('SOUR_FACTS_QUICK')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('SOUR_FACTS_QUICK'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Quick source facts” configuration setting */ WT_I18N::translate('This is the short list of GEDCOM source facts that appears next to the full list and can be added with a single click.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Facts for repository records'); ?></h3>
+
+ <!-- REPO_FACTS_ADD -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="REPO_FACTS_ADD">
+ <?php echo WT_I18N::translate('All repository facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="REPO_FACTS_ADD"
+ maxlength="255"
+ name="REPO_FACTS_ADD"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('REPO_FACTS_ADD')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('REPO_FACTS_ADD'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “All repository facts” configuration setting */ WT_I18N::translate('This is the list of GEDCOM facts that your users can add to repositories. You can modify this list by removing or adding fact names, even custom ones, as necessary. Fact names that appear in this list must not also appear in the “Unique repository facts” list.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- REPO_FACTS_UNIQUE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="REPO_FACTS_UNIQUE">
+ <?php echo WT_I18N::translate('Unique repository facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="REPO_FACTS_UNIQUE"
+ maxlength="255"
+ name="REPO_FACTS_UNIQUE"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('REPO_FACTS_UNIQUE')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('REPO_FACTS_UNIQUE'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Unique repository facts” configuration setting */ WT_I18N::translate('This is the list of GEDCOM facts that your users can only add once to repositories. For example, if NAME is in this list, users will not be able to add more than one NAME record to a repository. Fact names that appear in this list must not also appear in the “All repository facts” list.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- REPO_FACTS_QUICK -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="REPO_FACTS_QUICK">
+ <?php echo WT_I18N::translate('Quick repository facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="REPO_FACTS_QUICK"
+ maxlength="255"
+ name="REPO_FACTS_QUICK"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('REPO_FACTS_QUICK')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('REPO_FACTS_QUICK'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Quick repository facts” configuration setting */ WT_I18N::translate('This is the short list of GEDCOM repository facts that appears next to the full list and can be added with a single click.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Advanced fact settings'); ?></h3>
+
+ <!-- ADVANCED_NAME_FACTS -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="ADVANCED_NAME_FACTS">
+ <?php echo WT_I18N::translate('Advanced name facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="ADVANCED_NAME_FACTS"
+ maxlength="255"
+ name="ADVANCED_NAME_FACTS"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('ADVANCED_NAME_FACTS')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('ADVANCED_NAME_FACTS'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Advanced name facts” configuration setting */ WT_I18N::translate('This is a comma separated list of GEDCOM fact tags that will be shown on the add/edit name form. If you use non-Latin alphabets such as Hebrew, Greek, Cyrillic, or Arabic, you may want to add tags such as _HEB, ROMN, FONE, etc. to allow you to store names in several different alphabets.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- ADVANCED_PLAC_FACTS -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="ADVANCED_PLAC_FACTS">
+ <?php echo WT_I18N::translate('Advanced place name facts'); ?>
+ </label>
+ <div class="col-sm-9">
+ <div class="input-group">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="ADVANCED_PLAC_FACTS"
+ maxlength="255"
+ name="ADVANCED_PLAC_FACTS"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('ADVANCED_PLAC_FACTS')); ?>"
+ >
+ <div class="input-group-btn">
+ <a class="btn btn-default" onclick="return findFact(document.getElementById('ADVANCED_PLAC_FACTS'), '<?php echo WT_GEDCOM ?>');">
+ <i class="fa fa-pencil"></i>
+ <?php echo WT_I18N::translate('edit'); ?>
+ </a>
+ </div>
+ </div>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Advanced place name facts” configuration setting */ WT_I18N::translate('This is a comma separated list of GEDCOM fact tags that will be shown when you add or edit place names. If you use non-Latin alphabets such as Hebrew, Greek, Cyrillic, or Arabic, you may want to add tags such as _HEB, ROMN, FONE, etc. to allow you to store place names in several different alphabets.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <h3><?php echo WT_I18N::translate('Other settings'); ?></h3>
+
+ <!-- SURNAME_TRADITION -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo WT_I18N::translate('Surname tradition'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('SURNAME_TRADITION', $surname_traditions, $WT_TREE->getPreference('SURNAME_TRADITION'), 'class="radio" style="padding-left:20px;font-weight:normal;"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Surname tradition” configuration setting */ WT_I18N::translate('When you add a new family member, a default surname can be provided. This surname will depend on the local tradition.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- FULL_SOURCES -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Use full source citations'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('FULL_SOURCES', $no_yes, $WT_TREE->getPreference('FULL_SOURCES'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Use full source citations” configuration setting */ WT_I18N::translate('Source citations can include fields to record the quality of the data (primary, secondary, etc.) and the date the event was recorded in the source. If you don’t use these fields, you can disable them when creating new source citations.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- PREFER_LEVEL2_SOURCES -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Source type'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('PREFER_LEVEL2_SOURCES', $source_types, $WT_TREE->getPreference('PREFER_LEVEL2_SOURCES'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Source type” configuration setting */ WT_I18N::translate('When adding new close relatives, you can add source citations to the records (e.g. INDI, FAM) or the facts (BIRT, MARR, DEAT). This option controls which checkboxes are ticked by default.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <!-- GEONAMES_ACCOUNT -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="GEONAMES_ACCOUNT">
+ <?php echo WT_I18N::translate('Use the GeoNames database for autocomplete on places'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input
+ class="form-control"
+ dir="ltr"
+ id="GEONAMES_ACCOUNT"
+ maxlength="255"
+ name="GEONAMES_ACCOUNT"
+ type="text"
+ value="<?php echo WT_Filter::escapeHtml($WT_TREE->getPreference('GEONAMES_ACCOUNT')); ?>"
+ >
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Use GeoNames database for autocomplete on places” configuration setting */ WT_I18N::translate('The website www.geonames.org provides a large database of place names. This can be searched when entering new places. To use this feature, you must register for a free account at www.geonames.org and provide the username.'); ?>
+ </p>
+ </div>
+ </div>
+
+ <!-- NO_UPDATE_CHAN -->
+ <fieldset class="form-group">
+ <legend class="control-label col-sm-3">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Do not update the “last change” record'); ?>
+ </legend>
+ <div class="col-sm-9">
+ <?php echo radio_buttons('NO_UPDATE_CHAN', $no_yes, $WT_TREE->getPreference('NO_UPDATE_CHAN'), 'class="radio-inline"'); ?>
+ <p class="small text-muted">
+ <?php echo /* I18N: Help text for the “Do not update the ‘last change’ record” configuration setting */ WT_I18N::translate('Administrators sometimes need to clean up and correct the data submitted by users. For example, they might need to correct the PLAC location to include the country. When administrators make such corrections, information about the original change is normally replaced. This may not be desirable.<br><br>When this option is selected, webtrees will retain the original change information instead of replacing it with that of the current session. With this option selected, administrators also have the ability to modify or delete the information associated with the original CHAN tag.'); ?>
+ </p>
+ </div>
+ </fieldset>
+
+ <?php endif; ?>
+
+ <div class="form-group">
+ <div class="col-sm-offset-3 col-sm-9">
+ <button type="submit" class="btn btn-primary"><?php echo WT_I18N::translate('save'); ?></button>
+ </div>
+ </div>
</form>
diff --git a/admin_trees_manage.php b/admin_trees_manage.php
index 21d88c9ce2..b74759191e 100644
--- a/admin_trees_manage.php
+++ b/admin_trees_manage.php
@@ -2,7 +2,7 @@
// UI for online updating of the GEDCOM configuration.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -23,12 +23,21 @@ use WT\User;
define('WT_SCRIPT_NAME', 'admin_trees_manage.php');
require './includes/session.php';
-require WT_ROOT.'includes/functions/functions_edit.php';
$controller = new WT_Controller_Page();
-$controller
- ->restrictAccess(Auth::isAdmin())
- ->setPageTitle(WT_I18N::translate('Family trees'));
+$controller->restrictAccess(Auth::isAdmin());
+
+switch (WT_Filter::get('action')) {
+case 'uploadform':
+ $controller->setPageTitle(WT_I18N::translate('Upload family tree'));
+ break;
+case 'importform':
+ $controller->setPageTitle(WT_I18N::translate('Import family tree'));
+ break;
+default:
+ $controller->setPageTitle(WT_I18N::translate('Manage family trees'));
+ break;
+}
// Don’t allow the user to cancel the request. We do not want to be left
// with an incomplete transaction.
@@ -85,20 +94,20 @@ case 'delete':
if (WT_Filter::checkCsrf() && $gedcom_id) {
WT_Tree::get($gedcom_id)->delete();
}
- header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
- break;
+ header('Location: '.WT_SERVER_NAME.WT_SCRIPT_PATH.WT_SCRIPT_NAME);
+ exit;
case 'setdefault':
if (WT_Filter::checkCsrf()) {
- WT_Site::setPreference('DEFAULT_GEDCOM', WT_Filter::post('default_ged'));
+ WT_Site::setPreference('DEFAULT_GEDCOM', WT_Filter::post('ged'));
}
header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
exit;
case 'new_tree':
- $ged_name=basename(WT_Filter::post('ged_name'));
- if (WT_Filter::checkCsrf() && $ged_name) {
- WT_Tree::create($ged_name);
+ $tree_name = basename(WT_Filter::post('tree_name'));
+ if (WT_Filter::checkCsrf() && $tree_name) {
+ WT_Tree::create($tree_name);
}
- header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?ged=' . $tree_name);
exit;
case 'replace_upload':
$gedcom_id = WT_Filter::postInteger('gedcom_id');
@@ -110,21 +119,52 @@ case 'replace_upload':
}
}
}
- header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?keep_media' . $gedcom_id . '=' . WT_Filter::postBool('keep_media' . $gedcom_id));
- exit;
+
+ header('Location: '.WT_SERVER_NAME.WT_SCRIPT_PATH.WT_SCRIPT_NAME.'?keep_media'.$gedcom_id.'='.WT_Filter::postBool('keep_media'.$gedcom_id));
+
+ return;
case 'replace_import':
$gedcom_id = WT_Filter::postInteger('gedcom_id');
// Make sure the gedcom still exists
if (WT_Filter::checkCsrf() && WT_Tree::get($gedcom_id)) {
- $ged_name = basename(WT_Filter::post('ged_name'));
- import_gedcom_file($gedcom_id, WT_DATA_DIR.$ged_name, $ged_name);
+ $tree_name = basename(WT_Filter::post('tree_name'));
+ import_gedcom_file($gedcom_id, WT_DATA_DIR.$tree_name, $tree_name);
}
- header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?keep_media' . $gedcom_id . '=' . WT_Filter::postBool('keep_media' . $gedcom_id));
- exit;
+
+ header('Location: '.WT_SERVER_NAME.WT_SCRIPT_PATH.WT_SCRIPT_NAME.'?keep_media'.$gedcom_id.'='.WT_Filter::postBool('keep_media'.$gedcom_id));
+
+ return;
}
+$default_tree_title = WT_I18N::translate('My family tree');
+$default_tree_name = 'tree';
+$default_tree_number = 1 ;
+$existing_trees = WT_Tree::getNameList();
+while (array_key_exists($default_tree_name . $default_tree_number, $existing_trees)) {
+ $default_tree_number++;
+}
+$default_tree_name .= $default_tree_number;
+
$controller->pageHeader();
+?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo WT_I18N::translate('Manage family trees'); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
+
+<?php if (!WT_Tree::getAll()): ?>
+ <p class="alert alert-info alert-dismissable" role="alert">
+ <button type="button" class="close" data-dismiss="alert">
+ <span aria-hidden="true">&times;</span><span class="sr-only">
+ <?php echo WT_I18N::translate('Close'); ?>
+ </span>
+ </button>
+ <?php echo WT_I18N::translate('Before you can continue, you must create a family tree.'); ?>
+ </p>
+<?php endif;
+
// Process GET actions
switch (WT_Filter::get('action')) {
case 'uploadform':
@@ -134,7 +174,7 @@ case 'importform':
if (!$tree) {
break;
}
- echo '<p>', WT_I18N::translate('This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM.', $tree->tree_name_html), '</p>';
+ echo '<p>', WT_I18N::translate('This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file.', $tree->tree_name_html), '</p>';
// the javascript in the next line strips any path associated with the file before comparing it to the current GEDCOM name (both Chrome and IE8 include c:\fakepath\ in the filename).
$previous_gedcom_filename = $tree->getPreference('gedcom_filename');
echo '<form name="replaceform" method="post" enctype="multipart/form-data" action="', WT_SCRIPT_NAME, '" onsubmit="var newfile = document.replaceform.ged_name.value; newfile = newfile.substr(newfile.lastIndexOf(\'\\\\\')+1); if (newfile!=\'', WT_Filter::escapeHtml($previous_gedcom_filename), '\' && \'\' != \'', WT_Filter::escapeHtml($previous_gedcom_filename), '\') return confirm(\'', WT_Filter::escapeHtml(WT_I18N::translate('You have selected a GEDCOM file with a different name. Is this correct?')), '\'); else return true;">';
@@ -142,7 +182,7 @@ case 'importform':
echo WT_Filter::getCsrf();
if (WT_Filter::get('action')=='uploadform') {
echo '<input type="hidden" name="action" value="replace_upload">';
- echo '<input type="file" name="ged_name">';
+ echo '<input type="file" name="tree_name">';
} else {
echo '<input type="hidden" name="action" value="replace_import">';
$d=opendir(WT_DATA_DIR);
@@ -159,7 +199,7 @@ case 'importform':
}
if ($files) {
sort($files);
- echo WT_DATA_DIR, '<select name="ged_name">';
+ echo WT_DATA_DIR, '<select name="tree_name">';
foreach ($files as $file) {
echo '<option value="', WT_Filter::escapeHtml($file), '"';
if ($file==$previous_gedcom_filename) {
@@ -182,16 +222,22 @@ case 'importform':
}
// List the gedcoms available to this user
-foreach (WT_Tree::GetAll() as $tree) {
- if (Auth::isManager($tree)) {
-
- echo
- '<table class="gedcom_table">',
- '<tr><th>', WT_I18N::translate('Family tree'),
- '</th><th><a class="accepted" href="index.php?ctype=gedcom&amp;ged=', $tree->tree_name_url, '" dir="auto">',
- $tree->tree_title_html, '</a>',
- '</th></tr><tr><th class="accepted">', $tree->tree_name_html,
- '</th><td>';
+?>
+<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
+ <?php foreach (WT_Tree::GetAll() as $tree): ?>
+ <?php if (Auth::isManager($tree)): ?>
+ <div class="panel panel-default">
+ <div class="panel-heading" role="tab" id="panel-tree-<?php echo $tree->tree_id; ?>">
+ <h3 class="panel-title">
+ <i class="fa fa-fw fa-tree"></i>
+ <a data-toggle="collapse" data-parent="#accordion" href="#tree-<?php echo $tree->tree_id; ?>" aria-expanded="true" aria-controls="tree-<?php echo $tree->tree_id; ?>">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?> — <?php echo WT_Filter::escapeHtml($tree->tree_title); ?>
+ </a>
+ </h3>
+ </div>
+ <div id="tree-<?php echo $tree->tree_id; ?>" class="panel-collapse collapse<?php echo $tree->tree_id === WT_GED_ID ? ' in' : ''; ?>" aria-labelled-by="panel-tree-<?php echo $tree->tree_id; ?>">
+ <div class="panel-body">
+ <?php
// The third row shows an optional progress bar and a list of maintenance options
$importing = WT_DB::prepare(
@@ -201,96 +247,385 @@ foreach (WT_Tree::GetAll() as $tree) {
$in_progress = WT_DB::prepare(
"SELECT 1 FROM `##gedcom_chunk` WHERE gedcom_id = ? AND imported = '1' LIMIT 1"
)->execute(array($tree->tree_id))->fetchOne();
- if (!$in_progress) {
- echo '<div id="import', $tree->tree_id, '"><div id="progressbar', $tree->tree_id, '"><div style="position:absolute;">', WT_I18N::translate('Deleting old genealogy data…'), '</div></div></div>';
- $controller->addInlineJavascript(
- 'jQuery("#progressbar'.$tree->tree_id.'").progressbar({value: 0});'
- );
- } else {
- echo '<div id="import', $tree->tree_id, '"></div>';
- }
+ ?>
+ <div id="import<?php echo $tree->tree_id; ?>" class="col-xs-12">
+ <div class="progress">
+ <?php echo $in_progress? WT_I18N::translate('Calculating…'): WT_I18N::translate('Deleting old genealogy data…'); ?>
+ </div>
+ </div>
+ <?php
$controller->addInlineJavascript(
'jQuery("#import'.$tree->tree_id.'").load("import.php?gedcom_id='.$tree->tree_id.'&keep_media'.$tree->tree_id.'='.WT_Filter::get('keep_media'.$tree->tree_id).'");'
);
- echo '<table border="0" width="100%" id="actions', $tree->tree_id, '" style="display:none">';
- } else {
- echo '<table border="0" width="100%" id="actions', $tree->tree_id, '">';
}
- echo
- '<tr align="center">',
- // export
- '<td><a href="admin_trees_export.php?ged=', $tree->tree_name_url, '" onclick="return modalDialog(\'admin_trees_export.php?ged=', $tree->tree_name_url, '\', \'', WT_I18N::translate('Export'), '\');">', WT_I18N::translate('Export'), '</a>',
- help_link('export_gedcom'),
- '</td>',
- // import
- '<td><a href="', WT_SCRIPT_NAME, '?action=importform&amp;gedcom_id=', $tree->tree_id, '">', WT_I18N::translate('Import'), '</a>',
- help_link('import_gedcom'),
- '</td>',
- // download
- '<td><a href="admin_trees_download.php?ged=', $tree->tree_name_url,'">', WT_I18N::translate('Download'), '</a>',
- help_link('download_gedcom'),
- '</td>',
- // upload
- '<td><a href="', WT_SCRIPT_NAME, '?action=uploadform&amp;gedcom_id=', $tree->tree_id, '">', WT_I18N::translate('Upload'), '</a>',
- help_link('upload_gedcom'),
- '</td>',
- // delete
- '<td>',
- '<a href="#" onclick="if (confirm(\''.WT_Filter::escapeJs(WT_I18N::translate('Are you sure you want to delete “%s”?', $tree->tree_name)),'\')) document.delete_form', $tree->tree_id, '.submit(); return false;">', WT_I18N::translate('Delete'), '</a>',
- '<form name="delete_form', $tree->tree_id ,'" method="post" action="', WT_SCRIPT_NAME ,'">',
- '<input type="hidden" name="action" value="delete">',
- '<input type="hidden" name="gedcom_id" value="', $tree->tree_id, '">',
- WT_Filter::getCsrf(),
- '</form>',
- '</td></tr></table></td></tr></table><br>';
- }
-}
-?>
-
-<?php if (Auth::isAdmin()): ?>
- <table class="gedcom_table2">
- <tr>
- <?php if (count(WT_Tree::GetAll())>1): ?>
- <th>
- <?php echo WT_I18N::translate('Default family tree'), help_link('default_gedcom'); ?>
- </th>
- <?php endif; ?>
- <th>
- <?php echo WT_I18N::translate('Create a new family tree'), help_link('add_new_gedcom'); ?>
- </th>
- </tr>
- <tr>
- <?php if (count(WT_Tree::GetAll())>1): ?>
- <td>
- <form method="post">
- <input type="hidden" name="action" value="setdefault">
- <?php echo WT_Filter::getCsrf(); ?>
- <?php echo select_edit_control('default_ged', WT_Tree::getNameList(), '', WT_Site::getPreference('DEFAULT_GEDCOM'), 'onchange="document.defaultform.submit();"'); ?>
- <input type="submit" value="<?php echo WT_I18N::translate('save'); ?>">
- </form>
- </td>
- <?php endif; ?>
- <td class="button">
- <form method="post">
+ ?>
+ <div class="row<?php echo $importing ? ' hidden' : ''; ?>" id="actions<?php echo $tree->tree_id; ?>">
+ <div class="col-sm-6 col-md-3">
+ <h4>
+ <?php echo WT_I18N::translate('Family tree'); ?>
+ </h4>
+ <ul class="fa-ul">
+ <!-- HOME PAGE -->
+ <li>
+ <i class="fa fa-li fa-home"></i>
+ <a href="index.php?ctype=gedcom&ged=<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>">
+ <?php echo WT_I18N::translate('Home page'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- PREFERENCES -->
+ <li>
+ <i class="fa fa-li fa-cogs"></i>
+ <a href="admin_trees_config.php?action=general&amp;ged=<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>">
+ <?php echo WT_I18N::translate('Preferences'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- PRIVACY -->
+ <li>
+ <i class="fa fa-li fa-lock"></i>
+ <a href="admin_trees_config.php?action=privacy&amp;ged=<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>">
+ <?php echo WT_I18N::translate('Privacy'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- SET AS DEFAULT -->
+ <?php if (count(WT_Tree::getAll()) > 1): ?>
+ <li>
+ <i class="fa fa-li fa-star"></i>
+ <?php if ($tree->tree_name == WT_Site::getPreference('DEFAULT_GEDCOM')): ?>
+ <?php echo WT_I18N::translate('Default family tree'); ?>
+ <?php else: ?>
+ <a href="#" onclick="document.defaultform<?php echo $tree->tree_id; ?>.submit();">
+ <?php echo WT_I18N::translate('Set as default'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ <form name="defaultform<?php echo $tree->tree_id; ?>" method="POST" action="admin_trees_manage.php">
+ <input type="hidden" name="action" value="setdefault">
+ <input type="hidden" name="ged" value="<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>">
+ <?php echo WT_Filter::getCsrf(); ?>
+ <!-- A11Y - forms need submit buttons, but they look ugly here -->
+ <button class="sr-only" type="submit">
+ <?php echo WT_I18N::translate('Set as default'); ?>
+ </button>
+ </form>
+ <?php endif; ?>
+ </li>
+ <?php endif; ?>
+ <!-- DELETE -->
+ <li>
+ <i class="fa fa-li fa-trash-o"></i>
+ <a href="#" onclick="if (confirm('<?php echo WT_Filter::escapeJs(WT_I18N::translate('Are you sure you want to delete “%s”?', $tree->tree_name)); ?>')) document.delete_form<?php echo $tree->tree_id; ?>.submit(); return false;">
+ <?php echo WT_I18N::translate('Delete'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ <form name="delete_form<?php echo $tree->tree_id; ?>" method="POST" action="admin_trees_manage.php">
+ <input type="hidden" name="action" value="delete">
+ <input type="hidden" name="gedcom_id" value="<?php echo $tree->tree_id; ?>">
+ <?php echo WT_Filter::getCsrf(); ?>
+ <!-- A11Y - forms need submit buttons, but they look ugly here -->
+ <button class="sr-only" onclick="return confirm('<?php echo WT_Filter::escapeJs(WT_I18N::translate('Are you sure you want to delete “%s”?', $tree->tree_name)); ?>')" type="submit">
+ <?php echo WT_I18N::translate('Delete'); ?>
+ </button>
+ </form>
+ </li>
+ </ul>
+ </div>
+ <div class="col-sm-6 col-md-3">
+ <h4>
+ <?php echo /* I18N: Individuals, sources, dates, places, etc. */ WT_I18N::translate('Genealogy data'); ?>
+ </h4>
+ <ul class="fa-ul">
+ <!-- MERGE -->
+ <li>
+ <i class="fa fa-li fa-code-fork"></i>
+ <a href="admin_site_merge.php?ged=<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>">
+ <?php echo WT_I18N::translate('Merge records'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- UPDATE PLACE NAMES -->
+ <li>
+ <i class="fa fa-li fa-map-marker"></i>
+ <a href="admin_trees_places.php?ged=<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>">
+ <?php echo WT_I18N::translate('Update place names'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- CHECK FOR ERRORS -->
+ <li>
+ <i class="fa fa-li fa-check"></i>
+ <a href="admin_trees_check.php?ged=<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>">
+ <?php echo WT_I18N::translate('Check for errors'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- RENUMBER -->
+ <li>
+ <i class="fa fa-li fa-sort-numeric-asc"></i>
+ <a href="admin_trees_renumber.php?ged=<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>">
+ <?php echo WT_I18N::translate('Renumber'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- CHANGES -->
+ <li>
+ <i class="fa fa-li fa-th-list"></i>
+ <a href="admin_site_change.php?gedc=<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>">
+ <?php echo WT_I18N::translate('Changes log'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ </ul>
+ </div>
+ <div class="clearfix visible-sm-block"></div>
+ <div class="col-sm-6 col-md-3">
+ <h4>
+ <?php echo WT_I18N::translate('Add unlinked records'); ?>
+ </h4>
+ <ul class="fa-ul">
+ <!-- UNLINKED INDIVIDUAL -->
+ <li>
+ <i class="fa fa-li fa-user"></i>
+ <a href="#" onclick="add_unlinked_indi(); return false;">
+ <?php echo WT_I18N::translate('Individual'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- UNLINKED SOURCE -->
+ <li>
+ <i class="fa fa-li fa-book"></i>
+ <a href="#" onclick="addnewsource(''); return false;">
+ <?php echo WT_I18N::translate('Source'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- UNLINKED REPOSITORY -->
+ <li>
+ <i class="fa fa-li fa-university"></i>
+ <a href="#" onclick="addnewrepository(''); return false;">
+ <?php echo WT_I18N::translate('Repository'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- UNLINKED MEDIA OBJECT -->
+ <li>
+ <i class="fa fa-li fa-photo"></i>
+ <a href="#" onclick="window.open('addmedia.php?action=showmediaform', '_blank', edit_window_specs); return false;">
+ <?php echo WT_I18N::translate('Media object'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- UNLINKED NOTE -->
+ <li>
+ <i class="fa fa-li fa-paragraph"></i>
+ <a href="#" onclick="addnewnote(''); return false;">
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ <?php echo WT_I18N::translate('Shared note'); ?>
+ </a>
+ </li>
+ </ul>
+ </div>
+ <div class="col-sm-6 col-md-3">
+ <h4>
+ <?php echo WT_I18N::translate('GEDCOM file'); ?>
+ </h4>
+ <ul class="fa-ul">
+ <!-- DOWNLOAD -->
+ <li>
+ <i class="fa fa-li fa-download"></i>
+ <a href="admin_trees_download.php?ged=<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>">
+ <?php echo WT_I18N::translate('Download'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- UPLOAD -->
+ <li>
+ <i class="fa fa-li fa-upload"></i>
+ <a href="admin_trees_manage.php?action=uploadform&amp;gedcom_id=<?php echo $tree->tree_id; ?>">
+ <?php echo WT_I18N::translate('Upload'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- EXPORT -->
+ <li>
+ <i class="fa fa-li fa-file-text"></i>
+ <a href="#" onclick="return modalDialog('admin_trees_export.php?ged=<?php echo WT_Filter::escapeHtml($tree->tree_name); ?>', '<?php echo WT_I18N::translate('Export'); ?>');">
+ <?php echo WT_I18N::translate('Export'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ <!-- IMPORT -->
+ <li>
+ <i class="fa fa-li fa-file-text-o"></i>
+ <a href="admin_trees_manage.php?action=importform&amp;gedcom_id=<?php echo $tree->tree_id; ?>">
+ <?php echo WT_I18N::translate('Import'); ?>
+ <span class="sr-only">
+ <?php echo WT_Filter::escapeHtml($tree->tree_name); ?>
+ </span>
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <?php endif; ?>
+ <?php endforeach; ?>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h3 class="panel-title">
+ <i class="fa fa-fw fa-plus"></i>
+ <a data-toggle="collapse" data-parent="#accordion" href="#create-a-new-family-tree">
+ <?php echo WT_I18N::translate('Create a new family tree'); ?>
+ </a>
+ </h3>
+ </div>
+ <?php if (Auth::isAdmin()): ?>
+ <div id="create-a-new-family-tree" class="panel-collapse collapse<?php echo WT_Tree::getAll() ? '' : ' in'; ?>">
+ <div class="panel-body">
+ <form role="form" class="form-horizontal" method="POST" action="admin_trees_manage.php">
<?php echo WT_Filter::getCsrf(); ?>
<input type="hidden" name="action" value="new_tree">
- <input name="ged_name">
- <input type="submit" value="<?php echo WT_I18N::translate('save'); ?>">
+ <div class="form-group">
+ <label for="ged_title" class="col-sm-2 control-label">
+ <?php echo WT_I18N::translate('Family tree title'); ?>
+ </label>
+ <div class="col-sm-10">
+ <input
+ class="form-control"
+ id="ged_title"
+ maxlength="255"
+ name="tree_title"
+ required
+ type="text"
+ value="<?php echo $default_tree_title; ?>"
+ >
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="tree_name" class="col-sm-2 control-label">
+ <?php echo WT_I18N::translate('URL'); ?>
+ </label>
+ <div class="col-sm-10">
+ <div class="input-group">
+ <span class="input-group-addon">
+ <?php echo WT_SERVER_NAME, WT_SCRIPT_PATH; ?>?ged=
+ </span>
+ <input
+ class="form-control"
+ id="tree_name"
+ maxlength="31"
+ name="tree_name"
+ pattern="[^&lt;&gt;&amp;&quot;#^$.*?{}()\[\]/\\]*"
+ required
+ type="text"
+ value="<?php echo $default_tree_name; ?>"
+ >
+ </div>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('Avoid spaces and puncutation. A surname might be a good choice.'); ?>
+ </p>
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="col-sm-offset-2 col-sm-10">
+ <button type="submit" class="btn btn-primary">
+ <?php echo /* I18N: Button label */ WT_I18N::translate('create'); ?>
+ </button>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('After creating the family tree, you will be able to upload or import data from a GEDCOM file.'); ?>
+ </p>
+ </div>
+ </div>
</form>
- </td>
- </tr>
- </table>
-<?php endif; ?>
-<br>
-<?php
-// display link to PGV-WT transfer wizard on first visit to this page, before any GEDCOM is loaded
-if (count(WT_Tree::GetAll())==0 && count(User::all())==1) {
- echo
- '<div class="center">',
- '<a style="color:green; font-weight:bold;" href="admin_pgv_to_wt.php">',
- WT_I18N::translate('Click here for PhpGedView to webtrees transfer wizard'),
- '</a>',
- help_link('PGV_WIZARD'),
- '</div>';
-}
-
+ </div>
+ </div>
+ <?php endif; ?>
+ </div>
+ <!-- display link to PGV-WT transfer wizard on first visit to this page, before any GEDCOM is loaded -->
+ <?php if (count(WT_Tree::GetAll()) === 0 && count(User::all()) === 1): ?>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h3 class="panel-title">
+ <i class="fa fa-fw fa-magic"></i>
+ <a data-toggle="collapse" data-parent="#accordion" href="#pgv-import-wizard">
+ <?php echo WT_I18N::translate('PhpGedView to webtrees transfer wizard'); ?>
+ </a>
+ </h3>
+ </div>
+ <div id="pgv-import-wizard" class="panel-collapse collapse">
+ <div class="panel-body">
+ <p>
+ <?php echo WT_I18N::translate('The PGV to webtrees wizard is an automated process to assist administrators make the move from a PGV installation to a new webtrees one. It will transfer all PGV GEDCOM and other database information directly to your new webtrees database. The following requirements are necessary:'); ?>
+ </p>
+ <ul>
+ <li>
+ <?php echo WT_I18N::translate('webtrees’ database must be on the same server as PGV’s'); ?>
+ </li>
+ <li>
+ <?php echo WT_I18N::translate('PGV must be version 4.2.3, or any SVN up to #6973'); ?>
+ </li>
+ <li>
+ <?php echo WT_I18N::translate('All changes in PGV must be accepted'); ?>
+ </li>
+ <li>
+ <?php echo WT_I18N::translate('You must export your latest GEDCOM data'); ?>
+ </li>
+ <li>
+ <?php echo WT_I18N::translate('The current webtrees admin username must be the same as an existing PGV admin username'); ?>
+ </li>
+ <li>
+ <?php echo WT_I18N::translate('All existing PGV users must have distinct email addresses'); ?>
+ </li>
+ </ul>
+ <p>
+ <?php echo WT_I18N::translate('<b>Important note:</b> The transfer wizard is not able to assist with moving media items. You will need to set up and move or copy your media configuration and objects separately after the transfer wizard is finished.'); ?>
+ </p>
+ <p>
+ <a href="admin_pgv_to_wt.php">
+ <?php echo WT_I18N::translate('Click here for PhpGedView to webtrees transfer wizard'); ?>
+ </a>
+ </p>
+ </div>
+ </div>
+ </div>
+ <?php endif; ?>
+</div>
diff --git a/admin_trees_merge.php b/admin_trees_merge.php
index 62f9dadfce..89a545c98f 100644
--- a/admin_trees_merge.php
+++ b/admin_trees_merge.php
@@ -2,7 +2,7 @@
// Merge two trees, by copying the records from one into another.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 Greg Roach
+// Copyright (C) 2015 Greg Roach
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -30,7 +30,14 @@ $controller
->setPageTitle(WT_I18N::translate('Merge family trees'))
->pageHeader();
-echo '<h2>', $controller->getPageTitle(), '</h2>';
+?>
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li><a href="admin_trees_manage.php"><?php echo WT_I18N::translate('Manage family trees'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
+<?php
$tree1_id = WT_Filter::post('tree1_id');
$tree2_id = WT_Filter::post('tree2_id');
@@ -62,8 +69,8 @@ if ($tree1_id && $tree2_id != $tree1_id) {
" SELECT o_id AS xref FROM `##other` WHERE o_file = ? AND o_type NOT IN ('HEAD', 'TRLR')" .
") AS other_trees USING (xref)"
)->execute(array(
- $tree1_id, $tree1_id, $tree1_id, $tree1_id, $tree1_id,
- $tree2_id, $tree2_id, $tree2_id, $tree2_id, $tree2_id, $tree2_id
+ $tree1_id, $tree1_id, $tree1_id, $tree1_id, $tree1_id,
+ $tree2_id, $tree2_id, $tree2_id, $tree2_id, $tree2_id, $tree2_id
))->fetchAssoc();
if ($xrefs) {
@@ -74,7 +81,7 @@ if ($tree1_id && $tree2_id != $tree1_id) {
'<p>',
WT_I18N::plural(
/* I18N: An XREF is the identification number used in GEDCOM files. */
- 'The two family trees have %1$s record which use the same “XREF”.',
+ 'The two family trees have %1$s record which uses the same “XREF”.',
'The two family trees have %1$s records which use the same “XREF”.',
count($xrefs), count($xrefs)
),
diff --git a/admin_trees_renumber.php b/admin_trees_renumber.php
index ed3419e161..420cc2a64e 100644
--- a/admin_trees_renumber.php
+++ b/admin_trees_renumber.php
@@ -2,7 +2,7 @@
// Renumber the XREFs in a tree, so they are unique across the site.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 Greg Roach
+// Copyright (C) 2015 Greg Roach
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -55,9 +55,9 @@ $xrefs = WT_DB::prepare(
" SELECT o_id AS xref FROM `##other` WHERE o_file <> ? AND o_type NOT IN ('HEAD', 'TRLR')" .
") AS other_trees USING (xref)"
)->execute(array(
- WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID,
- WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID
- ))->fetchAssoc();
+ WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID,
+ WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID
+))->fetchAssoc();
echo '<h2>', $controller->getPageTitle(), ' — ', $WT_TREE->tree_title_html, '</h2>';
if (WT_Filter::get('go')) {
diff --git a/admin_users.php b/admin_users.php
index 2319979cfd..6c0fbefbe1 100644
--- a/admin_users.php
+++ b/admin_users.php
@@ -2,7 +2,7 @@
// Administrative User Interface.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team.
@@ -23,15 +23,14 @@
use WT\Auth;
use WT\Log;
+use WT\Theme;
use WT\User;
define('WT_SCRIPT_NAME', 'admin_users.php');
require './includes/session.php';
$controller = new WT_Controller_Page();
-$controller
- ->restrictAccess(Auth::isAdmin())
- ->setPageTitle(WT_I18N::translate('User administration'));
+$controller->restrictAccess(Auth::isAdmin());
require_once WT_ROOT.'includes/functions/functions_edit.php';
@@ -45,29 +44,85 @@ $ALL_EDIT_OPTIONS=array(
);
// Form actions
-$action = WT_Filter::get('action', null, 'listusers');
-$usrlang = WT_Filter::post('usrlang', implode('|', array_keys(WT_I18N::installed_languages())), WT_LOCALE);
-$username = WT_Filter::post('username', WT_REGEX_USERNAME);
-$filter = WT_Filter::post('filter');
-$ged = WT_Filter::post('ged');
+switch (WT_Filter::post('action')) {
+case 'save':
+ if (WT_Filter::checkCsrf()) {
+ $user_id = WT_Filter::postInteger('user_id');
+ $user = User::find($user_id);
+ $username = WT_Filter::post('username', WT_REGEX_USERNAME);
+ $real_name = WT_Filter::post('real_name');
+ $email = WT_Filter::postEmail('email');
+ $pass1 = WT_Filter::post('pass1', WT_REGEX_PASSWORD);
+ $pass2 = WT_Filter::post('pass2', WT_REGEX_PASSWORD);
+ $theme = WT_Filter::post('theme', implode('|', array_keys(Theme::installedThemes())));
+ $language = WT_Filter::post('language', implode('|', array_keys(WT_I18N::installed_languages())), WT_LOCALE);
+ $contact_method = WT_Filter::post('contact_method');
+ $comment = WT_Filter::post('comment');
+ $auto_accept = WT_Filter::postBool('auto_accept');
+ $admin = WT_Filter::postBool('admin');
+ $visible_online = WT_Filter::postBool('visible_online');
+ $edit_account = WT_Filter::postBool('edit_account');
+ $verified = WT_Filter::postBool('verified');
+ $approved = WT_Filter::postBool('approved');
-// Extract form variables
-$realname = WT_Filter::post('realname' );
-$pass1 = WT_Filter::post('pass1', WT_REGEX_PASSWORD);
-$pass2 = WT_Filter::post('pass2', WT_REGEX_PASSWORD);
-$emailaddress = WT_Filter::postEmail('emailaddress');
-$user_theme = WT_Filter::post('user_theme', implode('|', get_theme_names()));
-$user_language = WT_Filter::post('user_language', implode('|', array_keys(WT_I18N::installed_languages())), WT_LOCALE);
-$new_contact_method = WT_Filter::post('new_contact_method');
-$new_comment = WT_Filter::post('new_comment');
-$new_auto_accept = WT_Filter::postBool('new_auto_accept');
-$canadmin = WT_Filter::postBool('canadmin');
-$visibleonline = WT_Filter::postBool('visibleonline');
-$editaccount = WT_Filter::postBool('editaccount');
-$verified = WT_Filter::postBool('verified');
-$verified_by_admin = WT_Filter::postBool('verified_by_admin');
+ if ($user_id === 0) {
+ // Create a new user
+ if (User::findByIdentifier($username)) {
+ WT_FlashMessages::addMessage(WT_I18N::translate('Duplicate user name. A user with that user name already exists. Please choose another user name.'));
+ } elseif (User::findByIdentifier($email)) {
+ WT_FlashMessages::addMessage(WT_I18N::translate('Duplicate email address. A user with that email already exists.'));
+ } elseif ($pass1 !== $pass2) {
+ WT_FlashMessages::addMessage(WT_I18N::translate('Passwords do not match.'));
+ } else {
+ $user = User::create($username, $real_name, $email, $pass1);
+ $user->setPreference('reg_timestamp', date('U'))->setPreference('sessiontime', '0');
+ Log::addAuthenticationLog('User ->' . $username . '<- created');
+ }
+ } else {
+ $user = User::find($user_id);
+ if ($user) {
+ $user->setEmail($email);
+ $user->setUserName($username);
+ $user->setRealName($real_name);
+ if ($pass1 !== null && $pass1 === $pass2) {
+ $user->setPassword($pass1);
+ }
+ }
+ }
+
+ if ($user) {
+ $user
+ ->setPreference('theme', $theme)
+ ->setPreference('language', $language)
+ ->setPreference('contactmethod', $contact_method)
+ ->setPreference('comment', $comment)
+ ->setPreference('auto_accept', $auto_accept ? '1' : '0')
+ ->setPreference('admin', $admin ? '1' : '0')
+ ->setPreference('visibleonline', $visible_online ? '1' : '0')
+ ->setPreference('editaccount', $edit_account ? '1' : '0')
+ ->setPreference('verified', $verified ? '1' : '0')
+ ->setPreference('verified_by_admin', $approved ? '1' : '0');
+
+ foreach (WT_Tree::getAll() as $tree) {
+ $tree->setUserPreference($user, 'gedcomid', WT_Filter::post('gedcomid' . $tree->tree_id, WT_REGEX_XREF));
+ $tree->setUserPreference($user, 'rootid', WT_Filter::post('rootid' . $tree->tree_id, WT_REGEX_XREF));
+ $tree->setUserPreference($user, 'canedit', WT_Filter::post('canedit' . $tree->tree_id, implode('|', array_keys($ALL_EDIT_OPTIONS))));
+ if (WT_Filter::post('gedcomid' . $tree->tree_id, WT_REGEX_XREF)) {
+ $tree->setUserPreference($user, 'RELATIONSHIP_PATH_LENGTH', WT_Filter::postInteger('RELATIONSHIP_PATH_LENGTH' . $tree->tree_id, 0, 10, 0));
+ } else {
+ // Do not allow a path length to be set if the individual ID is not
+ $tree->setUserPreference($user, 'RELATIONSHIP_PATH_LENGTH', null);
+ }
+ }
+ }
+ }
+
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
+
+ return;
+}
-switch ($action) {
+switch (WT_Filter::get('action')) {
case 'loadrows':
// Generate an AJAX/JSON response for datatables to load a block of rows
$search = WT_Filter::postArray('search');
@@ -78,11 +133,7 @@ case 'loadrows':
$WHERE = " WHERE u.user_id > 0";
$ARGS = array();
if ($search) {
- $WHERE .=
- " AND (".
- " user_name LIKE CONCAT('%', ?, '%') OR " .
- " real_name LIKE CONCAT('%', ?, '%') OR " .
- " email LIKE CONCAT('%', ?, '%'))";
+ $WHERE .= " AND (" . " user_name LIKE CONCAT('%', ?, '%') OR " . " real_name LIKE CONCAT('%', ?, '%') OR " . " email LIKE CONCAT('%', ?, '%'))";
$ARGS = array($search, $search, $search);
}
Auth::user()->setPreference('admin_users_page_size', $length);
@@ -113,482 +164,539 @@ case 'loadrows':
$ORDER_BY = '1 ASC';
}
- $sql=
- "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS '', u.user_id, user_name, real_name, email, '', us1.setting_value, us2.setting_value, us2.setting_value, us3.setting_value, us3.setting_value, us4.setting_value, us5.setting_value".
- " FROM `##user` u".
- " LEFT JOIN `##user_setting` us1 ON (u.user_id=us1.user_id AND us1.setting_name='language')".
- " LEFT JOIN `##user_setting` us2 ON (u.user_id=us2.user_id AND us2.setting_name='reg_timestamp')".
- " LEFT JOIN `##user_setting` us3 ON (u.user_id=us3.user_id AND us3.setting_name='sessiontime')".
- " LEFT JOIN `##user_setting` us4 ON (u.user_id=us4.user_id AND us4.setting_name='verified')".
- " LEFT JOIN `##user_setting` us5 ON (u.user_id=us5.user_id AND us5.setting_name='verified_by_admin')".
- $WHERE.
- $ORDER_BY.
- $LIMIT;
+ $sql = "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS '', u.user_id, user_name, real_name, email, us1.setting_value, us2.setting_value, us2.setting_value, us3.setting_value, us3.setting_value, us4.setting_value, us5.setting_value" . " FROM `##user` u" . " LEFT JOIN `##user_setting` us1 ON (u.user_id=us1.user_id AND us1.setting_name='language')" . " LEFT JOIN `##user_setting` us2 ON (u.user_id=us2.user_id AND us2.setting_name='reg_timestamp')" . " LEFT JOIN `##user_setting` us3 ON (u.user_id=us3.user_id AND us3.setting_name='sessiontime')" . " LEFT JOIN `##user_setting` us4 ON (u.user_id=us4.user_id AND us4.setting_name='verified')" . " LEFT JOIN `##user_setting` us5 ON (u.user_id=us5.user_id AND us5.setting_name='approved')" . $WHERE . $ORDER_BY . $LIMIT;
// This becomes a JSON list, not array, so need to fetch with numeric keys.
- $data=WT_DB::prepare($sql)->execute($ARGS)->fetchAll(PDO::FETCH_NUM);
+ $data = WT_DB::prepare($sql)->execute($ARGS)->fetchAll(PDO::FETCH_NUM);
+
+ $installed_languages = WT_I18N::installed_languages();
// Reformat various columns for display
foreach ($data as &$datum) {
- $datum[0]='<a href="#" title="'.WT_I18N::translate('Details').'">&nbsp;</a>';
- // $aData[1] is the user ID
- $user_id =$datum[1];
- $user_name=$datum[2];
- $datum[2]=edit_field_inline('user-user_name-'.$user_id, $datum[2]);
- $datum[3]=edit_field_inline('user-real_name-'.$user_id, $datum[3]);
- $datum[4]=edit_field_inline('user-email-'. $user_id, $datum[4]);
- // $aData[5] is a link to an email icon
+ $user_id = $datum[1];
+ $user_name = $datum[2];
+
if ($user_id != Auth::id()) {
- $datum[5]='<i class="icon-email" onclick="return message(\''.$user_name.'\', \'\', \'\');"></i>';
- }
- $datum[6]=edit_field_language_inline('user_setting-'.$user_id.'-language', $datum[6]);
- // $aData[7] is the sortable registration timestamp
- $datum[8]=$datum[8] ? format_timestamp($datum[8]) : '';
- if (date("U") - $datum[7] > 604800 && !$datum[11]) {
- $datum[8]='<span class="red">'.$datum[8].'</span>';
- }
- // $aData[9] is the sortable last-login timestamp
- if ($datum[9]) {
- $datum[10]=format_timestamp($datum[9]).'<br>'.WT_I18N::timeAgo(WT_TIMESTAMP - $datum[9]);
+ $admin_options = '<li class="divider">' . '<li><a onclick="modalDialog(\'index_edit.php?user_id=' . $user_id . '\', \'' . /* I18N: %s is a user's name. */
+ WT_I18N::translate('Change the blocks on this user’s “My page”') . '\');" href="#"><i class="fa fa-fw fa-th-large"></i> ' . WT_I18N::translate('Change the blocks on this user’s “My page”') . '</a></li>' . '<li><a href="#" onclick="return masquerade(' . $user_id . ')"><i class="fa fa-fw fa-user"></i> ' . /* I18N: Pretend to be another user, by logging in as them */
+ WT_I18N::translate('Masquerade as this user') . '</a></li>' . '<li><a href="#" onclick="delete_user(\'' . WT_I18N::translate('Are you sure you want to delete “%s”?', WT_Filter::escapeJs($user_name)) . '\', \'' . WT_Filter::escapeJs($user_id) . '\');"><i class="fa fa-fw fa-trash-o"></i> ' . WT_I18N::translate('Delete') . '</a></li>';
} else {
- $datum[10]=WT_I18N::translate('Never');
+ // Do not delete ourself!
+ $admin_options = '';
}
- $datum[11]=edit_field_yes_no_inline('user_setting-'.$user_id.'-verified-', $datum[11]);
- $datum[12]=edit_field_yes_no_inline('user_setting-'.$user_id.'-verified_by_admin-', $datum[12]);
- // Add extra column for "delete" action
+
+ $datum[0] = '<div class="btn-group"><button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"><i class="fa fa-pencil"></i> <span class="caret"></span></button><ul class="dropdown-menu" role="menu"><li><a href="?action=edit&amp;user_id=' . $user_id . '"><i class="fa fa-fw fa-pencil"></i> ' . WT_I18N::translate('Edit') . '</a></li></li>' . $admin_options . '</ul></div>';
+ // $datum[1] is the user ID
+ // $datum[2] is the user name
+ // $datum[3] is the real name
+ // $datum[4] is the email address
if ($user_id != Auth::id()) {
- $datum[13]='<div class="icon-delete" onclick="delete_user(\'' . WT_I18N::translate('Are you sure you want to delete “%s”?', WT_Filter::escapeJs($user_name)) . '\', \'' . WT_Filter::escapeJs($user_id) . '\');"></div>';
+ $datum[4] = '<a href="#" onclick="return message(\'' . $datum[2] . '\', \'\', \'\');">' . $datum[4] . '</i></a>';
+ }
+ // $datum[5] is the langauge
+ if (array_key_exists($datum[5], $installed_languages)) {
+ $datum[5] = $installed_languages[$datum[5]];
+ }
+ // $datum[6] is the sortable registration timestamp
+ $datum[7] = $datum[7] ? format_timestamp($datum[7]) : '';
+ if (date("U") - $datum[6] > 604800 && !$datum[10]) {
+ $datum[7] = '<span class="red">' . $datum[7] . '</span>';
+ }
+ // $datum[8] is the sortable last-login timestamp
+ if ($datum[8]) {
+ $datum[9] = format_timestamp($datum[8]) . '<br>' . WT_I18N::timeAgo(WT_TIMESTAMP - $datum[8]);
} else {
- // Do not delete ourself!
- $datum[13]='';
+ $datum[9] = WT_I18N::translate('Never');
}
+ $datum[10] = $datum[10] ? WT_I18N::translate('yes') : WT_I18N::translate('no');
+ $datum[11] = $datum[11] ? WT_I18N::translate('yes') : WT_I18N::translate('no');
}
// Total filtered/unfiltered rows
- $recordsFiltered = (int) WT_DB::prepare("SELECT FOUND_ROWS()")->fetchOne();
- $recordsTotal = User::count();
+ $recordsFiltered = (int)WT_DB::prepare("SELECT FOUND_ROWS()")->fetchOne();
+ $recordsTotal = User::count();
Zend_Session::writeClose();
header('Content-type: application/json');
- echo json_encode(array( // See http://www.datatables.net/usage/server-side
- 'draw' => WT_Filter::getInteger('draw'), // String, but always an integer
+ // See http://www.datatables.net/usage/server-side
+ echo json_encode(array(
+ 'draw' => WT_Filter::getInteger('draw'),
'recordsTotal' => $recordsTotal,
'recordsFiltered' => $recordsFiltered,
'data' => $data
));
- exit;
-case 'load1row':
- // Generate an AJAX response for datatables to load expanded row
+
+ return;
+
+case 'edit':
$user_id = WT_Filter::getInteger('user_id');
- $user = User::find($user_id);
- Zend_Session::writeClose();
- header('Content-type: text/html; charset=UTF-8');
- echo '<h2>', WT_I18N::translate('Details'), '</h2>';
- echo '<dl>';
- echo '<dt>', WT_I18N::translate('Administrator'), '</dt>';
- echo '<dd>', edit_field_yes_no_inline('user_setting-'.$user_id.'-canadmin', $user->getPreference('canadmin')), '</dd>';
- echo '<dt>', WT_I18N::translate('Password'), '</dt>';
- echo '<dd>', edit_field_inline('user-password-'.$user_id, ''), '</dd>';
+ if ($user_id === 0) {
+ $controller->setPageTitle(WT_I18N::translate('Add a new user'));
+ $tmp = new \stdClass;
+ $tmp->user_id = '';
+ $tmp->user_name = '';
+ $tmp->real_name = '';
+ $tmp->email = '';
+ $user = new User($tmp);
+ } else {
+ $controller->setPageTitle(WT_I18N::translate('Edit user'));
+ $user = User::find($user_id);
+ }
- echo '<dt>', WT_I18N::translate('Preferred contact method'), '</dt>';
- echo '<dd>', edit_field_contact_inline('user_setting-'.$user_id.'-contactmethod', $user->getPreference('contactmethod')), '</dd>';
+ $controller
+ ->pageHeader()
+ ->addExternalJavascript(WT_STATIC_URL . 'js/autocomplete.js')
+ ->addInlineJavascript('autocomplete();')
+ ->addInlineJavascript('
+ jQuery(".relpath").change(function() {
+ var fieldIDx = jQuery(this).attr("id");
+ var idNum = fieldIDx.replace("RELATIONSHIP_PATH_LENGTH","");
+ var newIDx = "gedcomid"+idNum;
+ if (jQuery("#"+newIDx).val()=="") {
+ alert("'.WT_I18N::translate('You must specify an individual record before you can restrict the user to their immediate family.').'");
+ jQuery(this).val("");
+ }
+ });
+ function regex_quote(str) {
+ return str.replace(/[\\\\.?+*()[\](){}|]/g, "\\\\$&");
+ }
+ ');
- echo '<dt>', WT_I18N::translate('Allow this user to edit his account information'), '</dt>';
- echo '<dd>', edit_field_yes_no_inline('user_setting-'.$user_id.'-editaccount', $user->getPreference('editaccount')), '</dd>';
+ ?>
+ <ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li><a href="admin_users.php"><?php echo WT_I18N::translate('User administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+ </ol>
+ <h2><?php echo $controller->getPageTitle(); ?></h2>
- echo '<dt>', WT_I18N::translate('Automatically approve changes made by this user'), '</dt>';
- echo '<dd>', edit_field_yes_no_inline('user_setting-'.$user_id.'-auto_accept', $user->getPreference('auto_accept')), '</dd>';
+ <form class="form-horizontal" name="newform" method="post" role="form" action="?action=edit" autocomplete="off">
+ <?php echo WT_Filter::getCsrf(); ?>
+ <input type="hidden" name="action" value="save">
+ <input type="hidden" name="user_id" value="<?php echo $user->getUserId(); ?>">
- echo '<dt>', WT_I18N::translate('Theme'), '</dt>';
- echo '<dd>', select_edit_control_inline('user_setting-'.$user_id.'-theme', array_flip(get_theme_names()), WT_I18N::translate('<default theme>'), $user->getPreference('theme')), '</dd>';
+ <!-- REAL NAME -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="real_name">
+ <?php echo WT_I18N::translate('Real name'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input class="form-control" type="text" id="real_name" name="real_name" required maxlength="64" value="<?php echo WT_Filter::escapeHtml($user->getRealName()); ?>" autofocus>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('This is your real name, as you would like it displayed on screen.'); ?>
+ </p>
+ </div>
+ </div>
- echo '<dt>', WT_I18N::translate('Visible to other users when online'), '</dt>';
- echo '<dd>', edit_field_yes_no_inline('user_setting-'.$user_id.'-visibleonline', $user->getPreference('visibleonline')), '</dd>';
+ <!-- USER NAME -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="username">
+ <?php echo WT_I18N::translate('Username'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input class="form-control" type="text" id="username" name="username" required maxlength="32" value="<?php echo WT_Filter::escapeHtml($user->getUserName()); ?>" pattern="<?php echo WT_REGEX_USERNAME; ?>">
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('Usernames are case-insensitive and ignore accented letters, so that “chloe”, “chloë”, and “Chloe” are considered to be the same.'), ' ', WT_I18N::translate('Usernames may not contain the following characters: &lt; &gt; &quot; %% { } ;'); ?>
+ </p>
+ </div>
+ </div>
- echo '<dt>', WT_I18N::translate('Comments'), '</dt>';
- echo '<dd>', edit_field_inline('user_setting-'.$user_id.'-comment', $user->getPreference('comment')), '</dd>';
+ <!-- PASSWORD -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="pass1">
+ <?php echo WT_I18N::translate('Password'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input class="form-control" type="password" id="pass1" name="pass1" pattern = "<?php echo WT_REGEX_PASSWORD; ?>" placeholder="<?php echo WT_I18N::plural('Use at least %s character.', 'Use at least %s characters.', WT_MINIMUM_PASSWORD_LENGTH, WT_I18N::number(WT_MINIMUM_PASSWORD_LENGTH)); ?>" <?php echo $user->getUserId() ? '' : 'required'; ?> onchange="form.pass2.pattern = regex_quote(this.value);">
+ <p class="small text-muted">
+ <?php echo 'Passwords must be at least 6 characters long and are case-sensitive, so that “secret” is different to “SECRET”.'; ?>
+ </p>
+ </div>
+ </div>
- echo '<dt>', WT_I18N::translate('My page'), '</dt>';
- echo '<dd><a href="#" onclick="modalDialog(\'index_edit.php?user_id='.$user_id.'\', \'', WT_I18N::translate('Change the blocks on this page'), '\');">', WT_I18N::translate('Change the blocks on this page'), '</a></dd>';
+ <!-- CONFIRM PASSWORD -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="pass2">
+ <?php echo WT_I18N::translate('Confirm password'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input class="form-control" type="password" id="pass2" name="pass2" pattern = "<?php echo WT_REGEX_PASSWORD; ?>" placeholder="<?php echo WT_I18N::translate('Type the password again.'); ?>" <?php echo $user->getUserId() ? '' : 'required'; ?>>
+ </div>
+ </div>
- // Masquerade as others users - but not other administrators
- if (!Auth::isAdmin($user)) {
- echo '<dt>', /* I18N: Pretend to be another user, by logging in as them */ WT_I18N::translate('Masquerade as this user'), '</dt>';
- echo '<dd><a href="#" onclick="return masquerade(', $user_id, ')">', /* I18N: verb: pretend to be someone else */ WT_I18N::translate('masquerade'), '</a></dd>';
- }
+ <!-- EMAIL ADDRESS -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="email">
+ <?php echo WT_I18N::translate('Email address'); ?>
+ </label>
+ <div class="col-sm-9">
+ <input class="form-control" type="email" id="email" name="email" required maxlength="64" value="<?php echo WT_Filter::escapeHtml($user->getEmail()); ?>">
+ </div>
+ </div>
- echo '</dl>';
+ <!-- EMAIL VERIFIED -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="verified">
+ </label>
+ <div class="col-sm-9">
+ <div class="checkbox">
+ <label>
+ <input type="checkbox" name="verified" value="1" <?php echo $user->getPreference('verified') ? 'checked' : ''?>>
+ <?php echo WT_I18N::translate('Email verified'); ?>
+ </label>
+ </div>
+ </div>
+ </div>
- // Column One - details
+ <!-- ACCOUNT APPROVED -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="approved">
+ </label>
+ <div class="col-sm-9">
+ <div class="checkbox">
+ <label>
+ <input type="checkbox" name="approved" value="1" <?php echo $user->getPreference('verified_by_admin') ? 'checked' : '';?>>
+ <?php echo WT_I18N::translate('Approved by administrator'); ?>
+ </label>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('When a user registers for an account, an email is sent to their email address with a verification link. When they click this link, we know the email address is correct, and the “email verified” option is selected automatically.'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('If an administrator creates a user account, the verification email is not sent, and the email must be verified manually.'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('You should not approve an account unless you know that the email address is correct.'); ?>
+ </p>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('A user will not be able to login until both the “email verified” and “approved by administrator” options are selected.'); ?>
+ </p>
+ </div>
+ </div>
+ </div>
- echo
- '<div id="access">',
- '<h2>', WT_I18N::translate('Family tree access and settings'), '</h2>',
- '<table><tr>',
- '<th>', WT_I18N::translate('Family tree'), '</th>',
- '<th>', WT_I18N::translate('Default individual'), help_link('default_individual'), '</th>',
- '<th>', WT_I18N::translate('Individual record'), help_link('useradmin_gedcomid'), '</th>',
- '<th>', WT_I18N::translate('Role'), help_link('role'), '</th>',
- '<th>', WT_I18N::translate('Restrict to immediate family'), help_link('RELATIONSHIP_PATH_LENGTH'), '</th>',
- '</tr>';
+ <!-- LANGUAGE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="language">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Language'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('language', WT_I18N::installed_languages(), null, $user->getPreference('language'), 'class="form-control"'); ?>
+ </div>
+ </div>
- foreach (WT_Tree::getAll() as $tree) {
- echo
- '<tr><td>',
- $tree->tree_title_html,
- //Pedigree root person
- '</td><td>',
- // TODO: autocomplete/find/etc. for this field
- edit_field_inline('user_gedcom_setting-'.$user_id.'-'.$tree->tree_id.'-rootid', $tree->getUserPreference($user, 'rootid')),
- '</td><td>',
- // TODO: autocomplete/find/etc. for this field
- edit_field_inline('user_gedcom_setting-'.$user_id.'-'.$tree->tree_id.'-gedcomid', $tree->getUserPreference($user, 'gedcomid')),
- '</td><td>',
- select_edit_control_inline('user_gedcom_setting-'.$user_id.'-'.$tree->tree_id.'-canedit', $ALL_EDIT_OPTIONS, null, $tree->getUserPreference($user, 'canedit')),
- '</td><td>',
- select_edit_control_inline('user_gedcom_setting-'.$user_id.'-'.$tree->tree_id.'-RELATIONSHIP_PATH_LENGTH', array(0=>WT_I18N::translate('no'), 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, 10=>10), null, $tree->getUserPreference($user, 'RELATIONSHIP_PATH_LENGTH')),
- '</td></tr>';
- }
- echo '</table>';
- exit;
+ <!-- AUTO ACCEPT -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="auto_accept">
+ </label>
+ <div class="col-sm-9">
+ <div class="checkbox">
+ <label>
+ <input type="checkbox" name="auto_accept" value="1" <?php echo $user->getPreference('auto_accept') ? 'checked' : '';?>>
+ <?php echo WT_I18N::translate('Automatically approve changes made by this user'); ?>
+ </label>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('Normally, any changes made to a family tree need to be approved by a moderator. This option allows a user to make changes without needing a moderator’s approval.'); ?>
+ </p>
+ </div>
+ </div>
+ </div>
-case 'createuser':
- if (!WT_Filter::checkCsrf()) {
- $action='createform';
- } elseif (User::findByIdentifier($username)) {
- WT_FlashMessages::addMessage(WT_I18N::translate('Duplicate user name. A user with that user name already exists. Please choose another user name.'));
- $action='createform';
- } elseif (User::findByIdentifier($emailaddress)) {
- WT_FlashMessages::addMessage(WT_I18N::translate('Duplicate email address. A user with that email already exists.'));
- $action='createform';
- } elseif ($pass1!=$pass2) {
- WT_FlashMessages::addMessage(WT_I18N::translate('Passwords do not match.'));
- $action='createform';
- } else {
- $user = User::create($username, $realname, $emailaddress, $pass1);
- $user
- ->setPreference('reg_timestamp', date('U'))
- ->setPreference('sessiontime', '0')
- ->setPreference('theme', $user_theme)
- ->setPreference('language', $user_language)
- ->setPreference('contactmethod', $new_contact_method)
- ->setPreference('comment', $new_comment)
- ->setPreference('auto_accept', $new_auto_accept ? '1' : '0')
- ->setPreference('canadmin', $canadmin ? '1' : '0')
- ->setPreference('visibleonline', $visibleonline ? '1' : '0')
- ->setPreference('editaccount', $editaccount ? '1' : '0')
- ->setPreference('verified', $verified ? '1' : '0')
- ->setPreference('verified_by_admin', $verified_by_admin ? '1' : '0');
+ <!-- EDIT ACCOUNT -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="edit_account">
+ </label>
+ <div class="col-sm-9">
+ <div class="checkbox">
+ <label>
+ <input type="checkbox" name="edit_account" value="1" <?php echo $user->getPreference('edit_account') ? 'checked' : '';?>>
+ <?php echo WT_I18N::translate('Allow this user to edit his account information'); ?>
+ </label>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('If this box is checked, this user will be able to edit his account information. Although this is not generally recommended, you can create a single user name and password for multiple users. When this box is unchecked for all users with the shared account, they are prevented from editing the account information and only an administrator can alter that account.'); ?>
+ </p>
+ </div>
+ </div>
+ </div>
- foreach (WT_Tree::getAll() as $tree) {
- $tree->setUserPreference($user, 'gedcomid', WT_Filter::post('gedcomid'.$tree->tree_id, WT_REGEX_XREF));
- $tree->setUserPreference($user, 'rootid', WT_Filter::post('rootid'.$tree->tree_id, WT_REGEX_XREF));
- $tree->setUserPreference($user, 'canedit', WT_Filter::post('canedit'.$tree->tree_id, implode('|', array_keys($ALL_EDIT_OPTIONS))));
- if (WT_Filter::post('gedcomid'.$tree->tree_id, WT_REGEX_XREF)) {
- $tree->setUserPreference($user, 'RELATIONSHIP_PATH_LENGTH', WT_Filter::postInteger('RELATIONSHIP_PATH_LENGTH'.$tree->tree_id, 0, 10, 0));
- } else {
- // Do not allow a path length to be set if the individual ID is not
- $tree->setUserPreference($user, 'RELATIONSHIP_PATH_LENGTH', null);
- }
- }
- Log::addAuthenticationLog("User ->{$username}<- created");
- header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
- Zend_Session::writeClose();
- exit;
- }
-}
+ <!-- VISIBLE ONLINE -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="edit_account">
+ </label>
+ <div class="col-sm-9">
+ <div class="checkbox">
+ <label>
+ <input type="checkbox" name="visible_online" value="1" <?php echo $user->getPreference('visible_online') ? 'checked' : '';?>>
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Visible to other users when online'); ?>
+ </label>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('This checkbox controls your visibility to other users while you’re online. It also controls your ability to see other online users who are configured to be visible.<br><br>When this box is unchecked, you will be completely invisible to others, and you will also not be able to see other online users. When this box is checked, exactly the opposite is true. You will be visible to others, and you will also be able to see others who are configured to be visible.'); ?>
+ </p>
+ </div>
+ </div>
+ </div>
-$controller->pageHeader();
+ <!-- CONTACT METHOD -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="contactmethod">
+ <?php echo /* I18N: A configuration setting */ WT_I18N::translate('Contact method'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo edit_field_contact('contactmethod', $user->getPreference('contact_method')); ?>
+ <p class="small text-muted">
+ <?php echo WT_I18N::translate('Site members can send each other messages. You can choose to how these messages are sent to you, or choose not receive them at all.'); ?>
+ </p>
+ </div>
+ </div>
-switch ($action) {
-case 'createform':
- $controller
- ->addExternalJavascript(WT_STATIC_URL . 'js/autocomplete.js')
- ->addInlineJavascript('autocomplete();');
+ <!-- THEME -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="theme">
+ <?php echo WT_I18N::translate('Theme'); ?>
+ </label>
+ <div class="col-sm-9">
+ <?php echo select_edit_control('theme', Theme::themeNames(), WT_I18N::translate('<default theme>'), $user->getPreference('theme'), 'class="form-control"'); ?>
+ </div>
+ </div>
- init_calendar_popup();
- $controller->addInlineJavascript('
- function checkform(frm) {
- if (frm.username.value=="") {
- alert("'.WT_I18N::translate('You must enter a user name.').'");
- frm.username.focus();
- return false;
- }
- if (frm.realname.value=="") {
- alert("'.WT_I18N::translate('You must enter a real name.').'");
- frm.realname.focus();
- return false;
- }
- if (frm.pass1.value=="") {
- alert("'.WT_I18N::translate('You must enter a password.').'");
- frm.pass1.focus();
- return false;
- }
- if (frm.emailaddress.value=="") {
- alert("'.WT_I18N::translate('You must enter an email address.').'");
- frm.emailaddress.focus();
- return false;
- }
- if (frm.pass2.value=="") {
- alert("'.WT_I18N::translate('You must confirm the password.').'");
- frm.pass2.focus();
- return false;
- }
- if (frm.pass1.value.length < 6) {
- alert("'.WT_I18N::translate('Passwords must contain at least 6 characters.').'");
- frm.pass1.value = "";
- frm.pass2.value = "";
- frm.pass1.focus();
- return false;
- }
- return true;
- }
- jQuery(".relpath").change(function() {
- var fieldIDx = jQuery(this).attr("id");
- var idNum = fieldIDx.replace("RELATIONSHIP_PATH_LENGTH","");
- var newIDx = "gedcomid"+idNum;
- if (jQuery("#"+newIDx).val()=="") {
- alert("'.WT_I18N::translate('You must specify an individual record before you can restrict the user to their immediate family.').'");
- jQuery(this).val("");
- }
- });
+ <!-- COMMENTS -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="comment">
+ <?php echo WT_I18N::translate('Admin comments on user'); ?>
+ </label>
+ <div class="col-sm-9">
+ <textarea class="form-control" id="comment" name="comment" rows="5" maxlength="255"><?php echo WT_Filter::escapeHtml($user->getPreference('comment')); ?></textarea>
+ </div>
+ </div>
- function regex_quote(str) {
- return str.replace(/[\\\\.?+*()[\](){}|]/g, "\\\\$&");
- }
- ');
+ <!-- ADMINISTRATOR -->
+ <div class="form-group">
+ <label class="control-label col-sm-3" for="admin">
+ </label>
+ <div class="col-sm-9">
+ <div class="checkbox">
+ <label>
+ <input type="checkbox" name="admin" value="1" <?php echo $user->getPreference('admin') ? 'checked' : '';?>>
+ <?php echo WT_I18N::translate('Administrator'); ?>
+ </label>
+ <p class="small text-muted">
+ <?php echo help_link('role'); ?>
+ </p>
+ </div>
+ </div>
+ </div>
- echo '
- <form name="newform" method="post" action="admin_users.php?action=createuser" onsubmit="return checkform(this);" autocomplete="off">
- ', WT_Filter::getCsrf(), '
- <table id="adduser">
- <tr>
- <td>', WT_I18N::translate('Real name'), help_link('real_name'), '</td>
- <td><input type="text" name="realname" style="width:95%;" required maxlength="64" value="', WT_Filter::escapeHtml($realname), '" autofocus></td>
- <td>', WT_I18N::translate('Administrator'), help_link('role'), '</td>
- <td><input type="checkbox" name="canadmin" value="1"></td>
- </tr>
- <tr>
- <td>', WT_I18N::translate('Username'), help_link('username'), '</td>
- <td><input type="text" name="username" style="width:95%;" required maxlength="32" value="', WT_Filter::escapeHtml($username), '"></td>
- <td>', WT_I18N::translate('Approved by administrator'), help_link('useradmin_verification'), '</td>
- <td><input type="checkbox" name="verified_by_admin" value="1" checked="checked"></td>
- </tr>
- <tr>
- <td>', WT_I18N::translate('Email address'), help_link('email'), '</td>
- <td><input type="email" name="emailaddress" style="width:95%;" required maxlength="64" value="', WT_Filter::escapeHtml($emailaddress), '"></td>
- <td>', WT_I18N::translate('Email verified'), help_link('useradmin_verification'), '</td>
- <td><input type="checkbox" name="verified" value="1" checked="checked"></td>
- </tr>
- <tr>
- <td>', WT_I18N::translate('Password'), help_link('password'), '</td>
- <td><input type="password" name="pass1" style="width:95%;" value="', WT_Filter::escapeHtml($pass1), '" required placeholder="', WT_I18N::plural('Use at least %s character.', 'Use at least %s characters.', WT_MINIMUM_PASSWORD_LENGTH, WT_I18N::number(WT_MINIMUM_PASSWORD_LENGTH)), '" pattern="', WT_REGEX_PASSWORD, '" onchange="form.pass2.pattern = regex_quote(this.value);"></td>
- <td>', WT_I18N::translate('Automatically approve changes made by this user'), help_link('useradmin_auto_accept'), '</td>
- <td><input type="checkbox" name="new_auto_accept" value="1"></td>
- </tr>
- <td>', WT_I18N::translate('Confirm password'), help_link('password_confirm'), '</td>
- <td><input type="password" name="pass2" style="width:95%;" value="', WT_Filter::escapeHtml($pass2), '" required placeholder="', WT_I18N::translate('Type the password again.'), '" pattern="', WT_REGEX_PASSWORD, '"></td>
- <td>', WT_I18N::translate('Allow this user to edit his account information'), help_link('useradmin_editaccount'), '</td>
- <td><input type="checkbox" name="editaccount" value="1" checked="checked"></td>
- <tr>
- <td>', WT_I18N::translate('Preferred contact method'), '</td>
- <td>';
- echo edit_field_contact('new_contact_method', $new_contact_method);
- echo '</td>
- <td>', WT_I18N::translate('Visible to other users when online'), help_link('useradmin_visibleonline'), '</td>
- <td><input type="checkbox" name="visibleonline" value="1" checked="checked"></td>
- </tr>
- <tr>
- </tr>
- <tr>
- <td>', WT_I18N::translate('Language'), '</td>
- <td>', edit_field_language('user_language', $user_language), '</td>';
- if (WT_Site::getPreference('ALLOW_USER_THEMES')) {
- echo '<td>', WT_I18N::translate('Theme'), help_link('THEME'), '</td>
+ <h3><?php echo WT_I18N::translate('Family tree access and settings'); ?></h3>
+
+ <table class="table table-bordered table-condensed table-responsive">
+ <thead>
+ <tr>
+ <th><?php echo WT_I18N::translate('Family tree'); ?></th>
+ <th><?php echo WT_I18N::translate('Default individual'), help_link('default_individual'); ?></th>
+ <th><?php echo WT_I18N::translate('Individual record'), help_link('useradmin_gedcomid'); ?></th>
+ <th><?php echo WT_I18N::translate('Role'), help_link('role'); ?></th>
+ <th><?php echo WT_I18N::translate('Restrict to immediate family'), help_link('RELATIONSHIP_PATH_LENGTH'); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach (WT_Tree::getAll() as $tree): ?>
+ <tr>
<td>
- <select name="new_user_theme">
- <option value="" selected="selected">', WT_Filter::escapeHtml(WT_I18N::translate('<default theme>')), '</option>';
- foreach (get_theme_names() as $theme_name => $theme_id) {
- echo '<option value="', $theme_id, '">', $theme_name, '</option>';
- }
- echo '</select>
- </td>';
- }
- echo '</tr>';
- if (Auth::isAdmin()) {
- echo '<tr>
- <td>', WT_I18N::translate('Admin comments on user'), '</td>
- <td colspan="3"><textarea style="width:95%;" rows="5" name="new_comment" value="', WT_Filter::escapeHtml($new_comment), '"></textarea></td>
- </tr>';
- }
- echo '<tr>
- <th colspan="4">', WT_I18N::translate('Family tree access and settings'), '</th>
- </tr>
- <tr>
- <td colspan="4">
- <table id="adduser2">
- <tr>
- <th>', WT_I18N::translate('Family tree'), '</th>
- <th>', WT_I18N::translate('Default individual'), help_link('default_individual'), '</th>
- <th>', WT_I18N::translate('Individual record'), help_link('useradmin_gedcomid'), '</th>
- <th>', WT_I18N::translate('Role'), help_link('role'), '</th>
- <th>', WT_I18N::translate('Restrict to immediate family'), help_link('RELATIONSHIP_PATH_LENGTH'), '</th>
- </tr>';
- foreach (WT_Tree::getAll() as $tree) {
- echo '<tr>',
- '<td>', $tree->tree_title_html, '</td>',
- //Pedigree root person
- '<td>';
- $varname='rootid'.$tree->tree_id;
- echo '<input data-autocomplete-type="INDI" data-autocomplete-ged="' . $tree->tree_name_html . '" type="text" size="12" name="', $varname, '" id="', $varname, '" value="', WT_Filter::escapeHtml(WT_Filter::post('rootid'.$tree->tree_id, WT_REGEX_XREF)), '"> ', print_findindi_link($varname, '', $tree->tree_name),
- '</td>',
- // GEDCOM INDI Record ID
- '<td>';
- $varname='gedcomid'.$tree->tree_id;
- echo '<input data-autocomplete-type="INDI" data-autocomplete-ged="' . $tree->tree_name_html . '" type="text" size="12" name="',$varname, '" id="',$varname, '" value="', WT_Filter::escapeHtml(WT_Filter::post('gedcomid'.$tree->tree_id, WT_REGEX_XREF)), '"> ', print_findindi_link($varname, '', $tree->tree_name),
- '</td>',
- '<td>';
- $varname='canedit'.$tree->tree_id;
- echo '<select name="', $varname, '">';
- foreach ($ALL_EDIT_OPTIONS as $EDIT_OPTION=>$desc) {
- echo '<option value="', $EDIT_OPTION, '" ';
- if ($EDIT_OPTION == WT_I18N::translate('None')) {
- echo 'selected="selected" ';
- }
- echo '>', $desc, '</option>';
- }
- echo '</select>',
- '</td>',
- //Relationship path
- '<td>';
- $varname = 'RELATIONSHIP_PATH_LENGTH'.$tree->tree_id;
- echo '<select name="', $varname, '" id="', $varname, '" class="relpath">';
- for ($n=0; $n<=10; ++$n) {
- echo
- '<option value="', $n, '">',
- $n ? $n : WT_I18N::translate('No'),
- '</option>';
- }
- echo '</select>',
- '</td>',
- '</tr>';
- }
- echo '</table>
- </td>
- </tr>
- <td colspan="4">
- <input type="submit" value="', WT_I18N::translate('Create user'), '">
- </td>
- </tr>
+ <?php echo $tree->tree_title_html; ?>
+ </td>
+ <td>
+ <input
+ data-autocomplete-type="INDI"
+ data-autocomplete-ged="<?php echo $tree->tree_name_html; ?>"
+ type="text"
+ size="12"
+ name="rootid<?php echo $tree->tree_id; ?>"
+ id="rootid<?php echo $tree->tree_id; ?>"
+ value="<?php echo WT_Filter::escapeHtml($tree->getUserPreference($user, 'rootid')); ?>"
+ >
+ <?php echo print_findindi_link('rootid' . $tree->tree_id, $tree->tree_name); ?>
+ </td>
+ <td>
+ <input
+ data-autocomplete-type="INDI"
+ data-autocomplete-ged="<?php echo $tree->tree_name_html; ?>"
+ type="text"
+ size="12"
+ name="gedcomid<?php echo $tree->tree_id; ?>"
+ id="gedcomid<?php echo $tree->tree_id; ?>"
+ value="<?php echo WT_Filter::escapeHtml($tree->getUserPreference($user, 'gedcomid')); ?>"
+ >
+ <?php echo print_findindi_link('gedcomid' . $tree->tree_id, '', $tree->tree_name); ?>
+ </td>
+ <td>
+ <select name="canedit<?php echo $tree->tree_id; ?>">
+ <?php foreach ($ALL_EDIT_OPTIONS as $EDIT_OPTION => $desc): ?>
+ <option value="<?php echo $EDIT_OPTION; ?>"
+ <?php if ($EDIT_OPTION === $tree->getUserPreference($user, 'canedit')): ?>
+ selected="selected"
+ <?php endif; ?>
+ >
+ <?php echo $desc; ?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ <td>
+ <select name="RELATIONSHIP_PATH_LENGTH<?php echo $tree->tree_id; ?>" id="RELATIONSHIP_PATH_LENGTH<?php echo $tree->tree_id; ?>" class="relpath">
+ <?php for ($n=0; $n<=10; ++$n): ?>
+ <option value="<?php echo $n; ?>" <?php echo $tree->getUserPreference($user, 'RELATIONSHIP_PATH_LENGTH') === $n ? 'checked' : ''; ?>>
+ <?php echo $n ? $n : WT_I18N::translate('No'); ?>
+ </option>
+ <?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
</table>
- </form>';
- break;
+ <button class="btn btn-primary" type="submit"><?php echo WT_I18N::translate('save'); ?></button>
+ </form>
+ <?php
+
+ return;
+
case 'cleanup':
+
+ $controller
+ ->setPageTitle(WT_I18N::translate('Delete inactive users'))
+ ->pageHeader();
+
?>
- <form name="cleanupform" method="post" action="admin_users.php?action=cleanup2">
- <table id="clean">
+ <ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li><a href="admin_users.php"><?php echo WT_I18N::translate('User administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+ </ol>
+ <h2><?php echo $controller->getPageTitle(); ?></h2>
+
+ <form method="post" action="?action=cleanup2">
+ <table class="table table-bordered">
<?php
// Check for idle users
$month = WT_Filter::getInteger('month', 1, 12, 6);
- echo "<tr><th>", WT_I18N::translate('Number of months since the last login for a user’s account to be considered inactive: '), "</th>";
- echo "<td><select onchange=\"document.location=options[selectedIndex].value;\">";
- for ($i=1; $i<=12; $i++) {
- echo "<option value=\"admin_users.php?action=cleanup&amp;month=$i\"";
- if ($i == $month) echo " selected=\"selected\"";
- echo ">", $i, "</option>";
+ echo '<tr><th colspan="2">', WT_I18N::translate('Number of months since the last login for a user’s account to be considered inactive: '), '</th>';
+ echo '<td><select onchange="document.location=options[selectedIndex].value;">';
+ for ($i = 1; $i <= 12; $i++) {
+ echo '<option value="admin_users.php?action=cleanup&amp;month=' . $i . '"';
+ if ($i == $month) {
+ echo ' selected="selected"';
+ }
+ echo '>', $i, '</option>';
}
- echo "</select></td></tr>";
- ?>
- <tr><th colspan="2"><?php echo WT_I18N::translate('Options:'); ?></th></tr>
- <?php
+ echo '</select></td></tr>';
+
// Check users not logged in too long
$ucnt = 0;
foreach (User::all() as $user) {
- if ($user->getPreference('sessiontime') == "0") {
- $datelogin = (int)$user->getPreference('reg_timestamp');
+ if ($user->getPreference('sessiontime') === '0') {
+ $datelogin = (int) $user->getPreference('reg_timestamp');
} else {
- $datelogin = (int)$user->getPreference('sessiontime');
+ $datelogin = (int) $user->getPreference('sessiontime');
}
- if ((mktime(0, 0, 0, (int)date("m")-$month, (int)date("d"), (int)date("Y")) > $datelogin) && $user->getPreference('verified') && $user->getPreference('verified_by_admin')) {
- ?><tr><td><?php echo WT_Filter::escapeHtml($user->getUserName()), " - <p>", WT_Filter::escapeHtml($user->getRealName()), "</p>", WT_I18N::translate('User’s account has been inactive too long: ');
- echo timestamp_to_gedcom_date($datelogin)->display();
+ if (mktime(0, 0, 0, (int) date('m')-$month, (int) date('d'), (int) date('Y')) > $datelogin && $user->getPreference('verified') && $user->getPreference('approved')) {
$ucnt++;
- ?></td><td><input type="checkbox" name="del_<?php echo $user->getUserId(); ?>" value="1"></td></tr><?php
+ ?>
+ <tr>
+ <td>
+ <a href="?action=edit&amp;user_id=<?php echo $user->getUserId(); ?>">
+ <?php echo WT_Filter::escapeHtml($user->getUserName()); ?>
+ —
+ <?php echo WT_Filter::escapeHtml($user->getRealName()); ?>
+ </a>
+ </td>
+ <td>
+ <?php echo WT_I18N::translate('User’s account has been inactive too long: ') . timestamp_to_gedcom_date($datelogin)->display(); ?>
+ </td>
+ <td>
+ <input type="checkbox" name="del_<?php echo $user->getUserId(); ?>" value="1">
+ </td>
+ </tr>
+ <?php
}
}
// Check unverified users
foreach (User::all() as $user) {
- if (((date("U") - (int)$user->getPreference('reg_timestamp')) > 604800) && !$user->getPreference('verified')) {
- ?><tr><td><?php echo WT_Filter::escapeHtml($user->getUserName()), " - ", WT_Filter::escapeHtml($user->getRealName()), ":&nbsp;&nbsp;", WT_I18N::translate('User didn’t verify within 7 days.');
+ if (((date('U') - (int) $user->getPreference('reg_timestamp')) > 604800) && !$user->getPreference('verified')) {
$ucnt++;
- ?></td><td><input type="checkbox" checked="checked" name="del_<?php echo $user->getUserId(); ?>" value="1"></td></tr><?php
+ ?>
+ <tr>
+ <td>
+ <a href="?action=edit&amp;user_id=<?php echo $user->getUserId(); ?>">
+ <?php echo WT_Filter::escapeHtml($user->getUserName()); ?>
+ —
+ <?php echo WT_Filter::escapeHtml($user->getRealName()); ?>
+ </a>
+ </td>
+ <td>
+ <?php echo WT_I18N::translate('User didn’t verify within 7 days.'); ?>
+ </td>
+ <td>
+ <input type="checkbox" checked name="del_<?php echo $user->getUserId(); ?>" value="1">
+ </td>
+ </tr>
+ <?php
}
}
// Check users not verified by admin
foreach (User::all() as $user) {
- if (!$user->getPreference('verified_by_admin') && $user->getPreference('verified')) {
- ?><tr><td><?php echo WT_Filter::escapeHtml($user->getUserName()), " - ", WT_Filter::escapeHtml($user->getRealName()), ":&nbsp;&nbsp;", WT_I18N::translate('User not verified by administrator.');
- ?></td><td><input type="checkbox" name="del_<?php echo $user->getUserId(); ?>" value="1"></td></tr><?php
+ if ($user->getUserId() !== Auth::id() && !$user->getPreference('approved') && $user->getPreference('verified')) {
$ucnt++;
+ ?>
+ <tr>
+ <td>
+ <a href="?action=edit&amp;user_id=<?php echo $user->getUserId(); ?>">
+ <?php echo WT_Filter::escapeHtml($user->getUserName()); ?>
+ —
+ <?php echo WT_Filter::escapeHtml($user->getRealName()); ?>
+ </a>
+ </td>
+ <td>
+ <?php echo WT_I18N::translate('User not verified by administrator.'); ?>
+ </td>
+ <td>
+ <input type="checkbox" name="del_<?php echo $user->getUserId(); ?>" value="1">
+ </td>
+ </tr>
+ <?php
}
}
- if ($ucnt == 0) {
- echo "<tr><td class=\"accepted\" colspan=\"2\">";
- echo WT_I18N::translate('Nothing found to cleanup'), "</td></tr>";
- } ?>
- </table>
- <p>
+ ?>
+ </table>
+ <p>
+ <?php if ($ucnt): ?>
+ <input type="submit" value="<?php echo WT_I18N::translate('delete'); ?>">
+ <?php else: ?>
+ <?php echo WT_I18N::translate('Nothing found to cleanup'); ?>
+ <?php endif; ?>
+ </p>
+ </form>
<?php
- if ($ucnt >0) {
- ?><input type="submit" value="<?php echo WT_I18N::translate('continue'); ?>">&nbsp;&nbsp;<?php
- } ?>
- </p>
- </form><?php
break;
+
case 'cleanup2':
foreach (User::all() as $user) {
if (WT_Filter::post('del_' . $user->getUserId()) == '1') {
Log::addAuthenticationLog('Deleted user: ' . $user->getUserName());
- echo WT_I18N::translate('Deleted user: '), $user->getUserName(), '<br>';
+ WT_FlashMessages::addMessage(WT_I18N::translate('Deleted user: ') . $user->getUserName(), 'success');
$user->delete();
}
}
+
+ header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME);
break;
-case 'listusers':
default:
- echo
- '<table id="list">',
- '<thead>',
- '<tr>',
- '<th style="margin:0 -2px 1px 1px; padding:6px 0 5px;"> </th>',
- '<th> user-id </th>',
- '<th>', WT_I18N::translate('Username'), '</th>',
- '<th>', WT_I18N::translate('Real name'), '</th>',
- '<th>', WT_I18N::translate('Email'), '</th>',
- '<th> </th>', /* COLSPAN does not work? */
- '<th>', WT_I18N::translate('Language'), '</th>',
- '<th> date_registered </th>',
- '<th>', WT_I18N::translate('Date registered'), '</th>',
- '<th> last_login </th>',
- '<th>', WT_I18N::translate('Last logged in'), '</th>',
- '<th>', WT_I18N::translate('Verified'), '</th>',
- '<th>', WT_I18N::translate('Approved'), '</th>',
- '<th style="margin:0 -2px 1px 1px; padding:3px 0 4px;"> </th>',
- '</tr>',
- '</thead>',
- '<tbody>',
- '</tbody>',
- '</table>';
-
$controller
->addExternalJavascript(WT_JQUERY_DATATABLES_URL)
- ->addExternalJavascript(WT_JQUERY_JEDITABLE_URL)
+ ->addExternalJavascript(WT_DATATABLES_BOOTSTRAP_JS_URL)
->addInlineJavascript('
- jQuery("#list").dataTable({
- dom: \'<"H"pf<"dt-clear">irl>t<"F"pl>\',
+ jQuery(".table-user-list").dataTable({
' . WT_I18N::datatablesI18N() . ',
processing: true,
serverSide: true,
@@ -599,52 +707,55 @@ default:
search: {
search: "' . WT_Filter::escapeJs(WT_Filter::get('filter')) . '"
},
- jQueryUI: true,
autoWidth: false,
pageLength: ' . Auth::user()->getPreference('admin_users_page_size', 10) . ',
- pagingType: "full_numbers",
sorting: [[2,"asc"]],
columns: [
- /* details */ { sortable: false, class: "icon-open" },
+ /* details */ { sortable: false },
/* user-id */ { visible: false },
/* user_name */ null,
/* real_name */ null,
/* email */ null,
- /* email link */ { sortable: false },
/* language */ null,
/* registered (sort) */ { visible: false },
/* registered */ { dataSort: 7 },
/* last_login (sort) */ { visible: false },
/* last_login */ { dataSort: 9 },
/* verified */ { class: "center" },
- /* approved */ { class: "center" },
- /* delete */ { sortable: false }
- ],
- "drawCallback": function() {
- // Our JSON responses include Javascript as well as HTML. This does not get executed automatically…
- jQuery("#list script").each(function() {
- eval(this.text);
- });
- }
- });
+ /* approved */ { class: "center" }
+ ]
+ })
+ .fnFilter("' . WT_Filter::get('filter') . '"); // View details of a newly created user
+ ')
+ ->pageHeader();
- /* When clicking on the +/- icon, we expand/collapse the details block */
- jQuery("#list").on("click", ".icon-open, .icon-close", function () {
- var self = jQuery(this),
- aData,
- oTable = self.parents("table").dataTable();
- nTr=self.parent();
+ ?>
+ <ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+ </ol>
+ <h2><?php echo $controller->getPageTitle(); ?></h2>
- if(self.hasClass("icon-open")) {
- aData=oTable.fnGetData(nTr);
- jQuery.get("'.WT_SCRIPT_NAME.'?action=load1row&user_id="+aData[1], function(data) {
- oTable.fnOpen(nTr, data, "details");
- });
- } else {
- oTable.fnClose(nTr);
- }
- jQuery(this).toggleClass("icon-open icon-close");
- });
- ');
+ <table class="table table-condensed table-bordered table-user-list">
+ <thead>
+ <tr>
+ <th><?php echo WT_I18N::translate('Edit'); ?></th>
+ <th><!-- user id --></th>
+ <th><?php echo WT_I18N::translate('Username'); ?></th>
+ <th><?php echo WT_I18N::translate('Real name'); ?></th>
+ <th><?php echo WT_I18N::translate('Email address'); ?></th>
+ <th><?php echo WT_I18N::translate('Language'); ?></th>
+ <th><!-- date registered --></th>
+ <th><?php echo WT_I18N::translate('Date registered'); ?></th>
+ <th><!-- last login --></th>
+ <th><?php echo WT_I18N::translate('Last logged in'); ?></th>
+ <th><?php echo WT_I18N::translate('Verified'); ?></th>
+ <th><?php echo WT_I18N::translate('Approved'); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>
+ </table>
+ <?php
break;
}
diff --git a/admin_users_bulk.php b/admin_users_bulk.php
index 9bef76b0ef..8a3577c5c0 100644
--- a/admin_users_bulk.php
+++ b/admin_users_bulk.php
@@ -2,7 +2,7 @@
// Administrative User Interface.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team.
@@ -35,20 +35,25 @@ $controller
->pageHeader();
?>
-<div id="users_bulk">
- <p>
- <a href="#" onclick="message('all', 'messaging2', ''); return false;">
- <?php echo WT_I18N::translate('Send a message to all users'); ?>
- </a>
- </p>
- <p>
- <a href="#" onclick="message('never_logged', 'messaging2', ''); return false;">
- <?php echo WT_I18N::translate('Send a message to users who have never logged in'); ?>
- </a>
- </p>
- <p>
- <a href="#" onclick="message('last_6mo', 'messaging2', ''); return false;">
- <?php echo WT_I18N::translate('Send a message to users who have not logged in for 6 months'); ?>
- </a>
- </p>
-</div>
+
+<ol class="breadcrumb small">
+ <li><a href="admin.php"><?php echo WT_I18N::translate('Administration'); ?></a></li>
+ <li class="active"><?php echo $controller->getPageTitle(); ?></li>
+</ol>
+<h2><?php echo $controller->getPageTitle(); ?></h2>
+
+<p>
+ <a href="#" onclick="return message('all', 'messaging2', '');">
+ <?php echo WT_I18N::translate('Send a message to all users'); ?>
+ </a>
+</p>
+<p>
+ <a href="#" onclick="return message('never_logged', 'messaging2', '');">
+ <?php echo WT_I18N::translate('Send a message to users who have never logged in'); ?>
+ </a>
+</p>
+<p>
+ <a href="#" onclick="return message('last_6mo', 'messaging2', '');">
+ <?php echo WT_I18N::translate('Send a message to users who have not logged in for 6 months'); ?>
+ </a>
+</p>
diff --git a/edit_changes.php b/edit_changes.php
index d1fc69e5bf..b3e505f594 100644
--- a/edit_changes.php
+++ b/edit_changes.php
@@ -212,7 +212,9 @@ if ($changed_gedcoms) {
$output2 .= '<tr><td class="list_value">';
$count = 0;
foreach ($changed_gedcoms as $gedcom_name) {
- if ($count!=0) $output2.='<br>';
+ if ($count != 0) {
+ $output2.='<br>';
+ }
$output2 .= '<a href="edit_changes.php?action=acceptall&amp;ged='.rawurlencode($gedcom_name).'">'.$gedcom_name.' - '.WT_I18N::translate('Approve all changes').'</a>';
$count ++;
}
diff --git a/edit_interface.php b/edit_interface.php
index 3bccd1c2bc..05892bd375 100644
--- a/edit_interface.php
+++ b/edit_interface.php
@@ -2,7 +2,7 @@
// PopUp Window to provide editing features.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team.
@@ -22,6 +22,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
define('WT_SCRIPT_NAME', 'edit_interface.php');
require './includes/session.php';
@@ -1820,7 +1821,7 @@ case 'reorder_children':
echo '<li style="cursor:move; margin-bottom:2px; position:relative;"';
if (!in_array($id, $ids)) echo ' class="facts_value new"';
echo ' id="li_',$id,'">';
- print_pedigree_person(WT_Individual::getInstance($id), 2);
+ echo Theme::theme()->individualBoxLarge(WT_Individual::getInstance($id));
echo '<input type="hidden" name="order[',$id,']" value="',$i,'">';
echo '</li>';
$i++;
diff --git a/edituser.php b/edituser.php
index 4019819c66..17500a5b0d 100644
--- a/edituser.php
+++ b/edituser.php
@@ -2,7 +2,7 @@
// User Account Edit Interface.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team.
@@ -23,6 +23,7 @@
use WT\Auth;
use WT\Log;
+use WT\Theme;
use WT\User;
define('WT_SCRIPT_NAME', 'edituser.php');
@@ -44,7 +45,7 @@ $form_pass1 = WT_Filter::post('form_pass1', WT_REGEX_PASSWORD);
$form_pass2 = WT_Filter::post('form_pass2', WT_REGEX_PASSWORD);
$form_email = WT_Filter::postEmail('form_email');
$form_rootid = WT_Filter::post('form_rootid', WT_REGEX_XREF);
-$form_theme = WT_Filter::post('form_theme', implode('|', get_theme_names()));
+$form_theme = WT_Filter::post('form_theme', implode('|', array_keys(Theme::installedThemes())));
$form_language = WT_Filter::post('form_language', implode('|', array_keys(WT_I18N::installed_languages())), WT_LOCALE);
$form_contact_method = WT_Filter::post('form_contact_method');
$form_visible_online = WT_Filter::postBool('form_visible_online');
@@ -161,7 +162,7 @@ echo '<div id="edituser-page">
<div class="value">
<select name="form_theme">
<option value="">', WT_Filter::escapeHtml(/* I18N: default option in list of themes */ WT_I18N::translate('<default theme>')), '</option>';
- foreach (get_theme_names() as $theme_name => $theme_id) {
+ foreach (Theme::themeNames() as $theme_id => $theme_name) {
echo '<option value="', $theme_id, '"';
if ($theme_id === Auth::user()->getPreference('theme')) {
echo ' selected="selected"';
@@ -170,7 +171,7 @@ echo '<div id="edituser-page">
}
echo '</select>
</div>
- <div class="label">', WT_I18N::translate('Preferred contact method'), help_link('edituser_contact_meth'), '</div>
+ <div class="label">', WT_I18N::translate('Contact method'), help_link('edituser_contact_meth'), '</div>
<div class="value">', edit_field_contact('form_contact_method', Auth::user()->getPreference('contactmethod')), '</div>
<div class="label">', WT_I18N::translate('Visible to other users when online'), help_link('useradmin_visibleonline'), '</div>
<div class="value">', checkbox('form_visible_online', Auth::user()->getPreference('visibleonline')), '</div>
diff --git a/family.php b/family.php
index ec8c405ff2..4a4e3d897c 100644
--- a/family.php
+++ b/family.php
@@ -106,7 +106,7 @@ $show_full = '1';
echo '<a href="#" onclick="return add_spouse_to_family(\'', $controller->record->getXref(), '\', \'HUSB\');">', WT_I18N::translate('Add a new father'), '</a><br>';
}
$wife=$controller->record->getWife();
- if (!$wife) {
+ if (!$wife) {
echo '<a href="#" onclick="return add_spouse_to_family(\'', $controller->record->getXref(), '\', \'WIFE\');">', WT_I18N::translate('Add a new mother'), '</a><br>';
}
}
diff --git a/fanchart.php b/fanchart.php
index 087bc89e54..f395c80ee9 100644
--- a/fanchart.php
+++ b/fanchart.php
@@ -2,7 +2,7 @@
// View for the fan chart.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2010 PGV Development Team.
@@ -30,7 +30,7 @@ $controller = new WT_Controller_Fanchart();
if (WT_Filter::getBool('img')) {
Zend_Session::writeClose();
header('Content-Type: image/png');
- echo $controller->generateFanChart('png', $fanChart); // $fanChart comes from the theme
+ echo $controller->generateFanChart('png');
return;
}
@@ -123,6 +123,6 @@ if ($controller->error_message) {
}
if ($controller->root) {
- echo '<div id="fan_chart">', $controller->generateFanChart('html', $fanChart), '</div>';
+ echo '<div id="fan_chart">', $controller->generateFanChart('html'), '</div>';
}
echo '</div>';
diff --git a/help_text.php b/help_text.php
index 362a239183..8bf7a81505 100644
--- a/help_text.php
+++ b/help_text.php
@@ -2,7 +2,7 @@
// Show help text in a popup window.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This file also serves as a database of fact and label descriptions,
// allowing them to be discovered by xgettext, so we may use them dynamically
@@ -402,308 +402,16 @@ case '_PRIM':
// This section contains an entry for every configuration item
//////////////////////////////////////////////////////////////////////////////
-case 'ADVANCED_NAME_FACTS':
- $title=WT_I18N::translate('Advanced name facts');
- $text=WT_I18N::translate('This is a comma separated list of GEDCOM fact tags that will be shown on the add/edit name form. If you use non-Latin alphabets such as Hebrew, Greek, Cyrillic, or Arabic, you may want to add tags such as _HEB, ROMN, FONE, etc. to allow you to store names in several different alphabets.');
- break;
-
-case 'ADVANCED_PLAC_FACTS':
- $title=WT_I18N::translate('Advanced place name facts');
- $text=WT_I18N::translate('This is a comma separated list of GEDCOM fact tags that will be shown when you add or edit place names. If you use non-Latin alphabets such as Hebrew, Greek, Cyrillic, or Arabic, you may want to add tags such as _HEB, ROMN, FONE, etc. to allow you to store place names in several different alphabets.');
- break;
-
-case 'ALLOW_CHANGE_GEDCOM':
- $title=WT_I18N::translate('Show list of family trees');
- $text=/* I18N: Help text for the “Show list of family trees” site configuration setting */ WT_I18N::translate('For sites with more than one family tree, this option will show the list of family trees in the main menu, the search pages, etc.');
- break;
-
-case 'ALLOW_THEME_DROPDOWN':
- $title=WT_I18N::translate('Theme dropdown selector for theme changes');
- $text=WT_I18N::translate('Gives users the option of selecting their own theme from a menu.<br><br>Even with this option set, the theme currently in effect may not provide for such a menu. To be effective, this option requires the <b>Allow users to select their own theme</b> option to be set as well.');
- break;
-
-case 'ALLOW_USER_THEMES':
- $title=WT_I18N::translate('Allow users to select their own theme');
- $text=WT_I18N::translate('Gives users the option of selecting their own theme.');
- break;
-
-case 'CALENDAR_FORMAT':
- $d1=new WT_Date('22 SEP 1792'); $d1=$d1->display();
- $d2=new WT_Date('31 DEC 1805'); $d2=$d2->display();
- $d3=new WT_Date('15 OCT 1582'); $d3=$d3->display();
- $title=WT_I18N::translate('Calendar conversion');
- $text=
- '<p>'.
- WT_I18N::translate('Different calendar systems are used in different parts of the world, and many other calendar systems have been used in the past. Where possible, you should enter dates using the calendar in which the event was originally recorded. You can then specify a conversion, to show these dates in a more familiar calendar. If you regularly use two calendars, you can specify two conversions and dates will be converted to both the selected calendars.').
- '<p>'.
- WT_I18N::translate('The following calendars are supported:').
- '</p><ul>'.
- '<li>'.WT_Date_Gregorian::calendarName().'</li>'.
- '<li>'.WT_Date_Julian::calendarName().'</li>'.
- '<li>'.WT_Date_Jewish::calendarName().'</li>'.
- '<li>'.WT_Date_French::calendarName().'</li>'.
- '<li>'.WT_Date_Hijri::calendarName().'</li>'.
- '<li>'.WT_Date_Jalali::calendarName().'</li>'.
- '</ul><p>'.
- /* I18N: The three place holders are all dates. */ WT_I18N::translate('Dates are only converted if they are valid for the calendar. For example, only dates between %1$s and %2$s will be converted to the French calendar and only dates after %3$s will be converted to the Gregorian calendar.', $d1, $d2, $d3).
- '</p><p>'.
- WT_I18N::translate('In some calendars, days start at midnight. In other calendars, days start at sunset. The conversion process does not take account of the time, so for any event that occurs between sunset and midnight, the conversion between these types of calendar will be one day out.').
- '</p>';
- break;
-
-case 'CHART_BOX_TAGS':
- $title=WT_I18N::translate('Other facts to show in charts');
- $text=WT_I18N::translate('This should be a comma or space separated list of facts, in addition to birth and death, that you want to appear in chart boxes such as the pedigree chart. This list requires you to use fact tags as defined in the GEDCOM 5.5.1 standard. For example, if you wanted the occupation to show up in the box, you would add “OCCU” to this field.');
- break;
-
case 'CHECK_MARRIAGE_RELATIONS':
$title=WT_I18N::translate('Check relationships by marriage');
$text=WT_I18N::translate('When calculating relationships, this option controls whether webtrees will include spouses/partners as well as blood relatives.');
break;
-case 'COMMON_NAMES_ADD':
- $title=WT_I18N::translate('Names to add to common surnames (comma separated)');
- $text=WT_I18N::translate('If the number of times that a certain surname occurs is lower than the threshold, it will not appear in the list. It can be added here manually. If more than one surname is entered, they must be separated by a comma. <b>Surnames are case-sensitive.</b>');
- break;
-
-case 'COMMON_NAMES_REMOVE':
- $title=WT_I18N::translate('Names to remove from common surnames (comma separated)');
- $text=WT_I18N::translate('If you want to remove a surname from the Common Surname list without increasing the threshold value, you can do that by entering the surname here. If more than one surname is entered, they must be separated by a comma. <b>Surnames are case-sensitive</b>. Surnames entered here will also be removed from the “Top surnames” list on the “Home page”.');
- break;
-
-case 'COMMON_NAMES_THRESHOLD':
- $title=WT_I18N::translate('Min. no. of occurrences to be a “common surname”');
- $text=WT_I18N::translate('This is the number of times that a surname must occur before it shows up in the Common Surname list on the “Home page”.');
- break;
-
-case 'CONTACT_USER_ID':
- $title=WT_I18N::translate('Genealogy contact');
- $text=WT_I18N::translate('The individual to contact about the genealogical data on this site.');
- break;
-
-case 'DEFAULT_PEDIGREE_GENERATIONS':
- $title=WT_I18N::translate('Default pedigree generations');
- $text=WT_I18N::translate('Set the default number of generations to display on descendancy and pedigree charts.');
- break;
-
-case 'EXPAND_NOTES':
- $title=WT_I18N::translate('Automatically expand notes');
- $text=WT_I18N::translate('This option controls whether or not to automatically display content of a <i>Note</i> record on the Individual page.');
- break;
-
-case 'EXPAND_RELATIVES_EVENTS':
- $title=WT_I18N::translate('Automatically expand list of events of close relatives');
- $text=WT_I18N::translate('This option controls whether or not to automatically expand the <i>Events of close relatives</i> list.');
- break;
-
-case 'EXPAND_SOURCES':
- $title=WT_I18N::translate('Automatically expand sources');
- $text=WT_I18N::translate('This option controls whether or not to automatically display content of a <i>Source</i> record on the Individual page.');
- break;
-
-case 'FAM_FACTS_ADD':
- $title=WT_I18N::translate('All family facts');
- $text=WT_I18N::translate('This is the list of GEDCOM facts that your users can add to families. You can modify this list by removing or adding fact names, even custom ones, as necessary. Fact names that appear in this list must not also appear in the “Unique family facts” list.');
- break;
-
-case 'FAM_FACTS_QUICK':
- $title=WT_I18N::translate('Quick family facts');
- $text=WT_I18N::translate('This is the short list of GEDCOM family facts that appears next to the full list and can be added with a single click.');
- break;
-
-case 'FAM_FACTS_UNIQUE':
- $title=WT_I18N::translate('Unique family facts');
- $text=WT_I18N::translate('This is the list of GEDCOM facts that your users can only add once to families. For example, if MARR is in this list, users will not be able to add more than one MARR record to a family. Fact names that appear in this list must not also appear in the “All family facts” list.');
- break;
-
-case 'FAM_ID_PREFIX':
- $title=WT_I18N::translate('Family ID prefix');
- $text=WT_I18N::translate('When a new family record is added online in webtrees, a new ID for that family will be generated automatically. The family ID will have this prefix.');
- break;
-
-case 'FORMAT_TEXT':
- $title=WT_I18N::translate('Format text and notes');
- $text =
- '<p>' .
- WT_I18N::translate('To ensure compatibility with other genealogy applications, notes, text, and transcripts should be recorded in simple, unformatted text. However, formatting is often desirable to aid presentation, comprehension, etc.') .
- '</p><p>' .
- WT_I18N::translate('Markdown is a simple system of formatting, used on websites such as Wikipedia. It uses unobtrusive punctuation characters to create headings and sub-headings, bold and italic text, lists, tables, etc.') .
- '</p>';
- break;
-case 'FULL_SOURCES':
- $title=WT_I18N::translate('Use full source citations');
- $text=WT_I18N::translate('Source citations can include fields to record the quality of the data (primary, secondary, etc.) and the date the event was recorded in the source. If you don’t use these fields, you can disable them when creating new source citations.');
- break;
-
-case 'GEDCOM_ID_PREFIX':
- $title=WT_I18N::translate('Individual ID prefix');
- $text=WT_I18N::translate('When a new individual record is added online in webtrees, a new ID for that individual will be generated automatically. The individual ID will have this prefix.');
- break;
-
-case 'GEDCOM_MEDIA_PATH':
- $title=WT_I18N::translate('GEDCOM media path');
- $text=
- '<p>'.
- // I18N: A “path” is something like “C:\Documents\My_User\Genealogy\Photos\Gravestones\John_Smith.jpeg”
- WT_I18N::translate('Some genealogy applications create GEDCOM files that contain media filenames with full paths. These paths will not exist on the web-server. To allow webtrees to find the file, the first part of the path must be removed.').
- '</p><p>'.
- // I18N: %s are all folder names; “GEDCOM media path” is a configuration setting
- WT_I18N::translate('For example, if the GEDCOM file contains %1$s and webtrees expects to find %2$s in the media folder, then the GEDCOM media path would be %3$s.', '<span class="filename">/home/fab/documents/family/photo.jpeg</span>', '<span class="filename">family/photo.jpeg</span>', '<span class="filename">/home/fab/documents/</span>').
- '</p><p>'.
- WT_I18N::translate('This setting is only used when you read or write GEDCOM files.').
- '</p>';
- break;
-
-case 'GENERATE_GUID':
- $title=WT_I18N::translate('Automatically create globally unique IDs');
- $text=WT_I18N::translate('<b>GUID</b> in this context is an acronym for “Globally Unique ID”.<br><br>GUIDs are intended to help identify each individual in a manner that is repeatable, so that central organizations such as the Family History Center of the LDS church in Salt Lake City, or even compatible programs running on your own server, can determine whether they are dealing with the same individual no matter where the GEDCOM file originates. The goal of the Family History Center is to have a central repository of genealogical data and expose it through web services. This will enable any program to access the data and update their data within it.<br><br>If you do not intend to share this GEDCOM file with anyone else, you do not need to let webtrees create these GUIDs; however, doing so will do no harm other than increasing the size of your GEDCOM file.');
- break;
-
-case 'HIDE_GEDCOM_ERRORS':
- $title=WT_I18N::translate('GEDCOM errors');
- $text=WT_I18N::translate('Many genealogy programs create GEDCOM files with custom tags, and webtrees understands most of them. When unrecognized tags are found, this option lets you choose whether to ignore them or display a warning message.');
- break;
-
-case 'HIDE_LIVE_PEOPLE':
- $title=WT_I18N::translate('Privacy options');
- $text=WT_I18N::translate('This option will enable all privacy settings and hide the details of living individuals, as defined or modified on the Privacy tab of each GEDCOM’s configuration page.');
- $text .= '<p>';
- $text .= WT_I18N::plural('Note: “living” is defined (if no death or burial is known) as ending %d year after birth or estimated birth.','Note: “living” is defined (if no death or burial is known) as ending %d years after birth or estimated birth.', $WT_TREE->getPreference('MAX_ALIVE_AGE'), $WT_TREE->getPreference('MAX_ALIVE_AGE'));
- $text .= ' ';
- $text .= WT_I18N::translate('The length of time after birth can be set on the “Privacy” tab option “Age at which to assume an individual is dead”.');
- $text .= '</p>';
- break;
-
-case 'INDEX_DIRECTORY':
- $title=WT_I18N::translate('Data folder');
- $text=
- '<p>'.
- /* I18N: Help text for the "Data folder" site configuration setting */ WT_I18N::translate('This folder will be used by webtrees to store media files, GEDCOM files, temporary files, etc. These files may contain private data, and should not be made available over the internet.').
- '</p><p>'.
- /* I18N: “Apache” is a software program. */ WT_I18N::translate('To protect this private data, webtrees uses an Apache configuration file (.htaccess) which blocks all access to this folder. If your web-server does not support .htaccess files, and you cannot restrict access to this folder, then you can select another folder, away from your web documents.').
- '</p><p>'.
- WT_I18N::translate('If you select a different folder, you must also move all files (except config.ini.php, index.php, and .htaccess) from the existing folder to the new folder.').
- '</p><p>'.
- WT_I18N::translate('The folder can be specified in full (e.g. /home/user_name/webtrees_data/) or relative to the installation folder (e.g. ../../webtrees_data/).').
- '</p>';
- break;
-
-case 'INDI_FACTS_ADD':
- $title=WT_I18N::translate('All individual facts');
- $text=WT_I18N::translate('This is the list of GEDCOM facts that your users can add to individuals. You can modify this list by removing or adding fact names, even custom ones, as necessary. Fact names that appear in this list must not also appear in the “Unique individual facts” list.');
- break;
-
-case 'INDI_FACTS_QUICK':
- $title=WT_I18N::translate('Quick individual facts');
- $text=WT_I18N::translate('This is the short list of GEDCOM individual facts that appears next to the full list and can be added with a single click.');
- break;
-
-case 'INDI_FACTS_UNIQUE':
- $title=WT_I18N::translate('Unique individual facts');
- $text=WT_I18N::translate('This is the list of GEDCOM facts that your users can only add once to individuals. For example, if BIRT is in this list, users will not be able to add more than one BIRT record to an individual. Fact names that appear in this list must not also appear in the “All individual facts” list.');
- break;
-
-case 'KEEP_ALIVE':
- $title=WT_I18N::translate('Extend privacy to dead individuals');
- $text=WT_I18N::translate('In some countries, privacy laws apply not only to living individuals, but also to those who have died recently. This option will allow you to extend the privacy rules for living individuals to those who were born or died within a specified number of years. Leave these values empty to disable this feature.');
- break;
-
-case 'LANGUAGE':
- $title=WT_I18N::translate('Language');
- $text=WT_I18N::translate('If a visitor to the site has not specified a preferred language in their browser configuration, or they have specified an unsupported language, then this language will be used. Typically, this setting applies to search engines.');
- break;
-
-case 'LOGIN_URL':
- $title=/* I18N: A site configuration setting */ WT_I18N::translate('Login URL');
- $text=/* I18N: Help text for the “Login URL” site configuration setting */ WT_I18N::translate('You only need to enter a Login URL if you want to redirect to a different site or location when your users login. This is very useful if you need to switch from http to https when your users login. Include the full URL to <i>login.php</i>. For example, https://www.yourserver.com/webtrees/login.php .');
- break;
-
-case 'MAX_ALIVE_AGE':
- $title=WT_I18N::translate('Age at which to assume an individual is dead');
- $text=WT_I18N::translate('If this individual has any events other than death, burial, or cremation more recent than this number of years, he is considered to be “alive”. Children’s birth dates are considered to be such events for this purpose.');
- break;
-
case 'MAX_DESCENDANCY_GENERATIONS':
$title=WT_I18N::translate('Maximum descendancy generations');
$text=WT_I18N::translate('Set the maximum number of generations to display on descendancy charts.');
break;
-case 'MAX_EXECUTION_TIME':
- // Find the default value for max_execution_time
- ini_restore('max_execution_time');
- $dflt_cpu=ini_get('max_execution_time');
- $title=WT_I18N::translate('PHP time limit');
- $text=
- WT_I18N::plural(
- 'By default, your server allows scripts to run for %s second.',
- 'By default, your server allows scripts to run for %s seconds.',
- $dflt_cpu, $dflt_cpu
- ).
- ' '.
- WT_I18N::translate('You can request a higher or lower limit, although the server may ignore this request.').
- ' '.
- WT_I18N::translate('If you leave this setting empty, the default value will be used.');
- break;
-
-case 'MAX_PEDIGREE_GENERATIONS':
- $title=WT_I18N::translate('Maximum pedigree generations');
- $text=WT_I18N::translate('Set the maximum number of generations to display on pedigree charts.');
- break;
-
-case 'MEDIA_DIRECTORY':
- $title=WT_I18N::translate('Media folder');
- $text=
- '<p>'.
- WT_I18N::translate('This folder will be used to store the media files for this family tree.').
- '</p><p>'.
- WT_I18N::translate('If you select a different folder, you must also move any media files from the existing folder to the new one.').
- '</p><p>'.
- WT_I18N::translate('If two family trees use the same media folder, then they will be able to share media files. If they use different media folders, then their media files will be kept separate.').
- '</p>';
- break;
-
-case 'MEDIA_ID_PREFIX':
- $title=WT_I18N::translate('Media ID prefix');
- $text=WT_I18N::translate('When a new media record is added online in webtrees, a new ID for that media will be generated automatically. The media ID will have this prefix.');
- break;
-
-case 'MEDIA_UPLOAD':
- $title=WT_I18N::translate('Who can upload new media files?');
- $text=WT_I18N::translate('If you are concerned that users might upload inappropriate images, you can restrict media uploads to managers only.');
- break;
-
-case 'MEMORY_LIMIT':
- // Find the default value for max_execution_time
- ini_restore('memory_limit');
- $dflt_mem=ini_get('memory_limit');
- $title=WT_I18N::translate('Memory limit');
- $text= /* I18N: %s is an amount of memory, such as 32MB */ WT_I18N::translate('By default, your server allows scripts to use %s of memory.', $dflt_mem).
- ' '.
- WT_I18N::translate('You can request a higher or lower limit, although the server may ignore this request.').
- ' '.
- WT_I18N::translate('If you leave this setting empty, the default value will be used.');
- break;
-
-case 'META_DESCRIPTION':
- $title=WT_I18N::translate('Description META tag');
- $text=WT_I18N::translate('The value to place in the “meta description” tag in the HTML page header. Leave this field empty to use the name of the family tree.');
- break;
-
-case 'META_TITLE':
- $title=WT_I18N::translate('Add to TITLE header tag');
- $text=WT_I18N::translate('This text will be appended to each page title. It will be shown in the browser’s title bar, bookmarks, etc.');
- break;
-
-case 'NOTE_ID_PREFIX':
- $title=WT_I18N::translate('Note ID prefix');
- $text=WT_I18N::translate('When a new note record is added online in webtrees, a new ID for that note will be generated automatically. The note ID will have this prefix.');
- break;
-
-case 'PEDIGREE_FULL_DETAILS':
- $title=/* I18N: A site configuration setting */ WT_I18N::translate('Show chart details by default');
- $text=/* I18N: Help text for the “Show chart details by default” tree configuration setting */ WT_I18N::translate('This is the initial setting for the “show details” option on the charts.');
- break;
-
case 'PEDIGREE_LAYOUT':
$title=/* I18N: A site configuration setting */ WT_I18N::translate('Default pedigree chart layout');
$text=/* I18N: Help text for the “Default pedigree chart layout” tree configuration setting */ WT_I18N::translate('This option indicates whether the pedigree chart should be generated in landscape or portrait mode.');
@@ -724,149 +432,9 @@ case 'RELATIONSHIP_PATH_LENGTH':
WT_I18N::translate('Note: longer path lengths require a lot of calculation, which can make your site run slowly for these users.');
break;
-case 'SESSION_TIME':
- $title/* I18N: A site configuration setting */ =WT_I18N::translate('Session timeout');
- $text=/* I18N: Help text for the “Session timeout” site configuration setting */ WT_I18N::translate('The time in seconds that a webtrees session remains active before requiring a login. The default is 7200, which is 2 hours.');
- break;
-
-case 'SMTP_ACTIVE':
- $title=/* I18N: A site configuration setting */ WT_I18N::translate('Messages');
- $text=/* I18N: Help text for the “Messages” site configuration setting */ WT_I18N::translate('webtrees needs to send emails, such as password reminders and site notifications. To do this, it can use this server’s built in PHP mail facility (which is not always available) or an external SMTP (mail-relay) service, for which you will need to provide the connection details.');
- break;
-
-case 'SMTP_AUTH_PASS':
- $title=WT_I18N::translate('Password');
- $text=WT_I18N::translate('The password required for authentication with the SMTP server.');
- break;
-
-case 'SMTP_AUTH_USER':
- $title=WT_I18N::translate('Username');
- $text=WT_I18N::translate('The user name required for authentication with the SMTP server.');
- break;
-
-case 'SMTP_AUTH':
- $title=WT_I18N::translate('Use password');
- $text=/* I18N: Help text for the “Use password” site configuration setting */ WT_I18N::translate('Most SMTP servers require a password.');
- break;
-
-case 'SMTP_FROM_NAME':
- $title=/* I18N: A site configuration setting */ WT_I18N::translate('Sender name');
- $text=/* I18N: Help text for the “Sender name” site configuration setting */ WT_I18N::translate('This name is used in the “From” field, when sending automatic emails from this server.');
- break;
-
-case 'SMTP_HELO':
- $title=/* I18N: A site configuration setting */ WT_I18N::translate('Sending server name');
- $text=/* I18N: Help text for the “Sending server name” site configuration setting */ WT_I18N::translate('Many mail servers require that the sending server identifies itself correctly, using a valid domain name.');
- break;
-
-case 'SMTP_HOST':
- $title=/* I18N: A site configuration setting */ WT_I18N::translate('Server name');
- $text=/* I18N: Help text for the “Server name” site configuration setting */ WT_I18N::translate('This is the name of the SMTP server. “localhost” means that the mail service is running on the same computer as your web server.');
- break;
-
-case 'SMTP_PORT':
- $title=/* I18N: A site configuration setting */ WT_I18N::translate('Port number');
- $text=/* I18N: Help text for the "Port number" site configuration setting */ WT_I18N::translate('By default, SMTP works on port 25.');
- break;
-
-case 'SMTP_SSL':
- $title=/* I18N: A site configuration setting */ WT_I18N::translate('Secure connection');
- $text=/* I18N: Help text for the "Secure connection" site configuration setting */ WT_I18N::translate('Most servers do not use secure connections.');
- break;
-
-case 'WEBTREES_EMAIL':
- $title=WT_I18N::translate('webtrees reply address');
- $text=WT_I18N::translate('E-mail address to be used in the “From:” field of e-mails that webtrees creates automatically.<br><br>webtrees can automatically create e-mails to notify administrators of changes that need to be reviewed. webtrees also sends notification e-mails to users who have requested an account.<br><br>Usually, the “From:” field of these automatically created e-mails is something like <i>From: webtrees-noreply@yoursite</i> to show that no response to the e-mail is required. To guard against spam or other e-mail abuse, some e-mail systems require each message’s “From:” field to reflect a valid e-mail account and will not accept messages that are apparently from account <i>webtrees-noreply</i>.');
- break;
-
-case 'PREFER_LEVEL2_SOURCES':
- $title=WT_I18N::translate('Source type');
- $text=WT_I18N::translate('When adding new close relatives, you can add source citations to the records (e.g. INDI, FAM) or the facts (BIRT, MARR, DEAT). This option controls which checkboxes are ticked by default.');
- break;
-
-case 'QUICK_REQUIRED_FACTS':
- $title=WT_I18N::translate('Facts for new individuals');
- $text=WT_I18N::translate('This is a comma separated list of GEDCOM fact tags that will be shown when adding a new individual. For example, if BIRT is in the list, fields for birth date and birth place will be shown on the form.');
- break;
-
-case 'QUICK_REQUIRED_FAMFACTS':
- $title=WT_I18N::translate('Facts for new families');
- $text=WT_I18N::translate('This is a comma separated list of GEDCOM fact tags that will be shown when adding a new family. For example, if MARR is in the list, then fields for marriage date and marriage place will be shown on the form.');
- break;
-
-case 'REPO_FACTS_ADD':
- $title=WT_I18N::translate('All repository facts');
- $text=WT_I18N::translate('This is the list of GEDCOM facts that your users can add to repositories. You can modify this list by removing or adding fact names, even custom ones, as necessary. Fact names that appear in this list must not also appear in the “Unique repository facts” list.');
- break;
-
-case 'REPO_FACTS_QUICK':
- $title=WT_I18N::translate('Quick repository facts');
- $text=WT_I18N::translate('This is the short list of GEDCOM repository facts that appears next to the full list and can be added with a single click.');
- break;
-
-case 'REPO_FACTS_UNIQUE':
- $title=WT_I18N::translate('Unique repository facts');
- $text=WT_I18N::translate('This is the list of GEDCOM facts that your users can only add once to repositories. For example, if NAME is in this list, users will not be able to add more than one NAME record to a repository. Fact names that appear in this list must not also appear in the “All repository facts” list.');
- break;
-
-case 'REPO_ID_PREFIX':
- $title=WT_I18N::translate('Repository ID prefix');
- $text=WT_I18N::translate('When a new repository record is added online in webtrees, a new ID for that repository will be generated automatically. The repository ID will have this prefix.');
- break;
-
-case 'REQUIRE_ADMIN_AUTH_REGISTRATION':
- $title=WT_I18N::translate('Require an administrator to approve new user registrations');
- $text=WT_I18N::translate('If the option <b>Allow visitors to request account registration</b> is enabled this setting controls whether the admin must approve the registration.<br><br>Setting this to <b>Yes</b> will require that all new users first verify themselves and then be approved by an admin before they can login. With this setting on <b>No</b>, the “Approved by administrator” checkbox will be checked automatically when users verify their account, thus allowing an immediate login afterwards without admin intervention.');
- break;
-
-case 'REQUIRE_AUTHENTICATION':
- $title=WT_I18N::translate('Require visitor authentication');
- $text=WT_I18N::translate('Enabling this option will force all visitors to login before they can view any data on the site.');
- break;
-
-case 'SERVER_URL':
- $title=WT_I18N::translate('Website URL');
- $text=/* I18N: Help text for the "Website URL" site configuration setting */ WT_I18N::translate('If your site can be reached using more than one URL, such as <b>http://www.example.com/webtrees/</b> and <b>http://webtrees.example.com/</b>, you can specify the preferred URL. Requests for the other URLs will be redirected to the preferred one.');
- break;
-
-case 'SHOW_COUNTER':
- $title=WT_I18N::translate('Hit counters');
- $text=WT_I18N::translate('Show hit counters on Portal and Individual pages.');
- break;
-
-case 'SHOW_DEAD_PEOPLE':
- $title=WT_I18N::translate('Show dead individuals');
- $text=WT_I18N::translate('Set the privacy access level for all dead individuals.');
- break;
-
case 'SHOW_EST_LIST_DATES':
$title=WT_I18N::translate('Estimated dates for birth and death');
$text=WT_I18N::translate('This option controls whether or not to show estimated dates for birth and death instead of leaving blanks on individual lists and charts for individuals whose dates are not known.');
- break;
-
-case 'SHOW_FACT_ICONS':
- $title=WT_I18N::translate('Show fact icons');
- $text=WT_I18N::translate('Set this to <b>Yes</b> to display icons near Fact names on the Personal Facts and Details page. Fact icons will be displayed only if they exist in the <i>images/facts</i> directory of the current theme.');
- break;
-
-case 'SHOW_GEDCOM_RECORD':
- $title=WT_I18N::translate('Allow users to see raw GEDCOM records');
- $text=WT_I18N::translate('Setting this to <b>Yes</b> will place links on individuals, sources, and families to let users bring up another window containing the raw data taken right out of the GEDCOM file.');
- break;
-
-case 'SHOW_LDS_AT_GLANCE':
- $title=WT_I18N::translate('LDS ordinance codes in chart boxes');
- $text=WT_I18N::translate('Setting this option to <b>Yes</b> will show status codes for LDS ordinances in chart boxes.<ul><li><b>B</b> - Baptism</li><li><b>E</b> - Endowed</li><li><b>S</b> - Sealed to spouse</li><li><b>P</b> - Sealed to parents</li></ul>An individual who has all of the ordinances done will have <b>BESP</b> printed after their name. Missing ordinances are indicated by <b>_</b> in place of the corresponding letter code. For example, <b>BE__</b> indicates missing <b>S</b> and <b>P</b> ordinances.');
- break;
-
-case 'SHOW_LEVEL2_NOTES':
- $title=WT_I18N::translate('Show all notes and source references on notes and sources tabs');
- $text=WT_I18N::translate('This option controls whether Notes and Source references that are attached to Facts should be shown on the Notes and Sources tabs of the Individual page.<br><br>Ordinarily, the Notes and Sources tabs show only Notes and Source references that are attached directly to the individual’s database record. These are <i>level 1</i> Notes and Source references.<br><br>The <b>Yes</b> option causes these tabs to also show Notes and Source references that are part of the various Facts in the individual’s database record. These are <i>level 2</i> Notes and Source references because the various Facts are at level 1.');
- break;
-
-case 'SHOW_LIVING_NAMES':
- $title=WT_I18N::translate('Names of private individuals');
- $text=WT_I18N::translate('This option will show the names (but no other details) of private individuals. Individuals are private if they are still alive or if a privacy restriction has been added to their individual record. To hide a specific name, add a privacy restriction to that name record.');
break;
@@ -880,176 +448,16 @@ case 'SHOW_PARENTS_AGE':
$text=WT_I18N::translate('This option controls whether or not to show age of father and mother next to child’s birthdate on charts.');
break;
-case 'SHOW_PEDIGREE_PLACES':
- $title=WT_I18N::translate('Abbreviate place names');
- $text=WT_I18N::translate('Place names are frequently too long to fit on charts, lists, etc. They can be abbreviated by showing just the first few parts of the name, such as <i>village, county</i>, or the last few part of it, such as <i>region, country</i>.');
- break;
-
-case 'SHOW_PRIVATE_RELATIONSHIPS':
- $title=WT_I18N::translate('Show private relationships');
- $text=WT_I18N::translate('This option will retain family links in private records. This means that you will see empty “private” boxes on the pedigree chart and on other charts with private individuals.');
- break;
-
-case 'SHOW_REGISTER_CAUTION':
- $title=WT_I18N::translate('Show acceptable use agreement on “Request new user account” page');
- $text=WT_I18N::translate('When set to <b>Yes</b>, the following message will appear above the input fields on the “Request new user account” page:<div class="list_value_wrap"><div class="largeError">Notice:</div><div class="error">By completing and submitting this form, you agree:<ul><li>to protect the privacy of living individuals listed on our site;</li><li>and in the text box below, to explain to whom you are related, or to provide us with information on someone who should be listed on our site.</li></ul></div></div>');
- break;
-
-case 'SHOW_STATS':
- $title=WT_I18N::translate('Execution statistics');
- $text=WT_I18N::translate('Show runtime statistics and database queries at the bottom of every page.');
- break;
-
-case 'SOURCE_ID_PREFIX':
- $title=WT_I18N::translate('Source ID prefix');
- $text=WT_I18N::translate('When a new source record is added online in webtrees, a new ID for that source will be generated automatically. The source ID will have this prefix.');
- break;
-
-case 'SOUR_FACTS_ADD':
- $title=WT_I18N::translate('All source facts');
- $text=WT_I18N::translate('This is the list of GEDCOM facts that your users can add to sources. You can modify this list by removing or adding fact names, even custom ones, as necessary. Fact names that appear in this list must not also appear in the “Unique source facts” list.');
- break;
-
-case 'SOUR_FACTS_QUICK':
- $title=WT_I18N::translate('Quick source facts');
- $text=WT_I18N::translate('This is the short list of GEDCOM source facts that appears next to the full list and can be added with a single click.');
- break;
-
-case 'SOUR_FACTS_UNIQUE':
- $title=WT_I18N::translate('Unique source facts');
- $text=WT_I18N::translate('This is the list of GEDCOM facts that your users can only add once to sources. For example, if TITL is in this list, users will not be able to add more than one TITL record to a source. Fact names that appear in this list must not also appear in the “All source facts” list.');
- break;
-
-case 'SUBLIST_TRIGGER_I':
- $title=WT_I18N::translate('Maximum number of surnames on individual list');
- $text=WT_I18N::translate('Long lists of individuals with the same surname can be broken into smaller sub-lists according to the first letter of the individual’s given name.<br><br>This option determines when sub-listing of surnames will occur. To disable sub-listing completely, set this option to zero.');
- break;
-
-case 'SURNAME_TRADITION':
- $title=WT_I18N::translate('Surname tradition');
- $text=
- WT_I18N::translate('When you add a new family member, a default surname can be provided. This surname will depend on the local tradition.').
- '<br><br><dl><dt>'.
- /* I18N: https://en.wikipedia.org/wiki/Patrilineal (a system where children take their father’s surname */
- WT_I18N::translate('patrilineal').
- '</dt><dd>'.
- /* I18N: In the patrilineal surname tradition, ... */
- WT_I18N::translate('Children take their father’s surname.').
- '</dd></dl><dl><dt>'.
- /* I18N: https://en.wikipedia.org/wiki/Matrilineal (a system where children take their mother’s surname */
- WT_I18N::translate('matrilineal').
- '</dt><dd>'.
- /* I18N: In the matrilineal surname tradition, ... */
- WT_I18N::translate('Children take their mother’s surname.').
- '</dd></dl><dl><dt>'.
- WT_I18N::translate_c('Surname tradition', 'paternal').
- '</dt><dd>'.
- WT_I18N::translate('Children take their father’s surname.') . '<br>' .
- /* I18N: In the paternal surname tradition, ... */
- WT_I18N::translate('Wives take their husband’s surname.').
- '</dd></dl><dl><dt>'.
- WT_I18N::translate_c('Surname tradition', 'Spanish').
- '</dt><dd>'.
- /* I18N: In the Spanish surname tradition, ... */
- WT_I18N::translate('Children take one surname from the father and one surname from the mother.').
- '</dd></dl><dl><dt>'.
- WT_I18N::translate_c('Surname tradition', 'Portuguese').
- '</dt><dd>'.
- /* I18N: In the Portuguese surname tradition, ... */
- WT_I18N::translate('Children take one surname from the mother and one surname from the father.').
- '</dd></dl><dl><dt>'.
- WT_I18N::translate_c('Surname tradition', 'Icelandic').
- '</dt><dd>'.
- /* I18N: In the Icelandic surname tradition, ... */
- WT_I18N::translate('Children take a patronym instead of a surname.').
- '</dd></dl><dl><dt>'.
- WT_I18N::translate_c('Surname tradition', 'Polish').
- '</dt><dd>'.
- WT_I18N::translate('Children take their father’s surname.') . '<br>' .
- WT_I18N::translate('Wives take their husband’s surname.') . '<br>' .
- /* I18N: In the Polish surname tradition, ... */
- WT_I18N::translate('Surnames are inflected to indicate an individual’s gender.').
- '</dd></dl><dl><dt>'.
- WT_I18N::translate_c('Surname tradition', 'Lithuanian').
- '</dt><dd>'.
- WT_I18N::translate('Children take their father’s surname.') . '<br>' .
- WT_I18N::translate('Wives take their husband’s surname.') . '<br>' .
- /* I18N: In the Lithuanian surname tradition, ... */
- WT_I18N::translate('Surnames are inflected to indicate an individual’s gender and marital status.').
- '</dd></dl>';
- break;
-
-case 'THEME':
- $title=WT_I18N::translate('Theme');
- $text=
- /* I18N: Help text for the "Default theme" site configuration setting */ WT_I18N::translate('You can change the appearance of webtrees using “themes”. Each theme has a different style, layout, color scheme, etc.').
- '<br><br>'.
- WT_I18N::translate('Themes can be selected at three levels: user, GEDCOM, and site. User settings take priority over GEDCOM settings, which in turn take priority over the site setting. Selecting “default theme” at user level will give the setting for the current GEDCOM. Selecting “default theme” at GEDCOM level will give the site setting.');
- break;
-
case 'THUMBNAIL_WIDTH':
$title=WT_I18N::translate('Width of generated thumbnails');
$text=WT_I18N::translate('This is the width (in pixels) that the program will use when automatically generating thumbnails. The default setting is 100.');
break;
-case 'GEONAMES_ACCOUNT':
- $title=WT_I18N::translate('Use the GeoNames database for autocomplete on places');
- $text=WT_I18N::translate('The website www.geonames.org provides a large database of place names. This can be searched when entering new places. To use this feature, you must register for a free account at www.geonames.org and provide the username.');
- break;
-
-case 'USE_REGISTRATION_MODULE':
- $title=WT_I18N::translate('Allow visitors to request account registration');
- $text=WT_I18N::translate('Gives visitors the option of registering themselves for an account on the site.<br><br>The visitor will receive an email message with a code to verify his application for an account. After verification, an administrator will have to approve the registration before it becomes active.');
- break;
-
case 'USE_RELATIONSHIP_PRIVACY':
$title=WT_I18N::translate('Use relationship privacy');
$text=WT_I18N::translate('<b>No</b> means that authenticated users can see the details of all living individuals. <b>Yes</b> means that users can only see the private information of living individuals they are related to.<br><br>This option sets the default for all users who have access to this genealogical database. The administrator can override this option for individual users by editing the user’s account details.');
break;
-case 'USE_RIN':
- $title=WT_I18N::translate('Use RIN number instead of GEDCOM ID');
- $text=WT_I18N::translate('Set to <b>Yes</b> to use the RIN number instead of the GEDCOM ID when asked for individual IDs in configuration files, user settings, and charts. This is useful for genealogy programs that do not consistently export GEDCOM files with the same ID assigned to each individual but always use the same RIN.');
- break;
-
-case 'USE_SILHOUETTE':
- $title=WT_I18N::translate('Use silhouettes');
- $text=WT_I18N::translate('Use silhouette images when no highlighted image for that individual has been specified. The images used are specific to the gender of the individual in question.<br><br><table><tr><td style="vertical-align:middle">This image might be used when the gender of the individual is unknown:')
- ." </td><td><img src=\"" . $WT_IMAGES["default_image_U"] . "\" width=\"40\" alt=\"\" title=\"\" /></td></tr></table>";
- break;
-
-case 'Watermarks':
- $title = WT_I18N::translate('Watermarks');
- $text =
- '<p>' .
- WT_I18N::translate('A watermark is text that is added to an image, to discourage others from copying it without permission.') .
- '</p><p>' .
- WT_I18N::translate('Watermarks are optional and normally shown just to visitors.') .
- '</p><p>' .
- WT_I18N::translate('Watermarks can be slow to generate for large images. Busy sites may prefer to generate them once and store the watermarked image on the server.') .
- '</p>';
- break;
-
-case 'WEBMASTER_USER_ID':
- $title=WT_I18N::translate('Technical help contact');
- $text=WT_I18N::translate('The individual to be contacted about technical questions or errors encountered on your site.');
- break;
-
-case 'WELCOME_TEXT_AUTH_MODE_CUST':
- $title=WT_I18N::translate('Custom welcome text');
- $text=WT_I18N::translate('If you have opted for custom welcome text, you can type that text here. To set this text for other languages, you must switch to that language, and visit this page again.');
- break;
-
-case 'WELCOME_TEXT_AUTH_MODE':
- $title=WT_I18N::translate('Welcome text on login page');
- $text=WT_I18N::translate('Here you can choose text to appear on the login screen. You must determine which predefined text is most appropriate.<br><br>You can also choose to enter your own custom Welcome text. Please refer to the help text associated with the <b>Custom Welcome text</b> field for more information.<br><br>The predefined texts are:<ul><li><b>Predefined text that states all users can request a user account:</b><div class="list_value_wrap"><center><b>Welcome to this genealogy website</b></center><br>Access to this site is permitted to every visitor who has a user account.<br><br>If you have a user account, you can login on this page. If you don’t have a user account, you can apply for one by clicking on the appropriate link below.<br><br>After verifying your application, the site administrator will activate your account. You will receive an email when your application has been approved.</div><br></li><li><b>Predefined text that states admin will decide on each request for a user account:</b><div class="list_value_wrap"><center><b>Welcome to this genealogy website</b></center><br>Access to this site is permitted to <u>authorized</u> users only.<br><br>If you have a user account you can login on this page. If you don’t have a user account, you can apply for one by clicking on the appropriate link below.<br><br>After verifying your information, the administrator will either approve or decline your account application. You will receive an email message when your application has been approved.</div><br></li><li><b>Predefined text that states only family members can request a user account:</b><div class="list_value_wrap"><center><b>Welcome to this genealogy website</b></center><br>Access to this site is permitted to <u>family members only</u>.<br><br>If you have a user account you can login on this page. If you don’t have a user account, you can apply for one by clicking on the appropriate link below.<br><br>After verifying the information you provide, the administrator will either approve or decline your request for an account. You will receive an email when your request is approved.</div></li></ul>');
- break;
-
-case 'WORD_WRAPPED_NOTES':
- $title=WT_I18N::translate('Add spaces where notes were wrapped');
- $text=WT_I18N::translate('Some genealogy programs wrap notes at word boundaries while others wrap notes anywhere. This can cause webtrees to run words together. Setting this to <b>Yes</b> will add a space between words where they are wrapped in the original GEDCOM file during the import process. If you have already imported the file you will need to re-import it.');
- break;
-
//////////////////////////////////////////////////////////////////////////////
// This section contains all the other help items.
//////////////////////////////////////////////////////////////////////////////
@@ -1063,14 +471,6 @@ case 'add_facts':
$text.=WT_I18N::translate('webtrees allows you to copy up to 10 facts, with all their details, to a clipboard. This clipboard is different from the clippings cart that you can use to export portions of your database.<br><br>You can select any of the facts from the clipboard and copy the selected fact to the individual, family, media, source, or repository record currently being edited. However, you cannot copy facts of dissimilar record types. For example, you cannot copy a marriage fact to a source or an individual record since the marriage fact is associated only with family records.<br><br>This is very helpful when entering similar facts, such as census facts, for many individuals or families.');
break;
-case 'add_new_gedcom':
- $title=WT_I18N::translate('Create a new family tree');
- $text=
- WT_I18N::translate('This option creates a new family tree. The name you give it will be used to generate URLs and filenames, so you should choose something short, simple, and avoid punctuation.').
- '<br><br>'.
- WT_I18N::translate('After creating the family tree, you will be able to upload or import data from a GEDCOM file.');
- break;
-
case 'add_note':
// This is a general help text for multiple pages
$title=WT_I18N::translate('Add a new note');
@@ -1094,11 +494,6 @@ case 'annivers_year_select':
$text=WT_I18N::translate('This input box lets you change that year of the calendar. Type a year into the box and press <b>Enter</b> to change the calendar to that year.<br><br><b>Advanced features</b> for <b>View year</b><dl><dt><b>More than one year</b></dt><dd>You can search for dates in a range of years.<br><br>Year ranges are <u>inclusive</u>. This means that the date range extends from 1 January of the first year of the range to 31 December of the last year mentioned. Here are a few examples of year ranges:<br><br><b>1992-5</b> for all events from 1992 to 1995.<br><b>1972-89</b> for all events from 1972 to 1989.<br><b>1610-759</b> for all events from 1610 to 1759.<br><b>1880-1905</b> for all events from 1880 to 1905.<br><b>880-1105</b> for all events from 880 to 1105.<br><br>To see all the events in a given decade or century, you can use <b>?</b> in place of the final digits. For example, <b>197?</b> for all events from 1970 to 1979 or <b>16??</b> for all events from 1600 to 1699.<br><br>Selecting a range of years will change the calendar to the year view.</dd></dl>');
break;
-case 'apply_privacy':
- $title=WT_I18N::translate('Apply privacy settings?');
- $text=WT_I18N::translate('This option will remove private data from the downloaded GEDCOM file. The file will be filtered according to the privacy settings that apply to each access level. Privacy settings are specified on the GEDCOM configuration page.');
- break;
-
case 'block_move_right':
$title=WT_I18N::translate('Move list entries');
$text=WT_I18N::translate('Use these buttons to move an entry from one list to another.<br><br>Highlight the entry to be moved, and then click a button to move or copy that entry in the direction of the arrow. Use the <b>&raquo;</b> and <b>&laquo;</b> buttons to move the highlighted entry from the leftmost to the rightmost list or vice-versa. Use the <b>&gt;</b> and <b>&lt;</b> buttons to move the highlighted entry between the Available blocks list and the list to its right or left.<br><br>The entries in the Available Blocks list do not change, regardless of what you do with the Move right and Move left buttons. This is so because the same block can appear several times on the same page. The HTML block is a good example of why you might want to do this.');
@@ -1114,21 +509,11 @@ case 'default_gedcom':
$text=WT_I18N::translate('This option selects the family tree that is shown to visitors when they first arrive at the site.');
break;
-case 'default_individual':
- $title=WT_I18N::translate('Default individual');
- $text=WT_I18N::translate('This individual will be selected by default when viewing charts and reports.');
- break;
-
case 'download_gedcom':
$title=WT_I18N::translate('Download family tree');
$text=WT_I18N::translate('This option will download the family tree to a GEDCOM file on your computer.');
break;
-case 'download_zipped':
- $title=WT_I18N::translate('Download ZIP file');
- $text=WT_I18N::translate('When you check this option, a copy of the GEDCOM file will be compressed into ZIP format before the download begins. This will reduce its size considerably, but you will need to use a compatible Unzip program (WinZIP, for example) to decompress the transmitted GEDCOM file before you can use it.<br><br>This is a useful option for downloading large GEDCOM files. There is a risk that the download time for the uncompressed file may exceed the maximum allowed execution time, resulting in incompletely downloaded files. The ZIP option should reduce the download time by 75 percent.');
- break;
-
case 'edit_add_ASSO':
$title=WT_I18N::translate('Add a new associate');
$text=WT_I18N::translate('Add a new associate allows you to link a fact with an associated individual in the site. This is one way in which you might record that someone was the godfather of another individual.');
@@ -1176,25 +561,8 @@ case 'edit_SOUR_EVEN':
break;
case 'edituser_contact_meth':
- $title=WT_I18N::translate('Preferred contact method');
- $text=WT_I18N::translate('webtrees has several different contact methods. The administrator determines which method will be used to contact him. You have control over the method to be used to contact <u>you</u>. Depending on site configuration, some of the listed methods may not be available to you.');
- $text.='<br><br><dl><dt>';
- $text.=WT_I18N::translate('Internal messaging');
- $text.='</dt><dd>';
- $text.=WT_I18N::translate('With this option, the webtrees internal messaging system will be used and no emails will be sent. You will receive only <u>internal</u> messages from the other users. When another site user sends you a message, that message will appear in the Message block on your “My page”. If you have removed this block from your “My page”, you will not see any messages. They will, however, show up as soon as you configure your “My page” to again have the Message block.');
- $text.='</dd><dt>';
- $text.=WT_I18N::translate('Internal messaging with emails');
- $text.='</dt><dd>';
- $text.=WT_I18N::translate('This option is like webtrees internal messaging, with one addition. As an extra, a copy of the message will also be sent to the email address you configured on your Account page. This is the default contact method.');
- $text.='</dd><dt>';
- $text.=WT_I18N::translate('Mailto link');
- $text.='</dt><dd>';
- $text.=WT_I18N::translate('With this option, you will only receive email messages at the address you configured on your Account page. The messaging system internal to webtrees will not be used at all, and there will never be any messages in the Message block on your “My page”.');
- $text.='</dd><dt>';
- $text.=WT_I18N::translate('No contact method');
- $text.='</dt><dd>';
- $text.=WT_I18N::translate('With this option, you will not receive any messages. Even the administrator will not be able to reach you.');
- $text.='</dd></dl>';
+ $title=WT_I18N::translate('Contact method');
+ $text=WT_I18N::translate('Site members can send each other messages. You can choose to how these messages are sent to you, or choose not receive them at all.');
break;
case 'edituser_gedcomid':
@@ -1299,31 +667,6 @@ case 'password_confirm':
$text=WT_I18N::translate('Type your password again, to make sure you have typed it correctly.');
break;
-case 'PGV_WIZARD':
- $title=WT_I18N::translate('PhpGedView to webtrees transfer wizard');
- $text =WT_I18N::translate('The PGV to webtrees wizard is an automated process to assist administrators make the move from a PGV installation to a new webtrees one. It will transfer all PGV GEDCOM and other database information directly to your new webtrees database. The following requirements are necessary:');
- $text .= '<ul><li>';
- $text .= WT_I18N::translate('webtrees’ database must be on the same server as PGV’s');
- $text .= '</li><li>';
- $text .= WT_I18N::translate('PGV must be version 4.2.3, or any SVN up to #6973');
- $text .= '</li><li>';
- $text .= WT_I18N::translate('All changes in PGV must be accepted');
- $text .= '</li><li>';
- $text .= WT_I18N::translate('You must export your latest GEDCOM data');
- $text .= '</li><li>';
- $text .= WT_I18N::translate('The current webtrees admin username must be the same as an existing PGV admin username');
- $text .= '</li><li>';
- $text .= WT_I18N::translate('All existing PGV users must have distinct email addresses');
- $text .= '</li></ul><p>';
- $text .= WT_I18N::translate('<b>Important note:</b> The transfer wizard is not able to assist with moving media items. You will need to set up and move or copy your media configuration and objects separately after the transfer wizard is finished.');
- $text .= '</p>';
- break;
-
-case 'phpinfo':
- $title=WT_I18N::translate('PHP information');
- $text=WT_I18N::translate('This page provides extensive information about the server on which webtrees is being hosted. Many configuration details about the server’s software, as it relates to PHP and webtrees, can be viewed.');
- break;
-
case 'pending_changes':
$title=WT_I18N::translate('Pending changes');
$text=
@@ -1399,11 +742,6 @@ case 'role':
'</dd>';
break;
-case 'SHOW_AGE_DIFF':
- $title=WT_I18N::translate('Date differences');
- $text=WT_I18N::translate('When this option is selected, webtrees will calculate the age differences between siblings, children, spouses, etc.');
- break;
-
case 'show_fact_sources':
$title=WT_I18N::translate('Show all sources');
$text=WT_I18N::translate('When this option is checked, you can see all source or note records for this individual. When this option is unchecked, source or note records that are associated with other facts for this individual will not be shown.');
@@ -1447,38 +785,11 @@ case 'upload_thumbnail_file':
$text=WT_I18N::translate('Choose the thumbnail image that you want to upload. Although thumbnails can be generated automatically for images, you may wish to generate your own thumbnail, especially for other media types. For example, you can provide a still image from a video, or a photograph of the individual who made an audio recording.');
break;
-case 'useradmin_auto_accept':
- $title=WT_I18N::translate('Automatically approve changes made by this user');
- $text=WT_I18N::translate('Normally, any changes made to a family tree need to be approved by a moderator. This option allows a user to make changes without needing a moderator’s approval.');
- break;
-
-
-case 'useradmin_editaccount':
- $title=WT_I18N::translate('Edit account information');
- $text=WT_I18N::translate('If this box is checked, this user will be able to edit his account information. Although this is not generally recommended, you can create a single user name and password for multiple users. When this box is unchecked for all users with the shared account, they are prevented from editing the account information and only an administrator can alter that account.');
- break;
-
case 'useradmin_gedcomid':
$title=WT_I18N::translate('Individual record');
$text=WT_I18N::translate('The individual record identifies the user in each family tree. Since a user can view the details of their individual record, this can only be set by an administrator. If the user does not have a record in a family tree, leave it empty.');
break;
-case 'useradmin_verification':
- $title=WT_I18N::translate('Account approval and email verification');
- $text=WT_I18N::translate('When a user registers for an account, an email is sent to their email address with a verification link. When they click this link, we know the email address is correct, and the “email verified” option is selected automatically.').
- '<br><br>'.
- WT_I18N::translate('If an administrator creates a user account, the verification email is not sent, and the email must be verified manually.').
- '<br><br>'.
- WT_I18N::translate('You should not approve an account unless you know that the email address is correct.').
- '<br><br>'.
- WT_I18N::translate('A user will not be able to login until both the “email verified” and “approved by administrator” options are selected.');
- break;
-
-case 'useradmin_visibleonline':
- $title=WT_I18N::translate('Visible online');
- $text=WT_I18N::translate('This checkbox controls your visibility to other users while you’re online. It also controls your ability to see other online users who are configured to be visible.<br><br>When this box is unchecked, you will be completely invisible to others, and you will also not be able to see other online users. When this box is checked, exactly the opposite is true. You will be visible to others, and you will also be able to see others who are configured to be visible.');
- break;
-
case 'username':
$title=WT_I18N::translate('Username');
$text=
@@ -1489,11 +800,6 @@ case 'username':
'</p>';
break;
-case 'utf8_ansi':
- $title=WT_I18N::translate('Convert from UTF-8 to ANSI (ISO-8859-1)');
- $text=WT_I18N::translate('For optimal display on the internet, webtrees uses the UTF-8 character set. Some programs, Family Tree Maker for example, do not support importing GEDCOM files encoded in UTF-8. Checking this box will convert the file from <b>UTF-8</b> to <b>ANSI (ISO-8859-1)</b>.<br><br>The format you need depends on the program you use to work with your downloaded GEDCOM file. If you aren’t sure, consult the documentation of that program.<br><br>Note that for special characters to remain unchanged, you will need to keep the file in UTF-8 and convert it to your program’s method for handling these special characters by some other means. Consult your program’s manufacturer or author.<br><br>This <a href="http://en.wikipedia.org/wiki/UTF-8" target="_blank" title="Wikipedia article"><b>Wikipedia article</b></a> contains comprehensive information and links about UTF-8.');
- break;
-
case 'zip':
$title=WT_I18N::translate('Zip clippings');
$text=WT_I18N::translate('Select this option as to save your clippings in a ZIP file. For more information about ZIP files, please visit <a href="http://www.winzip.com" target="_blank">http://www.winzip.com</a>.');
diff --git a/import.php b/import.php
index a855d6e567..55062dbc45 100644
--- a/import.php
+++ b/import.php
@@ -10,7 +10,7 @@
// flag.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 Greg Roach
+// Copyright (C) 2015 Greg Roach
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -65,20 +65,29 @@ if ($row->import_offset==$row->import_total) {
// Finished? Show the maintenance links, similar to admin_trees_manage.php
WT_DB::commit();
$controller->addInlineJavascript(
- 'jQuery("#import'. $gedcom_id.'").toggle();'.
- 'jQuery("#actions'.$gedcom_id.'").toggle();'
+ 'jQuery("#import'. $gedcom_id.'").addClass("hidden");'.
+ 'jQuery("#actions'.$gedcom_id.'").removeClass("hidden");'
);
exit;
}
// Calculate progress so far
-$percent=100*(($row->import_offset) / $row->import_total);
-$status=WT_I18N::translate('Loading data from GEDCOM file: %.1f%%', $percent);
+$progress = $row->import_offset / $row->import_total;
-echo '<div id="progressbar', $gedcom_id, '"><div style="position:absolute;">', $status, '</div></div>';
-$controller->addInlineJavascript(
- 'jQuery("#progressbar' . $gedcom_id . '").progressbar({value: ' . round($percent, 1) . '});'
-);
+?>
+<div class="progress" id="progress<?php echo $gedcom_id; ?>">
+ <div
+ class="progress-bar"
+ role="progressbar"
+ aria-valuenow="<?php echo $progress * 100; ?>"
+ aria-valuemin="0"
+ aria-valuemax="100"
+ style="width: <?php echo $progress * 100; ?>%; min-width: 40px;"
+ >
+ <?php echo WT_I18N::percentage($progress, 1); ?>
+ </div>
+</div>
+<?php
$first_time = ($row->import_offset == 0);
// Run for one second. This keeps the resource requirements low.
@@ -110,7 +119,7 @@ for ($end_time = microtime(true) + 1.0; microtime(true) < $end_time;) {
if (substr($data->chunk_data, 0, 6)!='0 HEAD') {
WT_DB::rollBack();
echo WT_I18N::translate('Invalid GEDCOM file - no header record found.');
- $controller->addInlineJavascript('jQuery("#actions'.$gedcom_id.'").toggle();');
+ $controller->addInlineJavascript('jQuery("#actions'.$gedcom_id.'").removeClass("hidden");');
exit;
}
// What character set is this? Need to convert it to UTF8
@@ -143,7 +152,7 @@ for ($end_time = microtime(true) + 1.0; microtime(true) < $end_time;) {
break;
case 'ANSI': // ANSI could be anything. Most applications seem to treat it as latin1.
$controller->addInlineJavascript(
- 'alert("'. /* I18N: %1$s and %2$s are the names of character encodings, such as ISO-8859-1 or ASCII */ WT_I18N::translate('This GEDCOM file is encoded using %1$s. Assume this to mean %2$s.', $charset, 'ISO-8859-1'). '");'
+ 'alert("'. /* I18N: %1$s and %2$s are the names of character encodings, such as ISO-8859-1 or ASCII */ WT_I18N::translate('This GEDCOM is encoded using %1$s. Assume this to mean %2$s.', $charset, 'ISO-8859-1'). '");'
);
case 'WINDOWS':
case 'CP1252':
@@ -187,7 +196,7 @@ for ($end_time = microtime(true) + 1.0; microtime(true) < $end_time;) {
default:
WT_DB::rollBack();
echo '<span class="error">', WT_I18N::translate('Error: converting GEDCOM files from %s encoding to UTF-8 encoding not currently supported.', $charset), '</span>';
- $controller->addInlineJavascript('jQuery("#actions'.$gedcom_id.'").toggle();');
+ $controller->addInlineJavascript('jQuery("#actions'.$gedcom_id.'").removeClass("hidden");');
exit;
}
$first_time=false;
@@ -221,7 +230,7 @@ for ($end_time = microtime(true) + 1.0; microtime(true) < $end_time;) {
} else {
// A fatal error. Nothing we can do?
echo '<span class="error">', $ex->getMessage(), '</span>';
- $controller->addInlineJavascript('jQuery("#actions' . $gedcom_id . '").toggle();');
+ $controller->addInlineJavascript('jQuery("#actions' . $gedcom_id . '").removeClass("hidden");');
}
exit;
}
diff --git a/includes/functions/functions_charts.php b/includes/functions/functions_charts.php
index 4dd670a1b7..2901d5f19a 100644
--- a/includes/functions/functions_charts.php
+++ b/includes/functions/functions_charts.php
@@ -2,7 +2,7 @@
// Functions used for charts
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2010 PGV Development Team.
@@ -20,6 +20,7 @@
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
/**
* print a table cell with sosa number
@@ -67,7 +68,7 @@ function print_sosa_number($sosa, $pid = "", $arrowDirection = "up") {
* @param string $gparid gd-parent ID (descendancy booklet)
*/
function print_family_parents(WT_Family $family, $sosa=0, $label='', $parid='', $gparid='') {
- global $pbwidth, $pbheight, $WT_IMAGES;
+ global $pbwidth, $pbheight;
$husb = $family->getHusband();
if ($husb) {
@@ -113,8 +114,8 @@ function print_family_parents(WT_Family $family, $sosa=0, $label='', $parid='',
// husband’s parents
$hfam = $husb->getPrimaryChildFamily();
if ($hfam) { // remove the|| test for $sosa
- echo "<td rowspan=\"2\"><img src=\"".$WT_IMAGES["hline"]."\" alt=\"\"></td><td rowspan=\"2\"><img src=\"".$WT_IMAGES["vline"]."\" width=\"3\" height=\"" . ($pbheight+9) . "\" alt=\"\"></td>";
- echo "<td><img class=\"line5\" src=\"".$WT_IMAGES["hline"]."\" alt=\"\"></td><td>";
+ echo "<td rowspan=\"2\"><img src=\"" . Theme::theme()->parameter('image-hline') ."\" alt=\"\"></td><td rowspan=\"2\"><img src=\"" . Theme::theme()->parameter('image-vline') . "\" width=\"3\" height=\"" . ($pbheight+9) . "\" alt=\"\"></td>";
+ echo "<td><img class=\"line5\" src=\"" . Theme::theme()->parameter('image-hline') . "\" alt=\"\"></td><td>";
// husband’s father
if ($hfam && $hfam->getHusband()) {
echo "<table style=\"width: " . ($pbwidth) . "px; height: " . $pbheight . "px;\" border=\"0\"><tr>";
@@ -138,7 +139,7 @@ function print_family_parents(WT_Family $family, $sosa=0, $label='', $parid='',
}
if ($hfam) { // remove the|| test for $sosa
// husband’s mother
- echo "</tr><tr><td><img src=\"".$WT_IMAGES["hline"]."\" alt=\"\"></td><td>";
+ echo "</tr><tr><td><img src=\"" . Theme::theme()->parameter('image-hline') . "\" alt=\"\"></td><td>";
if ($hfam && $hfam->getWife()) {
echo "<table style=\"width: " . ($pbwidth) . "px; height: " . $pbheight . "px;\" border=\"0\"><tr>";
if ($sosa > 0) print_sosa_number($sosa * 4 + 1, $hfam->getWife()->getXref(), "down");
@@ -193,8 +194,8 @@ function print_family_parents(WT_Family $family, $sosa=0, $label='', $parid='',
$hfam = $wife->getPrimaryChildFamily();
if ($hfam) { // remove the|| test for $sosa
- echo "<td rowspan=\"2\"><img src=\"".$WT_IMAGES["hline"]."\" alt=\"\"></td><td rowspan=\"2\"><img src=\"".$WT_IMAGES["vline"]."\" width=\"3\" height=\"" . ($pbheight+9) . "\" alt=\"\"></td>";
- echo "<td><img class=\"line5\" src=\"".$WT_IMAGES["hline"]."\" alt=\"\"></td><td>";
+ echo "<td rowspan=\"2\"><img src=\"" . Theme::theme()->parameter('image-hline') . "\" alt=\"\"></td><td rowspan=\"2\"><img src=\"" . Theme::theme()->parameter('image-vline') . "\" width=\"3\" height=\"" . ($pbheight+9) . "\" alt=\"\"></td>";
+ echo "<td><img class=\"line5\" src=\"" . Theme::theme()->parameter('image-hline') . "\" alt=\"\"></td><td>";
// wife’s father
if ($hfam && $hfam->getHusband()) {
echo "<table style=\"width: " . ($pbwidth) . "px; height: " . $pbheight . "px;\"><tr>";
@@ -218,7 +219,7 @@ function print_family_parents(WT_Family $family, $sosa=0, $label='', $parid='',
}
if ($hfam) { // remove the|| test for $sosa
// wife’s mother
- echo "</tr><tr><td><img src=\"".$WT_IMAGES["hline"]."\" alt=\"\"></td><td>";
+ echo "</tr><tr><td><img src=\"" . Theme::theme()->parameter('image-hline') . "\" alt=\"\"></td><td>";
if ($hfam && $hfam->getWife()) {
echo "<table style=\"width: " . ($pbwidth) . "px; height: " . $pbheight . "px;\"><tr>";
if ($sosa > 0) print_sosa_number($sosa * 4 + 3, $hfam->getWife()->getXref(), "down");
@@ -246,7 +247,7 @@ function print_family_parents(WT_Family $family, $sosa=0, $label='', $parid='',
* @param string $label indi label (descendancy booklet)
*/
function print_family_children(WT_Family $family, $childid = '', $sosa = 0, $label = '') {
- global $bheight, $pbheight, $cbheight, $show_cousins, $WT_IMAGES, $TEXT_DIRECTION;
+ global $bheight, $pbheight, $show_cousins, $TEXT_DIRECTION;
$children = $family->getChildren();
$numchil = count($children);
@@ -317,18 +318,18 @@ function print_family_children(WT_Family $family, $childid = '', $sosa = 0, $lab
//find out how many cousins there are to establish vertical line on second families
$fchildren=$famids[$f]->getChildren();
$kids = count($fchildren);
- $Pheader = ($cbheight*$kids)-$bheight;
+ $Pheader = Theme::theme()->parameter('compact-chart-box-y') * $kids - $bheight;
$PBadj = 6; // default
- if ($show_cousins>0) {
- if (($cbheight * $kids) > $bheight) {
- $PBadj = ($Pheader/2+$kids*4.5);
+ if ($show_cousins > 0) {
+ if (Theme::theme()->parameter('compact-chart-box-y') * $kids > $bheight) {
+ $PBadj = $Pheader / 2 + $kids * 4.5;
}
}
if ($PBadj<0) $PBadj=0;
if ($f==$maxfam) echo "<img height=\"".( (($bheight/2))+$PBadj)."px\"";
else echo "<img height=\"".$pbheight."px\"";
- echo " width=\"3\" src=\"".$WT_IMAGES["vline"]."\" alt=\"\">";
+ echo " width=\"3\" src=\"" . Theme::theme()->parameter('image-vline') . "\" alt=\"\">";
echo "</td>";
}
echo "<td class=\"details1\" valign=\"middle\" align=\"center\">";
@@ -344,7 +345,7 @@ function print_family_children(WT_Family $family, $childid = '', $sosa = 0, $lab
echo '–', $div->getDate()->minDate()->format('%Y');
}
}
- echo "<br><img width=\"100%\" class=\"line5\" height=\"3\" src=\"".$WT_IMAGES["hline"]."\" alt=\"\">";
+ echo "<br><img width=\"100%\" class=\"line5\" height=\"3\" src=\"" . Theme::theme()->parameter('image-hline') . "\" alt=\"\">";
echo "</td>";
// spouse information
echo "<td style=\"vertical-align: center;";
@@ -453,7 +454,7 @@ function get_sosa_name($sosa) {
* @param string $famid family ID
*/
function print_cousins($famid) {
- global $show_full, $bheight, $bwidth, $cbheight, $cbwidth, $WT_IMAGES, $TEXT_DIRECTION;
+ global $show_full, $bheight, $bwidth, $TEXT_DIRECTION;
$family=WT_Family::getInstance($famid);
$fchildren=$family->getChildren();
@@ -463,15 +464,15 @@ function print_cousins($famid) {
$sbheight = $bheight;
$sbwidth = $bwidth;
if ($save_show_full) {
- $bheight = $cbheight;
- $bwidth = $cbwidth;
+ $bheight = Theme::theme()->parameter('compact-chart-box-y');
+ $bwidth = Theme::theme()->parameter('compact-chart-box-x');
}
$show_full = false;
echo '<td valign="middle" height="100%">';
if ($kids) {
echo '<table cellspacing="0" cellpadding="0" border="0" ><tr valign="middle">';
- if ($kids>1) echo '<td rowspan="', $kids, '" valign="middle" align="right"><img width="3px" height="', (($bheight+9)*($kids-1)), 'px" src="', $WT_IMAGES["vline"], '" alt=""></td>';
+ if ($kids>1) echo '<td rowspan="', $kids, '" valign="middle" align="right"><img width="3px" height="', (($bheight+9)*($kids-1)), 'px" src="', Theme::theme()->parameter('image-vline'), '" alt=""></td>';
$ctkids = count($fchildren);
$i = 1;
foreach ($fchildren as $fchil) {
@@ -485,7 +486,7 @@ function print_cousins($famid) {
} else {
echo ' style="padding-left: 2px;"';
}
- echo ' src="', $WT_IMAGES['hline'], '" alt=""></td><td>';
+ echo ' src="', Theme::theme()->parameter('image-hline'), '" alt=""></td><td>';
print_pedigree_person($fchil);
echo '</td></tr>';
if ($i < $ctkids) {
diff --git a/includes/functions/functions_mediadb.php b/includes/functions/functions_mediadb.php
index 7d6d82cae7..609a88481c 100644
--- a/includes/functions/functions_mediadb.php
+++ b/includes/functions/functions_mediadb.php
@@ -61,7 +61,9 @@ function hasMemoryForImage($serverFilename) {
// find out how much total memory this script can access
$memoryAvailable = return_bytes(@ini_get('memory_limit'));
// if memory is unlimited, it will return -1 and we don’t need to worry about it
- if ($memoryAvailable == -1) return true;
+ if ($memoryAvailable == -1) {
+ return true;
+ }
// find out how much memory we are already using
$memoryUsed=memory_get_usage();
diff --git a/includes/functions/functions_print.php b/includes/functions/functions_print.php
index a50de1897a..91de5202c9 100644
--- a/includes/functions/functions_print.php
+++ b/includes/functions/functions_print.php
@@ -4,7 +4,7 @@
// Various printing functions used by all scripts and included by the functions.php file.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2010 PGV Development Team.
@@ -25,7 +25,7 @@
use Rhumsaa\Uuid\Uuid;
use WT\Auth;
-use WT\User;
+use WT\Theme;
/**
* print the information for an individual chart box
@@ -36,315 +36,21 @@ use WT\User;
* @param integer $style the style to print the box in, 1 for smaller boxes, 2 for larger boxes
*/
function print_pedigree_person(WT_Individual $person = null, $style = 1) {
- global $GEDCOM;
- global $SHOW_HIGHLIGHT_IMAGES, $bwidth, $bheight, $PEDIGREE_FULL_DETAILS;
- global $DEFAULT_PEDIGREE_GENERATIONS, $OLD_PGENS, $talloffset, $PEDIGREE_LAYOUT;
- global $chart_style, $box_width, $generations, $show_spouse, $show_full;
- global $CHART_BOX_TAGS, $SHOW_LDS_AT_GLANCE, $PEDIGREE_SHOW_GENDER;
- global $SEARCH_SPIDER;
-
- if (empty($show_full)) {
- $show_full = 0;
- }
-
- if (empty($PEDIGREE_FULL_DETAILS)) {
- $PEDIGREE_FULL_DETAILS = 0;
- }
-
- if (!isset($OLD_PGENS)) {
- $OLD_PGENS = $DEFAULT_PEDIGREE_GENERATIONS;
- }
- if (!isset($talloffset)) {
- $talloffset = $PEDIGREE_LAYOUT;
- }
-
- // extend $style to incorporate compact view
- $style = $show_full ? $style == 2 ? 2 : 1 : 0;
- /* $style in conjunction with "box-style" and "detail" is used to create css classes
- * e.g box-style1 and detail1
- * 0: compact box - used in charts (birth & death events hidden)
- * 1: small box - used in charts (birth & death events shown)
- * 2: large box - used elsewhere eg favourites block
- */
- $dims = "style='width:{$bwidth}px; min-height:{$bheight}px'";
-
- // NOTE: Start div out-rand()
- if (!$person) {
- echo "<div $dims class=\"person_boxNN box-style$style\"></div>";
- return;
- }
- $pid = $person->getXref();
- $isF = array_search($person->getSex(), array('' => 'M', 'F' => 'F', 'NN' => 'U'));
-
- $personlinks = '';
- $icons = '';
- $genderImage = '';
- $BirthDeath = '';
- $LDSord = '';
- $outBoxAdd = "class='person_box_template person_box$isF box-style$style";
- if (!$show_full) {
- $outBoxAdd .= " iconz";
- }
- $outBoxAdd .= $style < 2 ? ("' " . $dims) : "'";
-
- if ($person->canShowName()) {
- if (empty($SEARCH_SPIDER)) {
- //-- draw a box for the family popup
-
- $personlinks .= '<ul class="person_box' . $isF . '">';
- $personlinks .= '<li><a href="pedigree.php?rootid=' . $pid . '&amp;show_full=' . $PEDIGREE_FULL_DETAILS . '&amp;PEDIGREE_GENERATIONS=' . $OLD_PGENS . '&amp;talloffset=' . $talloffset . '&amp;ged=' . rawurlencode($GEDCOM) . '"><strong>' . WT_I18N::translate('Pedigree') . '</strong></a></li>';
- if (array_key_exists('googlemap', WT_Module::getActiveModules())) {
- $personlinks .= '<li><a href="module.php?mod=googlemap&amp;mod_action=pedigree_map&amp;rootid=' . $pid . '&amp;ged=' . WT_GEDURL . '"><strong>' . WT_I18N::translate('Pedigree map') . '</strong></a></li>';
- }
- if (WT_USER_GEDCOM_ID && WT_USER_GEDCOM_ID != $pid) {
- $personlinks .= '<li><a href="relationship.php?show_full=' . $PEDIGREE_FULL_DETAILS . '&amp;pid1=' . WT_USER_GEDCOM_ID . '&amp;pid2=' . $pid . '&amp;show_full=' . $PEDIGREE_FULL_DETAILS . '&amp;pretty=2&amp;followspouse=1&amp;ged=' . WT_GEDURL . '"><strong>' . WT_I18N::translate('Relationship to me') . '</strong></a></li>';
- }
- $personlinks .= '<li><a href="descendancy.php?rootid=' . $pid . '&amp;show_full=' . $PEDIGREE_FULL_DETAILS . '&amp;generations=' . $generations . '&amp;box_width=' . $box_width . '&amp;ged=' . rawurlencode($GEDCOM) . '"><strong>' . WT_I18N::translate('Descendants') . '</strong></a></li>';
- $personlinks .= '<li><a href="ancestry.php?rootid=' . $pid . '&amp;show_full=' . $PEDIGREE_FULL_DETAILS . '&amp;chart_style=' . $chart_style . '&amp;PEDIGREE_GENERATIONS=' . $OLD_PGENS . '&amp;box_width=' . $box_width . '&amp;ged=' . rawurlencode($GEDCOM) . '"><strong>' . WT_I18N::translate('Ancestors') . '</strong></a></li>';
- $personlinks .= '<li><a href="compact.php?rootid=' . $pid . '&amp;ged=' . rawurlencode($GEDCOM) . '"><strong>' . WT_I18N::translate('Compact tree') . '</strong></a></li>';
- if (function_exists("imagettftext")) {
- $personlinks .= '<li><a href="fanchart.php?rootid=' . $pid . '&amp;PEDIGREE_GENERATIONS=' . $OLD_PGENS . '&amp;ged=' . rawurlencode($GEDCOM) . '"><strong>' . WT_I18N::translate('Fan chart') . '</strong></a></li>';
- }
- $personlinks .= '<li><a href="hourglass.php?rootid=' . $pid . '&amp;show_full=' . $PEDIGREE_FULL_DETAILS . '&amp;chart_style=' . $chart_style . '&amp;PEDIGREE_GENERATIONS=' . $OLD_PGENS . '&amp;box_width=' . $box_width . '&amp;ged=' . rawurlencode($GEDCOM) . '&amp;show_spouse=' . $show_spouse . '"><strong>' . WT_I18N::translate('Hourglass chart') . '</strong></a></li>';
- if (array_key_exists('tree', WT_Module::getActiveModules())) {
- $personlinks .= '<li><a href="module.php?mod=tree&amp;mod_action=treeview&amp;ged=' . WT_GEDURL . '&amp;rootid=' . $pid . '"><strong>' . WT_I18N::translate('Interactive tree') . '</strong></a></li>';
- }
- foreach ($person->getSpouseFamilies() as $family) {
- $spouse = $family->getSpouse($person);
- if ($spouse) {
- $personlinks .= '<li>';
- $personlinks .= '<a href="' . $family->getHtmlUrl() . '"><strong>' . WT_I18N::translate('Family with spouse') . '</strong></a><br>';
- $personlinks .= '<a href="' . $spouse->getHtmlUrl() . '">' . $spouse->getFullName() . '</a>';
- $personlinks .= '</li>';
- $personlinks .= '<li><ul>';
- }
- foreach ($family->getChildren() as $child) {
- $personlinks .= '<li><a href="' . $child->getHtmlUrl() . '">';
- $personlinks .= $child->getFullName();
- $personlinks .= '</a></li>';
- }
- $personlinks .= '</ul></li>';
- }
- $personlinks .= '</ul>';
-
- // NOTE: Zoom
- if ($show_full) {
- $icons .= '<span class="iconz icon-zoomin" title="' . WT_I18N::translate('Zoom in/out on this box.') . '"></span>';
- $icons .= '<div class="itr"><a href="#" class="icon-pedigree"></a><div class="popup">' . $personlinks . '</div></div>';
- }
- }
- }
- //-- find the name
- $name = $person->getFullName();
- $shortname = $person->getShortName();
- $thumbnail = $SHOW_HIGHLIGHT_IMAGES ? $person->displayImage() : '';
-
- if ($PEDIGREE_SHOW_GENDER && $show_full) {
- $genderImage = $person->getSexImage('large');
- }
-
- //-- find additional name, e.g. Hebrew
- $addname = $person->getAddName();
-
- if ($SHOW_LDS_AT_GLANCE && $show_full) {
- $LDSord = get_lds_glance($person);
- }
-
- if ($show_full && $person->canShow()) {
- $opt_tags = preg_split('/\W/', $CHART_BOX_TAGS, 0, PREG_SPLIT_NO_EMPTY);
- // Show BIRT or equivalent event
- foreach (explode('|', WT_EVENTS_BIRT) as $birttag) {
- if (!in_array($birttag, $opt_tags)) {
- $event = $person->getFirstFact($birttag);
- if ($event) {
- $BirthDeath .= $event->summary();
- break;
- }
- }
- }
- // Show optional events (before death)
- foreach ($opt_tags as $key => $tag) {
- if (!preg_match('/^(' . WT_EVENTS_DEAT . ')$/', $tag)) {
- $event = $person->getFirstFact($tag);
- if (!is_null($event)) {
- $BirthDeath .= $event->summary();
- unset ($opt_tags[$key]);
- }
- }
- }
- // Show DEAT or equivalent event
- foreach (explode('|', WT_EVENTS_DEAT) as $deattag) {
- $event = $person->getFirstFact($deattag);
- if ($event) {
- $BirthDeath .= $event->summary();
- if (in_array($deattag, $opt_tags)) {
- unset ($opt_tags[array_search($deattag, $opt_tags)]);
- }
- break;
- }
- }
- // Show remaining optional events (after death)
- foreach ($opt_tags as $tag) {
- $event = $person->getFirstFact($tag);
- if ($event) {
- $BirthDeath .= $event->summary();
- }
- }
- }
-
- // Output to template
- if ($show_full) {
- require WT_THEME_DIR . 'templates/personbox_template.php';
- } else {
- require WT_THEME_DIR . 'templates/compactbox_template.php';
- }
-}
-
-/**
- * Print HTML header meta links
- *
- * @param string $META_DESCRIPTION
- * @param string $META_ROBOTS
- * @param string $META_GENERATOR
- * @param string $LINK_CANONICAL
- *
- * @return string
- */
-function header_links($META_DESCRIPTION, $META_ROBOTS, $META_GENERATOR, $LINK_CANONICAL) {
- $header_links = '';
- if ($LINK_CANONICAL) {
- $header_links .= '<link rel="canonical" href="' . $LINK_CANONICAL . '">';
- }
- if ($META_DESCRIPTION) {
- $header_links .= '<meta name="description" content="' . $META_DESCRIPTION . '">';
- }
- $header_links .= '<meta name="robots" content="' . $META_ROBOTS . '">';
- if ($META_GENERATOR) {
- $header_links .= '<meta name="generator" content="' . $META_GENERATOR . '">';
- }
- return $header_links;
-}
-
-/**
- * Prints Exection Statistics
- *
- * prints out the execution time and the databse queries
- */
-function execution_stats() {
- global $start_time;
-
- return
- '<div class="execution_stats">'.
- WT_I18N::translate(
- 'Execution time: %1$s seconds. Database queries: %2$s. Memory usage: %3$s KB.',
- WT_I18N::number(microtime(true) - $start_time, 3),
- WT_I18N::number(WT_DB::getQueryCount()),
- WT_I18N::number(memory_get_peak_usage(true)/1024)
- ).
- '</div>';
-}
-
-/**
- * Generate a login link.
- *
- * @return string
- */
-function login_link() {
- global $SEARCH_SPIDER;
-
- if ($SEARCH_SPIDER) {
- return '';
- } else {
- return
- '<a href="' . WT_LOGIN_URL . '?url='.rawurlencode(get_query_url()) . '" class="link">' .
- WT_I18N::translate('Login') .
- '</a>';
- }
-}
-
-/**
- * Generate a logout link.
- *
- * @return string
- */
-function logout_link() {
- global $SEARCH_SPIDER;
-
- if ($SEARCH_SPIDER) {
- return '';
- } else {
- return '<a href="logout.php" class="link">' . WT_I18N::translate('Logout') . '</a>';
- }
-}
-
-/**
- * Print a link to allow email/messaging contact with a user
- * Optionally specify a method (used for webmaster/genealogy contacts)
- *
- * @param integer $user_id
- *
- * @return string
- */
-function user_contact_link($user_id) {
- $user = User::find($user_id);
-
- if ($user) {
- $method = $user->getPreference('contactmethod');
-
- switch ($method) {
- case 'none':
- return '';
- case 'mailto':
- return '<a href="mailto:' . WT_Filter::escapeHtml($user->getEmail()).'">'.WT_Filter::escapeHtml($user->getRealName()).'</a>';
- default:
- return "<a href='#' onclick='message(\"" . WT_Filter::escapeJs($user->getUserName()) . "\", \"" . $method . "\", \"" . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_Filter::escapeJs(get_query_url()) . "\", \"\");return false;'>" . WT_Filter::escapeHtml($user->getRealName()) . '</a>';
- }
- } else {
- return '';
- }
-}
-
-/**
- * Print links for genealogy and technical contacts.
- * This function will print appropriate links based on the preferred
- * contact methods for the genealogy contact user and the technical
- * support contact user.
- *
- * @param integer $ged_id
- *
- * @return string
- */
-function contact_links($ged_id=WT_GED_ID) {
- $tree = WT_Tree::get($ged_id);
-
- $contact_user_id = $tree->getPreference('CONTACT_USER_ID');
- $webmaster_user_id = $tree->getPreference('WEBMASTER_USER_ID');
- $supportLink = user_contact_link($webmaster_user_id);
- if ($webmaster_user_id==$contact_user_id) {
- $contactLink = $supportLink;
- } else {
- $contactLink = user_contact_link($contact_user_id);
- }
-
- if (!$supportLink && !$contactLink) {
- return '';
- }
-
- if ($supportLink==$contactLink) {
- return '<div class="contact_links">'.WT_I18N::translate('For technical support or genealogy questions, please contact').' '.$supportLink.'</div>';
- } else {
- $returnText = '<div class="contact_links">';
- if ($supportLink) {
- $returnText .= WT_I18N::translate('For technical support and information contact').' '.$supportLink;
- if ($contactLink) {
- $returnText .= '<br>';
- }
+ switch (WT_Filter::get('show_full')) {
+ case 0:
+ if ($person) {
+ echo Theme::theme()->individualBoxSmall($person);
+ } else {
+ echo Theme::theme()->individualBoxSmallEmpty();
}
- if ($contactLink) {
- $returnText .= WT_I18N::translate('For help with genealogy questions contact').' '.$contactLink;
+ break;
+ case 1:
+ if ($person) {
+ echo Theme::theme()->individualBox($person);
+ } else {
+ echo Theme::theme()->individualBoxEmpty();
}
- $returnText .= '</div>';
- return $returnText;
+ break;
}
}
@@ -430,10 +136,14 @@ function print_fact_notes($factrec, $level, $textOnly=false) {
for ($j=0; $j<$ct; $j++) {
$spos1 = strpos($factrec, $match[$j][0], $previous_spos);
$spos2 = strpos($factrec."\n$level", "\n$level", $spos1+1);
- if (!$spos2) $spos2 = strlen($factrec);
+ if (!$spos2) {
+ $spos2 = strlen($factrec);
+ }
$previous_spos = $spos2;
$nrec = substr($factrec, $spos1, $spos2-$spos1);
- if (!isset($match[$j][1])) $match[$j][1]="";
+ if (!isset($match[$j][1])) {
+ $match[$j][1]="";
+ }
if (!preg_match("/@(.*)@/", $match[$j][1], $nmatch)) {
$data .= print_note_record($match[$j][1], $nlevel, $nrec, $textOnly);
} else {
@@ -864,19 +574,24 @@ function CheckFactUnique($uniquefacts, $recfacts, $type) {
if (is_object($factarray)) {
/* @var $factarray Event */
$fact = $factarray->getTag();
- }
- else {
- if (($type == "SOUR") || ($type == "REPO")) $factrec = $factarray[0];
- if (($type == "FAM") || ($type == "INDI")) $factrec = $factarray[1];
+ } else {
+ if ($type === 'SOUR' || $type === 'REPO') {
+ $factrec = $factarray[0];
+ }
+ if ($type === 'FAM' || $type === 'INDI') {
+ $factrec = $factarray[1];
+ }
- $ft = preg_match("/1 (\w+)(.*)/", $factrec, $match);
- if ($ft>0) {
- $fact = trim($match[1]);
+ $ft = preg_match("/1 (\w+)(.*)/", $factrec, $match);
+ if ($ft > 0) {
+ $fact = trim($match[1]);
}
}
- if ($fact!==false) {
+ if ($fact !== false) {
$key = array_search($fact, $uniquefacts);
- if ($key !== false) unset($uniquefacts[$key]);
+ if ($key !== false) {
+ unset($uniquefacts[$key]);
+ }
}
}
return $uniquefacts;
@@ -979,7 +694,9 @@ function print_add_new_fact($id, $usedfacts, $type) {
echo '</select>';
echo '<input type="button" value="', WT_I18N::translate('Add'), '" onclick="add_record(\''.$id.'\', \'newfact\');">';
echo '<span class="quickfacts">';
- foreach ($quickfacts as $fact) echo '<a href="#" onclick="add_new_record(\''.$id.'\', \''.$fact.'\');return false;">', WT_Gedcom_Tag::getLabel($fact), '</a>';
+ foreach ($quickfacts as $fact) {
+ echo '<a href="#" onclick="add_new_record(\''.$id.'\', \''.$fact.'\');return false;">', WT_Gedcom_Tag::getLabel($fact), '</a>';
+ }
echo '</span></form>';
echo '</td></tr>';
}
diff --git a/includes/functions/functions_print_facts.php b/includes/functions/functions_print_facts.php
index 2e63a83f26..859a8e8ae5 100644
--- a/includes/functions/functions_print_facts.php
+++ b/includes/functions/functions_print_facts.php
@@ -4,7 +4,7 @@
// Various printing functions used to print fact records
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2010 PGV Development Team.
@@ -24,6 +24,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use Rhumsaa\Uuid\Uuid;
+use WT\Theme;
use WT\User;
/**
@@ -149,7 +150,7 @@ function print_fact(WT_Fact $fact, WT_GedcomRecord $record) {
echo '<td class="descriptionbox width20">';
if ($SHOW_FACT_ICONS) {
- echo $fact->icon(), ' ';
+ echo Theme::theme()->icon($fact), ' ';
}
if ($fact->getFactId()!='histo' && $fact->canEdit()) {
diff --git a/includes/functions/functions_print_lists.php b/includes/functions/functions_print_lists.php
index 31fc1ee78d..a2523dc5a7 100644
--- a/includes/functions/functions_print_lists.php
+++ b/includes/functions/functions_print_lists.php
@@ -998,7 +998,7 @@ function format_fam_table($datalist) {
$html .= 'R';
} elseif (!$husb->isDead() && !$wife->isDead() && $family->getNumberOfChildren() < 1) {
$html .= 'L';
- } else {
+ } else {
$html .= '&nbsp;';
}
$html .= '</td>
diff --git a/includes/session.php b/includes/session.php
index f5ccb1742d..4f3010110b 100644
--- a/includes/session.php
+++ b/includes/session.php
@@ -2,7 +2,7 @@
// Startup and session logic
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2011 PGV Development Team.
@@ -23,6 +23,7 @@
use WT\Auth;
use WT\Log;
+use WT\Theme;
// WT_SCRIPT_NAME is defined in each script that the user is permitted to load.
if (!defined('WT_SCRIPT_NAME')) {
@@ -33,8 +34,6 @@ if (!defined('WT_SCRIPT_NAME')) {
// To embed webtrees code in other applications, we must explicitly declare any global variables that we create.
// session.php
global $start_time, $WT_REQUEST, $WT_SESSION, $WT_TREE, $GEDCOM, $SEARCH_SPIDER, $TEXT_DIRECTION;
-// theme.php
-global $headerfile, $footerfile, $WT_IMAGES, $fanchart, $bwidth, $bheight, $baseyoffset, $basexoffset, $bxspacing, $byspacing, $linewidth, $shadowcolor, $shadowblur, $shadowoffsetX, $shadowoffsetY, $Dbaseyoffset, $Dbasexoffset, $Dbxspacing, $Dbyspacing, $Dbwidth, $Dbheight, $Dindent, $Darrowwidth, $cbwidth, $cbheight, $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y, $WT_STATS_L_CHART_X, $WT_STATS_MAP_X, $WT_STATS_MAP_Y, $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_CHART_COLOR3;
// most pages
global $controller;
@@ -46,16 +45,36 @@ define('WT_VERSION', '1.6.3-dev');
define('WT_WEBTREES_URL', 'http://www.webtrees.net/');
define('WT_WEBTREES_WIKI', 'http://wiki.webtrees.net/');
-// Optionally, specify a CDN server for static content (e.g. CSS, JS, PNG)
-define('WT_STATIC_URL', ''); // For example, http://my.cdn.com/webtrees-static-1.3.1/
-define('WT_JQUERY_URL', WT_STATIC_URL . 'js/jquery-1.11.2.js');
-define('WT_JQUERYUI_URL', WT_STATIC_URL . 'js/jquery-ui-1.11.2.js');
-define('WT_JQUERY_COLORBOX_URL', WT_STATIC_URL . 'js/jquery.colorbox-1.5.14.js');
-define('WT_JQUERY_COOKIE_URL', WT_STATIC_URL . 'js/jquery.cookie-1.4.1.js');
-define('WT_JQUERY_DATATABLES_URL', WT_STATIC_URL . 'js/jquery.datatables-1.10.4.js');
-define('WT_JQUERY_JEDITABLE_URL', WT_STATIC_URL . 'js/jquery.jeditable-1.7.3.js');
-define('WT_JQUERY_WHEELZOOM_URL', WT_STATIC_URL . 'js/jquery.wheelzoom-2.0.0.js');
-define('WT_WEBTREES_JS_URL', WT_STATIC_URL . 'js/webtrees-1.6.2.js');
+// Resources have version numbers in the URL, so that they can be cached indefinitely.
+define('WT_STATIC_URL', getenv('STATIC_URL')); // We could set this to load our own static resources from a cookie-free domain.
+
+if (getenv('USE_CDN')) {
+ define('WT_BOOTSTRAP_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/css/bootstrap.min.css');
+ define('WT_BOOTSTRAP_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js');
+ define('WT_BOOTSTRAP_RTL_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/bootstrap-rtl/3.2.0-rc2/css/bootstrap-rtl.min.css'); // out of date!
+ define('WT_JQUERY_DATATABLES_URL', '//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.4/js/jquery.dataTables.min.js');
+ define('WT_DATATABLES_BOOTSTRAP_JS_URL', '//cdn.datatables.net/plug-ins/3cfcc339e89/integration/bootstrap/3/dataTables.bootstrap.js');
+ define('WT_DATATABLES_BOOTSTRAP_CSS_URL', '//cdn.datatables.net/plug-ins/3cfcc339e89/integration/bootstrap/3/dataTables.bootstrap.css');
+ define('WT_FONT_AWESOME_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.2.0/css/font-awesome.min.css');
+ define('WT_JQUERY_COLORBOX_URL', '//cdnjs.cloudflare.com/ajax/libs/jquery.colorbox/1.4.33/jquery.colorbox-min.js'); // out of date!
+ define('WT_JQUERY_COOKIE_URL', '//cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js');
+ define('WT_JQUERY_URL', '//cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js');
+ define('WT_JQUERYUI_URL', '//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js');
+} else {
+ define('WT_BOOTSTRAP_CSS_URL', WT_STATIC_URL . 'packages/bootstrap-3.3.1/css/bootstrap.min.css');
+ define('WT_BOOTSTRAP_JS_URL', WT_STATIC_URL . 'packages/bootstrap-3.3.1/js/bootstrap.min.js');
+ define('WT_BOOTSTRAP_RTL_CSS_URL', WT_STATIC_URL . 'packages/bootstrap-rtl-3.2.0/css/bootstrap-rtl.min.css');
+ define('WT_JQUERY_DATATABLES_URL', WT_STATIC_URL . 'packages/datatables-1.10.4/js/jquery.dataTables.min.js');
+ define('WT_DATATABLES_BOOTSTRAP_JS_URL', WT_STATIC_URL . 'packages/datatables-1.10.4/plugins/dataTables.bootstrap.js');
+ define('WT_DATATABLES_BOOTSTRAP_CSS_URL', WT_STATIC_URL . 'packages/datatables-1.10.4/plugins/dataTables.bootstrap.css');
+ define('WT_FONT_AWESOME_CSS_URL', WT_STATIC_URL . 'packages/font-awesome-4.1.0/css/font-awesome.min.css');
+ define('WT_JQUERY_COLORBOX_URL', WT_STATIC_URL . 'js/jquery.colorbox-1.5.14.js');
+ define('WT_JQUERY_COOKIE_URL', WT_STATIC_URL . 'js/jquery.cookie-1.4.1.js');
+ define('WT_JQUERY_URL', WT_STATIC_URL . 'js/jquery-1.11.2.js');
+ define('WT_JQUERYUI_URL', WT_STATIC_URL . 'js/jquery-ui-1.11.2.js');
+}
+define('WT_JQUERY_WHEELZOOM_URL', WT_STATIC_URL . 'js/jquery.wheelzoom-2.0.0.js');
+define('WT_WEBTREES_JS_URL', WT_STATIC_URL . 'js/webtrees-1.6.2.js');
// Location of our modules and themes. These are used as URLs and folder paths.
define('WT_MODULES_DIR', 'modules_v3/'); // Update setup.php and build/Makefile when this changes
@@ -592,50 +611,46 @@ if (WT_TIMESTAMP - $WT_SESSION->activity_time > 300) {
// Set the theme
if (substr(WT_SCRIPT_NAME, 0, 5) == 'admin' || WT_SCRIPT_NAME == 'module.php' && substr(WT_Filter::get('mod_action'), 0, 5) == 'admin') {
// Administration scripts begin with “admin” and use a special administration theme
- define('WT_THEME_DIR', WT_THEMES_DIR . '_administration/');
+ Theme::theme(new \WT\Theme\Administration)->init($WT_SESSION, $SEARCH_SPIDER, $WT_TREE);
} else {
if (WT_Site::getPreference('ALLOW_USER_THEMES')) {
// Requested change of theme?
- $THEME_DIR = WT_Filter::get('theme');
- if (!in_array($THEME_DIR, get_theme_names())) {
- $THEME_DIR = '';
+ $theme_id = WT_Filter::get('theme');
+ if (!array_key_exists($theme_id, Theme::themeNames())) {
+ $theme_id = '';
}
// Last theme used?
- if (!$THEME_DIR && in_array($WT_SESSION->theme_id, get_theme_names())) {
- $THEME_DIR = $WT_SESSION->theme_id;
+ if (!$theme_id && array_key_exists($WT_SESSION->theme_id, Theme::themeNames())) {
+ $theme_id = $WT_SESSION->theme_id;
}
} else {
- $THEME_DIR = '';
+ $theme_id = '';
}
- if (!$THEME_DIR) {
+ if (!$theme_id) {
// User cannot choose (or has not chosen) a theme.
// 1) gedcom setting
// 2) site setting
// 3) webtrees
// 4) first one found
if (WT_GED_ID) {
- $THEME_DIR = $WT_TREE->getPreference('THEME_DIR');
+ $theme_id = $WT_TREE->getPreference('THEME_DIR');
}
- if (!in_array($THEME_DIR, get_theme_names())) {
- $THEME_DIR = WT_Site::getPreference('THEME_DIR');
+ if (!array_key_exists($theme_id, Theme::themeNames())) {
+ $theme_id = WT_Site::getPreference('THEME_DIR');
}
- if (!in_array($THEME_DIR, get_theme_names())) {
- $THEME_DIR = 'webtrees';
+ if (!array_key_exists($theme_id, Theme::themeNames())) {
+ $theme_id = 'webtrees';
}
- if (!in_array($THEME_DIR, get_theme_names())) {
- list($THEME_DIR) = get_theme_names();
+ }
+ foreach (Theme::installedThemes() as $theme) {
+ if ($theme->themeId() === $theme_id) {
+ Theme::theme($theme)->init($WT_SESSION, $SEARCH_SPIDER, $WT_TREE);
}
}
- define('WT_THEME_DIR', WT_THEMES_DIR . $THEME_DIR . '/');
+
// Remember this setting
- if (WT_THEME_DIR != WT_THEMES_DIR . '_administration/') {
- $WT_SESSION->theme_id = $THEME_DIR;
- }
+ $WT_SESSION->theme_id = $theme_id;
}
-// If we have specified a CDN, use it for static theme resources
-define('WT_THEME_URL', WT_STATIC_URL . WT_THEME_DIR);
-
-require WT_ROOT . WT_THEME_DIR . 'theme.php';
// Page hit counter - load after theme, as we need theme formatting
if ($WT_TREE && $WT_TREE->getPreference('SHOW_COUNTER') && !$SEARCH_SPIDER) {
@@ -656,3 +671,13 @@ if ($SEARCH_SPIDER && !in_array(WT_SCRIPT_NAME, array(
echo '<p class="ui-state-error">', WT_I18N::translate('You do not have permission to view this page.'), '</p>';
exit;
}
+
+// These theme globals are horribly abused.
+$bwidth = Theme::theme()->parameter('chart-box-x');
+$bheight = Theme::theme()->parameter('chart-box-y');
+$basexoffset = Theme::theme()->parameter('chart-offset-x');
+$baseyoffset = Theme::theme()->parameter('chart-offset-y');
+$bxspacing = Theme::theme()->parameter('chart-spacing-x');
+$byspacing = Theme::theme()->parameter('chart-spacing-y');
+$Dbwidth = Theme::theme()->parameter('chart-descendancy-box-x');
+$Dbheight = Theme::theme()->parameter('chart-descendancy-box-y');
diff --git a/index.php b/index.php
index ce5c9ea92a..fff7146489 100644
--- a/index.php
+++ b/index.php
@@ -3,7 +3,7 @@
// to keep bookmarks, see a list of upcoming events, etc.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team.
@@ -66,7 +66,7 @@ if ($action === 'ajax') {
if (array_key_exists($module_name, $all_blocks)) {
$class_name = $module_name . '_WT_Module';
$module = new $class_name;
- $module->getBlock($block_id);
+ echo $module->getBlock($block_id);
}
if (WT_DEBUG_SQL) {
echo WT_DB::getQueryLog();
@@ -103,7 +103,7 @@ if ($blocks['main']) {
$module = new $class_name;
if ($SEARCH_SPIDER || !$module->loadAjax()) {
// Load the block directly
- $module->getBlock($block_id);
+ echo $module->getBlock($block_id);
} else {
// Load the block asynchronously
echo '<div id="block_', $block_id, '"><div class="loading-image">&nbsp;</div></div>';
@@ -125,7 +125,7 @@ if ($blocks['side']) {
$module = new $class_name;
if ($SEARCH_SPIDER || !$module->loadAjax()) {
// Load the block directly
- $module->getBlock($block_id);
+ echo $module->getBlock($block_id);
} else {
// Load the block asynchronously
echo '<div id="block_', $block_id, '"><div class="loading-image">&nbsp;</div></div>';
diff --git a/inverselink.php b/inverselink.php
index d57022550c..e975931647 100644
--- a/inverselink.php
+++ b/inverselink.php
@@ -50,7 +50,9 @@ if ($linkto=='manage' && array_key_exists('GEDFact_assistant', WT_Module::getAct
//-- check for admin
$paramok = true;
- if (!empty($linktoid)) $paramok = WT_GedcomRecord::getInstance($linktoid)->canShow();
+ if (!empty($linktoid)) {
+ $paramok = WT_GedcomRecord::getInstance($linktoid)->canShow();
+ }
if ($action == "choose" && $paramok) {
echo '<form name="link" method="get" action="inverselink.php">';
@@ -82,10 +84,12 @@ if ($linkto=='manage' && array_key_exists('GEDFact_assistant', WT_Module::getAct
} else {
echo '<input data-autocomplete-type="OBJE" type="text" name="mediaid" id="mediaid" size="5">';
echo ' ', print_findmedia_link('mediaid', '1media');
- echo "</td></tr>";
+ echo '</td></tr>';
}
- if (!isset($linktoid)) $linktoid = "";
+ if (!isset($linktoid)) {
+ $linktoid = '';
+ }
echo '<tr><td class="descriptionbox">';
if ($linkto == "person") {
diff --git a/js/jquery.jeditable-1.7.3.js b/js/jquery.jeditable-1.7.3.js
deleted file mode 100644
index 49b2612a58..0000000000
--- a/js/jquery.jeditable-1.7.3.js
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- * Jeditable - jQuery in place edit plugin
- *
- * Copyright (c) 2006-2013 Mika Tuupola, Dylan Verheul
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/mit-license.php
- *
- * Project home:
- * http://www.appelsiini.net/projects/jeditable
- *
- * Based on editable by Dylan Verheul <dylan_at_dyve.net>:
- * http://www.dyve.net/jquery/?editable
- *
- */
-
-/**
- * Version 1.7.3
- *
- * ** means there is basic unit tests for this parameter.
- *
- * @name Jeditable
- * @type jQuery
- * @param String target (POST) URL or function to send edited content to **
- * @param Hash options additional options
- * @param String options[method] method to use to send edited content (POST or PUT) **
- * @param Function options[callback] Function to run after submitting edited content **
- * @param String options[name] POST parameter name of edited content
- * @param String options[id] POST parameter name of edited div id
- * @param Hash options[submitdata] Extra parameters to send when submitting edited content.
- * @param String options[type] text, textarea or select (or any 3rd party input type) **
- * @param Integer options[rows] number of rows if using textarea **
- * @param Integer options[cols] number of columns if using textarea **
- * @param Mixed options[height] 'auto', 'none' or height in pixels **
- * @param Mixed options[width] 'auto', 'none' or width in pixels **
- * @param String options[loadurl] URL to fetch input content before editing **
- * @param String options[loadtype] Request type for load url. Should be GET or POST.
- * @param String options[loadtext] Text to display while loading external content.
- * @param Mixed options[loaddata] Extra parameters to pass when fetching content before editing.
- * @param Mixed options[data] Or content given as paramameter. String or function.**
- * @param String options[indicator] indicator html to show when saving
- * @param String options[tooltip] optional tooltip text via title attribute **
- * @param String options[event] jQuery event such as 'click' of 'dblclick' **
- * @param String options[submit] submit button value, empty means no button **
- * @param String options[cancel] cancel button value, empty means no button **
- * @param String options[cssclass] CSS class to apply to input form. 'inherit' to copy from parent. **
- * @param String options[style] Style to apply to input form 'inherit' to copy from parent. **
- * @param String options[select] true or false, when true text is highlighted ??
- * @param String options[placeholder] Placeholder text or html to insert when element is empty. **
- * @param String options[onblur] 'cancel', 'submit', 'ignore' or function ??
- *
- * @param Function options[onsubmit] function(settings, original) { ... } called before submit
- * @param Function options[onreset] function(settings, original) { ... } called before reset
- * @param Function options[onerror] function(settings, original, xhr) { ... } called on error
- *
- * @param Hash options[ajaxoptions] jQuery Ajax options. See docs.jquery.com.
- *
- */
-
-(function($) {
-
- $.fn.editable = function(target, options) {
-
- if ('disable' == target) {
- $(this).data('disabled.editable', true);
- return;
- }
- if ('enable' == target) {
- $(this).data('disabled.editable', false);
- return;
- }
- if ('destroy' == target) {
- $(this)
- .unbind($(this).data('event.editable'))
- .removeData('disabled.editable')
- .removeData('event.editable');
- return;
- }
-
- var settings = $.extend({}, $.fn.editable.defaults, {target:target}, options);
-
- /* setup some functions */
- var plugin = $.editable.types[settings.type].plugin || function() { };
- var submit = $.editable.types[settings.type].submit || function() { };
- var buttons = $.editable.types[settings.type].buttons
- || $.editable.types['defaults'].buttons;
- var content = $.editable.types[settings.type].content
- || $.editable.types['defaults'].content;
- var element = $.editable.types[settings.type].element
- || $.editable.types['defaults'].element;
- var reset = $.editable.types[settings.type].reset
- || $.editable.types['defaults'].reset;
- var callback = settings.callback || function() { };
- var onedit = settings.onedit || function() { };
- var onsubmit = settings.onsubmit || function() { };
- var onreset = settings.onreset || function() { };
- var onerror = settings.onerror || reset;
-
- /* Show tooltip. */
- if (settings.tooltip) {
- $(this).attr('title', settings.tooltip);
- }
-
- settings.autowidth = 'auto' == settings.width;
- settings.autoheight = 'auto' == settings.height;
-
- return this.each(function() {
-
- /* Save this to self because this changes when scope changes. */
- var self = this;
-
- /* Inlined block elements lose their width and height after first edit. */
- /* Save them for later use as workaround. */
- var savedwidth = $(self).width();
- var savedheight = $(self).height();
-
- /* Save so it can be later used by $.editable('destroy') */
- $(this).data('event.editable', settings.event);
-
- /* If element is empty add something clickable (if requested) */
- if (!$.trim($(this).html())) {
- $(this).html(settings.placeholder);
- }
-
- $(this).bind(settings.event, function(e) {
-
- /* Abort if element is disabled. */
- if (true === $(this).data('disabled.editable')) {
- return;
- }
-
- /* Prevent throwing an exeption if edit field is clicked again. */
- if (self.editing) {
- return;
- }
-
- /* Abort if onedit hook returns false. */
- if (false === onedit.apply(this, [settings, self])) {
- return;
- }
-
- /* Prevent default action and bubbling. */
- e.preventDefault();
- e.stopPropagation();
-
- /* Remove tooltip. */
- if (settings.tooltip) {
- $(self).removeAttr('title');
- }
-
- /* Figure out how wide and tall we are, saved width and height. */
- /* Workaround for http://dev.jquery.com/ticket/2190 */
- if (0 == $(self).width()) {
- settings.width = savedwidth;
- settings.height = savedheight;
- } else {
- if (settings.width != 'none') {
- settings.width =
- settings.autowidth ? $(self).width() : settings.width;
- }
- if (settings.height != 'none') {
- settings.height =
- settings.autoheight ? $(self).height() : settings.height;
- }
- }
-
- /* Remove placeholder text, replace is here because of IE. */
- if ($(this).html().toLowerCase().replace(/(;|"|\/)/g, '') ==
- settings.placeholder.toLowerCase().replace(/(;|"|\/)/g, '')) {
- $(this).html('');
- }
-
- self.editing = true;
- self.revert = $(self).html();
- $(self).html('');
-
- /* Create the form object. */
- var form = $('<form />');
-
- /* Apply css or style or both. */
- if (settings.cssclass) {
- if ('inherit' == settings.cssclass) {
- form.attr('class', $(self).attr('class'));
- } else {
- form.attr('class', settings.cssclass);
- }
- }
-
- if (settings.style) {
- if ('inherit' == settings.style) {
- form.attr('style', $(self).attr('style'));
- /* IE needs the second line or display wont be inherited. */
- form.css('display', $(self).css('display'));
- } else {
- form.attr('style', settings.style);
- }
- }
-
- /* Add main input element to form and store it in input. */
- var input = element.apply(form, [settings, self]);
-
- /* Set input content via POST, GET, given data or existing value. */
- var input_content;
-
- if (settings.loadurl) {
- var t = setTimeout(function() {
- input.disabled = true;
- content.apply(form, [settings.loadtext, settings, self]);
- }, 100);
-
- var loaddata = {};
- loaddata[settings.id] = self.id;
- if ($.isFunction(settings.loaddata)) {
- $.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings]));
- } else {
- $.extend(loaddata, settings.loaddata);
- }
- $.ajax({
- type : settings.loadtype,
- url : settings.loadurl,
- data : loaddata,
- async : false,
- success: function(result) {
- window.clearTimeout(t);
- input_content = result;
- input.disabled = false;
- }
- });
- } else if (settings.data) {
- input_content = settings.data;
- if ($.isFunction(settings.data)) {
- input_content = settings.data.apply(self, [self.revert, settings]);
- }
- } else {
- input_content = self.revert;
- }
- content.apply(form, [input_content, settings, self]);
-
- input.attr('name', settings.name);
-
- /* Add buttons to the form. */
- buttons.apply(form, [settings, self]);
-
- /* Add created form to self. */
- $(self).append(form);
-
- /* Attach 3rd party plugin if requested. */
- plugin.apply(form, [settings, self]);
-
- /* Focus to first visible form element. */
- $(':input:visible:enabled:first', form).focus();
-
- /* Highlight input contents when requested. */
- if (settings.select) {
- input.select();
- }
-
- /* discard changes if pressing esc */
- input.keydown(function(e) {
- if (e.keyCode == 27) {
- e.preventDefault();
- reset.apply(form, [settings, self]);
- }
- });
-
- /* Discard, submit or nothing with changes when clicking outside. */
- /* Do nothing is usable when navigating with tab. */
- var t;
- if ('cancel' == settings.onblur) {
- input.blur(function(e) {
- /* Prevent canceling if submit was clicked. */
- t = setTimeout(function() {
- reset.apply(form, [settings, self]);
- }, 500);
- });
- } else if ('submit' == settings.onblur) {
- input.blur(function(e) {
- /* Prevent double submit if submit was clicked. */
- t = setTimeout(function() {
- form.submit();
- }, 200);
- });
- } else if ($.isFunction(settings.onblur)) {
- input.blur(function(e) {
- settings.onblur.apply(self, [input.val(), settings]);
- });
- } else {
- input.blur(function(e) {
- /* TODO: maybe something here */
- });
- }
-
- form.submit(function(e) {
-
- if (t) {
- clearTimeout(t);
- }
-
- /* Do no submit. */
- e.preventDefault();
-
- /* Call before submit hook. */
- /* If it returns false abort submitting. */
- if (false !== onsubmit.apply(form, [settings, self])) {
- /* Custom inputs call before submit hook. */
- /* If it returns false abort submitting. */
- if (false !== submit.apply(form, [settings, self])) {
-
- /* Check if given target is function */
- if ($.isFunction(settings.target)) {
- var str = settings.target.apply(self, [input.val(), settings]);
- $(self).html(str);
- self.editing = false;
- callback.apply(self, [self.innerHTML, settings]);
- /* TODO: this is not dry */
- if (!$.trim($(self).html())) {
- $(self).html(settings.placeholder);
- }
- } else {
- /* Add edited content and id of edited element to POST. */
- var submitdata = {};
- submitdata[settings.name] = input.val();
- submitdata[settings.id] = self.id;
- /* Add extra data to be POST:ed. */
- if ($.isFunction(settings.submitdata)) {
- $.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings]));
- } else {
- $.extend(submitdata, settings.submitdata);
- }
-
- /* Quick and dirty PUT support. */
- if ('PUT' == settings.method) {
- submitdata['_method'] = 'put';
- }
-
- /* Show the saving indicator. */
- $(self).html(settings.indicator);
-
- /* Defaults for ajaxoptions. */
- var ajaxoptions = {
- type : 'POST',
- data : submitdata,
- dataType: 'html',
- url : settings.target,
- success : function(result, status) {
- if (ajaxoptions.dataType == 'html') {
- $(self).html(result);
- }
- self.editing = false;
- callback.apply(self, [result, settings]);
- if (!$.trim($(self).html())) {
- $(self).html(settings.placeholder);
- }
- },
- error : function(xhr, status, error) {
- onerror.apply(form, [settings, self, xhr]);
- }
- };
-
- /* Override with what is given in settings.ajaxoptions. */
- $.extend(ajaxoptions, settings.ajaxoptions);
- $.ajax(ajaxoptions);
-
- }
- }
- }
-
- /* Show tooltip again. */
- $(self).attr('title', settings.tooltip);
-
- return false;
- });
- });
-
- /* Privileged methods */
- this.reset = function(form) {
- /* Prevent calling reset twice when blurring. */
- if (this.editing) {
- /* Before reset hook, if it returns false abort reseting. */
- if (false !== onreset.apply(form, [settings, self])) {
- $(self).html(self.revert);
- self.editing = false;
- if (!$.trim($(self).html())) {
- $(self).html(settings.placeholder);
- }
- /* Show tooltip again. */
- if (settings.tooltip) {
- $(self).attr('title', settings.tooltip);
- }
- }
- }
- };
- });
-
- };
-
-
- $.editable = {
- types: {
- defaults: {
- element : function(settings, original) {
- var input = $('<input type="hidden"></input>');
- $(this).append(input);
- return(input);
- },
- content : function(string, settings, original) {
- $(':input:first', this).val(string);
- },
- reset : function(settings, original) {
- original.reset(this);
- },
- buttons : function(settings, original) {
- var form = this;
- if (settings.submit) {
- /* If given html string use that. */
- if (settings.submit.match(/>$/)) {
- var submit = $(settings.submit).click(function() {
- if (submit.attr("type") != "submit") {
- form.submit();
- }
- });
- /* Otherwise use button with given string as text. */
- } else {
- var submit = $('<button type="submit" />');
- submit.html(settings.submit);
- }
- $(this).append(submit);
- }
- if (settings.cancel) {
- /* If given html string use that. */
- if (settings.cancel.match(/>$/)) {
- var cancel = $(settings.cancel);
- /* otherwise use button with given string as text */
- } else {
- var cancel = $('<button type="cancel" />');
- cancel.html(settings.cancel);
- }
- $(this).append(cancel);
-
- $(cancel).click(function(event) {
- if ($.isFunction($.editable.types[settings.type].reset)) {
- var reset = $.editable.types[settings.type].reset;
- } else {
- var reset = $.editable.types['defaults'].reset;
- }
- reset.apply(form, [settings, original]);
- return false;
- });
- }
- }
- },
- text: {
- element : function(settings, original) {
- var input = $('<input />');
- if (settings.width != 'none') { input.width(settings.width); }
- if (settings.height != 'none') { input.height(settings.height); }
- /* https://bugzilla.mozilla.org/show_bug.cgi?id=236791 */
- //input[0].setAttribute('autocomplete','off');
- input.attr('autocomplete','off');
- $(this).append(input);
- return(input);
- }
- },
- textarea: {
- element : function(settings, original) {
- var textarea = $('<textarea />');
- if (settings.rows) {
- textarea.attr('rows', settings.rows);
- } else if (settings.height != "none") {
- textarea.height(settings.height);
- }
- if (settings.cols) {
- textarea.attr('cols', settings.cols);
- } else if (settings.width != "none") {
- textarea.width(settings.width);
- }
- $(this).append(textarea);
- return(textarea);
- }
- },
- select: {
- element : function(settings, original) {
- var select = $('<select />');
- $(this).append(select);
- return(select);
- },
- content : function(data, settings, original) {
- /* If it is string assume it is json. */
- if (String == data.constructor) {
- eval ('var json = ' + data);
- } else {
- /* Otherwise assume it is a hash already. */
- var json = data;
- }
- for (var key in json) {
- if (!json.hasOwnProperty(key)) {
- continue;
- }
- if ('selected' == key) {
- continue;
- }
- var option = $('<option />').val(key).append(json[key]);
- $('select', this).append(option);
- }
- /* Loop option again to set selected. IE needed this... */
- $('select', this).children().each(function() {
- if ($(this).val() == json['selected'] ||
- $(this).text() == $.trim(original.revert)) {
- $(this).attr('selected', 'selected');
- }
- });
- /* Submit on change if no submit button defined. */
- if (!settings.submit) {
- var form = this;
- $('select', this).change(function() {
- form.submit();
- });
- }
- }
- }
- },
-
- /* Add new input type */
- addInputType: function(name, input) {
- $.editable.types[name] = input;
- }
- };
-
- /* Publicly accessible defaults. */
- $.fn.editable.defaults = {
- name : 'value',
- id : 'id',
- type : 'text',
- width : 'auto',
- height : 'auto',
- event : 'click.editable',
- onblur : 'cancel',
- loadtype : 'GET',
- loadtext : 'Loading...',
- placeholder: 'Click to edit',
- loaddata : {},
- submitdata : {},
- ajaxoptions: {}
- };
-
-})(jQuery);
diff --git a/language/ar.po b/language/ar.po
index 3fd1bf6fc7..3a277b4ab0 100644
--- a/language/ar.po
+++ b/language/ar.po
@@ -13780,7 +13780,7 @@ msgstr "الوقت الخامل بالثواني بعد ترك الموقع دو
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14531,7 +14531,7 @@ msgstr "تصفح الموقع متوقف مؤقتاً"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "هذا سيحذف جميع المعلومات من المشجر <b>%s</b> ويستبدلها بمعلومات من ملف GEDCOM آخر."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/bg.po b/language/bg.po
index 3cfd00c68f..68cf3a9eb3 100644
--- a/language/bg.po
+++ b/language/bg.po
@@ -13643,7 +13643,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/bs.po b/language/bs.po
index 9f19cf8a76..f59c7badd2 100644
--- a/language/bs.po
+++ b/language/bs.po
@@ -13670,7 +13670,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14415,7 +14415,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/ca.po b/language/ca.po
index 7aeeb3f44b..1ed823e28b 100644
--- a/language/ca.po
+++ b/language/ca.po
@@ -13647,7 +13647,7 @@ msgstr "El temps en segons que una sessio webtrees romàn activa abans de requer
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14390,7 +14390,7 @@ msgstr "Lloc web indisponible temporalment"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Això esborrarà totes les dades genealògiques de <b>%s</b> i les substituirà per les d’un altre GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/cs.po b/language/cs.po
index 7b085ca465..d2dc2941c8 100644
--- a/language/cs.po
+++ b/language/cs.po
@@ -13677,7 +13677,7 @@ msgstr "Čas ve vteřinách, po jak dlouhý zůstávají sezení uživatelů akt
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14422,7 +14422,7 @@ msgstr "Tyto stránky jsou dočasně nedostupné"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Vymaže všechna rodokmenová data z <b>%s</b> a nahradí je daty z jiného GEDCOMu."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/da.po b/language/da.po
index 66b6a17f39..0c49529c73 100644
--- a/language/da.po
+++ b/language/da.po
@@ -13647,7 +13647,7 @@ msgstr "Tiden i sekunder som en webtrees session må være aktiv før der atter
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "De to familietræer er posten %1$s oprettet med den samme “XREF”."
msgstr[1] "De to familietræer er posterne %1$s oprettet med den samme “XREF”."
@@ -14390,7 +14390,7 @@ msgstr "Dette websted er ikke tilgængeligt i øjeblikket"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Dette sletter al slægtsdata fra <b>%s</b> og erstatter den med data fra en anden GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/de.po b/language/de.po
index 1cecc886f1..be63a95789 100644
--- a/language/de.po
+++ b/language/de.po
@@ -13644,7 +13644,7 @@ msgstr "Die Zeit in Sekunden, nach der man sich für eine webtrees-Sitzung erneu
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "Die beiden Stammbäume haben einen Datensatz, der die selbe “XREF” verwendet."
msgstr[1] "Die beiden Stammbäume haben %1$s Datensätze, die die selben “XREF” verwenden."
@@ -14387,7 +14387,7 @@ msgstr "Diese Webseite ist vorübergehend nicht verfügbar."
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Dies wird die Genealogischen Daten von <b>%s</b> löschen und sie durch Daten einer andern GEDCOM ersetzen."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/el.po b/language/el.po
index 9b385304f2..74fe547a22 100644
--- a/language/el.po
+++ b/language/el.po
@@ -13648,7 +13648,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14391,7 +14391,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/en_GB.po b/language/en_GB.po
index b575350b2c..fd8259d496 100644
--- a/language/en_GB.po
+++ b/language/en_GB.po
@@ -13647,7 +13647,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14390,7 +14390,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/en_US.po b/language/en_US.po
index e9f8554180..2a1aa75889 100644
--- a/language/en_US.po
+++ b/language/en_US.po
@@ -13643,7 +13643,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/es.po b/language/es.po
index 9b3d68561c..86f7cd966f 100644
--- a/language/es.po
+++ b/language/es.po
@@ -13648,7 +13648,7 @@ msgstr "El tiempo en segundos que una sesión en webtrees permanece activa antes
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14391,7 +14391,7 @@ msgstr "Este sitio web no está disponible en este momento"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Se borrarán todos los datos genealógicos de <b>%s</b> y reemplazarlos con datos de otra GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/et.po b/language/et.po
index 83ff78aae4..634b2529a1 100644
--- a/language/et.po
+++ b/language/et.po
@@ -13653,7 +13653,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14396,7 +14396,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/af.po b/language/extra/af.po
index 8bb120d9bd..ed1b2ef3ba 100644
--- a/language/extra/af.po
+++ b/language/extra/af.po
@@ -13642,7 +13642,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14385,7 +14385,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/dv.po b/language/extra/dv.po
index 711535dadd..b33453c0bd 100644
--- a/language/extra/dv.po
+++ b/language/extra/dv.po
@@ -13616,7 +13616,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
@@ -14357,7 +14357,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/en_AU.po b/language/extra/en_AU.po
index 4b3451a81e..a01209573b 100644
--- a/language/extra/en_AU.po
+++ b/language/extra/en_AU.po
@@ -13643,7 +13643,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/fa.po b/language/extra/fa.po
index ec29c21a43..0bed3a8ba3 100644
--- a/language/extra/fa.po
+++ b/language/extra/fa.po
@@ -13629,7 +13629,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
@@ -14370,7 +14370,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/fo.po b/language/extra/fo.po
index 862be9491b..77dbef9694 100644
--- a/language/extra/fo.po
+++ b/language/extra/fo.po
@@ -13644,7 +13644,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14387,7 +14387,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/fr_CA.po b/language/extra/fr_CA.po
index 5647f2a27c..7365e3c2ee 100644
--- a/language/extra/fr_CA.po
+++ b/language/extra/fr_CA.po
@@ -13645,7 +13645,7 @@ msgstr "Le temps en secondes que la session webtrees reste active avant d’exig
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "Les deux arbres généalogiques ont %1$s enregistrement qui utilise le même code (“XREF”)."
msgstr[1] "Les deux arbres généalogiques ont %1$s enregistrements qui utilisent le même identifiant (“XREF”)."
@@ -14388,7 +14388,7 @@ msgstr "Ce site est momentanément indisponible"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Toutes les données généalogiques de <b>%s</b> seront effacées, elles seront remplacées par les données provenant d’un autre GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/gl.po b/language/extra/gl.po
index e5ed70bf42..90d673c529 100644
--- a/language/extra/gl.po
+++ b/language/extra/gl.po
@@ -13645,7 +13645,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14388,7 +14388,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/id.po b/language/extra/id.po
index 7bcd917f41..669e7b4296 100644
--- a/language/extra/id.po
+++ b/language/extra/id.po
@@ -13622,7 +13622,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
@@ -14363,7 +14363,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/ja.po b/language/extra/ja.po
index ecd3afaf16..706fda554f 100644
--- a/language/extra/ja.po
+++ b/language/extra/ja.po
@@ -13616,7 +13616,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
@@ -14357,7 +14357,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/ka.po b/language/extra/ka.po
index 1ac32f6328..e9fb5e4ec2 100644
--- a/language/extra/ka.po
+++ b/language/extra/ka.po
@@ -13616,7 +13616,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
@@ -14357,7 +14357,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/ko.po b/language/extra/ko.po
index 2e8f562bdd..1184c30347 100644
--- a/language/extra/ko.po
+++ b/language/extra/ko.po
@@ -13616,7 +13616,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
@@ -14357,7 +14357,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/lv.po b/language/extra/lv.po
index 88403cfb22..0bc7b5e971 100644
--- a/language/extra/lv.po
+++ b/language/extra/lv.po
@@ -13668,7 +13668,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14413,7 +14413,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/mi.po b/language/extra/mi.po
index 8300026735..a8131cd9c6 100644
--- a/language/extra/mi.po
+++ b/language/extra/mi.po
@@ -13643,7 +13643,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/ms.po b/language/extra/ms.po
index 8ad6a92b50..25a54de77f 100644
--- a/language/extra/ms.po
+++ b/language/extra/ms.po
@@ -13643,7 +13643,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/ne.po b/language/extra/ne.po
index 70248a2253..6a2dc56bb4 100644
--- a/language/extra/ne.po
+++ b/language/extra/ne.po
@@ -13643,7 +13643,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/oc.po b/language/extra/oc.po
index b7b92d5849..631d310289 100644
--- a/language/extra/oc.po
+++ b/language/extra/oc.po
@@ -13643,7 +13643,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/ro.po b/language/extra/ro.po
index 25b2ed71f1..7517d0398a 100644
--- a/language/extra/ro.po
+++ b/language/extra/ro.po
@@ -13670,7 +13670,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14415,7 +14415,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/sl.po b/language/extra/sl.po
index 62a587993a..fa2bcc2e90 100644
--- a/language/extra/sl.po
+++ b/language/extra/sl.po
@@ -13702,7 +13702,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14449,7 +14449,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/sr.po b/language/extra/sr.po
index 4f30e96d0a..e53f7e3d63 100644
--- a/language/extra/sr.po
+++ b/language/extra/sr.po
@@ -13675,7 +13675,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14420,7 +14420,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/sr@Latn.po b/language/extra/sr@Latn.po
index 9ef49077ed..347300d332 100644
--- a/language/extra/sr@Latn.po
+++ b/language/extra/sr@Latn.po
@@ -13675,7 +13675,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14420,7 +14420,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/ta.po b/language/extra/ta.po
index ef587eec1c..c06ebcdf7b 100644
--- a/language/extra/ta.po
+++ b/language/extra/ta.po
@@ -13643,7 +13643,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/tt.po b/language/extra/tt.po
index 5b25d5dacc..a188e43429 100644
--- a/language/extra/tt.po
+++ b/language/extra/tt.po
@@ -13622,7 +13622,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
@@ -14363,7 +14363,7 @@ msgstr "Сәхифә вакытлыча ябык"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/yi.po b/language/extra/yi.po
index a0075c28d5..dd78e16b9f 100644
--- a/language/extra/yi.po
+++ b/language/extra/yi.po
@@ -13643,7 +13643,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr "דעם וועבזייַטל איז צייַטווייַליק נישט
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/extra/zh_TW.po b/language/extra/zh_TW.po
index cb6438a512..e6e61677c7 100644
--- a/language/extra/zh_TW.po
+++ b/language/extra/zh_TW.po
@@ -13616,7 +13616,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
@@ -14357,7 +14357,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/fi.po b/language/fi.po
index bbf9c2ca7d..4e7fef7c06 100644
--- a/language/fi.po
+++ b/language/fi.po
@@ -13643,7 +13643,7 @@ msgstr "Aika sekunneissa, miten kauan webtrees sessio / käyttäjän istunto pys
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "Molemmissa sukupuissa on yksi tietue joilla on sama “XREF”."
msgstr[1] "Molemmissa sukupuissa on %1$s tietuetta joilla on sama “XREF”."
@@ -14386,7 +14386,7 @@ msgstr "Tämä sivusto on tilapäisesti poissa käytöstä"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Tämä poistaa kaikki sukututkimustiedot <b>%s</b>sta ja korvaa ne toisen GEDCOMin tiedoilla."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/fr.po b/language/fr.po
index 78db889ba3..09447f3724 100644
--- a/language/fr.po
+++ b/language/fr.po
@@ -13647,7 +13647,7 @@ msgstr "La durée en secondes durant laquelle la session webtrees reste active a
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "Les deux arbres généalogiques ont %1$s enregistrement qui utilise le même code (“XREF”)."
msgstr[1] "Les deux arbres généalogiques ont %1$s enregistrements qui utilisent le même identifiant (“XREF”)."
@@ -14390,7 +14390,7 @@ msgstr "Ce site est momentanément indisponible"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Toutes les données généalogiques de <b>%s</b> seront effacées et seront remplacées par les données provenant d’un autre GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/he.po b/language/he.po
index 3d17a7951e..c6cdecf290 100644
--- a/language/he.po
+++ b/language/he.po
@@ -13647,7 +13647,7 @@ msgstr "הזמן בשניות שמושב webtrees נשאר פעיל לפני ש
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "בשני עצי המשפחה יש רשומה אחת המשתמשת באותו ”XREF”."
msgstr[1] "בשני עצי המשפחה יש %1$s רשומות המשתמשות באותו ”XREF”."
@@ -14390,7 +14390,7 @@ msgstr "אתר האינטרנט הזה אינו זמין באופן זמני."
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "פעולה זו ימחק את כל הנתונים הגנאלוגיים מן <b>%s</b> ויחליף אותו עם נתוני GEDCOM אחרת."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/hr.po b/language/hr.po
index b524617d78..e22517a5e9 100644
--- a/language/hr.po
+++ b/language/hr.po
@@ -13674,7 +13674,7 @@ msgstr "Vrijeme u sekundama u kojem webtrees drži aktivnu prijavu prije nego za
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "Obiteljska stabla imaju %1$s zapis koji koristi isti “XREF”."
msgstr[1] "Obiteljska stabla imaju %1$s zapisa koji koriste isti “XREF”."
@@ -14420,7 +14420,7 @@ msgstr "Ove web stranice su privremeno nedostupne"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Ovo će obrisati sve genealoške podatke iz <b>%s</b> i prepisati sa podacima iz drugog GEDCOM-a."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/hu.po b/language/hu.po
index 59209d5041..e55272e816 100644
--- a/language/hu.po
+++ b/language/hu.po
@@ -13649,7 +13649,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14392,7 +14392,7 @@ msgstr "Ez az oldal ideiglenesen nem elérhető."
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Ez kitörli az összes családfa adatot a(z) <b>%s</b> bejegyzésből és felülírja egy másik GEDCOM adataival."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/is.po b/language/is.po
index bc5877ed44..fdc1ae51c0 100644
--- a/language/is.po
+++ b/language/is.po
@@ -13643,7 +13643,7 @@ msgstr "Tíminn í sekúndum sem webtrees seta helst virk áður en krafist er i
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr "Þessi vefsíða er tímabundið óaðgengileg."
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Þetta mun eyða öllum ættfræðigögnum frá <b>%s</b> og skipta þeim út með gögnum frá öðrum GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/it.po b/language/it.po
index 1bc907efdd..e788102e25 100644
--- a/language/it.po
+++ b/language/it.po
@@ -13649,7 +13649,7 @@ msgstr "Il tempo (in secondi) che una sessione di webtrees rimane attiva prima c
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "I due alberi genealogici hanno %1$s record che usa lo stesso “XREF”."
msgstr[1] "I due alberi genealogici hanno %1$s record che usano lo stesso “XREF”."
@@ -14392,7 +14392,7 @@ msgstr "Questo sito è temporaneamente non disponibile"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Questo cancellerà tutti i dati genealogici da <b>%s</b> e li sostituirà con i dati di un altro GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/lt.po b/language/lt.po
index 76d24dcc0e..2f9191b3a4 100644
--- a/language/lt.po
+++ b/language/lt.po
@@ -13674,7 +13674,7 @@ msgstr "Laikotarpis sekundėmis per kurį webtrees sesija pasilieka atidaryta be
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "Šie du šeimos medžiai turi %1$s įrašą su tuo pačiu „XREF“ numeriu."
msgstr[1] "Šie du šeimos medžiai turi %1$s įrašus su tuo pačiu „XREF“ numeriu."
@@ -14419,7 +14419,7 @@ msgstr "Šis tinklapis laikinai nepasiekiamas"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Tai ištrins visus genealoginius duomenis iš <b>%s</b> ir pakeis duomenimis iš kito GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/mr.po b/language/mr.po
index ecd6d83ace..d6f64130df 100644
--- a/language/mr.po
+++ b/language/mr.po
@@ -13643,7 +13643,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14386,7 +14386,7 @@ msgstr ""
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr ""
#: modules_v3/googlemap/module.php:1772
diff --git a/language/nb.po b/language/nb.po
index 135016eac1..f485e30021 100644
--- a/language/nb.po
+++ b/language/nb.po
@@ -13643,7 +13643,7 @@ msgstr "Tid i sekunder som en webtrees økt er aktiv før ny innlogging kreves.
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "De to slektstrærne har %1$s post med samme “XREF”."
msgstr[1] "De to slektstrærne har %1$s poster med samme “XREF”."
@@ -14386,7 +14386,7 @@ msgstr "Dette nettstedet er for øyeblikket ikke tilgjengelig"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Dette vil slette alle slektsdata fra <b>%s</b> og erstatte dem med data fra en annen GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/nl.po b/language/nl.po
index 20eb926235..af3e3e90bd 100644
--- a/language/nl.po
+++ b/language/nl.po
@@ -13647,7 +13647,7 @@ msgstr "De tijd in seconden dat een webtrees-sessie actief blijft, voordat er ee
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "De twee stambomen hebben %1$s record met dezelfde “XREF”."
msgstr[1] "De twee stambomen hebben %1$s record met dezelfde “XREF”."
@@ -14390,7 +14390,7 @@ msgstr "Deze website is tijdelijk niet beschikbaar"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Dit zal alle genealogische data van <b>%s</b> verwijderen en het vervangen door data van een andere GEDCOM"
#: modules_v3/googlemap/module.php:1772
diff --git a/language/nn.po b/language/nn.po
index 3e42f4818f..aaf4d5301d 100644
--- a/language/nn.po
+++ b/language/nn.po
@@ -13647,7 +13647,7 @@ msgstr "Tid i sekund som ei webtrees økt er aktiv før det vert krevd ny innlog
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "Dei to slektstrea har %1$s post med same “XREF”."
msgstr[1] "Dei to slektstrea har %1$s postar med same “XREF”."
@@ -14390,7 +14390,7 @@ msgstr "Denne nettstaden er for augneblinken ikkje tilgjengeleg"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Dette vil slette alle slektsdata frå <b>%s</b> og erstatte dei med data frå ein annan GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/pl.po b/language/pl.po
index 6ee867f74f..eee655444f 100644
--- a/language/pl.po
+++ b/language/pl.po
@@ -13676,7 +13676,7 @@ msgstr "Czas w sekundach, po którym sesja webtrees wygaśnie i będzie konieczn
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "Dwa drzewa genealogiczne mają %1$s wpis, który używa tego samego numeru „XREF”."
msgstr[1] "Dwa drzewa genealogiczne mają %1$s wpisy, które używają tego samego numeru „XREF”."
@@ -14421,7 +14421,7 @@ msgstr "Ta strona jest chwilowo niedostępna"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Spowoduje to usunięcie wszystkich danych genealogicznych <b>%s</b> i zastąpienie ich danymi z innego pliku GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/pt.po b/language/pt.po
index 06c61e4356..a21b0bcbcb 100644
--- a/language/pt.po
+++ b/language/pt.po
@@ -13648,7 +13648,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14391,7 +14391,7 @@ msgstr "Este site web está temporariamente indisponível"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Isto excluirá todos os dados genealógicos de <b>%s</b> e o substituirá com os dados de outro GEDCOM"
#: modules_v3/googlemap/module.php:1772
diff --git a/language/pt_BR.po b/language/pt_BR.po
index d144f944bc..4c7cd94f74 100644
--- a/language/pt_BR.po
+++ b/language/pt_BR.po
@@ -13647,7 +13647,7 @@ msgstr "O tempo em segundos que uma sessão webtrees permanece ativa antes de ex
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14390,7 +14390,7 @@ msgstr "Este site web está temporariamente indisponível"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Isto excluirá todos os dados genealógicos de <b>%s</b> e o substituirá com os dados de outro GEDCOM"
#: modules_v3/googlemap/module.php:1772
diff --git a/language/ru.po b/language/ru.po
index 5659aba7d0..279ecf6038 100644
--- a/language/ru.po
+++ b/language/ru.po
@@ -13677,7 +13677,7 @@ msgstr "Время в секундах, при котором сеанс ост
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "Два семейных деревья имеют %1$s запись которые использует тот же “XREF”."
msgstr[1] "Два семейных деревья имеют %1$s записи которые использует тот же “XREF”."
@@ -14422,7 +14422,7 @@ msgstr "Сайт временно недоступен"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Это удалит все генеалогические данные из <b>%s</b> и заменит их на данные из другого GEDCOM-файла."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/sk.po b/language/sk.po
index 2204c0caf9..7502837974 100644
--- a/language/sk.po
+++ b/language/sk.po
@@ -13675,7 +13675,7 @@ msgstr "Čas v sekundách, po aký zostávajú relácie (session) uživateľov a
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14420,7 +14420,7 @@ msgstr "Táto stránka je dočasne nedostupná"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Toto zmaže všetky genealogické dáta z <b>%s</b> a prepíše ich dátami z iného GEDCOMu."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/sv.po b/language/sv.po
index c521fb74e0..512d513bcc 100644
--- a/language/sv.po
+++ b/language/sv.po
@@ -13647,7 +13647,7 @@ msgstr "Tid i sekunder som en webtrees session är aktiv tills en ny inloggning
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "De två släktträden har en post som använder samma ”XREF”."
msgstr[1] "De två släktträden har %1$s poster som använder samma ”XREF”."
@@ -14390,7 +14390,7 @@ msgstr "Denna sajt är otillgänglig för tillfället"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Radera all släktdata från <b>%s</b> och ersätt dem med data från annan GEDCOM."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/tr.po b/language/tr.po
index 230049c41e..1dac115716 100644
--- a/language/tr.po
+++ b/language/tr.po
@@ -13668,7 +13668,7 @@ msgstr "Saniye olarak webtrees in tekrar otutum açmak gerekmeden oturumu açık
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] "Her iki soy ağacında aynı “XREF” değerini taşıyan %1$s kayıt var. "
@@ -14576,7 +14576,7 @@ msgstr "Bu web sitesi geçici olarak kullanılamıyor"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Bu <b>%s</b> soyağacının tüm verileri silerek bir başka GEDCOM verileri yüklenecektir."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/uk.po b/language/uk.po
index 2c1d1e3f58..d0aa19b0cd 100644
--- a/language/uk.po
+++ b/language/uk.po
@@ -13670,7 +13670,7 @@ msgstr ""
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
msgstr[1] ""
@@ -14415,7 +14415,7 @@ msgstr "Сайт тимчасово недоступний"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Це видалить всі генеалогічні дані з <b>%s</b> і замінить їх на дані з іншого GEDCOM-файла."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/vi.po b/language/vi.po
index e64d98bf02..8a5a060123 100644
--- a/language/vi.po
+++ b/language/vi.po
@@ -13620,7 +13620,7 @@ msgstr "Thời gian bằng giây mà phiên làm việc webtrees vẫn hoạt đ
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
@@ -14361,7 +14361,7 @@ msgstr "Site hiện tạm thời không hoạt động"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "Việc này sẽ xóa bỏ mọi chi tiết gia phả của <b>%s</b> và thay thế bằng số liệu từ một file GEDCOM khác."
#: modules_v3/googlemap/module.php:1772
diff --git a/language/zh_CN.po b/language/zh_CN.po
index 0865570e5f..c09c55866b 100644
--- a/language/zh_CN.po
+++ b/language/zh_CN.po
@@ -13621,7 +13621,7 @@ msgstr "一个webtrees会话仍然活动不需要登录的时间。默认值是7
#. I18N: An XREF is the identification number used in GEDCOM files.
#: admin_trees_merge.php:77
#, php-format
-msgid "The two family trees have %1$s record which use the same “XREF”."
+msgid "The two family trees have %1$s record which uses the same “XREF”."
msgid_plural "The two family trees have %1$s records which use the same “XREF”."
msgstr[0] ""
@@ -14362,7 +14362,7 @@ msgstr "该网站暂时不可用"
#: admin_trees_manage.php:137
#, php-format
-msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM."
+msgid "This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM file."
msgstr "从<b>%s</b>删除所有的家谱资料并用另一个GEDCOM取代它的数据。"
#: modules_v3/googlemap/module.php:1772
diff --git a/library/WT/Auth.php b/library/WT/Auth.php
index c4981d27b2..1371e1506d 100644
--- a/library/WT/Auth.php
+++ b/library/WT/Auth.php
@@ -1,6 +1,4 @@
<?php
-namespace WT;
-
// webtrees: Web based Family History software
// Copyright (C) 2014 webtrees development team
//
@@ -18,6 +16,8 @@ namespace WT;
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+namespace WT;
+
use WT_Tree;
use Zend_Session;
diff --git a/library/WT/Controller/AdvancedSearch.php b/library/WT/Controller/AdvancedSearch.php
index d5ceaeaa07..1f8bf7f012 100644
--- a/library/WT/Controller/AdvancedSearch.php
+++ b/library/WT/Controller/AdvancedSearch.php
@@ -168,7 +168,9 @@ class WT_Controller_AdvancedSearch extends WT_Controller_Search {
*/
function getValue($i) {
$val = '';
- if (isset($this->values[$i])) $val = $this->values[$i];
+ if (isset($this->values[$i])) {
+ $val = $this->values[$i];
+ }
return $val;
}
@@ -219,8 +221,12 @@ class WT_Controller_AdvancedSearch extends WT_Controller_Search {
continue;
}
$newfields[$i] = $this->fields[$j];
- if (isset($this->values[$j])) $newvalues[$i] = $this->values[$j];
- if (isset($this->plusminus[$j])) $newplus[$i] = $this->plusminus[$j];
+ if (isset($this->values[$j])) {
+ $newvalues[$i] = $this->values[$j];
+ }
+ if (isset($this->plusminus[$j])) {
+ $newplus[$i] = $this->plusminus[$j];
+ }
$i++;
}
$this->fields = $newfields;
@@ -345,7 +351,9 @@ class WT_Controller_AdvancedSearch extends WT_Controller_Search {
for ($i=0; $i<$fct; $i++) {
$field = $this->fields[$i];
$value = $this->values[$i];
- if ($value==='') continue;
+ if ($value === '') {
+ continue;
+ }
$parts = preg_split("/:/", $field.'::::');
if ($parts[0]=='NAME') {
// NAME:*
@@ -458,8 +466,11 @@ class WT_Controller_AdvancedSearch extends WT_Controller_Search {
$date = new WT_Date($value);
if ($date->isOK()) {
$jd1 = $date->date1->minJD;
- if ($date->date2) $jd2 = $date->date2->maxJD;
- else $jd2 = $date->date1->maxJD;
+ if ($date->date2) {
+ $jd2 = $date->date2->maxJD;
+ } else {
+ $jd2 = $date->date1->maxJD;
+ }
if (!empty($this->plusminus[$i])) {
$adjd = $this->plusminus[$i]*365;
$jd1 = $jd1 - $adjd;
@@ -475,8 +486,11 @@ class WT_Controller_AdvancedSearch extends WT_Controller_Search {
$date = new WT_Date($value);
if ($date->isOK()) {
$jd1 = $date->date1->minJD;
- if ($date->date2) $jd2 = $date->date2->maxJD;
- else $jd2 = $date->date1->maxJD;
+ if ($date->date2) {
+ $jd2 = $date->date2->maxJD;
+ } else {
+ $jd2 = $date->date1->maxJD;
+ }
if (!empty($this->plusminus[$i])) {
$adjd = $this->plusminus[$i]*365;
$jd1 = $jd1 - $adjd;
diff --git a/library/WT/Controller/Ajax.php b/library/WT/Controller/Ajax.php
index b78659ae7e..87fe05a8d7 100644
--- a/library/WT/Controller/Ajax.php
+++ b/library/WT/Controller/Ajax.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -34,12 +34,11 @@ class WT_Controller_Ajax extends WT_Controller_Base {
}
/**
- * @return $this
+ * @return string
*/
public function pageFooter() {
// Ajax responses may have Javascript
- echo $this->getJavascript();
- return $this;
+ return $this->getJavascript();
}
/**
diff --git a/library/WT/Controller/Ancestry.php b/library/WT/Controller/Ancestry.php
index e8733ca94a..8b769807e6 100644
--- a/library/WT/Controller/Ancestry.php
+++ b/library/WT/Controller/Ancestry.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team. All rights reserved.
@@ -18,6 +18,7 @@
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
/**
* Class WT_Controller_Ancestry - Controller for the ancestry chart
@@ -38,7 +39,7 @@ class WT_Controller_Ancestry extends WT_Controller_Chart {
* Startup activity
*/
function __construct() {
- global $bwidth, $bheight, $cbwidth, $cbheight, $pbwidth, $pbheight, $PEDIGREE_FULL_DETAILS;
+ global $bwidth, $bheight, $pbwidth, $pbheight, $PEDIGREE_FULL_DETAILS;
global $DEFAULT_PEDIGREE_GENERATIONS, $PEDIGREE_GENERATIONS, $MAX_PEDIGREE_GENERATIONS, $OLD_PGENS, $box_width, $Dbwidth, $Dbheight;
global $show_full;
@@ -64,8 +65,8 @@ class WT_Controller_Ancestry extends WT_Controller_Chart {
// -- adjust size of the compact box
if (!$this->show_full) {
- $bwidth = $cbwidth;
- $bheight = $cbheight;
+ $bwidth = Theme::theme()->parameter('compact-chart-box-x');
+ $bheight = Theme::theme()->parameter('compact-chart-box-y');
}
$pbwidth = $bwidth+12;
@@ -80,8 +81,11 @@ class WT_Controller_Ancestry extends WT_Controller_Chart {
$this->setPageTitle(WT_I18N::translate('Ancestors'));
}
- if (strlen($this->name)<30) $this->cellwidth="420";
- else $this->cellwidth=(strlen($this->name)*14);
+ if (strlen($this->name)<30) {
+ $this->cellwidth="420";
+ } else {
+ $this->cellwidth=(strlen($this->name)*14);
+ }
}
/**
@@ -92,7 +96,7 @@ class WT_Controller_Ancestry extends WT_Controller_Chart {
* @param integer $depth the ascendancy depth to show
*/
public function printChildAscendancy($person, $sosa, $depth) {
- global $OLD_PGENS, $WT_IMAGES, $Dindent, $pidarr, $box_width;
+ global $OLD_PGENS, $pidarr, $box_width;
if ($person) {
$pid=$person->getXref();
@@ -105,10 +109,10 @@ class WT_Controller_Ancestry extends WT_Controller_Chart {
echo '<li>';
echo '<table><tr><td>';
if ($sosa==1) {
- echo '<img src="', $WT_IMAGES['spacer'], '" height="3" width="', $Dindent, '" alt=""></td><td>';
+ echo '<img src="', Theme::theme()->parameter('image-spacer'), '" height="3" width="', Theme::theme()->parameter('chart-descendancy-indent'), '"></td><td>';
} else {
- echo '<img src="', $WT_IMAGES['spacer'], '" height="3" width="2" alt="">';
- echo '<img src="', $WT_IMAGES['hline'], '" height="3" width="', ($Dindent-2), '" alt=""></td><td>';
+ echo '<img src="', Theme::theme()->parameter('image-spacer'), '" height="3" width="2" alt="">';
+ echo '<img src="', Theme::theme()->parameter('image-hline'), '" height="3" width="', Theme::theme()->parameter('chart-descendancy-indent') - 2, '"></td><td>';
}
print_pedigree_person($person);
echo '</td>';
@@ -120,9 +124,12 @@ class WT_Controller_Ancestry extends WT_Controller_Chart {
echo '<td class="details1">&nbsp;<span dir="ltr" class="person_box'. (($sosa==1)?'NN':(($sosa%2)?'F':'')) . '">&nbsp;', $sosa, '&nbsp;</span>&nbsp;';
echo '</td><td class="details1">';
$relation ='';
- $new=($pid=='' or !isset($pidarr[$pid]));
- if (!$new) $relation = '<br>[=<a href="#sosa'.$pidarr[$pid].'">'.$pidarr[$pid].'</a> - '.get_sosa_name($pidarr[$pid]).']';
- else $pidarr[$pid]=$sosa;
+ $new=($pid=='' || !isset($pidarr[$pid]));
+ if (!$new) {
+ $relation = '<br>[=<a href="#sosa'.$pidarr[$pid].'">'.$pidarr[$pid].'</a> - '.get_sosa_name($pidarr[$pid]).']';
+ } else {
+ $pidarr[$pid]=$sosa;
+ }
echo get_sosa_name($sosa).$relation;
echo '</td>';
echo '</tr></table>';
@@ -137,7 +144,7 @@ class WT_Controller_Ancestry extends WT_Controller_Chart {
if ($family && $new && $depth>0) {
// print marriage info
echo '<span class="details1">';
- echo '<img src="', $WT_IMAGES['spacer'], '" height="2" width="', $Dindent, '" alt=""><a href="#" onclick="return expand_layer(\'sosa_', $sosa, '\');" class="top"><i id="sosa_', $sosa, '_img" class="icon-minus" title="', WT_I18N::translate('View family'), '"></i></a>';
+ echo '<img src="', Theme::theme()->parameter('image-spacer'), '" height="2" width="', Theme::theme()->parameter('chart-descendancy-indent'), '" alt=""><a href="#" onclick="return expand_layer(\'sosa_', $sosa, '\');" class="top"><i id="sosa_', $sosa, '_img" class="icon-minus" title="', WT_I18N::translate('View family'), '"></i></a>';
echo '&nbsp;<span dir="ltr" class="person_box">&nbsp;', ($sosa*2), '&nbsp;</span>&nbsp;', WT_I18N::translate('and');
echo '&nbsp;<span dir="ltr" class="person_boxF">&nbsp;', ($sosa*2+1), '&nbsp;</span>&nbsp;';
if ($family->canShow()) {
diff --git a/library/WT/Controller/Base.php b/library/WT/Controller/Base.php
index bf53a0daa6..963ae40a46 100644
--- a/library/WT/Controller/Base.php
+++ b/library/WT/Controller/Base.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -45,7 +45,7 @@ class WT_Controller_Base {
public function __destruct() {
// If we printed a header, automatically print a footer
if ($this->page_header) {
- $this->pageFooter();
+ echo $this->pageFooter();
}
}
diff --git a/library/WT/Controller/Compact.php b/library/WT/Controller/Compact.php
index 4c63935e5f..8d4ac4d17f 100644
--- a/library/WT/Controller/Compact.php
+++ b/library/WT/Controller/Compact.php
@@ -71,7 +71,9 @@ class WT_Controller_Compact extends WT_Controller_Chart {
$html .= '<a class="name1" href="'.$indi->getHtmlUrl().'">';
$html .= $name;
- if ($addname) $html .= '<br>' . $addname;
+ if ($addname) {
+ $html .= '<br>' . $addname;
+ }
$html .= '</a>';
$html .= '<br>';
if ($indi->canShow()) {
diff --git a/library/WT/Controller/Descendancy.php b/library/WT/Controller/Descendancy.php
index f2324d9e43..e34bf15023 100644
--- a/library/WT/Controller/Descendancy.php
+++ b/library/WT/Controller/Descendancy.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team. All rights reserved.
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use Rhumsaa\Uuid\Uuid;
+use WT\Theme;
/**
* Class WT_Controller_Descendancy - Controller for the descendancy chart
@@ -52,7 +53,7 @@ class WT_Controller_Descendancy extends WT_Controller_Chart {
* Create the descendancy controller
*/
function __construct() {
- global $bwidth, $bheight, $cbwidth, $cbheight, $pbwidth, $pbheight, $PEDIGREE_FULL_DETAILS, $MAX_DESCENDANCY_GENERATIONS, $DEFAULT_PEDIGREE_GENERATIONS, $show_full;
+ global $bwidth, $bheight, $pbwidth, $pbheight, $PEDIGREE_FULL_DETAILS, $MAX_DESCENDANCY_GENERATIONS, $DEFAULT_PEDIGREE_GENERATIONS, $show_full;
parent::__construct();
@@ -65,7 +66,9 @@ class WT_Controller_Descendancy extends WT_Controller_Chart {
// This is passed as a global. A parameter would be better...
$show_full=$this->show_full;
- if (!isset($this->personcount)) $this->personcount = 1;
+ if (!isset($this->personcount)) {
+ $this->personcount = 1;
+ }
// -- size of the detailed boxes based upon optional width parameter
$Dbwidth = ($this->box_width*$bwidth)/100;
@@ -75,8 +78,8 @@ class WT_Controller_Descendancy extends WT_Controller_Chart {
// -- adjust size of the compact box
if (!$this->show_full) {
- $bwidth = $cbwidth;
- $bheight = $cbheight;
+ $bwidth = Theme::theme()->parameter('compact-chart-box-x');
+ $bheight = Theme::theme()->parameter('compact-chart-box-y');
}
$pbwidth = $bwidth+12;
@@ -111,7 +114,9 @@ class WT_Controller_Descendancy extends WT_Controller_Chart {
*/
public function printChildFamily(WT_Individual $person, $depth, $label='1.', $gpid='') {
- if ($depth<2) return;
+ if ($depth<2) {
+ return;
+ }
foreach ($person->getSpouseFamilies() as $family) {
print_sosa_family($family->getXref(), '', -1, $label, $person->getXref(), $gpid);
$i=1;
@@ -130,14 +135,13 @@ class WT_Controller_Descendancy extends WT_Controller_Chart {
* @return void
*/
public function printChildDescendancy(WT_Individual $person, $depth) {
- global $WT_IMAGES, $Dindent;
-
echo "<li>";
echo "<table><tr><td>";
- if ($depth==$this->generations) echo "<img src=\"".$WT_IMAGES["spacer"]."\" height=\"3\" width=\"$Dindent\" alt=\"\"></td><td>";
- else {
- echo "<img src=\"".$WT_IMAGES["spacer"]."\" height=\"3\" width=\"3\" alt=\"\">";
- echo "<img src=\"".$WT_IMAGES["hline"]."\" height=\"3\" width=\"".($Dindent-3)."\" alt=\"\"></td><td>";
+ if ($depth==$this->generations) {
+ echo "<img src=\"".Theme::theme()->parameter('image-spacer')."\" height=\"3\" width=\"", Theme::theme()->parameter('chart-descendancy-indent'), "\" alt=\"\"></td><td>";
+ } else {
+ echo "<img src=\"" . Theme::theme()->parameter('image-spacer') . "\" height=\"3\" width=\"3\" alt=\"\">";
+ echo "<img src=\"" . Theme::theme()->parameter('image-hline') . "\" height=\"3\" width=\"", Theme::theme()->parameter('chart-descendancy-indent') - 3, "\" alt=\"\"></td><td>";
}
print_pedigree_person($person);
echo '</td>';
@@ -155,18 +159,28 @@ class WT_Controller_Descendancy extends WT_Controller_Chart {
// d'Aboville child number
$level =$this->generations-$depth;
- if ($this->show_full) echo '<br><br>&nbsp;';
+ if ($this->show_full) {
+ echo '<br><br>&nbsp;';
+ }
echo '<span dir="ltr">'; //needed so that RTL languages will display this properly
- if (!isset($this->dabo_num[$level])) $this->dabo_num[$level]=0;
+ if (!isset($this->dabo_num[$level])) {
+ $this->dabo_num[$level]=0;
+ }
$this->dabo_num[$level]++;
$this->dabo_num[$level+1]=0;
$this->dabo_sex[$level]=$person->getSex();
- for ($i=0; $i<=$level;$i++) {
- $isf=$this->dabo_sex[$i];
- if ($isf=="M") $isf="";
- if ($isf=="U") $isf="NN";
+ for ($i = 0; $i <= $level; $i++) {
+ $isf = $this->dabo_sex[$i];
+ if ($isf === 'M') {
+ $isf = '';
+ }
+ if ($isf === 'U') {
+ $isf = 'NN';
+ }
echo "<span class=\"person_box".$isf."\">&nbsp;".$this->dabo_num[$i]."&nbsp;</span>";
- if ($i<$level) echo ".";
+ if ($i < $level) {
+ echo '.';
+ }
}
echo "</span>";
echo "</td></tr>";
@@ -189,12 +203,10 @@ class WT_Controller_Descendancy extends WT_Controller_Chart {
* @return void
*/
private function printFamilyDescendancy(WT_Individual $person, WT_Family $family, $depth) {
- global $WT_IMAGES, $Dindent;
-
$uid = Uuid::uuid4(); // create a unique ID
// print marriage info
echo '<li>';
- echo '<img src="', $WT_IMAGES['spacer'], '" height="2" width="', ($Dindent+4), '" alt="">';
+ echo '<img src="', Theme::theme()->parameter('image-spacer'), '" height="2" width="', Theme::theme()->parameter('chart-descendancy-indent') + 4, '" alt="">';
echo '<span class="details1">';
echo "<a href=\"#\" onclick=\"expand_layer('".$uid."'); return false;\" class=\"top\"><i id=\"".$uid."_img\" class=\"icon-minus\" title=\"".WT_I18N::translate('View family')."\"></i></a>";
if ($family->canShow()) {
@@ -224,7 +236,9 @@ class WT_Controller_Descendancy extends WT_Controller_Chart {
}
}
}
- if ($this->show_full) echo '<br><br>&nbsp;';
+ if ($this->show_full) {
+ echo '<br><br>&nbsp;';
+ }
echo '</td></tr>';
// children
@@ -243,8 +257,10 @@ class WT_Controller_Descendancy extends WT_Controller_Chart {
}
echo '</td></tr></table>';
echo '</li>';
- if ($depth>1) foreach ($children as $child) {
- $this->printChildDescendancy($child, $depth-1);
+ if ($depth > 1) {
+ foreach ($children as $child) {
+ $this->printChildDescendancy($child, $depth-1);
+ }
}
echo '</ul>';
echo '</li>';
diff --git a/library/WT/Controller/Familybook.php b/library/WT/Controller/Familybook.php
index 1e541ff8b9..a50f36f533 100644
--- a/library/WT/Controller/Familybook.php
+++ b/library/WT/Controller/Familybook.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team. All rights reserved.
@@ -18,6 +18,7 @@
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
/**
* Class WT_Controller_Familybook - Controller for the familybook chart
@@ -63,15 +64,15 @@ class WT_Controller_Familybook extends WT_Controller_Chart {
$this->box_width = WT_Filter::getInteger('box_width', 50, 300, 100);
// Box sizes are set globally in the theme. Modify them here.
- global $bwidth, $bheight, $cbwidth, $cbheight, $Dbwidth, $bhalfheight, $Dbheight;
+ global $bwidth, $bheight, $Dbwidth, $bhalfheight, $Dbheight;
$Dbwidth = $this->box_width * $bwidth / 100;
$bwidth = $Dbwidth;
$bheight = $Dbheight;
// -- adjust size of the compact box
if (!$this->show_full) {
- $bwidth = $this->box_width * $cbwidth / 100;
- $bheight = $cbheight;
+ $bwidth = $this->box_width * Theme::theme()->parameter('compact-chart-box-x') / 100;
+ $bheight = Theme::theme()->parameter('compact-chart-box-y');
}
$bhalfheight = $bheight / 2;
if ($this->root && $this->root->canShowName()) {
@@ -98,7 +99,7 @@ class WT_Controller_Familybook extends WT_Controller_Chart {
* @return integer
*/
private function printDescendency(WT_Individual $person = null, $count) {
- global $WT_IMAGES, $bwidth, $bheight, $show_full, $box_width; // print_pedigree_person() requires these globals.
+ global $bwidth, $bheight, $show_full, $box_width; // print_pedigree_person() requires these globals.
if ($count > $this->dgenerations) {
return 0;
@@ -155,7 +156,7 @@ class WT_Controller_Familybook extends WT_Controller_Chart {
$h = ($kids - 1) * 4 + $h;
}
echo '<td class="tdbot">',
- '<img class="tvertline" id="vline_', $chil, '" src="', $WT_IMAGES["vline"], '" height="', $h - 1, '" alt=""></td>';
+ '<img class="tvertline" id="vline_', $chil, '" src="', Theme::theme()->parameter('image-vline'), '" height="', $h - 1, '" alt=""></td>';
} else if ($i == $ct - 1) {
//-- adjust for the first column on left
$h = round(((($bheight) * $kids) + 8) / 2);
@@ -164,10 +165,10 @@ class WT_Controller_Familybook extends WT_Controller_Chart {
$h = ((($kids - 1) * 4) + $h);
}
echo '<td class="tdtop">',
- '<img class="bvertline" id="vline_', $chil, '" src="', $WT_IMAGES["vline"], '" height="', $h + 1, '" alt=""></td>';
+ '<img class="bvertline" id="vline_', $chil, '" src="', Theme::theme()->parameter('image-vline'), '" height="', $h + 1, '" alt=""></td>';
} else {
- echo '<td style="background: url(', $WT_IMAGES["vline"], ');">',
- '<img class="spacer" src="', $WT_IMAGES["spacer"], '" alt=""></td>';
+ echo '<td style="background: url(', Theme::theme()->parameter('image-vline'), ');">',
+ '<img class="spacer" src="', Theme::theme()->parameter('image-spacer'), '" alt=""></td>';
}
}
echo '</tr>';
@@ -185,7 +186,7 @@ class WT_Controller_Familybook extends WT_Controller_Chart {
if ($person) {
print_pedigree_person($person);
echo '</td><td>',
- '<img class="line2" src="', $WT_IMAGES["hline"], '" width="8" height="3" alt="">';
+ '<img class="line2" src="', Theme::theme()->parameter('image-hline'), '" width="8" height="3" alt="">';
} else {
echo '<div style="width:', $bwidth + 19, 'px; height:', $bheight + 8, 'px;"></div>',
'</td><td>';
@@ -223,7 +224,7 @@ class WT_Controller_Familybook extends WT_Controller_Chart {
* @param integer $count
*/
private function printPersonPedigree($person, $count) {
- global $WT_IMAGES, $bheight, $bwidth, $bhalfheight;
+ global $bheight, $bwidth, $bhalfheight;
if ($count >= $this->generations) {
return;
}
@@ -292,9 +293,9 @@ class WT_Controller_Familybook extends WT_Controller_Chart {
$lh = $savlh;
}
}
- echo '<img class="line3 pvline" src="', $WT_IMAGES["vline"], '" height="', $lh - 1, '" alt=""></td>',
+ echo '<img class="line3 pvline" src="', Theme::theme()->parameter('image-vline'), '" height="', $lh - 1, '" alt=""></td>',
'<td>',
- '<img class="line4" src="', $WT_IMAGES["hline"], '" height="3" alt=""></td>',
+ '<img class="line4" src="', Theme::theme()->parameter('image-hline'), '" height="3" alt=""></td>',
'<td>';
$lh = $savlh; // restore original line height
//-- print the father box
@@ -317,8 +318,8 @@ class WT_Controller_Familybook extends WT_Controller_Chart {
}
}
echo '</tr><tr>',
- '<td class="tdtop"><img class="pvline" src="', $WT_IMAGES["vline"], '" height="', $lh + 1, '" alt=""></td>',
- '<td><img class="line4" src="', $WT_IMAGES["hline"], '" height="3" alt=""></td>',
+ '<td class="tdtop"><img class="pvline" src="', Theme::theme()->parameter('image-vline'), '" height="', $lh + 1, '"></td>',
+ '<td><img class="line4" src="', Theme::theme()->parameter('image-hline'), '" height="3"></td>',
'<td>';
//-- print the mother box
print_pedigree_person($family->getWife());
diff --git a/library/WT/Controller/Fanchart.php b/library/WT/Controller/Fanchart.php
index f51f9078d3..e39e83f733 100644
--- a/library/WT/Controller/Fanchart.php
+++ b/library/WT/Controller/Fanchart.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team. All rights reserved.
@@ -18,6 +18,7 @@
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
/**
* Class WT_Controller_Fanchart Controller for the fan chart
@@ -98,7 +99,9 @@ class WT_Controller_Fanchart extends WT_Controller_Chart {
// do not split hebrew line
$found = false;
foreach ($RTLOrd as $ord) {
- if (strpos($data, chr($ord)) !== false) $found=true;
+ if (strpos($data, chr($ord)) !== false) {
+ $found = true;
+ }
}
if ($found) {
$line=$data;
@@ -107,7 +110,9 @@ class WT_Controller_Fanchart extends WT_Controller_Chart {
$len = strlen($line);
$wlen = strlen($word);
if (($len+$wlen)<$maxlen) {
- if (!empty($line)) $line .= " ";
+ if (!empty($line)) {
+ $line .= ' ';
+ }
$line .= "$word";
} else {
$p = max(0,(int)(($maxlen-$len)/2));
@@ -141,11 +146,10 @@ class WT_Controller_Fanchart extends WT_Controller_Chart {
* HTTP requests.
*
* @param string $what "png" or "html"
- * @param string[] $fanChart Presentation parameters, provided by the theme.
*
* @return string
*/
- public function generateFanChart($what, $fanChart) {
+ public function generateFanChart($what) {
$treeid = $this->sosaAncestors($this->generations);
$fanw = 640 * $this->fan_width / 100;
$fandeg = 90 * $this->fan_style;
@@ -182,10 +186,29 @@ class WT_Controller_Fanchart extends WT_Controller_Chart {
ImageFilledRectangle($image, 0, 0, $fanw, $fanh, $white);
ImageColorTransparent($image, $white);
- $color = ImageColorAllocate($image, hexdec(substr($fanChart['color'],1,2)), hexdec(substr($fanChart['color'],3,2)), hexdec(substr($fanChart['color'],5,2)));
- $bgcolor = ImageColorAllocate($image, hexdec(substr($fanChart['bgColor'],1,2)), hexdec(substr($fanChart['bgColor'],3,2)), hexdec(substr($fanChart['bgColor'],5,2)));
- $bgcolorM = ImageColorAllocate($image, hexdec(substr($fanChart['bgMColor'],1,2)), hexdec(substr($fanChart['bgMColor'],3,2)), hexdec(substr($fanChart['bgMColor'],5,2)));
- $bgcolorF = ImageColorAllocate($image, hexdec(substr($fanChart['bgFColor'],1,2)), hexdec(substr($fanChart['bgFColor'],3,2)), hexdec(substr($fanChart['bgFColor'],5,2)));
+ $color = ImageColorAllocate(
+ $image,
+ hexdec(substr(Theme::theme()->parameter('chart-font-color'), 0, 2)),
+ hexdec(substr(Theme::theme()->parameter('chart-font-color'), 2, 2)),
+ hexdec(substr(Theme::theme()->parameter('chart-font-color'), 4, 2)));
+ $bgcolor = ImageColorAllocate(
+ $image,
+ hexdec(substr(Theme::theme()->parameter('chart-background-u'), 0, 2)),
+ hexdec(substr(Theme::theme()->parameter('chart-background-u'), 2, 2)),
+ hexdec(substr(Theme::theme()->parameter('chart-background-u'), 4, 2))
+ );
+ $bgcolorM = ImageColorAllocate(
+ $image,
+ hexdec(substr(Theme::theme()->parameter('chart-background-m'), 0, 2)),
+ hexdec(substr(Theme::theme()->parameter('chart-background-m'), 2, 2)),
+ hexdec(substr(Theme::theme()->parameter('chart-background-m'), 4, 2))
+ );
+ $bgcolorF = ImageColorAllocate(
+ $image,
+ hexdec(substr(Theme::theme()->parameter('chart-background-f'), 0, 2)),
+ hexdec(substr(Theme::theme()->parameter('chart-background-f'), 2, 2)),
+ hexdec(substr(Theme::theme()->parameter('chart-background-f'), 4, 2))
+ );
// imagemap
$imagemap = '<map id="fanmap" name="fanmap">';
@@ -238,7 +261,7 @@ class WT_Controller_Fanchart extends WT_Controller_Chart {
ImageFilledArc($image, $cx, $cy, $rx, $rx, $deg1, $deg2, $bg, IMG_ARC_PIE);
// split and center text by lines
- $wmax = (int)($angle * 7 / $fanChart['size'] * $scale);
+ $wmax = (int)($angle * 7 / Theme::theme()->parameter('chart-font-size') * $scale);
$wmax = min($wmax, 35 * $scale);
if ($gen == 0) {
$wmax = min($wmax, 17 * $scale);
@@ -277,7 +300,13 @@ class WT_Controller_Fanchart extends WT_Controller_Chart {
}
// print text
- ImageTtfText($image, (double)$fanChart['size'], $tangle, $tx, $ty, $color, $fanChart['font'], $text);
+ ImageTtfText(
+ $image,
+ Theme::theme()->parameter('chart-font-size'),
+ $tangle, $tx, $ty,
+ $color, Theme::theme()->parameter('chart-font-name'),
+ $text
+ );
$imagemap .= '<area shape="poly" coords="';
// plot upper points
diff --git a/library/WT/Controller/Hourglass.php b/library/WT/Controller/Hourglass.php
index dd3bed8031..e3bb28f122 100644
--- a/library/WT/Controller/Hourglass.php
+++ b/library/WT/Controller/Hourglass.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team. All rights reserved.
@@ -18,6 +18,7 @@
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
/**
* Class WT_Controller_Hourglass - Controller for the hourglass chart
@@ -52,7 +53,7 @@ class WT_Controller_Hourglass extends WT_Controller_Chart {
* @param boolean $loadJS
*/
function __construct($rootid = '', $show_full = 1, $loadJS = true) {
- global $bheight, $bwidth, $cbwidth, $cbheight, $PEDIGREE_FULL_DETAILS, $MAX_DESCENDANCY_GENERATIONS;
+ global $bheight, $bwidth, $PEDIGREE_FULL_DETAILS, $MAX_DESCENDANCY_GENERATIONS;
global $TEXT_DIRECTION, $show_full;
parent::__construct();
@@ -89,8 +90,8 @@ class WT_Controller_Hourglass extends WT_Controller_Chart {
// -- adjust size of the compact box
if (!$this->show_full) {
- $bwidth = $this->box_width * $cbwidth / 100;
- $bheight = $cbheight;
+ $bwidth = $this->box_width * Theme::theme()->parameter('compact-chart-box-x') / 100;
+ $bheight = Theme::theme()->parameter('compact-chart-box-y');
}
$this->bhalfheight = (int)($bheight / 2);
@@ -120,7 +121,7 @@ class WT_Controller_Hourglass extends WT_Controller_Chart {
* @param integer $count generation count, so it recursively calls itself
*/
public function printPersonPedigree(WT_Individual $person, $count) {
- global $WT_IMAGES, $bheight, $bwidth;
+ global $bheight, $bwidth;
if ($count >= $this->generations) {
return;
@@ -143,11 +144,11 @@ class WT_Controller_Hourglass extends WT_Controller_Chart {
echo '</td><td></tr></table>';
}
foreach ($person->getChildFamilies() as $family) {
- echo "<table class='hourglassChart'>";
- echo "<tr>";
- echo "<td style='vertical-align:bottom'><img class='line3 pvline' src='{$WT_IMAGES["vline"]}' width='3' alt=''></td>";
- echo "<td><img class='line4' src='{$WT_IMAGES["hline"]}' width='7' height='3' alt=''></td>";
- echo "<td>";
+ echo '<table class="hourglassChart">';
+ echo '<tr>';
+ echo '<td style="vertical-align:bottom;"><img class="line3 pvline" src="' . Theme::theme()->parameter('image-vline') . '" width="3"></td>';
+ echo '<td><img class="line4" src="' . Theme::theme()->parameter('image-hline') . '" width="7" height="3"></td>';
+ echo '<td>';
//-- print the father box
print_pedigree_person($family->getHusband());
echo "</td>";
@@ -177,8 +178,8 @@ class WT_Controller_Hourglass extends WT_Controller_Chart {
}
echo
'</tr><tr>',
- "<td style='vertical-align:top'><img class='pvline' src='{$WT_IMAGES["vline"]}' width='3' alt=''></td>",
- '<td><img class="line4" src="' . $WT_IMAGES["hline"] . '" width="7" height="3" alt=""></td>',
+ "<td style='vertical-align:top'><img class='pvline' src='" . Theme::theme()->parameter('image-vline') . "' width='3' alt=''></td>",
+ '<td><img class="line4" src="' . Theme::theme()->parameter('image-hline') . '" width="7" height="3" alt=""></td>',
'<td>';
//-- print the mother box
print_pedigree_person($family->getWife());
@@ -226,7 +227,7 @@ class WT_Controller_Hourglass extends WT_Controller_Chart {
* @return integer
*/
public function printDescendency($person, $count, $showNav = true) {
- global $TEXT_DIRECTION, $WT_IMAGES, $bheight, $bwidth, $lastGenSecondFam;
+ global $TEXT_DIRECTION, $bheight, $bwidth, $lastGenSecondFam;
if ($count > $this->dgenerations) {
return;
@@ -279,13 +280,13 @@ class WT_Controller_Hourglass extends WT_Controller_Chart {
if ($ct > 1) {
if ($i == 0) {
// First child
- echo "<td style='vertical-align:bottom'><img alt='' class='line1 tvertline' id='vline_$chil' src='{$WT_IMAGES["vline"]}' width='3'></td>";
+ echo "<td style='vertical-align:bottom'><img alt='' class='line1 tvertline' id='vline_$chil' src='" . Theme::theme()->parameter('image-vline') . "' width='3'></td>";
} elseif ($i == $ct - 1) {
// Last child
- echo "<td style='vertical-align:top'><img alt='' class='bvertline' id='vline_$chil' src='{$WT_IMAGES["vline"]}' width='3'></td>";
+ echo "<td style='vertical-align:top'><img alt='' class='bvertline' id='vline_$chil' src='" . Theme::theme()->parameter('image-vline') . "' width='3'></td>";
} else {
// Middle child
- echo '<td style="background: url(\'' . $WT_IMAGES['vline'] . '\');"><img src=\'' . $WT_IMAGES['spacer'] . '\' width="3" alt=""></td>';
+ echo '<td style="background: url(\'' . Theme::theme()->parameter('image-vline') . '\');"><img src=\'' . Theme::theme()->parameter('image-spacer') . '\' width="3" alt=""></td>';
}
}
echo '</tr>';
@@ -319,9 +320,9 @@ class WT_Controller_Hourglass extends WT_Controller_Chart {
}
}
- echo "<table id='table2_$pid'><tr><td>";
+ echo '<table id="table2_' . $pid . '"><tr><td>';
print_pedigree_person($person);
- echo "</td><td><img class='line2' src='{$WT_IMAGES["hline"]}' width='7' height='3' alt=''>";
+ echo '</td><td><img class="line2" src="' . Theme::theme()->parameter('image-hline') . '" width="7" height="3">';
//----- Print the spouse
if ($this->show_spouse) {
diff --git a/library/WT/Controller/Individual.php b/library/WT/Controller/Individual.php
index 89788d2471..f1abce391e 100644
--- a/library/WT/Controller/Individual.php
+++ b/library/WT/Controller/Individual.php
@@ -224,7 +224,9 @@ class WT_Controller_Individual extends WT_Controller_GedcomRecord {
*/
public function printSexRecord(WT_Fact $event) {
$sex = $event->getValue();
- if (empty($sex)) $sex = 'U';
+ if (empty($sex)) {
+ $sex = 'U';
+ }
echo '<span id="sex" class="';
if ($event->isPendingDeletion()) {
echo 'old ';
@@ -283,9 +285,10 @@ class WT_Controller_Individual extends WT_Controller_GedcomRecord {
$menu->setOnclick("return false;");
if (WT_USER_CAN_EDIT) {
foreach ($this->record->getFacts() as $fact) {
- if ($fact->getTag()=='NAME' && $fact->canEdit())
+ if ($fact->getTag() === 'NAME' && $fact->canEdit()) {
$menu->setOnclick("return edit_name('".$this->record->getXref() . "', '" . $fact->getFactId() . "');");
break;
+ }
}
$submenu = new WT_Menu(WT_I18N::translate('Add a new name'), '#', 'menu-indi-addname');
diff --git a/library/WT/Controller/Page.php b/library/WT/Controller/Page.php
index 46a455e88d..d0755b51e8 100644
--- a/library/WT/Controller/Page.php
+++ b/library/WT/Controller/Page.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -15,13 +15,13 @@
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
/**
* Class WT_Controller_Page Controller for full-page, themed HTML responses
*/
class WT_Controller_Page extends WT_Controller_Base {
// Page header information
- const DOCTYPE = '<!DOCTYPE html>'; // HTML5
private $canonical_url = '';
private $meta_robots = 'noindex,nofollow'; // Most pages are not intended for robots
private $page_title = WT_WEBTREES; // <head><title> $page_title </title></head>
@@ -44,7 +44,7 @@ class WT_Controller_Page extends WT_Controller_Base {
public function __destruct() {
// If we printed a header, automatically print a footer
if ($this->page_header) {
- $this->pageFooter();
+ echo $this->pageFooter();
}
}
@@ -84,6 +84,15 @@ class WT_Controller_Page extends WT_Controller_Base {
}
/**
+ * What is the preferred URL for this page?
+ *
+ * @return string
+ */
+ public function getCanonicalUrl() {
+ return $this->canonical_url;
+ }
+
+ /**
* Should robots index this page?
*
* @param string $meta_robots
@@ -97,6 +106,15 @@ class WT_Controller_Page extends WT_Controller_Base {
}
/**
+ * Should robots index this page?
+ *
+ * @return string
+ */
+ public function getMetaRobots() {
+ return $this->meta_robots;
+ }
+
+ /**
* Restrict access
*
* @param boolean $condition
@@ -113,35 +131,38 @@ class WT_Controller_Page extends WT_Controller_Base {
}
/**
- * Print the page header, using the theme
+ * Print the page footer, using the theme
*
- * @return $this
+ * @return string
*/
- public function pageHeader() {
- // Import global variables into the local scope, for the theme’s header.php
- global $WT_TREE, $SEARCH_SPIDER, $TEXT_DIRECTION, $REQUIRE_AUTHENTICATION, $headerfile, $view;
+ protected function pageFooter() {
+ global $start_time;
- // The title often includes the names of records, which may have markup
- // that cannot be used in the page title.
- $title = html_entity_decode(strip_tags($this->page_title), ENT_QUOTES, 'UTF-8');
+ return
+ Theme::theme()->footerContainer() .
+ $this->getJavascript() .
+ Theme::theme()->hookFooterExtraJavascript() .
+ '</body>' .
+ '</html>' . PHP_EOL .
+ '<!-- webtrees: ' . WT_VERSION . ' -->' .
+ '<!-- Execution time: ' . WT_I18N::number(microtime(true) - $start_time, 3) . ' seconds -->' .
+ '<!-- Memory: ' . WT_I18N::number(memory_get_peak_usage(true)/1024) . ' KB -->' .
+ '<!-- SQL queries: ' . WT_I18N::number(WT_DB::getQueryCount()) . ' -->';
+ }
- // Initialise variables for the theme’s header.php
- $LINK_CANONICAL = $this->canonical_url;
- $META_ROBOTS = $this->meta_robots;
- $META_DESCRIPTION = $WT_TREE ? $WT_TREE->getPreference('META_DESCRIPTION') : '';
- if (!$META_DESCRIPTION) {
- $META_DESCRIPTION = strip_tags(WT_TREE_TITLE);
- }
- $META_GENERATOR = WT_WEBTREES . ' ' . WT_VERSION . ' - ' . WT_WEBTREES_URL;
- $META_TITLE = $WT_TREE ? $WT_TREE->getPreference('META_TITLE') : '';
- if ($META_TITLE) {
- $title .= ' - ' . $META_TITLE;
- }
+ /**
+ * Print the page header, using the theme
+ *
+ * @param string $view 'simple' or ''
+ *
+ * @return $this
+ */
+ public function pageHeader($view = '') {
+ global $TEXT_DIRECTION;
// Give Javascript access to some PHP constants
$this->addInlineJavascript('
var WT_STATIC_URL = "' . WT_Filter::escapeJs(WT_STATIC_URL) . '";
- var WT_THEME_DIR = "' . WT_Filter::escapeJs(WT_THEME_DIR) . '";
var WT_MODULES_DIR = "' . WT_Filter::escapeJs(WT_MODULES_DIR) . '";
var WT_GEDCOM = "' . WT_Filter::escapeJs(WT_GEDCOM) . '";
var WT_GED_ID = "' . WT_Filter::escapeJs(WT_GED_ID) . '";
@@ -158,8 +179,26 @@ class WT_Controller_Page extends WT_Controller_Base {
}
');
- header('Content-Type: text/html; charset=UTF-8');
- require WT_ROOT . $headerfile;
+ Theme::theme()->sendHeaders();
+ echo Theme::theme()->doctype();
+ echo Theme::theme()->html();
+ echo Theme::theme()->head($this);
+
+ switch ($view) {
+ case 'simple':
+ echo Theme::theme()->bodyHeaderPopupWindow();
+ break;
+ default:
+ echo Theme::theme()->bodyHeader();
+ break;
+ }
+
+ // Flush the output, so the browser can render the header and load javascript
+ // while we are preparing data for the page
+ if (ini_get('output_buffering')) {
+ ob_flush();
+ }
+ flush();
// Once we've displayed the header, we should no longer write session data.
Zend_Session::writeClose();
@@ -171,27 +210,6 @@ class WT_Controller_Page extends WT_Controller_Base {
}
/**
- * Print the page footer, using the theme
- *
- * @return $this
- */
- protected function pageFooter() {
- global $footerfile, $WT_TREE, $TEXT_DIRECTION, $view;
-
- if (WT_GED_ID) {
- require WT_ROOT . $footerfile;
- }
-
- if (WT_DEBUG_SQL) {
- echo WT_DB::getQueryLog();
- }
- echo $this->getJavascript();
- echo '</body></html>';
-
- return $this;
- }
-
- /**
* Get significant information from this page, to allow other pages such as
* charts and reports to initialise with the same records
*
diff --git a/library/WT/Controller/Pedigree.php b/library/WT/Controller/Pedigree.php
index 4caf85bf01..60f57a3632 100644
--- a/library/WT/Controller/Pedigree.php
+++ b/library/WT/Controller/Pedigree.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team. All rights reserved.
@@ -18,6 +18,7 @@
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
/**
* Class WT_Controller_Pedigree - Controller for the pedigree chart
@@ -46,18 +47,16 @@ class WT_Controller_Pedigree extends WT_Controller_Chart {
public function __construct() {
global $PEDIGREE_FULL_DETAILS, $PEDIGREE_LAYOUT, $MAX_PEDIGREE_GENERATIONS;
global $DEFAULT_PEDIGREE_GENERATIONS;
- global $bwidth, $bheight, $cbwidth, $cbheight, $baseyoffset, $basexoffset, $byspacing, $bxspacing;
- global $linewidth, $shadowcolor, $shadowblur, $shadowoffsetX, $shadowoffsetY;
+ global $bwidth, $bheight, $baseyoffset, $basexoffset, $byspacing, $bxspacing;
global $show_full, $talloffset;
parent::__construct();
-
- $this->linewidth = $linewidth;
- $this->shadowcolor = $shadowcolor;
- $this->shadowblur = $shadowblur;
- $this->shadowoffsetX = $shadowoffsetX;
- $this->shadowoffsetY = $shadowoffsetY;
+ $this->linewidth = Theme::theme()->parameter('line-width');
+ $this->shadowcolor = Theme::theme()->parameter('shadow-color');
+ $this->shadowblur = Theme::theme()->parameter('shadow-blur');
+ $this->shadowoffsetX = Theme::theme()->parameter('shadow-offset-x');
+ $this->shadowoffsetY = Theme::theme()->parameter('shadow-offset-y');
$this->show_full = WT_Filter::getInteger('show_full', 0, 1, $PEDIGREE_FULL_DETAILS);
$this->talloffset = WT_Filter::getInteger('talloffset', 0, 3, $PEDIGREE_LAYOUT);
@@ -91,19 +90,20 @@ class WT_Controller_Pedigree extends WT_Controller_Chart {
$this->setPageTitle(WT_I18N::translate('Pedigree'));
}
- // -- adjust size of the compact box
- if (!$this->show_full) {
- $bwidth = $cbwidth;
- $bheight = $cbheight;
+ if ($this->show_full) {
+ $this->pbwidth = Theme::theme()->parameter('chart-box-x') + 6;
+ $this->pbheight = Theme::theme()->parameter('chart-box-y') + 5;
+ } else {
+ $this->pbwidth = Theme::theme()->parameter('compact-chart-box-x') + 6;
+ $this->pbheight = Theme::theme()->parameter('compact-chart-box-y') + 5;
}
+
//-- adjustments for portrait mode
if ($this->talloffset==0) {
$bxspacing+=12;
$baseyoffset -= 20*($this->PEDIGREE_GENERATIONS-1);
}
- $this->pbwidth = $bwidth+6;
- $this->pbheight = $bheight+5;
$this->ancestors = $this->sosaAncestors($PEDIGREE_GENERATIONS);
$this->treesize = pow(2, (int)($this->PEDIGREE_GENERATIONS))-1;
diff --git a/library/WT/Controller/Simple.php b/library/WT/Controller/Simple.php
index 1b94ee445d..e1bea0fd25 100644
--- a/library/WT/Controller/Simple.php
+++ b/library/WT/Controller/Simple.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -34,13 +34,8 @@ class WT_Controller_Simple extends WT_Controller_Page {
*
* @return $this
*/
- public function pageHeader() {
- global $view;
-
- $view = 'simple';
- parent::pageHeader();
-
- return $this;
+ public function pageHeader($view = 'simple') {
+ return parent::pageHeader($view);
}
/**
diff --git a/library/WT/Controller/Timeline.php b/library/WT/Controller/Timeline.php
index 17bc2f0d35..8804a5b297 100644
--- a/library/WT/Controller/Timeline.php
+++ b/library/WT/Controller/Timeline.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team. All rights reserved.
@@ -18,6 +18,7 @@
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
/**
* Class WT_Controller_Timeline - Controller for the timeline chart
@@ -158,7 +159,7 @@ class WT_Controller_Timeline extends WT_Controller_Page {
* @param WT_Fact $event
*/
function print_time_fact(WT_Fact $event) {
- global $basexoffset, $baseyoffset, $factcount, $TEXT_DIRECTION, $WT_IMAGES, $placements;
+ global $basexoffset, $baseyoffset, $factcount, $TEXT_DIRECTION, $placements;
$desc = $event->getValue();
// check if this is a family fact
@@ -193,7 +194,7 @@ class WT_Controller_Timeline extends WT_Controller_Page {
echo "<div id=\"fact$factcount\" style=\"position:absolute; " . ($TEXT_DIRECTION == "ltr" ? "left: " . ($xoffset) : "right: " . ($xoffset)) . "px; top:" . ($yoffset) . "px; font-size: 8pt; height: " . ($this->bheight) . "px;\" onmousedown=\"factMouseDown(this, '" . $factcount . "', " . ($yoffset - $tyoffset) . ");\">";
echo "<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" style=\"cursor: hand;\"><tr><td>";
- echo "<img src=\"" . $WT_IMAGES["hline"] . "\" name=\"boxline$factcount\" id=\"boxline$factcount\" height=\"3\" align=\"left\" width=\"10\" alt=\"\" style=\"padding-";
+ echo "<img src=\"" . Theme::theme()->parameter('image-hline') . "\" name=\"boxline$factcount\" id=\"boxline$factcount\" height=\"3\" align=\"left\" width=\"10\" alt=\"\" style=\"padding-";
if ($TEXT_DIRECTION == 'ltr') {
echo 'left: 3px;">';
} else {
@@ -250,26 +251,26 @@ class WT_Controller_Timeline extends WT_Controller_Page {
echo '</td></tr></table>';
echo '</div>';
if ($TEXT_DIRECTION === 'ltr') {
- $img = 'dline2';
+ $img = 'image-dline2';
$ypos = '0%';
} else {
- $img = 'dline';
+ $img = 'image-dline';
$ypos = '100%';
}
$dyoffset = ($yoffset - $tyoffset) + $this->bheight / 3;
if ($tyoffset < 0) {
$dyoffset = $yoffset + $this->bheight / 3;
if ($TEXT_DIRECTION === 'ltr') {
- $img = 'dline';
+ $img = 'image-dline';
$ypos = '100%';
} else {
- $img = 'dline2';
+ $img = 'image-dline2';
$ypos = '0%';
}
}
// Print the diagonal line
echo '<div id="dbox' . $factcount . '" style="position:absolute; ' . ($TEXT_DIRECTION == 'ltr' ? 'left: ' . ($basexoffset + 25) : 'right: ' . ($basexoffset + 25)) . 'px; top:' . ($dyoffset) . 'px; font-size: 8pt; height: ' . abs($tyoffset) . 'px; width: ' . abs($tyoffset) . 'px;';
- echo ' background-image: url(\'' . $WT_IMAGES[$img] . '\');';
+ echo ' background-image: url(\'' . Theme::theme()->parameter($img) . '\');';
echo ' background-position: 0% ' . $ypos . ';">';
echo '</div>';
}
diff --git a/library/WT/Fact.php b/library/WT/Fact.php
index 508b5df85e..a56535e7f9 100644
--- a/library/WT/Fact.php
+++ b/library/WT/Fact.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2008 PGV Development Team. All rights reserved.
@@ -407,25 +407,6 @@ class WT_Fact {
}
/**
- * Display an icon for this fact.
- * Icons are held in a theme subfolder. Not all themes provide icons.
- *
- * @return string
- */
- public function icon() {
- $icon = 'images/facts/' . $this->getTag() . '.png';
- $dir = substr(WT_CSS_URL, strlen(WT_STATIC_URL));
- if (file_exists($dir . $icon)) {
- return '<img src="' . WT_CSS_URL . $icon . '" title="' . WT_Gedcom_Tag::getLabel($this->getTag()) . '">';
- } elseif (file_exists($dir . 'images/facts/NULL.png')) {
- // Spacer image - for alignment - until we move to a sprite.
- return '<img src="' . WT_CSS_URL . 'images/facts/NULL.png">';
- } else {
- return '';
- }
- }
-
- /**
* Static Helper functions to sort events
*
* @param WT_Fact $a Fact one
diff --git a/library/WT/File.php b/library/WT/File.php
index 4e2c740a8b..99905d3402 100644
--- a/library/WT/File.php
+++ b/library/WT/File.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (c) 2014 webtrees development team
+// Copyright (c) 2015 webtrees development team
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -121,7 +121,7 @@ class WT_File {
if (is_dir($path)) {
return true;
} else {
- if (!is_dir(dirname($path))) {
+ if (dirname($path) && !is_dir(dirname($path))) {
WT_File::mkdir(dirname($path));
}
@mkdir($path);
diff --git a/library/WT/Filter.php b/library/WT/Filter.php
index fe930576c1..5a1506d817 100644
--- a/library/WT/Filter.php
+++ b/library/WT/Filter.php
@@ -2,7 +2,7 @@
// Filter/escape/validate input and output
//
// webtrees: Web based Family History software
-// Copyright (c) 2014 webtrees development team
+// Copyright (c) 2015 webtrees development team
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -454,9 +454,11 @@ class WT_Filter {
if (WT_Filter::post('csrf') !== WT_Filter::getCsrfToken()) {
// Oops. Something is not quite right
Log::addAuthenticationLog('CSRF mismatch - session expired or malicious attack');
- WT_FlashMessages::addMessage(WT_I18N::translate('This form has expired. Try again.'));
+ WT_FlashMessages::addMessage(WT_I18N::translate('This form has expired. Try again.'), 'error');
+
return false;
}
+
return true;
}
}
diff --git a/library/WT/FlashMessages.php b/library/WT/FlashMessages.php
index 665450e00d..d3d6fd7a61 100644
--- a/library/WT/FlashMessages.php
+++ b/library/WT/FlashMessages.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 Greg Roach
+// Copyright (C) 2015 Greg Roach
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -24,9 +24,13 @@ class WT_FlashMessages {
/**
* Add a new message to the session storage.
*
- * @param string $message
+ * @param string $text
+ * @param string $status "success", "info", "warning" or "danger"
*/
- public static function addMessage($message) {
+ public static function addMessage($text, $status='info') {
+ $message = new stdClass;
+ $message->text = $text;
+ $message->status = $status;
$flash_messenger = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger');
$flash_messenger->addMessage($message);
@@ -55,23 +59,4 @@ class WT_FlashMessages {
return $messages;
}
-
- /**
- * Most theres will want a simple block of HTML to display
- *
- * @return string
- */
- public static function getHtmlMessages() {
- $html = '';
-
- foreach (self::getMessages() as $message) {
- $html .= '<p class="ui-state-highlight">' . $message . '</p>';
- }
-
- if ($html) {
- $html = '<div id="flash-messages">' . $html . '</div>';
- }
-
- return $html;
- }
}
diff --git a/library/WT/Log.php b/library/WT/Log.php
index 01d8116142..f81515cbf1 100644
--- a/library/WT/Log.php
+++ b/library/WT/Log.php
@@ -1,6 +1,4 @@
<?php
-namespace WT;
-
// webtrees: Web based Family History software
// Copyright (C) 2014 webtrees development team
//
@@ -18,6 +16,8 @@ namespace WT;
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+namespace WT;
+
use WT_DB;
use WT_Tree;
diff --git a/library/WT/Menu.php b/library/WT/Menu.php
index e2da292a60..20a40da1eb 100644
--- a/library/WT/Menu.php
+++ b/library/WT/Menu.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team. All rights reserved.
@@ -59,7 +59,7 @@ class WT_Menu {
* @param string $onclick A javascript onclick handler
* @param WT_Menu[] $submenus Any submenus
*/
- function __construct($label, $link = '#', $id = '', $onclick = '', $submenus = array()) {
+ public function __construct($label, $link = '#', $id = '', $onclick = '', $submenus = array()) {
$this
->setLabel($label)
->setLink($link)
@@ -79,13 +79,56 @@ class WT_Menu {
}
/**
+ * Render this menu using Bootstrap markup
+ *
+ * @return string
+ */
+ public function bootstrap() {
+ if ($this->iconclass) {
+ $class = ' class="' . $this->iconclass . '"';
+ } else {
+ $class = '';
+ }
+ if ($this->id) {
+ $id = ' id="' . $this->id . '"';
+ } else {
+ $id = '';
+ }
+
+ if ($this->submenus) {
+ $submenus = '';
+ foreach ($this->submenus as $submenu) {
+ $submenus .= $submenu->bootstrap();
+ }
+
+ return
+ '<li' . $id . ' class="dropdown">' .
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">' .
+ $this->label .
+ ' <span class="caret"></span></a>' .
+ '<ul class="dropdown-menu" role="menu">' .
+ $submenus .
+ '</ul>' .
+ '</li>';
+ } else {
+ if ($this->onclick) {
+ $onclick = ' onclick="' . $this->onclick . '"';
+ } else {
+ $onclick = '';
+ }
+
+ return '<li' . $id . $class . '><a href="' . $this->link . '"' . $onclick . '>' . $this->label . '</a></li>';
+ }
+ }
+
+ /**
* Set the CSS classes for this menu
*
* @param string $class
* @param string $submenuclass
* @param string $iconclass
*/
- function addClass($class, $submenuclass = '', $iconclass = 'icon_general') {
+ public function addClass($class, $submenuclass = '', $iconclass = '') {
$this->class = $class;
$this->submenuclass = $submenuclass;
$this->iconclass = $iconclass;
@@ -168,7 +211,7 @@ class WT_Menu {
*
* @param WT_Menu[]
*/
- function addSubmenu($menu) {
+ public function addSubmenu($menu) {
$this->submenus[] = $menu;
}
@@ -177,7 +220,7 @@ class WT_Menu {
*
* @return string
*/
- function getMenu() {
+ public function getMenu() {
global $menucount, $TEXT_DIRECTION;
if (!isset($menucount)) {
@@ -229,7 +272,7 @@ class WT_Menu {
*
* @return string
*/
- function getMenuAsList() {
+ public function getMenuAsList() {
if ($this->iconclass) {
$class = ' class="' . $this->iconclass . '"';
} else {
diff --git a/library/WT/MenuBar.php b/library/WT/MenuBar.php
deleted file mode 100644
index e57bda0cd6..0000000000
--- a/library/WT/MenuBar.php
+++ /dev/null
@@ -1,509 +0,0 @@
-<?php
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2010 PGV Development Team. All rights reserved.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-use WT\Auth;
-
-/**
- * Class WT_MenuBar - System for generating menus.
- */
-class WT_MenuBar {
- /**
- * @return WT_Menu
- */
- public static function getGedcomMenu() {
- $menu = new WT_Menu(WT_I18N::translate('Home page'), 'index.php?ctype=gedcom&amp;ged='.WT_GEDURL, 'menu-tree');
- $ALLOW_CHANGE_GEDCOM=WT_Site::getPreference('ALLOW_CHANGE_GEDCOM') && count(WT_Tree::getAll())>1;
- foreach (WT_Tree::getAll() as $tree) {
- if ($tree->tree_id==WT_GED_ID || $ALLOW_CHANGE_GEDCOM) {
- $submenu = new WT_Menu(
- $tree->tree_title_html,
- 'index.php?ctype=gedcom&amp;ged='.$tree->tree_name_url,
- 'menu-tree-'.$tree->tree_id // Cannot use name - it must be a CSS identifier
- );
- $menu->addSubmenu($submenu);
- }
- }
- return $menu;
- }
-
- /**
- * @return WT_Menu
- */
- public static function getMyPageMenu() {
- global $PEDIGREE_FULL_DETAILS, $PEDIGREE_LAYOUT;
-
- $showFull = ($PEDIGREE_FULL_DETAILS) ? 1 : 0;
- $showLayout = ($PEDIGREE_LAYOUT) ? 1 : 0;
-
- if (!Auth::id()) {
- return null;
- }
-
- //-- main menu
- $menu = new WT_Menu(WT_I18N::translate('My page'), 'index.php?ctype=user&amp;ged='.WT_GEDURL, 'menu-mymenu');
-
- //-- mypage submenu
- $submenu = new WT_Menu(WT_I18N::translate('My page'), 'index.php?ctype=user&amp;ged='.WT_GEDURL, 'menu-mypage');
- $menu->addSubmenu($submenu);
- //-- editaccount submenu
- if (Auth::user()->getPreference('editaccount')) {
- $submenu = new WT_Menu(WT_I18N::translate('My account'), 'edituser.php', 'menu-myaccount');
- $menu->addSubmenu($submenu);
- }
- if (WT_USER_GEDCOM_ID) {
- //-- my_pedigree submenu
- $submenu = new WT_Menu(
- WT_I18N::translate('My pedigree'),
- 'pedigree.php?ged='.WT_GEDURL.'&amp;rootid='.WT_USER_GEDCOM_ID."&amp;show_full={$showFull}&amp;talloffset={$showLayout}",
- 'menu-mypedigree'
- );
- $menu->addSubmenu($submenu);
- //-- my_indi submenu
- $submenu = new WT_Menu(WT_I18N::translate('My individual record'), 'individual.php?pid='.WT_USER_GEDCOM_ID.'&amp;ged='.WT_GEDURL, 'menu-myrecord');
- $menu->addSubmenu($submenu);
- }
- if (WT_USER_GEDCOM_ADMIN) {
- //-- admin submenu
- $submenu = new WT_Menu(WT_I18N::translate('Administration'), 'admin.php', 'menu-admin');
- $menu->addSubmenu($submenu);
- }
- return $menu;
- }
-
- /**
- * @return WT_Menu
- */
- public static function getChartsMenu() {
- global $SEARCH_SPIDER, $controller;
-
- if ($SEARCH_SPIDER || !WT_GED_ID) {
- return null;
- }
-
- $indi_xref=$controller->getSignificantIndividual()->getXref();
-
- $menu = new WT_Menu(WT_I18N::translate('Charts'), 'pedigree.php?rootid='.$indi_xref.'&amp;ged='.WT_GEDURL, 'menu-chart');
-
- // Build a sortable list of submenu items and then sort it in localized name order
- $menuList = array(
- 'pedigree' =>WT_I18N::translate('Pedigree'),
- 'descendancy' =>WT_I18N::translate('Descendants'),
- 'ancestry' =>WT_I18N::translate('Ancestors'),
- 'compact' =>WT_I18N::translate('Compact tree'),
- 'hourglass' =>WT_I18N::translate('Hourglass chart'),
- 'familybook' =>WT_I18N::translate('Family book'),
- 'timeline' =>WT_I18N::translate('Timeline'),
- 'lifespan' =>WT_I18N::translate('Lifespans'),
- 'relationship'=>WT_I18N::translate('Relationships'),
- 'statistics' =>WT_I18N::translate('Statistics'),
- );
- if (function_exists('imagettftext')) {
- $menuList['fanchart']=WT_I18N::translate('Fan chart');
- }
- // TODO: Use WT_Module_Chart ??
- if (array_key_exists('tree', WT_Module::getActiveModules())) {
- $menuList['tree']=WT_I18N::translate('Interactive tree');
- }
- if (array_key_exists('googlemap', WT_Module::getActiveModules())) {
- $menuList['pedigree_map']=WT_I18N::translate('Pedigree map');
- }
- asort($menuList);
-
- // Produce the submenus in localized name order
- foreach ($menuList as $menuType => $menuName) {
- switch ($menuType) {
- case 'pedigree':
- $submenu = new WT_Menu($menuName, 'pedigree.php?rootid='.$indi_xref.'&amp;ged='.WT_GEDURL, 'menu-chart-pedigree');
- $menu->addSubmenu($submenu);
- break;
-
- case 'descendancy':
- $submenu = new WT_Menu($menuName, 'descendancy.php?rootid='.$indi_xref.'&amp;ged='.WT_GEDURL, 'menu-chart-descendancy');
- $menu->addSubmenu($submenu);
- break;
-
- case 'ancestry':
- $submenu = new WT_Menu($menuName, 'ancestry.php?rootid='.$indi_xref.'&amp;ged='.WT_GEDURL, 'menu-chart-ancestry');
- $menu->addSubmenu($submenu);
- break;
-
- case 'compact':
- $submenu = new WT_Menu($menuName, 'compact.php?rootid='.$indi_xref.'&amp;ged='.WT_GEDURL, 'menu-chart-compact');
- $menu->addSubmenu($submenu);
- break;
-
- case 'fanchart':
- $submenu = new WT_Menu($menuName, 'fanchart.php?rootid='.$indi_xref.'&amp;ged='.WT_GEDURL, 'menu-chart-fanchart');
- $menu->addSubmenu($submenu);
- break;
-
- case 'hourglass':
- $submenu = new WT_Menu($menuName, 'hourglass.php?rootid='.$indi_xref.'&amp;ged='.WT_GEDURL, 'menu-chart-hourglass');
- $menu->addSubmenu($submenu);
- break;
-
- case 'familybook':
- $submenu = new WT_Menu($menuName, 'familybook.php?rootid='.$indi_xref.'&amp;ged='.WT_GEDURL, 'menu-chart-familybook');
- $menu->addSubmenu($submenu);
- break;
-
- case 'timeline':
- $submenu = new WT_Menu($menuName, 'timeline.php?pids%5B%5D='.$indi_xref.'&amp;ged='.WT_GEDURL, 'menu-chart-timeline');
- if ($controller instanceof WT_Controller_Family && $controller->record) {
- // Build a sortable list of submenu items and then sort it in localized name order
- $menuList = array();
- $menuList['parentTimeLine'] = WT_I18N::translate('Show couple on timeline chart');
- $menuList['childTimeLine'] = WT_I18N::translate('Show children on timeline chart');
- $menuList['familyTimeLine'] = WT_I18N::translate('Show family on timeline chart');
- asort($menuList);
-
- // Produce the submenus in localized name order
- foreach ($menuList as $submenuType => $submenuName) {
- switch ($submenuType) {
- case 'parentTimeLine':
- // charts / parents_timeline
- $subsubmenu = new WT_Menu(
- $submenuName,
- 'timeline.php?'.$controller->getTimelineIndis(array('HUSB','WIFE')).'&amp;ged='.WT_GEDURL,
- 'menu-chart-timeline-parents'
- );
- $submenu->addSubmenu($subsubmenu);
- break;
-
- case 'childTimeLine':
- // charts / children_timeline
- $subsubmenu = new WT_Menu(
- $submenuName,
- 'timeline.php?'.$controller->getTimelineIndis(array('CHIL')).'&amp;ged='.WT_GEDURL,
- 'menu-chart-timeline-children'
- );
- $submenu->addSubmenu($subsubmenu);
- break;
-
- case 'familyTimeLine':
- // charts / family_timeline
- $subsubmenu = new WT_Menu(
- $submenuName,
- 'timeline.php?'.$controller->getTimelineIndis(array('HUSB','WIFE','CHIL')).'&amp;ged='.WT_GEDURL,
- 'menu-chart-timeline-family'
- );
- $submenu->addSubmenu($subsubmenu);
- break;
-
- }
- }
- }
- $menu->addSubmenu($submenu);
- break;
-
- case 'lifespan':
- $submenu = new WT_Menu($menuName, 'lifespan.php?pids%5B%5D='.$indi_xref.'&amp;addFamily=1&amp;ged='.WT_GEDURL, 'menu-chart-lifespan');
- $menu->addSubmenu($submenu);
- break;
-
- case 'relationship':
- if ($indi_xref) {
- // Pages focused on a specific person - from the person, to me
- $pid1=WT_USER_GEDCOM_ID ? WT_USER_GEDCOM_ID : WT_USER_ROOT_ID;;
- $pid2=$indi_xref;
- if ($pid1==$pid2) {
- $pid2='';
- }
- $submenu = new WT_Menu(
- WT_I18N::translate('Relationships'),
- 'relationship.php?pid1='.$pid1.'&amp;pid2='.$pid2.'&amp;ged='.WT_GEDURL,
- 'menu-chart-relationship'
- );
- } else {
- // Regular pages - from me, to somebody
- $pid1=WT_USER_GEDCOM_ID ? WT_USER_GEDCOM_ID : WT_USER_ROOT_ID;
- $pid2='';
- $submenu = new WT_Menu(
- WT_I18N::translate('Relationships'),
- 'relationship.php?pid1='.$pid1.'&amp;pid2='.$pid2.'&amp;ged='.WT_GEDURL,
- 'menu-chart-relationship'
- );
- }
- $menu->addSubmenu($submenu);
- break;
-
- case 'statistics':
- $submenu = new WT_Menu($menuName, 'statistics.php?ged='.WT_GEDURL, 'menu-chart-statistics');
- $menu->addSubmenu($submenu);
- break;
-
- case 'tree':
- $submenu = new WT_Menu($menuName, 'module.php?mod=tree&amp;mod_action=treeview&amp;ged='.WT_GEDURL.'&amp;rootid='.$indi_xref, 'menu-chart-tree');
- $menu->addSubmenu($submenu);
- break;
-
- case 'pedigree_map':
- $submenu = new WT_Menu($menuName, 'module.php?ged='.WT_GEDURL.'&amp;mod=googlemap&amp;mod_action=pedigree_map&amp;rootid='.$indi_xref, 'menu-chart-pedigree_map');
- $menu->addSubmenu($submenu);
- break;
- }
- }
- return $menu;
- }
-
- /**
- * @return WT_Menu
- * @throws Exception
- */
- public static function getListsMenu() {
- global $SEARCH_SPIDER, $controller;
-
- // The top level menu shows the individual list
- $menu = new WT_Menu(WT_I18N::translate('Lists'), 'indilist.php?ged=' . WT_GEDURL, 'menu-list');
-
- // Do not show empty lists
- $row = WT_DB::prepare(
- "SELECT SQL_CACHE" .
- " EXISTS(SELECT 1 FROM `##sources` WHERE s_file=? ) AS sour," .
- " EXISTS(SELECT 1 FROM `##other` WHERE o_file=? AND o_type='REPO') AS repo," .
- " EXISTS(SELECT 1 FROM `##other` WHERE o_file=? AND o_type='NOTE') AS note," .
- " EXISTS(SELECT 1 FROM `##media` WHERE m_file=? ) AS obje"
- )->execute(array(WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID))->fetchOneRow();
-
- // Build a list of submenu items and then sort it in localized name order
- $surname_url = '&amp;surname=' . rawurlencode($controller->getSignificantSurname()) . '&amp;ged=' . WT_GEDURL;
-
- $menulist = array(
- new WT_Menu(WT_I18N::translate('Individuals'), 'indilist.php?ged=' . WT_GEDURL . $surname_url, 'menu-list-indi'),
- );
-
- if (!$SEARCH_SPIDER) {
- $menulist[] = new WT_Menu(WT_I18N::translate('Families'), 'famlist.php?ged=' . WT_GEDURL . $surname_url, 'menu-list-fam');
- $menulist[] = new WT_Menu(WT_I18N::translate('Branches'), 'branches.php?ged=' . WT_GEDURL . $surname_url, 'menu-branches');
- $menulist[] = new WT_Menu(WT_I18N::translate('Place hierarchy'), 'placelist.php?ged=' . WT_GEDURL, 'menu-list-plac');
- if ($row->obje) {
- $menulist[] = new WT_Menu(WT_I18N::translate('Media objects'), 'medialist.php?ged=' . WT_GEDURL, 'menu-list-obje');
- }
- if ($row->repo) {
- $menulist[] = new WT_Menu(WT_I18N::translate('Repositories'), 'repolist.php?ged=' . WT_GEDURL, 'menu-list-repo');
- }
- if ($row->sour) {
- $menulist[] = new WT_Menu(WT_I18N::translate('Sources'), 'sourcelist.php?ged=' . WT_GEDURL, 'menu-list-sour');
- }
- if ($row->note) {
- $menulist[] = new WT_Menu(WT_I18N::translate('Shared notes'), 'notelist.php?ged=' . WT_GEDURL, 'menu-list-note');
- }
- }
- uasort($menulist, function(WT_Menu $x, WT_Menu $y) { return WT_I18N::strcasecmp($x->getLabel(), $y->getLabel()); });
-
- $menu->setSubmenus($menulist);
-
- return $menu;
- }
-
- /**
- * @return WT_Menu
- */
- public static function getCalendarMenu() {
- global $SEARCH_SPIDER;
-
- if ($SEARCH_SPIDER) {
- return null;
- }
- //-- main calendar menu item
- $menu = new WT_Menu(WT_I18N::translate('Calendar'), 'calendar.php?ged='.WT_GEDURL, 'menu-calendar');
- //-- viewday sub menu
- $submenu = new WT_Menu(WT_I18N::translate('Day'), 'calendar.php?ged='.WT_GEDURL, 'menu-calendar-day');
- $menu->addSubmenu($submenu);
- //-- viewmonth sub menu
- $submenu = new WT_Menu(WT_I18N::translate('Month'), 'calendar.php?ged='.WT_GEDURL.'&amp;action=calendar', 'menu-calendar-month');
- $menu->addSubmenu($submenu);
- //-- viewyear sub menu
- $submenu = new WT_Menu(WT_I18N::translate('Year'), 'calendar.php?ged='.WT_GEDURL.'&amp;action=year', 'menu-calendar-year');
- $menu->addSubmenu($submenu);
- return $menu;
- }
-
- /**
- * get the reports menu
- *
- * @return WT_Menu the menu item
- */
- public static function getReportsMenu() {
- global $SEARCH_SPIDER;
-
- $active_reports=WT_Module::getActiveReports();
- if ($SEARCH_SPIDER || !$active_reports) {
- return null;
- }
-
- $menu = new WT_Menu(WT_I18N::translate('Reports'), 'reportengine.php?ged='.WT_GEDURL, 'menu-report');
-
- foreach ($active_reports as $report) {
- foreach ($report->getReportMenus() as $submenu) {
- $menu->addSubmenu($submenu);
- }
- }
-
- return $menu;
- }
-
- /**
- * @return WT_Menu
- */
- public static function getSearchMenu() {
- global $SEARCH_SPIDER;
-
- if ($SEARCH_SPIDER) {
- return null;
- }
- //-- main search menu item
- $menu = new WT_Menu(WT_I18N::translate('Search'), 'search.php?ged='.WT_GEDURL, 'menu-search');
- //-- search_general sub menu
- $submenu = new WT_Menu(WT_I18N::translate('General search'), 'search.php?ged='.WT_GEDURL, 'menu-search-general');
- $menu->addSubmenu($submenu);
- //-- search_soundex sub menu
- $submenu = new WT_Menu(/* I18N: search using “sounds like”, rather than exact spelling */ WT_I18N::translate('Phonetic search'), 'search.php?ged='.WT_GEDURL.'&amp;action=soundex', 'menu-search-soundex');
- $menu->addSubmenu($submenu);
- //-- advanced search
- $submenu = new WT_Menu(WT_I18N::translate('Advanced search'), 'search_advanced.php?ged='.WT_GEDURL, 'menu-search-advanced');
- $menu->addSubmenu($submenu);
- //-- search_replace sub menu
- if (WT_USER_CAN_EDIT) {
- $submenu = new WT_Menu(WT_I18N::translate('Search and replace'), 'search.php?ged='.WT_GEDURL.'&amp;action=replace', 'menu-search-replace');
- $menu->addSubmenu($submenu);
- }
- return $menu;
- }
-
- /**
- * @return WT_Menu[]
- */
- public static function getModuleMenus() {
- $menus=array();
- foreach (WT_Module::getActiveMenus() as $module) {
- $menu=$module->getMenu();
- if ($menu) {
- $menus[] = $menu;
- }
- }
- return $menus;
- }
-
- /**
- * @return null|WT_Menu
- * @throws Exception
- */
- public static function getThemeMenu() {
- global $SEARCH_SPIDER, $WT_TREE;
-
- if ($WT_TREE && !$SEARCH_SPIDER && WT_Site::getPreference('ALLOW_USER_THEMES') && $WT_TREE->getPreference('ALLOW_THEME_DROPDOWN')) {
- $menu=new WT_Menu(WT_I18N::translate('Theme'), '#', 'menu-theme');
- foreach (get_theme_names() as $themename=>$themedir) {
- $submenu=new WT_Menu($themename, get_query_url(array('theme'=>$themedir), '&amp;'), 'menu-theme-'.$themedir);
- if (WT_THEME_DIR == 'themes/'.$themedir.'/') {$submenu->addClass('','','theme-active');}
- $menu->addSubmenu($submenu);
- }
- return $menu;
- } else {
- return null;
- }
- }
-
- /**
- * @return null|WT_Menu
- */
- public static function getLanguageMenu() {
- global $SEARCH_SPIDER;
-
- if ($SEARCH_SPIDER) {
- return null;
- } else {
- $menu=new WT_Menu(WT_I18N::translate('Language'), '#', 'menu-language');
-
- foreach (WT_I18N::installed_languages() as $lang=>$name) {
- $submenu=new WT_Menu($name, get_query_url(array('lang'=>$lang), '&amp;'), 'menu-language-'.$lang);
- if (WT_LOCALE == $lang) {$submenu->addClass('','','lang-active');}
- $menu->addSubmenu($submenu);
- }
- if (count($menu->getSubmenus())>1) {
- return $menu;
- } else {
- return null;
- }
- }
- }
-
- /**
- * @return WT_Menu
- * @throws Exception
- */
- public static function getFavoritesMenu() {
- global $REQUIRE_AUTHENTICATION, $controller, $SEARCH_SPIDER;
-
- $show_user_favs = Auth::check() && array_key_exists('user_favorites', WT_Module::getActiveModules());
- $show_gedc_favs = !$REQUIRE_AUTHENTICATION && array_key_exists('gedcom_favorites', WT_Module::getActiveModules());
-
- if ($show_user_favs && !$SEARCH_SPIDER) {
- if ($show_gedc_favs && !$SEARCH_SPIDER) {
- $favorites=array_merge(
- gedcom_favorites_WT_Module::getFavorites(WT_GED_ID),
- user_favorites_WT_Module::getFavorites(Auth::id())
- );
- } else {
- $favorites=user_favorites_WT_Module::getFavorites(Auth::id());
- }
- } else {
- if ($show_gedc_favs && !$SEARCH_SPIDER) {
- $favorites=gedcom_favorites_WT_Module::getFavorites(WT_GED_ID);
- } else {
- return null;
- }
- }
- // Sort $favorites alphabetically?
-
- $menu=new WT_Menu(WT_I18N::translate('Favorites'), '#', 'menu-favorites');
-
- foreach ($favorites as $favorite) {
- switch($favorite['type']) {
- case 'URL':
- $submenu=new WT_Menu($favorite['title'], $favorite['url']);
- $menu->addSubmenu($submenu);
- break;
- case 'INDI':
- case 'FAM':
- case 'SOUR':
- case 'OBJE':
- case 'NOTE':
- $obj=WT_GedcomRecord::getInstance($favorite['gid']);
- if ($obj && $obj->canShowName()) {
- $submenu=new WT_Menu($obj->getFullName(), $obj->getHtmlUrl());
- $menu->addSubmenu($submenu);
- }
- break;
- }
- }
-
- if ($show_user_favs) {
- if (isset($controller->record) && $controller->record instanceof WT_GedcomRecord) {
- $submenu=new WT_Menu(WT_I18N::translate('Add to favorites'), '#');
- $submenu->setOnclick("jQuery.post('module.php?mod=user_favorites&amp;mod_action=menu-add-favorite',{xref:'".$controller->record->getXref()."'},function(){location.reload();})");
- $menu->addSubmenu($submenu);
- }
- }
- return $menu;
- }
-}
diff --git a/library/WT/Report/HTML_Html.php b/library/WT/Report/HTML_Html.php
index 45a6ed73c2..8441b5dbce 100644
--- a/library/WT/Report/HTML_Html.php
+++ b/library/WT/Report/HTML_Html.php
@@ -32,7 +32,9 @@ class WT_Report_HTML_Html extends WT_Report_Base_Html {
* @return string
*/
function render($renderer, $sub = false, $inat = true) {
- if (!empty($this->attrs["wt_style"])) $renderer->setCurrentStyle($this->attrs["wt_style"]);
+ if (!empty($this->attrs["wt_style"])) {
+ $renderer->setCurrentStyle($this->attrs["wt_style"]);
+ }
$this->text = $this->getStart() . $this->text;
foreach ($this->elements as $element) {
@@ -47,7 +49,9 @@ class WT_Report_HTML_Html extends WT_Report_Base_Html {
}
}
$this->text .= $this->getEnd();
- if ($sub) return $this->text;
+ if ($sub) {
+ return $this->text;
+ }
// If not called by an other attribute
if ($inat) {
diff --git a/library/WT/Report/HTML_Line.php b/library/WT/Report/HTML_Line.php
index 4c164c5de1..3f798b3ed8 100644
--- a/library/WT/Report/HTML_Line.php
+++ b/library/WT/Report/HTML_Line.php
@@ -32,12 +32,18 @@ class WT_Report_HTML_Line extends WT_Report_Base_Line {
* @return void
*/
function render($renderer) {
- if ($this->x1 == ".") $this->x1 = $renderer->getX();
- if ($this->y1 == ".") $this->y1 = $renderer->getY();
- if ($this->x2 == ".") {
+ if ($this->x1 == '.') {
+ $this->x1 = $renderer->getX();
+ }
+ if ($this->y1 == '.') {
+ $this->y1 = $renderer->getY();
+ }
+ if ($this->x2 == '.') {
$this->x2 = $renderer->getRemainingWidth();
}
- if ($this->y2 == ".") $this->y2 = $renderer->getY();
+ if ($this->y2 == '.') {
+ $this->y2 = $renderer->getY();
+ }
// TODO Non verticle or horizontal lines can use a series of divs absolutely positioned
// Vertical line
if ($this->x1 == $this->x2) {
diff --git a/library/WT/Report/HTML_TextBox.php b/library/WT/Report/HTML_TextBox.php
index f1460aef28..1d3707eb26 100644
--- a/library/WT/Report/HTML_TextBox.php
+++ b/library/WT/Report/HTML_TextBox.php
@@ -161,8 +161,9 @@ class WT_Report_HTML_TextBox extends WT_Report_Base_TextBox {
for ($i = 0; $i < $cE; $i++) {
if (is_object($this->elements[$i])) {
$ew = $this->elements[$i]->setWrapWidth($cW - $w - 2, $cW);
- if ($ew == $cW)
+ if ($ew == $cW) {
$w = 0;
+ }
$lw = $this->elements[$i]->getWidth($renderer);
// Text is already gets the # LF
$cHT += $lw[2];
diff --git a/library/WT/Stats.php b/library/WT/Stats.php
index f3c3940636..fc68415ebe 100644
--- a/library/WT/Stats.php
+++ b/library/WT/Stats.php
@@ -28,6 +28,7 @@ require_once WT_ROOT . 'includes/functions/functions_print_lists.php';
use Rhumsaa\Uuid\Uuid;
use WT\Auth;
+use WT\Theme;
use WT\User;
/**
@@ -360,7 +361,10 @@ class WT_Stats {
* @return string
*/
public function chartIndisWithSources($params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_S_CHART_X = Theme::theme()->parameter('stats-small-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
if (isset($params[0]) && $params[0] != '') {
$size = strtolower($params[0]);
@@ -437,7 +441,11 @@ class WT_Stats {
* @return string
*/
public function chartFamsWithSources($params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_S_CHART_X = Theme::theme()->parameter('stats-small-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
+
if (isset($params[0]) && $params[0] != '') {
$size = strtolower($params[0]);
@@ -1139,7 +1147,10 @@ class WT_Stats {
* @return string
*/
public function chartMedia($params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_S_CHART_X = Theme::theme()->parameter('stats-small-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
if (isset($params[0]) && $params[0] != '') {
$size = strtolower($params[0]);
@@ -1391,7 +1402,11 @@ class WT_Stats {
* @return string
*/
public function chartDistribution($params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_CHART_COLOR3, $WT_STATS_MAP_X, $WT_STATS_MAP_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_CHART_COLOR3 = Theme::theme()->parameter('distribution-chart-low-values');
+ $WT_STATS_MAP_X = Theme::theme()->parameter('distribution-chart-x');
+ $WT_STATS_MAP_Y = Theme::theme()->parameter('distribution-chart-y');
if (isset($params[0])) {
$chart_shows = $params[0];
@@ -1657,7 +1672,11 @@ class WT_Stats {
* @return array|string
*/
public function statsBirthQuery($simple = true, $sex = false, $year1 = -1, $year2 = -1, $params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_S_CHART_X = Theme::theme()->parameter('stats-small-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
+
if ($simple) {
$sql =
@@ -1745,7 +1764,11 @@ class WT_Stats {
* @return array|string
*/
public function statsDeathQuery($simple = true, $sex = false, $year1 = -1, $year2 = -1, $params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_S_CHART_X = Theme::theme()->parameter('stats-small-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
+
if ($simple) {
$sql =
@@ -3100,7 +3123,11 @@ class WT_Stats {
* @return string|array
*/
public function statsMarrQuery($simple = true, $first = false, $year1 = -1, $year2 = -1, $params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_S_CHART_X = Theme::theme()->parameter('stats-small-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
+
if ($simple) {
$sql =
@@ -3191,7 +3218,11 @@ class WT_Stats {
* @return string|array
*/
private function statsDivQuery($simple = true, $first = false, $year1 = -1, $year2 = -1, $params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_S_CHART_X = Theme::theme()->parameter('stats-small-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
+
if ($simple) {
$sql =
@@ -4114,7 +4145,11 @@ class WT_Stats {
* @return string|string[][]
*/
public function monthFirstChildQuery($simple = true, $sex = false, $year1 = -1, $year2 = -1, $params = array()) {
- global $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y, $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_S_CHART_X = Theme::theme()->parameter('stats-small-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
+
if ($year1 >= 0 && $year2 >= 0) {
$sql_years = " AND (d_year BETWEEN '{$year1}' AND '{$year2}')";
@@ -4281,7 +4316,10 @@ class WT_Stats {
* @return string
*/
public function chartLargestFamilies($params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_L_CHART_X, $WT_STATS_S_CHART_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_L_CHART_X = Theme::theme()->parameter('stats-large-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
if (isset($params[0]) && $params[0] != '') {
$size = strtolower($params[0]);
@@ -4850,7 +4888,11 @@ class WT_Stats {
* @return string
*/
public function chartCommonSurnames($params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_S_CHART_X = Theme::theme()->parameter('stats-small-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
+
if (isset($params[0]) && $params[0] != '') {
$size = strtolower($params[0]);
@@ -5247,7 +5289,11 @@ class WT_Stats {
* @return string
*/
public function chartCommonGiven($params = array()) {
- global $WT_STATS_CHART_COLOR1, $WT_STATS_CHART_COLOR2, $WT_STATS_S_CHART_X, $WT_STATS_S_CHART_Y;
+ $WT_STATS_CHART_COLOR1 = Theme::theme()->parameter('distribution-chart-no-values');
+ $WT_STATS_CHART_COLOR2 = Theme::theme()->parameter('distribution-chart-high-values');
+ $WT_STATS_S_CHART_X = Theme::theme()->parameter('stats-small-chart-x');
+ $WT_STATS_S_CHART_Y = Theme::theme()->parameter('stats-small-chart-y');
+
if (isset($params[0]) && $params[0] != '') {
$size = strtolower($params[0]);
@@ -5562,14 +5608,26 @@ class WT_Stats {
* @return string
*/
public function contactWebmaster() {
- return user_contact_link($this->tree->getPreference('WEBMASTER_USER_ID'));
+ $user_id = $this->tree->getPreference('WEBMASTER_USER_ID');
+ $user = User::find($user_id);
+ if ($user) {
+ return Theme::theme()->contactLink($user);
+ } else {
+ return $user_id;
+ }
}
/**
* @return string
*/
public function contactGedcom() {
- return user_contact_link($this->tree->getPreference('CONTACT_USER_ID'));
+ $user_id = $this->tree->getPreference('CONTACT_USER_ID');
+ $user = User::find($user_id);
+ if ($user) {
+ return Theme::theme()->contactLink($user);
+ } else {
+ return $user_id;
+ }
}
/**
diff --git a/library/WT/Theme.php b/library/WT/Theme.php
new file mode 100644
index 0000000000..87199517a2
--- /dev/null
+++ b/library/WT/Theme.php
@@ -0,0 +1,86 @@
+<?php
+// webtrees: Web based Family History software
+// Copyright (C) 2015 webtrees development team
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+namespace WT;
+
+use WT\Theme\BaseTheme;
+
+/**
+ * Class Theme - provide access to the current theme.
+ */
+class Theme {
+ /** @var BaseTheme The current theme*/
+ private static $theme;
+
+ /** @var BaseTheme[] All currently installed themes */
+ private static $installed_themes;
+
+ /**
+ * Create a list of all themes available on the system, including
+ * any custom themes.
+ *
+ * @return BaseTheme[]
+ */
+ public static function installedThemes() {
+ if (self::$installed_themes === null) {
+ self::$installed_themes = array();
+ foreach (glob(WT_ROOT . '/themes/*/theme.php') as $theme_path) {
+ $theme = require $theme_path;
+ // Themes beginning with an underscore are reserved for special use.
+ if (substr_compare($theme->themeId(), '_', 0, 1) !== 0) {
+ self::$installed_themes[] = $theme;
+ }
+ }
+ }
+
+ return self::$installed_themes;
+ }
+
+ /**
+ * An associative array of theme names, for <select> fields, etc.
+ *
+ * @return string[]
+ */
+ public static function themeNames() {
+ $theme_names = array();
+ foreach (self::installedThemes() as $theme) {
+ $theme_names[$theme->themeId()] = $theme->themeName();
+ }
+
+ return $theme_names;
+ }
+
+ /**
+ * The currently active theme
+ *
+ * @param BaseTheme|null $theme
+ *
+ * @return BaseTheme
+ * @throws \LogicException
+ */
+ public static function theme(BaseTheme $theme = null) {
+
+ if ($theme) {
+ self::$theme = $theme;
+ } elseif (!self::$theme) {
+ throw new \LogicException;
+ }
+
+ return self::$theme;
+ }
+}
diff --git a/library/WT/Theme/Administration.php b/library/WT/Theme/Administration.php
new file mode 100644
index 0000000000..f8167b88c6
--- /dev/null
+++ b/library/WT/Theme/Administration.php
@@ -0,0 +1,200 @@
+<?php
+// webtrees: Web based Family History software
+// Copyright (C) 2015 webtrees development team.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+namespace WT\Theme;
+
+use WT_I18N;
+use WT_Menu;
+use WT_Tree;
+
+/**
+ * Class Administration - The admin theme.
+ */
+class Administration extends BaseTheme {
+ /** {@inheritdoc} */
+ protected function stylesheets() {
+ return array(
+ WT_FONT_AWESOME_CSS_URL,
+ WT_BOOTSTRAP_CSS_URL,
+ WT_DATATABLES_BOOTSTRAP_CSS_URL,
+ $this->cssUrl() . 'style.css',
+ );
+ }
+
+ /** {@inheritdoc} */
+ public function cssUrl() {
+ return 'themes/_administration/css-1.6.2/';
+ }
+
+ /** {@inheritdoc} */
+ protected function favicon() {
+ // Use the default webtrees favicon
+ return '<link rel="icon" href="favicon.ico" type="image/x-icon">';
+ }
+
+ /** {@inheritdoc} */
+ protected function footerContent() {
+ return '';
+ }
+
+ /** {@inheritdoc} */
+ protected function headerContent() {
+ return $this->secondaryMenuContainer($this->secondaryMenu());
+ }
+
+ /** {@inheritdoc} */
+ public function hookFooterExtraJavascript() {
+ return
+ '<script src="' . WT_BOOTSTRAP_JS_URL . '"></script>';
+ }
+
+ /**
+ * @return WT_Menu
+ */
+ protected function menuAdminSite() {
+ return new WT_Menu(/* I18N: Menu entry*/ WT_I18N::translate('webtrees'), '#', '', '', array(
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Site preferences'), 'admin_site_config.php?action=site'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Sending email'), 'admin_site_config.php?action=email'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Login and registration'), 'admin_site_config.php?action=login'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Logs'), 'admin_site_logs.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Site access rules'), 'admin_site_access.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Clean up data folder'), 'admin_site_clean.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Server information'), 'admin_site_info.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('README documentation'), 'admin_site_readme.php'),
+ ));
+ }
+
+ /**
+ * @return WT_Menu
+ */
+ protected function menuAdminTrees() {
+ $submenus = array(
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Manage family trees'), 'admin_trees_manage.php')
+ );
+
+ if (count(WT_Tree::getAll()) > 1) {
+ $submenus[] = new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Set the default blocks'), '#', '', 'return modalDialog(\'index_edit.php?gedcom_id=-1\', \'' . WT_I18N::translate('Set the default blocks for new family trees') . '\')');
+ $submenus[] = new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Merge family trees'), 'admin_trees_merge.php');
+ }
+
+ return new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Family trees'), '#', '', '', $submenus);
+ }
+
+ /**
+ * @return WT_Menu
+ */
+ protected function menuAdminUsers() {
+ return new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Users'), '#', '', '', array(
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('User administration'), 'admin_users.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Add a new user'), 'admin_users.php?action=edit'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Send broadcast messages'), 'admin_users_bulk.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Delete inactive users'), 'admin_users.php?action=cleanup'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Set the default blocks'), '#', '', 'return modalDialog(\'index_edit.php?user_id=-1\', \'' . WT_I18N::translate('Set the default blocks for new users') . '\')'),
+ ));
+ }
+
+ /**
+ * @return WT_Menu
+ */
+ protected function menuAdminMedia() {
+ return new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Media'), '#', '', '', array(
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Manage media'), 'admin_media.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Upload media files'), 'admin_media_upload.php'),
+ ));
+ }
+
+ /**
+ * @return WT_Menu
+ */
+ protected function menuAdminModules() {
+ return new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Modules'), '#', '', '', array(
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Module administration'), 'admin_modules.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Menus'), 'admin_module_menus.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Tabs'), 'admin_module_tabs.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Blocks'), 'admin_module_blocks.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Sidebars'), 'admin_module_sidebar.php'),
+ new WT_Menu(/* I18N: Menu entry */ WT_I18N::translate('Reports'), 'admin_module_reports.php'),
+ ));
+ }
+
+ /** {@inheritdoc} */
+ protected function primaryMenu() {
+ return array(
+ $this->menuAdminSite(),
+ $this->menuAdminTrees(),
+ $this->menuAdminUsers(),
+ $this->menuAdminMedia(),
+ $this->menuAdminModules(),
+ );
+ }
+
+ /** {@inheritdoc} */
+ protected function primaryMenuContainer(array $menus) {
+ $html = '';
+ foreach ($menus as $menu) {
+ $html .= $menu->bootstrap();
+ }
+
+ return
+ '<nav class="navbar navbar-default">' .
+ '<div class="navbar-header">' .
+ '<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#primary-navbar-collapse">' .
+ '<span class="sr-only">Toggle navigation</span>' .
+ '<span class="icon-bar"></span>' .
+ '<span class="icon-bar"></span>' .
+ '<span class="icon-bar"></span>' .
+ '</button>' .
+ //'<a class="navbar-brand" href="index.php">' . WT_WEBTREES . '</a>' .
+ '</div>' .
+ '<div class="collapse navbar-collapse" id="primary-navbar-collapse">' .
+ '<ul class="nav navbar-nav">' .
+ $html .
+ '</ul>' .
+ '</div>' .
+ '</nav>';
+ }
+
+ /** {@inheritdoc} */
+ protected function secondaryMenu() {
+ return array(
+ $this->menuMyPage(),
+ $this->menuLanguages(),
+ $this->menuLogout(),
+ );
+ }
+
+ /** {@inheritdoc} */
+ protected function secondaryMenuContainer(array $menus) {
+ $html = '';
+ foreach ($menus as $menu) {
+ $html .= $menu->bootstrap();
+ }
+
+ return '<ul class="nav nav-pills small" role="menu">' . $html . '</ul>';
+ }
+
+ /** {@inheritdoc} */
+ public function themeId() {
+ return '_administration';
+ }
+
+ /** {@inheritdoc} */
+ public function themeName() {
+ return 'administration';
+ }
+}
diff --git a/library/WT/Theme/BaseTheme.php b/library/WT/Theme/BaseTheme.php
new file mode 100644
index 0000000000..404f15e3a8
--- /dev/null
+++ b/library/WT/Theme/BaseTheme.php
@@ -0,0 +1,1692 @@
+<?php
+// webtrees: Web based Family History software
+// Copyright (C) 2015 webtrees development team.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+namespace WT\Theme;
+
+use gedcom_favorites_WT_Module;
+use user_favorites_WT_Module;
+use WT\Auth;
+use WT\Theme;
+use WT\User;
+use WT_Controller_Page;
+use WT_DB;
+use WT_Fact;
+use WT_FlashMessages;
+use WT_Gedcom_Tag;
+use WT_GedcomRecord;
+use WT_I18N;
+use WT_Filter;
+use WT_Individual;
+use WT_Menu;
+use WT_Module;
+use WT_Site;
+use WT_Tree;
+use Zend_Session_Namespace;
+
+/**
+ * Class Base - Common functions and interfaces for all themes.
+ */
+abstract class BaseTheme {
+ /** @var Zend_Session_Namespace */
+ protected $session;
+
+ /** @var WT_Tree The current tree */
+ protected $tree;
+
+ /** @var string An escaped version of the "ged=XXX" URL parameter */
+ protected $tree_url;
+
+ /** @var boolean Are we showing a page to a search engine? */
+ protected $search_engine;
+
+ /**
+ * Custom themes should place their initialization code in the function hookAfterInit(), not in
+ * the constructor, as all themes get constructed - whether they are used or not.
+ */
+ final public function __construct() {
+ }
+
+ /**
+ * Create the top of the <body>.
+ *
+ * @return string
+ */
+ public function bodyHeader() {
+ return
+ '<body class="container">' .
+ '<header>' .
+ $this->headerContent() .
+ $this->primaryMenuContainer($this->primaryMenu()) .
+ '</header>' .
+ '<main id="content" role="main">' .
+ $this->flashMessagesContainer(WT_FlashMessages::getMessages());
+ }
+
+ /**
+ * Create the top of the <body> (for popup windows).
+ *
+ * @return string
+ */
+ public function bodyHeaderPopupWindow() {
+ return
+ '<body>' .
+ '<main id="content" role="main">' .
+ $this->flashMessagesContainer(WT_FlashMessages::getMessages());
+ }
+
+ /**
+ * Create a contact link for a user.
+ *
+ * @param User $user
+ *
+ * @return string
+ */
+ public function contactLink(User $user) {
+ $method = $user->getPreference('contactmethod');
+
+ switch ($method) {
+ case 'none':
+ return '';
+ case 'mailto':
+ return '<a href="mailto:' . WT_Filter::escapeHtml($user->getEmail()) . '">' . WT_Filter::escapeHtml($user->getRealName()) . '</a>';
+ default:
+ return "<a href='#' onclick='message(\"" . WT_Filter::escapeJs($user->getUserName()) . "\", \"" . $method . "\", \"" . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_Filter::escapeJs(get_query_url()) . "\", \"\");return false;'>" . WT_Filter::escapeHtml($user->getRealName()) . '</a>';
+ }
+ }
+
+ /**
+ * Create contact link for both technical and genealogy support.
+ *
+ * @param User $user
+ *
+ * @return string
+ */
+ protected function contactLinkEverything(User $user) {
+ return WT_I18N::translate('For technical support or genealogy questions, please contact') . ' ' . $this->contactLink($user);
+ }
+
+ /**
+ * Create contact link for genealogy support.
+ *
+ * @param User $user
+ *
+ * @return string
+ */
+ protected function contactLinkGenealogy(User $user) {
+ return WT_I18N::translate('For help with genealogy questions contact') . ' ' . $this->contactLink($user);
+ }
+
+ /**
+ * Create contact link for technical support.
+ *
+ * @param User $user
+ *
+ * @return string
+ */
+ protected function contactLinkTechnical(User $user) {
+ return WT_I18N::translate('For technical support and information contact') . ' ' . $this->contactLink($user);
+ }
+
+ /**
+ * Create contact links for the page footer.
+ *
+ * @return string
+ */
+ protected function contactLinks() {
+ $contact_user = User::find($this->tree->getPreference('CONTACT_USER_ID'));
+ $webmaster_user = User::find($this->tree->getPreference('WEBMASTER_USER_ID'));
+
+ if ($contact_user && $contact_user === $webmaster_user) {
+ return $this->contactLinkEverything($contact_user);
+ } elseif ($contact_user && $webmaster_user) {
+ return $this->contactLinkGenealogy($contact_user) . '<br>' . $this->contactLinkTechnical($webmaster_user);
+ } elseif ($contact_user) {
+ return $this->contactLinkGenealogy($contact_user);
+ } elseif ($webmaster_user) {
+ return $this->contactLinkTechnical($webmaster_user);
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Where are our CSS assets?
+ *
+ * @return string A relative path, such as "themes/foo/"
+ */
+ public function cssUrl() {
+ return '';
+ }
+
+ /**
+ * Create the <DOCTYPE> tag.
+ *
+ * @return string
+ */
+ public function doctype() {
+ return '<!DOCTYPE html>';
+ }
+
+ /**
+ * HTML link to a "favorites icon".
+ *
+ * @return string
+ */
+ protected function favicon() {
+ return '';
+ }
+
+ /**
+ * Add markup to a flash message.
+ *
+ * @param \stdClass $message
+ *
+ * @return string
+ */
+ protected function flashMessageContainer(\stdClass $message) {
+ return
+ '<div class="alert alert-' . $message->status . ' alert-dismissible" role="alert">' .
+ '<button type="button" class="close" data-dismiss="alert" aria-label="' . /* I18N: button label */ WT_I18N::translate('close') . '">' .
+ '<span aria-hidden="true">&times;</span>' .
+ '</button>' .
+ $message->text .
+ '</div>';
+ }
+
+ /**
+ * Create a container for messages that are "flashed" to the session
+ * on one request, and displayed on another. If there are many messages,
+ * the container may need a max-height and scroll-bar.
+ *
+ * @param \stdClass[] $messages
+ *
+ * @return string
+ */
+ protected function flashMessagesContainer(array $messages) {
+ $html = '';
+ foreach ($messages as $message) {
+ $html .= $this->flashMessageContainer($message);
+ }
+
+ if ($html) {
+ return '<div class="flash-messages">' . $html . '</div>';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Create the <footer> tag.
+ *
+ * @return string
+ */
+ public function footerContainer() {
+ return
+ '</main>' .
+ '<footer>' . $this->footerContent() . '</footer>';
+ }
+
+ /**
+ * Create the contents of the <footer> tag.
+ *
+ * @return string
+ */
+ protected function footerContent() {
+ return
+ $this->formatContactLinks() .
+ $this->logoPoweredBy();
+ }
+
+ /**
+ * Format the contents of a variable-height home-page block.
+ *
+ * @param string $id
+ * @param string $title
+ * @param string $class
+ * @param string $content
+ *
+ * @return string
+ */
+ public function formatBlock($id, $title, $class, $content) {
+ return
+ '<div id="' . $id . '" class="block" >' .
+ '<div class="blockheader">' . $title . '</div>' .
+ '<div class="blockcontent ' . $class . '">' . $content . '</div>' .
+ '</div>';
+ }
+
+ /**
+ * Add markup to the contact links.
+ *
+ * @return string
+ */
+ protected function formatContactLinks() {
+ if ($this->tree) {
+ return '<div class="contact_links">' . $this->contactLinks() . '</div>';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Create a pending changes link for the page footer.
+ *
+ * @return string
+ */
+ protected function formatPendingChangesLink() {
+ if ($this->pendingChangesExist()) {
+ return '<div class="pending-changes-link">' . $this->pendingChangesLink() . '</div>';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Add markup to the tree title.
+ *
+ * @return string
+ */
+ protected function formatTreeTitle() {
+ if ($this->tree) {
+ return '<h1 class="header-title">' . $this->tree->tree_title_html . '</h1>';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Add markup to the user menu.
+ *
+ * @return string
+ */
+ protected function formatSecondaryMenu() {
+ return
+ '<ul class="secondary-menu">' .
+ implode('', $this->secondaryMenu()) .
+ '</ul>';
+ }
+
+ /**
+ * Add markup to an item in the user menu.
+ *
+ * @param WT_Menu $menu
+ *
+ * @return string
+ */
+ protected function formatUserMenuItem(WT_Menu $menu) {
+ return $menu->getMenuAsList();
+ }
+
+ /**
+ * Create a quick search form for the header.
+ *
+ * @return string
+ */
+ protected function formQuickSearch() {
+ if ($this->tree) {
+ return
+ '<form action="search.php" class="header-search" method="post" role="search">' .
+ '<input type="hidden" name="action" value="general">' .
+ '<input type="hidden" name="ged" value="' . $this->tree->tree_name_html . '">' .
+ '<input type="hidden" name="topsearch" value="yes">' .
+ $this->formQuickSearchFields() .
+ '</form>';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Create a search field and submit button for the quick search form in the header.
+ *
+ * @return string
+ */
+ protected function formQuickSearchFields() {
+ return
+ '<input type="search" name="query" size="15" placeholder="' . WT_I18N::translate('Search') . '">' .
+ '<input type="image" src="' . Theme::theme()->parameter('image-search') . '" alt="' . WT_I18N::translate('Search') . '">';
+ }
+
+ /**
+ * Create the <head> tag.
+ *
+ * @param WT_Controller_Page $controller The current controller
+ *
+ * @return string
+ */
+ public function head(WT_Controller_Page $controller) {
+ return
+ '<head>' .
+ $this->headContents($controller) .
+ $this->hookHeaderExtraContent() .
+ '</head>';
+ }
+
+ /**
+ * Create the contents of the <head> tag.
+ *
+ * @param WT_Controller_Page $controller The current controller
+ *
+ * @return string
+ */
+ protected function headContents(WT_Controller_Page $controller) {
+ // The title often includes the names of records, which may include HTML markup.
+ $title = WT_Filter::unescapeHtml($controller->getPageTitle());
+
+ // If an extra (site) title is specified, append it.
+ if ($this->tree && $this->tree->getPreference('META_TITLE')) {
+ $title .= ' - ' . WT_Filter::escapeHtml($this->tree->getPreference('META_TITLE'));
+ }
+
+ $html =
+ // Modernizr needs to be loaded before the <body> to avoid FOUC in IE8
+ '<!--[if IE 8]><script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script><![endif]-->' .
+ $this->metaCharset() .
+ $this->metaRobots($controller->getMetaRobots()) .
+ $this->title($title) .
+ $this->metaGenerator(WT_WEBTREES . ' ' . WT_VERSION . ' - ' . WT_WEBTREES_URL) .
+ $this->metaCanonicalUrl($controller->getCanonicalUrl());
+
+ if ($this->tree) {
+ $html .= $this->metaDescription($this->tree->getPreference('META_DESCRIPTION', html_entity_decode(strip_tags($this->tree->tree_title_html), ENT_QUOTES)));
+ }
+
+ // CSS files
+ foreach ($this->stylesheets() as $css) {
+ $html .= '<link rel="stylesheet" type="text/css" href="' . $css . '">';
+ }
+
+ return $html;
+ }
+
+ /**
+ * Create the contents of the <header> tag.
+ *
+ * @return string
+ */
+ protected function headerContent() {
+ return
+ $this->logoHeader() .
+ $this->secondaryMenuContainer($this->secondaryMenu()) .
+ $this->formatTreeTitle() .
+ $this->formQuickSearch();
+ }
+
+ /**
+ * Create the <header> tag for a popup window.
+ *
+ * @return string
+ */
+ protected function headerSimple() {
+ return
+ WT_FlashMessages::getHtmlMessages() . // Feedback from asynchronous actions
+ '<div id="content">';
+ }
+
+ /**
+ * Allow themes to do things after initialization (since they cannot use
+ * the constructor).
+ *
+ * @return void
+ */
+ public function hookAfterInit() {
+ }
+
+ /**
+ * Allow themes to add extra scripts to the page footer.
+ *
+ * @return string
+ */
+ public function hookFooterExtraJavascript() {
+ return '';
+ }
+
+ /**
+ * Allow themes to add extra content to the page header.
+ * Typically this will be additional CSS.
+ *
+ * @return string
+ */
+ public function hookHeaderExtraContent() {
+ return '';
+ }
+
+ /**
+ * Create the <html> tag.
+ *
+ * @return string
+ */
+ public function html() {
+ return '<html ' . WT_I18N::html_markup() . '>';
+ }
+
+ /**
+ * Display an icon for this fact.
+ *
+ * @param WT_Fact $fact
+ *
+ * @return string
+ */
+ public function icon(WT_Fact $fact) {
+ $icon = 'images/facts/' . $fact->getTag() . '.png';
+ $dir = substr($this->cssUrl(), strlen(WT_STATIC_URL));
+ if (file_exists($dir . $icon)) {
+ return '<img src="' . $this->cssUrl() . $icon . '" title="' . WT_Gedcom_Tag::getLabel($fact->getTag()) . '">';
+ } elseif (file_exists($dir . 'images/facts/NULL.png')) {
+ // Spacer image - for alignment - until we move to a sprite.
+ return '<img src="' . Theme::theme()->cssUrl() . 'images/facts/NULL.png">';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Display an individual in a box - for charts, etc.
+ *
+ * @param WT_Individual $individual
+ *
+ * @return string
+ */
+ public function individualBox(WT_Individual $individual) {
+ $personBoxClass = array_search($individual->getSex(), array('person_box' => 'M', 'person_boxF' => 'F', 'person_boxNN' => 'U'));
+ if ($this->tree->getPreference('SHOW_HIGHLIGHT_IMAGES')) {
+ $thumbnail = $individual->displayImage();
+ } else {
+ $thumbnail = '';
+ }
+
+ return
+ '<div data-pid="' . $individual->getXref() . '" class="person_box_template ' . $personBoxClass . ' box-style1" style="width: ' . $this->parameter('chart-box-x') . 'px; min-height: ' . $this->parameter('chart-box-y') . 'px">' .
+ '<div class="noprint icons">' .
+ '<span class="iconz icon-zoomin" title="' . WT_I18N::translate('Zoom in/out on this box.') . '"></span>' .
+ '<div class="itr"><i class="icon-pedigree"></i><div class="popup">' .
+ '<ul class="' . $personBoxClass . '">' . implode('', $this->individualBoxMenu($individual)) . '</ul>' .
+ '</div>' .
+ '</div>' .
+ '</div>' .
+ '<div class="chart_textbox" style="max-height:' . $this->parameter('chart-box-y') . 'px;">' .
+ $thumbnail .
+ '<a href="' . $individual->getHtmlUrl() . '">'.
+ '<span class="namedef name1">' . $individual->getFullName() . '</span>' .
+ '</a>' .
+ '<div class="namedef name1">' . $individual->getAddName() . '</div>' .
+ '<div class="inout2 details1">' . $this->individualBoxFacts($individual) .'</div>' .
+ '</div>' .
+ '<div class="inout"></div>' .
+ '</div>';
+ }
+
+ /**
+ * Display an empty box - for a missing individual in a chart.
+ *
+ * @return string
+ */
+ public function individualBoxEmpty() {
+ return '<div class="person_box_template person_boxNN box-style1" style="width: ' . $this->parameter('chart-box-x') . 'px; min-height: ' . $this->parameter('chart-box-y') . 'px"></div>';
+ }
+
+ /**
+ * Display an individual in a box - for charts, etc.
+ *
+ * @param WT_Individual $individual
+ *
+ * @return string
+ */
+ public function individualBoxLarge(WT_Individual $individual) {
+ $personBoxClass = array_search($individual->getSex(), array('person_box' => 'M', 'person_boxF' => 'F', 'person_boxNN' => 'U'));
+ if ($this->tree->getPreference('SHOW_HIGHLIGHT_IMAGES')) {
+ $thumbnail = $individual->displayImage();
+ } else {
+ $thumbnail = '';
+ }
+
+ return
+ '<div data-pid="' . $individual->getXref() . '" class="person_box_template ' . $personBoxClass . ' box-style2">' .
+ '<div class="noprint icons">' .
+ '<span class="iconz icon-zoomin" title="' . WT_I18N::translate('Zoom in/out on this box.') . '"></span>' .
+ '<div class="itr"><i class="icon-pedigree"></i><div class="popup">' .
+ '<ul class="' . $personBoxClass . '">' . implode('', $this->individualBoxMenu($individual)) . '</ul>' .
+ '</div>' .
+ '</div>' .
+ '</div>' .
+ '<div class="chart_textbox" style="max-height:' . $this->parameter('chart-box-y') . 'px;">' .
+ $thumbnail .
+ '<a href="' . $individual->getHtmlUrl() . '">'.
+ '<span class="namedef name2">' . $individual->getFullName() . '</span>' .
+ '</a>' .
+ '<div class="namedef name2">' . $individual->getAddName() . '</div>' .
+ '<div class="inout2 details2">' . $this->individualBoxFacts($individual) .'</div>' .
+ '</div>' .
+ '<div class="inout"></div>' .
+ '</div>';
+ }
+
+ /**
+ * Display an individual in a box - for charts, etc.
+ *
+ * @param WT_Individual $individual
+ *
+ * @return string
+ */
+ public function individualBoxSmall(WT_Individual $individual) {
+ $personBoxClass = array_search($individual->getSex(), array('person_box' => 'M', 'person_boxF' => 'F', 'person_boxNN' => 'U'));
+ if ($this->tree->getPreference('SHOW_HIGHLIGHT_IMAGES')) {
+ $thumbnail = $individual->displayImage();
+ } else {
+ $thumbnail = '';
+ }
+
+
+ return
+ '<div data-pid="' . $individual->getXref() . '" class="person_box_template ' . $personBoxClass . ' box-style0" style="width: ' . $this->parameter('compact-chart-box-x') . 'px; min-height: ' . $this->parameter('compact-chart-box-y') . 'px">' .
+ '<div class="compact_view">' .
+ $thumbnail .
+ '<a href="' . $individual->getHtmlUrl() . '">'.
+ '<span class="namedef name0">' . $individual->getFullName() . '</span>' .
+ '</a>' .
+ '<div class="inout2 details0">' . $individual->getLifeSpan() .'</div>' .
+ '</div>' .
+ '<div class="inout"></div>' .
+ '</div>';
+ }
+
+ /**
+ * Display an individual in a box - for charts, etc.
+ *
+ * @return string
+ */
+ public function individualBoxSmallEmpty() {
+ return '<div class="person_box_template person_boxNN box-style1" style="width: ' . $this->parameter('compact-chart-box-x') . 'px; min-height: ' . $this->parameter('compact-chart-box-y') . 'px"></div>';
+ }
+
+ /**
+ * Generate the facts, for display in charts.
+ *
+ * @param WT_Individual $individual
+ *
+ * @return string
+ */
+ protected function individualBoxFacts(WT_Individual $individual) {
+ $html = '';
+
+ $opt_tags = preg_split('/\W/', $this->tree->getPreference('CHART_BOX_TAGS'), 0, PREG_SPLIT_NO_EMPTY);
+ // Show BIRT or equivalent event
+ foreach (explode('|', WT_EVENTS_BIRT) as $birttag) {
+ if (!in_array($birttag, $opt_tags)) {
+ $event = $individual->getFirstFact($birttag);
+ if ($event) {
+ $html .= $event->summary();
+ break;
+ }
+ }
+ }
+ // Show optional events (before death)
+ foreach ($opt_tags as $key => $tag) {
+ if (!preg_match('/^(' . WT_EVENTS_DEAT . ')$/', $tag)) {
+ $event = $individual->getFirstFact($tag);
+ if (!is_null($event)) {
+ $html .= $event->summary();
+ unset ($opt_tags[$key]);
+ }
+ }
+ }
+ // Show DEAT or equivalent event
+ foreach (explode('|', WT_EVENTS_DEAT) as $deattag) {
+ $event = $individual->getFirstFact($deattag);
+ if ($event) {
+ $html .= $event->summary();
+ if (in_array($deattag, $opt_tags)) {
+ unset ($opt_tags[array_search($deattag, $opt_tags)]);
+ }
+ break;
+ }
+ }
+ // Show remaining optional events (after death)
+ foreach ($opt_tags as $tag) {
+ $event = $individual->getFirstFact($tag);
+ if ($event) {
+ $html .= $event->summary();
+ }
+ }
+
+ return $html;
+ }
+
+ /**
+ * Generate the LDS summary, for display in charts.
+ *
+ * @param WT_Individual $individual
+ *
+ * @return string
+ */
+ protected function individualBoxLdsSummary(WT_Individual $individual) {
+ if ($this->tree->getPreference('SHOW_LDS_AT_GLANCE')) {
+ $BAPL = $individual->getFacts('BAPL') ? 'B' : '_';
+ $ENDL = $individual->getFacts('ENDL') ? 'E' : '_';
+ $SLGC = $individual->getFacts('SLGC') ? 'C' : '_';
+ $SLGS = '_';
+
+ foreach ($individual->getSpouseFamilies() as $family) {
+ if ($family->getFacts('SLGS')) {
+ $SLGS = '';
+ }
+ }
+
+ return $BAPL . $ENDL . $SLGS . $SLGC;
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Links, to show in chart boxes;
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu[]
+ */
+ protected function individualBoxMenu(WT_Individual $individual) {
+ $menus = array_merge(
+ $this->individualBoxMenuCharts($individual),
+ $this->individualBoxMenuFamilyLinks($individual)
+ );
+
+ return $menus;
+ }
+
+ /**
+ * Chart links, to show in chart boxes;
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu[]
+ */
+ protected function individualBoxMenuCharts(WT_Individual $individual) {
+ $menus = array_filter(array(
+ $this->menuChartAncestors($individual),
+ $this->menuChartCompact($individual),
+ $this->menuChartDescendants($individual),
+ $this->menuChartFanChart($individual),
+ $this->menuChartHourglass($individual),
+ $this->menuChartInteractiveTree($individual),
+ $this->menuChartPedigree($individual),
+ $this->menuChartPedigreeMap($individual),
+ $this->menuChartRelationship($individual),
+ $this->menuChartTimeline($individual),
+ ));
+
+ usort($menus, function (WT_Menu $x, WT_Menu $y) {
+ return WT_I18N::strcasecmp($x->getLabel(), $y->getLabel());
+ });
+
+ return $menus;
+ }
+
+ /**
+ * Family links, to show in chart boxes.
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu[]
+ */
+ protected function individualBoxMenuFamilyLinks(WT_Individual $individual) {
+ $menus = array();
+
+ foreach ($individual->getSpouseFamilies() as $family) {
+ $menus[] = new WT_Menu('<strong>' . WT_I18N::translate('Family with spouse') . '</strong>', $family->getHtmlUrl());
+ $spouse = $family->getSpouse($individual);
+ if ($spouse && $spouse->canShowName()) {
+ $menus[] = new WT_Menu($spouse->getFullName(), $spouse->getHtmlUrl());
+ }
+ foreach ($family->getChildren() as $child) {
+ if ($child->canShowName()) {
+ $menus[] = new WT_Menu($child->getFullName(), $child->getHtmlUrl());
+ }
+ }
+ }
+
+ return $menus;
+ }
+
+ /**
+ * Create part of an individual box
+ *
+ * @param WT_Individual $individual
+ *
+ * @return string
+ */
+ protected function individualBoxSexSymbol(WT_Individual $individual) {
+ if ($this->tree->getPreference('PEDIGREE_SHOW_GENDER')) {
+ return $individual->sexImage('large');
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Initialise the theme. We cannot pass these in a constructor, as the construction
+ * happens in a theme file, and we need to be able to change it.
+ *
+ * @param Zend_Session_Namespace $session
+ * @param bool $search_engine
+ * @param WT_Tree|null $tree The current tree (if there is one).
+ *
+ * @return void
+ */
+ final public function init(Zend_Session_Namespace $session, $search_engine, WT_Tree $tree = null) {
+ $this->tree = $tree;
+ $this->tree_url = $tree ? 'ged=' . WT_Filter::escapeUrl($tree->tree_name) : null;
+ $this->session = $session;
+ $this->search_engine = $search_engine;
+
+ $this->hookAfterInit();
+ }
+
+ /**
+ * Are we generating a page for a robot (instead of a human being).
+ *
+ * @return boolean
+ */
+ protected function isSearchEngine() {
+ return $this->search_engine;
+ }
+
+ /**
+ * A large webtrees logo, for the footer.
+ *
+ * @return string
+ */
+ protected function logoHeader() {
+ return '<div class="header-logo"></div>';
+ }
+
+ /**
+ * A small "powered by webtrees" logo for the footer.
+ *
+ * @return string
+ */
+ protected function logoPoweredBy() {
+ return '<a href="' . WT_WEBTREES_URL . '"><div class="footer-logo"></div></a>';
+ }
+
+ /**
+ * @return WT_Menu
+ */
+ protected function menuCalendar() {
+ if ($this->isSearchEngine()) {
+ return new WT_Menu(WT_I18N::translate('Calendar'), '#', 'menu-calendar');
+ }
+
+ // Default action is the day view.
+ $menu = new WT_Menu(WT_I18N::translate('Calendar'), 'calendar.php?' . $this->tree_url, 'menu-calendar');
+
+ // Day view
+ $submenu = new WT_Menu(WT_I18N::translate('Day'), 'calendar.php?' . $this->tree_url, 'menu-calendar-day');
+ $menu->addSubmenu($submenu);
+
+ // Month view
+ $submenu = new WT_Menu(WT_I18N::translate('Month'), 'calendar.php?' . $this->tree_url . '&amp;action=calendar', 'menu-calendar-month');
+ $menu->addSubmenu($submenu);
+
+ //Year view
+ $submenu = new WT_Menu(WT_I18N::translate('Year'), 'calendar.php?' . $this->tree_url . '&amp;action=year', 'menu-calendar-year');
+ $menu->addSubmenu($submenu);
+
+ return $menu;
+ }
+
+ /**
+ * Generate a menu for each of the different charts.
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu
+ */
+ protected function menuChart(WT_Individual $individual) {
+ if ($this->tree && !$this->isSearchEngine()) {
+ // The top level menu is the pedigree chart
+ $menu = $this->menuChartPedigree($individual);
+ $menu->setLabel(WT_I18N::translate('Charts'));
+ $menu->setId('menu-chart');
+
+ $submenus = array_filter(array(
+ $this->menuChartAncestors($individual),
+ $this->menuChartCompact($individual),
+ $this->menuChartDescendants($individual),
+ $this->menuChartFamilyBook($individual),
+ $this->menuChartFanChart($individual),
+ $this->menuChartHourglass($individual),
+ $this->menuChartInteractiveTree($individual),
+ $this->menuChartLifespan($individual),
+ $this->menuChartPedigree($individual),
+ $this->menuChartPedigreeMap($individual),
+ $this->menuChartRelationship($individual),
+ $this->menuChartStatistics(),
+ $this->menuChartTimeline($individual),
+ ));
+
+ usort($submenus, function (WT_Menu $x, WT_Menu $y) {
+ return WT_I18N::strcasecmp($x->getLabel(), $y->getLabel());
+ });
+
+ $menu->setSubmenus($submenus);
+
+ return $menu;
+ } else {
+ return new WT_Menu(WT_I18N::translate('Charts'), '#', 'menu-chart');
+ }
+ }
+
+ /**
+ * Generate a menu item for the ancestors chart (ancestry.php).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu
+ */
+ protected function menuChartAncestors(WT_Individual $individual) {
+ return new WT_Menu(WT_I18N::translate('Ancestors'), 'ancestry.php?rootid=' . $individual->getXref() . '&amp;' . $this->tree_url, 'menu-chart-pedigree');
+ }
+
+ /**
+ * Generate a menu item for the compact tree (compact.php).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu
+ */
+ protected function menuChartCompact(WT_Individual $individual) {
+ return new WT_Menu(WT_I18N::translate('Compact tree'), 'compact.php?rootid=' . $individual->getXref() . '&amp;' . $this->tree_url, 'menu-chart-compact');
+ }
+
+ /**
+ * Generate a menu item for the descendants chart (descendancy.php).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu
+ */
+ protected function menuChartDescendants(WT_Individual $individual) {
+ return new WT_Menu(WT_I18N::translate('Descendants'), 'descendancy.php?rootid=' . $individual->getXref() . '&amp;' . $this->tree_url, 'menu-chart-descendants');
+ }
+
+ /**
+ * Generate a menu item for the family-book chart (familybook.php).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu
+ */
+ protected function menuChartFamilyBook(WT_Individual $individual) {
+ return new WT_Menu(WT_I18N::translate('Family book'), 'familybook.php?rootid=' . $individual->getXref() . '&amp;' . $this->tree_url, 'menu-chart-familybook');
+ }
+
+ /**
+ * Generate a menu item for the fan chart (fanchart.php).
+ *
+ * We can only do this if the GD2 library is installed with TrueType support.
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuChartFanChart(WT_Individual $individual) {
+ if (function_exists('imagettftext')) {
+ return new WT_Menu(WT_I18N::translate('Fan chart'), 'fanchart.php?rootid=' . $individual->getXref() . '&amp;' . $this->tree_url, 'menu-chart-fanchart');
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Generate a menu item for the pedigree map (googlemap module).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuChartInteractiveTree(WT_Individual $individual) {
+ if (array_key_exists('tree', WT_Module::getActiveModules())) {
+ return new WT_Menu(WT_I18N::translate('Interactive tree'), 'module.php?mod=tree&amp;mod_action=treeview&amp;' . $this->tree_url . '&amp;rootid=' . $individual->getXref(), 'menu-chart-tree');
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Generate a menu item for the hourglass chart (hourglass.php).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu
+ */
+ protected function menuChartHourglass(WT_Individual $individual) {
+ return new WT_Menu(WT_I18N::translate('Hourglass chart'), 'hourglass.php?rootid=' . $individual->getXref() . '&amp;' . $this->tree_url, 'menu-chart-hourglass');
+ }
+
+ /**
+ * Generate a menu item for the lifepsan chart (lifespan.php).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu
+ */
+ protected function menuChartLifespan(WT_Individual $individual) {
+ return new WT_Menu(WT_I18N::translate('Lifespans'), 'lifespan.php?pids%5B%5D=' . $individual->getXref() . '&amp;addFamily=1&amp;' . $this->tree_url, 'menu-chart-lifespan');
+ }
+
+ /**
+ * Generate a menu item for the pedigree chart (pedigree.php).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu
+ */
+ protected function menuChartPedigree(WT_Individual $individual) {
+ return new WT_Menu(WT_I18N::translate('Pedigree'), 'pedigree.php?rootid=' . $individual->getXref() . '&amp;' . $this->tree_url, 'menu-chart-pedigree');
+ }
+
+ /**
+ * Generate a menu item for the pedigree map (googlemap module).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuChartPedigreeMap(WT_Individual $individual) {
+ if (array_key_exists('googlemap', WT_Module::getActiveModules())) {
+ return new WT_Menu(WT_I18N::translate('Pedigree map'), 'module.php?' . $this->tree_url . '&amp;mod=googlemap&amp;mod_action=pedigree_map&amp;rootid=' . $individual->getXref(), 'menu-chart-pedigree_map');
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Generate a menu item for the relationship chart (relationship.php).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu
+ */
+ protected function menuChartRelationship(WT_Individual $individual) {
+ if (WT_USER_GEDCOM_ID && $individual->getXref()) {
+ return new WT_Menu(WT_I18N::translate('Relationship to me'), 'relationship.php?pid1=' . WT_USER_GEDCOM_ID . '&amp;pid2=' . $individual->getXref() . '&amp;ged=' . $this->tree_url, 'menu-chart-relationship');
+ } else {
+ return new WT_Menu(WT_I18N::translate('Relationships'), 'relationship.php?pid1=' . $individual->getXref() . '&amp;ged=' . $this->tree_url, 'menu-chart-relationship');
+ }
+ }
+
+ /**
+ * Generate a menu item for the statistics charts (statistics.php).
+ *
+ * @return WT_Menu
+ */
+ protected function menuChartStatistics() {
+ return new WT_Menu(WT_I18N::translate('Statistics'), 'statistics.php?' . $this->tree_url, 'menu-chart-statistics');
+ }
+
+ /**
+ * Generate a menu item for the timeline chart (timeline.php).
+ *
+ * @param WT_Individual $individual
+ *
+ * @return WT_Menu
+ */
+ protected function menuChartTimeline(WT_Individual $individual) {
+ return new WT_Menu(WT_I18N::translate('Timeline'), 'timeline.php?pids%5B%5D=' . $individual->getXref() . '&amp;' . $this->tree_url, 'menu-chart-timeline');
+ }
+
+ /**
+ * Favorites menu.
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuFavorites() {
+ global $controller;
+
+ $show_user_favs = Auth::check() && array_key_exists('user_favorites', WT_Module::getActiveModules());
+ $show_gedc_favs = !$this->tree->getPreference('REQUIRE_AUTHENTICATION') && array_key_exists('gedcom_favorites', WT_Module::getActiveModules());
+
+ if ($show_user_favs && Auth::check()) {
+ if ($show_gedc_favs && !$this->isSearchEngine()) {
+ $favorites = array_merge(
+ gedcom_favorites_WT_Module::getFavorites(WT_GED_ID),
+ user_favorites_WT_Module::getFavorites(Auth::id())
+ );
+ } else {
+ $favorites = user_favorites_WT_Module::getFavorites(Auth::id());
+ }
+ } else {
+ if ($show_gedc_favs && !$this->isSearchEngine()) {
+ $favorites = gedcom_favorites_WT_Module::getFavorites(WT_GED_ID);
+ } else {
+ return null;
+ }
+ }
+
+ $menu = new WT_Menu(WT_I18N::translate('Favorites'), '#', 'menu-favorites');
+
+ foreach ($favorites as $favorite) {
+ switch ($favorite['type']) {
+ case 'URL':
+ $submenu = new WT_Menu($favorite['title'], $favorite['url']);
+ $menu->addSubmenu($submenu);
+ break;
+ case 'INDI':
+ case 'FAM':
+ case 'SOUR':
+ case 'OBJE':
+ case 'NOTE':
+ $obj = WT_GedcomRecord::getInstance($favorite['gid']);
+ if ($obj && $obj->canShowName()) {
+ $submenu = new WT_Menu($obj->getFullName(), $obj->getHtmlUrl());
+ $menu->addSubmenu($submenu);
+ }
+ break;
+ }
+ }
+
+ if ($show_user_favs) {
+ if (isset($controller->record) && $controller->record instanceof WT_GedcomRecord) {
+ $submenu = new WT_Menu(WT_I18N::translate('Add to favorites'), '#');
+ $submenu->setOnclick("jQuery.post('module.php?mod=user_favorites&amp;mod_action=menu-add-favorite',{xref:'" . $controller->record->getXref() . "'},function(){location.reload();})");
+ $menu->addSubmenu($submenu);
+ }
+ }
+
+ return $menu;
+ }
+
+ /**
+ * @return WT_Menu
+ */
+ protected function menuHomePage() {
+ $menu = new WT_Menu(WT_I18N::translate('Home page'), 'index.php?ctype=gedcom&amp;' . $this->tree_url, 'menu-tree');
+ $ALLOW_CHANGE_GEDCOM = WT_Site::getPreference('ALLOW_CHANGE_GEDCOM') && count(WT_Tree::getAll()) > 1;
+ foreach (WT_Tree::getAll() as $tree) {
+ if ($tree->tree_id === WT_GED_ID || $ALLOW_CHANGE_GEDCOM) {
+ $submenu = new WT_Menu(
+ $tree->tree_title_html,
+ 'index.php?ctype=gedcom&amp;ged=' . $tree->tree_name_url,
+ 'menu-tree-' . $tree->tree_id // Cannot use name - it must be a CSS identifier
+ );
+ $menu->addSubmenu($submenu);
+ }
+ }
+
+ return $menu;
+ }
+
+ /**
+ * A menu to show a list of available languages.
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuLanguages() {
+ $menu = new WT_Menu(WT_I18N::translate('Language'), '#', 'menu-language');
+
+ foreach (WT_I18N::installed_languages() as $lang => $name) {
+ $submenu = new WT_Menu($name, get_query_url(array('lang' => $lang), '&amp;'), 'menu-language-' . $lang);
+ if (WT_LOCALE === $lang) {
+ $submenu->addClass('', '', 'active');
+ }
+ $menu->addSubmenu($submenu);
+ }
+
+ if (count($menu->getSubmenus()) > 1 && !$this->isSearchEngine()) {
+ return $menu;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Create a menu to show lists of individuals, families, sources, etc.
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuLists() {
+ global $controller;
+
+ // The top level menu shows the individual list
+ $menu = new WT_Menu(WT_I18N::translate('Lists'), 'indilist.php?' . $this->tree_url, 'menu-list');
+
+ // Do not show empty lists
+ $row = WT_DB::prepare(
+ "SELECT SQL_CACHE" .
+ " EXISTS(SELECT 1 FROM `##sources` WHERE s_file=? ) AS sour," .
+ " EXISTS(SELECT 1 FROM `##other` WHERE o_file=? AND o_type='REPO') AS repo," .
+ " EXISTS(SELECT 1 FROM `##other` WHERE o_file=? AND o_type='NOTE') AS note," .
+ " EXISTS(SELECT 1 FROM `##media` WHERE m_file=? ) AS obje"
+ )->execute(array(WT_GED_ID, WT_GED_ID, WT_GED_ID, WT_GED_ID))->fetchOneRow();
+
+ // Build a list of submenu items and then sort it in localized name order
+ $surname_url = '&surname=' . rawurlencode($controller->getSignificantSurname()) . '&amp;' . $this->tree_url;
+
+ $menulist = array(
+ new WT_Menu(WT_I18N::translate('Individuals'), 'indilist.php?' . $this->tree_url . $surname_url, 'menu-list-indi'),
+ );
+
+ if (!$this->isSearchEngine()) {
+ $menulist[] = new WT_Menu(WT_I18N::translate('Families'), 'famlist.php?' . $this->tree_url . $surname_url, 'menu-list-fam');
+ $menulist[] = new WT_Menu(WT_I18N::translate('Branches'), 'branches.php?' . $this->tree_url . $surname_url, 'menu-branches');
+ $menulist[] = new WT_Menu(WT_I18N::translate('Place hierarchy'), 'placelist.php?' . $this->tree_url, 'menu-list-plac');
+ if ($row->obje) {
+ $menulist[] = new WT_Menu(WT_I18N::translate('Media objects'), 'medialist.php?' . $this->tree_url, 'menu-list-obje');
+ }
+ if ($row->repo) {
+ $menulist[] = new WT_Menu(WT_I18N::translate('Repositories'), 'repolist.php?' . $this->tree_url, 'menu-list-repo');
+ }
+ if ($row->sour) {
+ $menulist[] = new WT_Menu(WT_I18N::translate('Sources'), 'sourcelist.php?' . $this->tree_url, 'menu-list-sour');
+ }
+ if ($row->note) {
+ $menulist[] = new WT_Menu(WT_I18N::translate('Shared notes'), 'notelist.php?' . $this->tree_url, 'menu-list-note');
+ }
+ }
+ uasort($menulist, function (WT_Menu $x, WT_Menu $y) {
+ return WT_I18N::strcasecmp($x->getLabel(), $y->getLabel());
+ });
+
+ $menu->setSubmenus($menulist);
+
+ return $menu;
+ }
+
+ /**
+ * A login menu option (or null if we are already logged in).
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuLogin() {
+ if (Auth::check() || $this->isSearchEngine()) {
+ return null;
+ } else {
+ return new WT_Menu(WT_I18N::translate('Login'), WT_LOGIN_URL . '?url=' . rawurlencode(get_query_url()));
+ }
+ }
+
+ /**
+ * A logout menu option (or null if we are already logged out).
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuLogout() {
+ if (Auth::check()) {
+ return new WT_Menu(WT_I18N::translate('Logout'), 'logout.php');
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Get the additional menus created by each of the modules
+ *
+ * @return WT_Menu[]
+ */
+ protected function menuModules() {
+ $menus = array();
+ foreach (WT_Module::getActiveMenus() as $module) {
+ $menu = $module->getMenu();
+ if ($menu) {
+ $menus[] = $menu;
+ }
+ }
+
+ return $menus;
+ }
+
+ /**
+ * A link to allow users to edit their account settings.
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuMyAccount() {
+ if (Auth::check()) {
+ return new WT_Menu(WT_Filter::escapeHtml(Auth::user()->getRealName()), 'edituser.php');
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @return WT_Menu|null
+ */
+ protected function menuMyMenu() {
+ $showFull = $this->tree->getPreference('PEDIGREE_FULL_DETAILS') ? 1 : 0;
+ $showLayout = $this->tree->getPreference('PEDIGREE_LAYOUT') ? 1 : 0;
+
+ if (!Auth::id()) {
+ return null;
+ }
+
+ $menu = new WT_Menu(WT_I18N::translate('My page'), 'index.php?ctype=user&amp;' . $this->tree_url, 'menu-mymenu');
+
+ $menu->addSubmenu($this->menuMyPage());
+
+ if (Auth::user()->getPreference('editaccount')) {
+ $menu->addSubmenu(new WT_Menu(WT_I18N::translate('My account'), 'edituser.php', 'menu-myaccount'));
+ }
+
+ if (WT_USER_GEDCOM_ID) {
+ $menu->addSubmenu(new WT_Menu(
+ WT_I18N::translate('My pedigree'),
+ 'pedigree.php?' . $this->tree_url . '&amp;rootid=' . WT_USER_GEDCOM_ID . "&amp;show_full={$showFull}&amp;talloffset={$showLayout}",
+ 'menu-mypedigree'
+ ));
+
+ $menu->addSubmenu(new WT_Menu(
+ WT_I18N::translate('My individual record'), 'individual.php?pid=' . WT_USER_GEDCOM_ID . '&amp;' . $this->tree_url, 'menu-myrecord'
+ ));
+ }
+
+ if (WT_USER_GEDCOM_ADMIN) {
+ $menu->addSubmenu(new WT_Menu(WT_I18N::translate('Administration'), 'admin.php', 'menu-admin'));
+ }
+
+ return $menu;
+ }
+
+ /**
+ * A link to the user's personal home page.
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuMyPage()
+ {
+ return new WT_Menu(WT_I18N::translate('My page'), 'index.php?ctype=user&amp;' . $this->tree_url, 'menu-mypage');
+ }
+
+ /**
+ * Create a pending changes menu.
+ *
+ * @return WT_Menu|null
+ */
+ protected function menuPendingChanges() {
+ if ($this->pendingChangesExist()) {
+ $menu = new WT_Menu(WT_I18N::translate('Pending changes'), '#', 'menu-pending');
+ $menu->setOnclick('window.open(\'edit_changes.php\', \'_blank\', chan_window_specs); return false;');
+
+ return $menu;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @return WT_Menu|null
+ */
+ protected function menuReports() {
+ $active_reports = WT_Module::getActiveReports();
+
+ if ($this->isSearchEngine() || !$active_reports) {
+ return new WT_Menu(WT_I18N::translate('Reports'), '#', 'menu-report');
+ }
+
+ $menu = new WT_Menu(WT_I18N::translate('Reports'), 'reportengine.php?' . $this->tree_url, 'menu-report');
+
+ $sub_menu = false;
+ foreach ($active_reports as $report) {
+ foreach ($report->getReportMenus() as $submenu) {
+ $menu->addSubmenu($submenu);
+ $sub_menu = true;
+ }
+ }
+
+ if ($sub_menu && !$this->isSearchEngine()) {
+ return $menu;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Create the search menu
+ *
+ * @return WT_Menu
+ */
+ protected function menuSearch() {
+ if ($this->isSearchEngine()) {
+ return new WT_Menu(WT_I18N::translate('Search'), '#', 'menu-search');
+ }
+ //-- main search menu item
+ $menu = new WT_Menu(WT_I18N::translate('Search'), 'search.php?' . $this->tree_url, 'menu-search');
+ //-- search_general sub menu
+ $submenu = new WT_Menu(WT_I18N::translate('General search'), 'search.php?' . $this->tree_url, 'menu-search-general');
+ $menu->addSubmenu($submenu);
+ //-- search_soundex sub menu
+ $submenu = new WT_Menu(/* I18N: search using “sounds like”, rather than exact spelling */
+ WT_I18N::translate('Phonetic search'), 'search.php?' . $this->tree_url . '&amp;action=soundex', 'menu-search-soundex');
+ $menu->addSubmenu($submenu);
+ //-- advanced search
+ $submenu = new WT_Menu(WT_I18N::translate('Advanced search'), 'search_advanced.php?' . $this->tree_url, 'menu-search-advanced');
+ $menu->addSubmenu($submenu);
+ //-- search_replace sub menu
+ if (WT_USER_CAN_EDIT) {
+ $submenu = new WT_Menu(WT_I18N::translate('Search and replace'), 'search.php?' . $this->tree_url . '&amp;action=replace', 'menu-search-replace');
+ $menu->addSubmenu($submenu);
+ }
+
+ return $menu;
+ }
+
+ /**
+ * Themes menu.
+ *
+ * @return WT_Menu|null
+ */
+ public function menuThemes() {
+ if ($this->tree && !$this->isSearchEngine() && WT_Site::getPreference('ALLOW_USER_THEMES') && $this->tree->getPreference('ALLOW_THEME_DROPDOWN')) {
+ $menu = new WT_Menu(WT_I18N::translate('Theme'), '#', 'menu-theme');
+ foreach (Theme::installedThemes() as $theme) {
+ $submenu = new WT_Menu($theme->themeName(), get_query_url(array('theme' => $theme->themeId()), '&amp;'), 'menu-theme-' . $theme->themeId());
+ if ($theme === $this) {
+ $submenu->addClass('', '', 'active');
+ }
+ $menu->addSubmenu($submenu);
+ }
+
+ return $menu;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Create the <link rel="canonical"> tag.
+ *
+ * @param string $url
+ *
+ * @return string
+ */
+ protected function metaCanonicalUrl($url) {
+ if ($url) {
+ return '<link rel="canonical" href="' . $url . '">';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Create the <meta charset=""> tag.
+ *
+ * @return string
+ */
+ protected function metaCharset() {
+ return '<meta charset="UTF-8">';
+ }
+
+ /**
+ * Create the <meta name="description"> tag.
+ *
+ * @param string $description
+ *
+ * @return string
+ */
+ protected function metaDescription($description) {
+ if ($description) {
+ return '<meta name="description" content="' . $description . '">';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Create the <meta name="generator"> tag.
+ *
+ * @param string $generator
+ *
+ * @return string
+ */
+ protected function metaGenerator($generator) {
+ if ($generator) {
+ return '<meta name="generator" content="' . $generator . '">';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Create the <meta name="robots"> tag.
+ *
+ * @param string $robots
+ *
+ * @return string
+ */
+ protected function metaRobots($robots) {
+ if ($robots) {
+ return '<meta name="robots" content="' . $robots . '">';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Create the <meta http-equiv="X-UA-Compatible"> tag.
+ *
+ * @return string
+ */
+ protected function metaUaCompatible() {
+ return '<meta http-equiv="X-UA-Compatible" content="IE=edge">';
+ }
+
+ /**
+ * Misecellaneous dimensions, fonts, styles, etc.
+ *
+ * @param string $parameter_name
+ *
+ * @return string|integer|float
+ */
+ public function parameter($parameter_name) {
+ $parameters = array(
+ 'chart-background-f' => 'dddddd',
+ 'chart-background-m' => 'cccccc',
+ 'chart-background-u' => 'eeeeee',
+ 'chart-box-x' => 250,
+ 'chart-box-y' => 80,
+ 'chart-descendancy-box-x' => 260,
+ 'chart-descendancy-box-y' => 80,
+ 'chart-descendancy-indent' => 15,
+ 'chart-font-color' => '000000',
+ 'chart-font-name' => WT_ROOT . 'includes/fonts/DejaVuSans.ttf',
+ 'chart-font-size' => 7,
+ 'chart-offset-x' => 10,
+ 'chart-offset-y' => 10,
+ 'chart-spacing-x' => 1,
+ 'chart-spacing-y' => 5,
+ 'compact-chart-box-x' => 240,
+ 'compact-chart-box-y' => 50,
+ 'distribution-chart-high-values' => '555555',
+ 'distribution-chart-low-values' => 'cccccc',
+ 'distribution-chart-no-values' => 'ffffff',
+ 'distribution-chart-x' => 440,
+ 'distribution-chart-y' => 220,
+ 'line-width' => 1.5,
+ 'shadow-blur' => 0,
+ 'shadow-color' => '',
+ 'shadow-offset-x' => 0,
+ 'shadow-offset-y' => 0,
+ 'stats-small-chart-x' => 440,
+ 'stats-small-chart-y' => 125,
+ 'stats-large-chart-x' => 900,
+ 'image-dline' => $this->cssUrl() . 'images/dline.png',
+ 'image-dline2' => $this->cssUrl() . 'images/dline2.png',
+ 'image-hline' => $this->cssUrl() . 'images/hline.png',
+ 'image-spacer' => $this->cssUrl() . 'images/spacer.png',
+ 'image-vline' => $this->cssUrl() . 'images/vline.png',
+ 'image-add' => $this->cssUrl() . 'images/add.png',
+ 'image-button_family' => $this->cssUrl() . 'images/buttons/family.png',
+ 'image-minus' => $this->cssUrl() . 'images/minus.png',
+ 'image-plus' => $this->cssUrl() . 'images/plus.png',
+ 'image-remove' => $this->cssUrl() . 'images/delete.png',
+ 'image-search' => $this->cssUrl() . 'images/go.png',
+ 'image-default_image_F' => $this->cssUrl() . 'images/silhouette_female.png',
+ 'image-default_image_M' => $this->cssUrl() . 'images/silhouette_male.png',
+ 'image-default_image_U' => $this->cssUrl() . 'images/silhouette_unknown.png',
+ );
+
+ if (array_key_exists($parameter_name, $parameters)) {
+ return $parameters[$parameter_name];
+ } else {
+ throw new \InvalidArgumentException($parameter_name);
+ }
+ }
+
+ /**
+ * Are there any pending changes for us to approve?
+ *
+ * @return bool
+ */
+ protected function pendingChangesExist() {
+ return exists_pending_change(Auth::user(), $this->tree);
+ }
+
+ /**
+ * Create a pending changes link.
+ *
+ * @return string
+ */
+ protected function pendingChangesLink() {
+ return
+ '<a href="#" onclick="window.open(\'edit_changes.php\', \'_blank\', chan_window_specs); return false;">' .
+ $this->pendingChangesLinkText() .
+ '</a>';
+ }
+
+ /**
+ * Text to use in the pending changes link.
+ *
+ * @return string
+ */
+ protected function pendingChangesLinkText() {
+ return WT_I18N::translate('There are pending changes for you to moderate.');
+ }
+
+ /**
+ * Generate a list of items for the main menu.
+ *
+ * @return WT_Menu[]
+ */
+ protected function primaryMenu() {
+ global $controller;
+
+ $individual = $controller->getSignificantIndividual();
+
+ return array_filter(array_merge(array(
+ $this->menuHomePage(),
+ $this->menuMyMenu(),
+ $this->menuChart($individual),
+ $this->menuLists(),
+ $this->menuCalendar(),
+ $this->menuReports(),
+ $this->menuSearch(),
+ ), $this->menuModules()));
+ }
+
+ /**
+ * Add markup to the primary menu.
+ *
+ * @param WT_Menu[] $menus
+ *
+ * @return string
+ */
+ protected function primaryMenuContainer(array $menus) {
+ $html = '';
+ foreach ($menus as $menu) {
+ $html .= $menu->getMenuAsList();
+ }
+
+ return '<nav><ul class="primary-menu">' . $html . '</ul></nav>';
+ }
+
+ /**
+ * Generate a list of items for the user menu.
+ *
+ * @return WT_Menu[]
+ */
+ protected function secondaryMenu() {
+ return array_filter(array(
+ $this->menuPendingChanges(),
+ $this->menuLogin(),
+ $this->menuMyAccount(),
+ $this->menuLogout(),
+ $this->menuFavorites(),
+ $this->menuLanguages(),
+ $this->menuThemes(),
+ ));
+ }
+
+ /**
+ * Add markup to the secondary menu.
+ *
+ * @param WT_Menu[] $menus
+ *
+ * @return string
+ */
+ protected function secondaryMenuContainer(array $menus) {
+ $html = '';
+ foreach ($menus as $menu) {
+ $html .= $menu->getMenuAsList();
+ }
+
+ return '<ul class="nav nav-pills secondary-menu">' . $html . '</ul>';
+ }
+
+ /**
+ * Send any HTTP headers.
+ *
+ * @return void
+ */
+ public function sendHeaders() {
+ header('Content-Type: text/html; charset=UTF-8');
+ }
+
+ /**
+ * A list of CSS files to include for this page.
+ *
+ * @return string[]
+ */
+ protected function stylesheets() {
+ return array();
+ }
+
+ /**
+ * A fixed string to identify this theme, in settings, etc.
+ *
+ * @return string
+ */
+ abstract public function themeId();
+
+ /**
+ * What is this theme called?
+ *
+ * @return string
+ */
+ abstract public function themeName();
+
+ /**
+ * Create the <title> tag.
+ *
+ * @param string $title
+ *
+ * @return string
+ */
+ protected function title($title) {
+ return '<title>' . WT_Filter::escapeHtml($title) . '</title>';
+ }
+}
diff --git a/library/WT/Theme/Clouds.php b/library/WT/Theme/Clouds.php
new file mode 100644
index 0000000000..218716c743
--- /dev/null
+++ b/library/WT/Theme/Clouds.php
@@ -0,0 +1,145 @@
+<?php
+// webtrees: Web based Family History software
+// Copyright (C) 2015 webtrees development team.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+namespace WT\Theme;
+
+use WT\Theme;
+use WT_I18N;
+use WT_Menu;
+
+/**
+ * Class Clouds - The clouds theme.
+ */
+class Clouds extends BaseTheme {
+ /** {@inheritdoc} */
+ public function cssUrl() {
+ return 'themes/clouds/css-1.6.2/';
+ }
+
+ /** {@inheritdoc} */
+ protected function favicon() {
+ return '<link rel="icon" href="' . $this->cssUrl() . 'favicon.png" type="image/png">';
+ }
+
+ /** {@inheritdoc} */
+ protected function flashMessageContainer(\stdClass $message) {
+ // This theme uses jQuery markup.
+ return '<p class="ui-state-highlight">' . $message->text . '</p>';
+ }
+
+ /** {@inheritdoc} */
+ protected function footerContent() {
+ return '<div id="footer">' . parent::footerContent() . '</div>';
+ }
+
+ /** {@inheritdoc} */
+ public function formatBlock($id, $title, $class, $content) {
+ return
+ '<div id="' . $id . '" class="block" >' .
+ '<table class="blockheader"><tr><td class="blockh1"></td><td class="blockh2">' .
+ '<div class="blockhc"><b>' . $title . '</b></div>' .
+ '</td><td class="blockh3"></td></tr></table>' .
+ '<div class="blockcontent normal_inner_block ' . $class . '">' . $content . '</div>' .
+ '</div>';
+ }
+
+ /** {@inheritdoc} */
+ protected function formQuickSearchFields() {
+ return
+ '<input type="search" name="query" size="15" placeholder="' . WT_I18N::translate('Search') . '">' .
+ '<input class="search-icon" type="image" src="' . Theme::theme()->parameter('image-search') . '" alt="' . WT_I18N::translate('Search') . '" title="' . WT_I18N::translate('Search') . '">';
+ }
+
+ /** {@inheritdoc} */
+ public function hookFooterExtraJavascript() {
+ return
+ '<script src="' . WT_JQUERY_COLORBOX_URL . '"></script>' .
+ '<script src="' . WT_JQUERY_WHEELZOOM_URL . '"></script>' .
+ '<script>' .
+ 'activate_colorbox();' .
+ 'jQuery.extend(jQuery.colorbox.settings, {' .
+ ' width: "85%",' .
+ ' height: "85%",' .
+ ' transition: "none",' .
+ ' slideshowStart: "' . WT_I18N::translate('Play') . '",' .
+ ' slideshowStop: "' . WT_I18N::translate('Stop') . '",' .
+ ' title: function() { return jQuery(this).data("title"); }' .
+ '});' .
+ '</script>';
+ }
+
+ /** {@inheritdoc} */
+ public function parameter($parameter_name) {
+ $parameters = array(
+ 'chart-background-f' => 'e9daf1',
+ 'chart-background-m' => 'b1cff0',
+ 'chart-descendancy-box-x' => 250,
+ 'chart-spacing-x' => 4,
+ 'distribution-chart-high-values' => '95b8e0',
+ 'distribution-chart-low-values' => 'c8e7ff',
+ );
+
+ if (array_key_exists($parameter_name, $parameters)) {
+ return $parameters[$parameter_name];
+ } else {
+ return parent::parameter($parameter_name);
+ }
+ }
+
+ /** {@inheritdoc} */
+ protected function primaryMenuContainer(array $menus) {
+ $html = '';
+
+ foreach ($menus as $menu) {
+ // Create an inert menu - to use as a label
+ $tmp = new WT_Menu(strip_tags($menu->getLabel()), '');
+
+ // Insert the label into the submenu
+ $submenus = $menu->getSubmenus();
+ array_unshift($submenus, $tmp);
+ $menu->setSubmenus($submenus);
+
+ // Neutralise the top-level menu
+ $menu->setLabel('');
+ $menu->setLink('');
+ $menu->setOnclick('');
+
+ $html .= $menu->getMenuAsList();
+ }
+
+ return '<ul class="primary-menu">' . $html . '</ul>';
+ }
+
+ /** {@inheritdoc} */
+ protected function stylesheets() {
+ return array(
+ 'themes/clouds/jquery-ui-1.11.2/jquery-ui.css',
+ $this->cssUrl() . 'style.css',
+ );
+ }
+
+ /** {@inheritdoc} */
+ public function themeId() {
+ return 'clouds';
+ }
+
+ /** {@inheritdoc} */
+ public function themeName() {
+ return /* I18N: Name of a theme. */ WT_I18N::translate('clouds');
+ }
+}
diff --git a/library/WT/Theme/Colors.php b/library/WT/Theme/Colors.php
new file mode 100644
index 0000000000..1d7a8e103b
--- /dev/null
+++ b/library/WT/Theme/Colors.php
@@ -0,0 +1,261 @@
+<?php
+// webtrees: Web based Family History software
+// Copyright (C) 2015 webtrees development team.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+namespace WT\Theme;
+
+use WT\Auth;
+use WT\Theme;
+use WT_I18N;
+use WT_Menu;
+use WT_Site;
+
+/**
+ * Class Colors - The colors theme.
+ */
+class Colors extends BaseTheme {
+ /** @var string[] A list of color palettes */
+ protected $sub_colors;
+
+ /** @var string Which of the color palettes to use on this page */
+ protected $sub_color;
+
+ /** {@inheritdoc} */
+ public function cssUrl() {
+ return 'themes/colors/css-1.6.2/';
+ }
+
+ /** {@inheritdoc} */
+ protected function favicon() {
+ return '<link rel="icon" href="' . $this->cssUrl() . 'favicon.png" type="image/png">';
+ }
+
+ /** {@inheritdoc} */
+ protected function flashMessageContainer(\stdClass $message) {
+ // This theme uses jQuery markup.
+ return '<p class="ui-state-highlight">' . $message->text . '</p>';
+ }
+
+ /** {@inheritdoc} */
+ public function formatBlock($id, $title, $class, $content) {
+ return
+ '<div id="' . $id . '" class="block" >' .
+ '<table class="blockheader"><tr><td class="blockh1"></td><td class="blockh2">' .
+ '<div class="blockhc"><b>' . $title . '</b></div>' .
+ '</td><td class="blockh3"></td></tr></table>' .
+ '<div class="blockcontent normal_inner_block ' . $class . '">' . $content . '</div>' .
+ '</div>';
+ }
+
+ /** {@inheritdoc} */
+ protected function formatSecondaryMenu() {
+ return
+ '<ul class="secondary-menu">' .
+ implode('', $this->secondaryMenu()) .
+ '<li>' .
+ $this->formQuickSearch() .
+ '</li>' .
+ '</ul>';
+ }
+ /** {@inheritdoc} */
+ protected function headerContent() {
+ return
+ $this->formatTreeTitle() .
+ $this->formatSecondaryMenu();
+ }
+
+ /** {@inheritdoc} */
+ protected function formQuickSearchFields() {
+ return
+ '<input type="search" name="query" size="15" placeholder="' . WT_I18N::translate('Search') . '">' .
+ '<input class="search-icon" type="image" src="' . Theme::theme()->parameter('image-search') . '" alt="' . WT_I18N::translate('Search') . '" title="' . WT_I18N::translate('Search') . '">';
+ }
+
+ /**
+ * Create resources for the colors theme.
+ *
+ * {@inheritdoc}
+ */
+ public function hookAfterInit() {
+ $this->sub_colors = array(
+ 'aquamarine' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Aqua Marine'),
+ 'ash' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Ash'),
+ 'belgianchocolate'=> /* I18N: The name of a colour-scheme */ WT_I18N::translate('Belgian Chocolate'),
+ 'bluelagoon' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Blue Lagoon'),
+ 'bluemarine' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Blue Marine'),
+ 'coffeeandcream' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Coffee and Cream'),
+ 'coldday' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Cold Day'),
+ 'greenbeam' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Green Beam'),
+ 'mediterranio' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Mediterranio'),
+ 'mercury' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Mercury'),
+ 'nocturnal' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Nocturnal'),
+ 'olivia' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Olivia'),
+ 'pinkplastic' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Pink Plastic'),
+ 'sage' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Sage'),
+ 'shinytomato' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Shiny Tomato'),
+ 'tealtop' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Teal Top'),
+ );
+ uasort($this->sub_colors, array('WT_I18N', 'strcasecmp'));
+
+ // If we've selected a new palette, and we are logged in, set this value as a default.
+ if (isset($_GET['themecolor']) && array_key_exists($_GET['themecolor'], $this->sub_colors)) {
+ // Request to change color
+ $this->sub_color = $_GET['themecolor'];
+ Auth::user()->setPreference('themecolor', $this->sub_color);
+ if (Auth::isAdmin()) {
+ WT_Site::setPreference('DEFAULT_COLOR_PALETTE', $this->sub_color);
+ }
+ unset($_GET['themecolor']);
+ // Rember that we have selected a value
+ $this->session->subColor = $this->sub_color;
+ }
+ // If we are logged in, use our preference
+ $this->sub_color = Auth::user()->getPreference('themecolor');
+ // If not logged in or no preference, use one we selected earlier in the session?
+ if (!$this->sub_color) {
+ $this->sub_color = $this->session->subColor;
+ }
+ // We haven't selected one this session? Use the site default
+ if (!$this->sub_color) {
+ $this->sub_color = WT_Site::getPreference('DEFAULT_COLOR_PALETTE');
+ }
+ // Make sure our selected palette actually exists
+ if (!array_key_exists($this->sub_color, $this->sub_colors)) {
+ $this->sub_color = 'ash';
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function hookFooterExtraJavascript() {
+ return
+ '<script src="' . WT_JQUERY_COLORBOX_URL . '"></script>' .
+ '<script src="' . WT_JQUERY_WHEELZOOM_URL . '"></script>' .
+ '<script>' .
+ 'activate_colorbox();' .
+ 'jQuery.extend(jQuery.colorbox.settings, {' .
+ ' width: "85%",' .
+ ' height: "85%",' .
+ ' transition: "none",' .
+ ' slideshowStart: "' . WT_I18N::translate('Play') . '",' .
+ ' slideshowStop: "' . WT_I18N::translate('Stop') . '",' .
+ ' title: function() { return jQuery(this).data("title"); }' .
+ '});' .
+ '</script>';
+ }
+
+ /**
+ * Generate a list of items for the user menu.
+ *
+ * @return WT_Menu[]
+ */
+ protected function secondaryMenu() {
+ $menubar = parent::secondaryMenu();
+ $menubar[] = $this->menuPalette();
+
+ return $menubar;
+ }
+
+ /**
+ * Create a menu of palette options
+ *
+ * @return WT_Menu
+ */
+ protected function menuPalette() {
+ $menu = new WT_Menu(/* I18N: A colour scheme */ WT_I18N::translate('Palette'), '#', 'menu-color');
+
+ foreach ($this->sub_colors as $colorChoice => $color_name) {
+ $submenu = new WT_Menu($color_name, get_query_url(array('themecolor' => $colorChoice), '&amp;'), 'menu-color-' . $colorChoice);
+ if ($this->session->subColor) {
+ if ($this->session->subColor === $colorChoice) {
+ $submenu->addClass('', '', 'theme-active');
+ }
+ } elseif (WT_Site::getPreference('DEFAULT_COLOR_PALETTE') === $colorChoice) {
+ // here when visitor changes palette from default
+ $submenu->addClass('', '', 'theme-active');
+ } elseif ($this->sub_color === 'ash') {
+ // here when site has different theme as default and user switches to colors
+ if ($this->sub_color === $colorChoice) {
+ $submenu->addClass('', '', 'theme-active');
+ }
+ }
+ $menu->addSubmenu($submenu);
+ }
+
+ return $menu;
+ }
+
+ /** {@inheritdoc} */
+ public function parameter($parameter_name) {
+ $parameters = array(
+ 'chart-background-f' => 'e9daf1',
+ 'chart-background-m' => 'b1cff0',
+ 'chart-descendancy-box-x' => 250,
+ 'chart-spacing-x' => 4,
+ 'distribution-chart-high-values' => '95b8e0',
+ 'distribution-chart-low-values' => 'c8e7ff',
+ );
+
+ if (array_key_exists($parameter_name, $parameters)) {
+ return $parameters[$parameter_name];
+ } else {
+ return parent::parameter($parameter_name);
+ }
+ }
+
+ /** {@inheritdoc} */
+ protected function primaryMenuContainer(array $menus) {
+ $html = '';
+
+ foreach ($menus as $menu) {
+ // Create an inert menu - to use as a label
+ $tmp = new WT_Menu(strip_tags($menu->getLabel()), '');
+
+ // Insert the label into the submenu
+ $submenus = $menu->getSubmenus();
+ array_unshift($submenus, $tmp);
+ $menu->setSubmenus($submenus);
+
+ // Neutralise the top-level menu
+ $menu->setLabel('');
+ $menu->setLink('');
+ $menu->setOnclick('');
+
+ $html .= $menu->getMenuAsList();
+ }
+
+ return '<ul class="primary-menu">' . $html . '</ul>';
+ }
+
+ /** {@inheritdoc} */
+ protected function stylesheets() {
+ return array(
+ 'themes/colors/jquery-ui-1.11.2/jquery-ui.css',
+ $this->cssUrl() . 'style.css',
+ $this->cssUrl() . 'palette/' . $this->sub_color . '.css',
+ );
+ }
+
+ /** {@inheritdoc} */
+ public function themeId() {
+ return 'colors';
+ }
+
+ /** {@inheritdoc} */
+ public function themeName() {
+ return /* I18N: Name of a theme. */ WT_I18N::translate('colors');
+ }
+}
diff --git a/library/WT/Theme/Fab.php b/library/WT/Theme/Fab.php
new file mode 100644
index 0000000000..81164d5397
--- /dev/null
+++ b/library/WT/Theme/Fab.php
@@ -0,0 +1,134 @@
+<?php
+// webtrees: Web based Family History software
+// Copyright (C) 2015 webtrees development team.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+namespace WT\Theme;
+
+use WT_I18N;
+use WT_Menu;
+
+/**
+ * Class Fab - The F.A.B. theme.
+ */
+class Fab extends BaseTheme {
+ /** {@inheritdoc} */
+ public function cssUrl() {
+ return 'themes/fab/css-1.6.2/';
+ }
+
+ /** {@inheritdoc} */
+ protected function favicon() {
+ return '<link rel="icon" href="' . $this->cssUrl() . 'favicon.png" type="image/png">';
+ }
+
+ /** {@inheritdoc} */
+ protected function flashMessageContainer(\stdClass $message) {
+ // This theme uses jQuery markup.
+ return '<p class="ui-state-highlight">' . $message->text . '</p>';
+ }
+
+ /** {@inheritdoc} */
+ protected function formatSecondaryMenu() {
+ return
+ '<ul class="secondary-menu">' .
+ implode('', $this->secondaryMenu()) .
+ '<li>' .
+ $this->formQuickSearch() .
+ '</li>' .
+ '</ul>';
+ }
+ /** {@inheritdoc} */
+ protected function headerContent() {
+ return
+ $this->formatTreeTitle() .
+ $this->formatSecondaryMenu();
+ }
+
+ /** {@inheritdoc} */
+ protected function logoPoweredBy() {
+ return
+ '<a style="font-size:150%; color:#888;" href="' . WT_WEBTREES_URL . '" title="' . WT_WEBTREES . ' - ' . WT_VERSION . '">' .
+ WT_WEBTREES .
+ '</a>';
+ }
+
+ /** {@inheritdoc} */
+ protected function formatUserMenuItem(WT_Menu $menu) {
+ return $menu->getMenuAsList();
+ }
+
+ /** {@inheritdoc} */
+ protected function formQuickSearchFields() {
+ return
+ '<input type="search" name="query" size="20" placeholder="' . WT_I18N::translate('Search') . '">';
+ }
+
+ /** {@inheritdoc} */
+ public function hookFooterExtraJavascript() {
+ return
+ '<script src="' . WT_JQUERY_COLORBOX_URL . '"></script>' .
+ '<script src="' . WT_JQUERY_WHEELZOOM_URL . '"></script>' .
+ '<script>' .
+ 'activate_colorbox();' .
+ 'jQuery.extend(jQuery.colorbox.settings, {' .
+ ' width: "85%",' .
+ ' height: "85%",' .
+ ' transition: "none",' .
+ ' slideshowStart: "' . WT_I18N::translate('Play') . '",' .
+ ' slideshowStop: "' . WT_I18N::translate('Stop') . '",' .
+ ' title: function() { return jQuery(this).data("title"); }' .
+ '});' .
+ '</script>';
+ }
+
+ /** {@inheritdoc} */
+ public function parameter($parameter_name) {
+ $parameters = array(
+ 'chart-background-f' => 'e9daf1',
+ 'chart-background-m' => 'b1cff0',
+ 'chart-box-x' => 260,
+ 'chart-descendancy-box-x' => 290,
+ 'chart-spacing-x' => 0,
+ 'distribution-chart-high-values' => '9ca3d4',
+ 'distribution-chart-low-values' => 'e5e6ef',
+ );
+
+ if (array_key_exists($parameter_name, $parameters)) {
+ return $parameters[$parameter_name];
+ } else {
+ return parent::parameter($parameter_name);
+ }
+ }
+
+ /** {@inheritdoc} */
+ protected function stylesheets() {
+ return array(
+ 'themes/fab/jquery-ui-1.11.2/jquery-ui.css',
+ $this->cssUrl() . 'style.css',
+ );
+ }
+
+ /** {@inheritdoc} */
+ public function themeId() {
+ return 'fab';
+ }
+
+ /** {@inheritdoc} */
+ public function themeName() {
+ return /* I18N: Name of a theme. */ WT_I18N::translate('F.A.B.');
+ }
+}
diff --git a/library/WT/Theme/Minimal.php b/library/WT/Theme/Minimal.php
new file mode 100644
index 0000000000..fc01216bf8
--- /dev/null
+++ b/library/WT/Theme/Minimal.php
@@ -0,0 +1,123 @@
+<?php
+// webtrees: Web based Family History software
+// Copyright (C) 2015 webtrees development team.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+namespace WT\Theme;
+
+use WT_I18N;
+
+/**
+ * Class Minimal - The Minimal theme.
+ */
+class Minimal extends BaseTheme {
+ /** {@inheritdoc} */
+ public function cssUrl() {
+ return 'themes/minimal/css-1.6.2/';
+ }
+
+ /** {@inheritdoc} */
+ protected function favicon() {
+ return '<link rel="icon" href="' . $this->cssUrl() . 'favicon.png" type="image/png">';
+ }
+
+ /** {@inheritdoc} */
+ protected function flashMessageContainer(\stdClass $message) {
+ // This theme uses jQuery markup.
+ return '<p class="ui-state-highlight">' . $message->text . '</p>';
+ }
+
+ /** {@inheritdoc} */
+ protected function formQuickSearchFields() {
+ return
+ '<input type="search" name="query" size="20" placeholder="' . WT_I18N::translate('Search') . '">';
+ }
+
+ /** {@inheritdoc} */
+ protected function formatSecondaryMenu() {
+ return
+ '<ul class="secondary-menu">' .
+ implode('', $this->secondaryMenu()) .
+ '<li>' .
+ $this->formQuickSearch() .
+ '</li>' .
+ '</ul>';
+ }
+ /** {@inheritdoc} */
+ protected function headerContent() {
+ return
+ $this->formatTreeTitle() .
+ $this->formatSecondaryMenu();
+ }
+
+ /** {@inheritdoc} */
+ protected function logoPoweredBy() {
+ return '<p class="logo"><a href="' . WT_WEBTREES_URL . '" title="' . WT_WEBTREES . ' ' . WT_VERSION . '">' . WT_WEBTREES . '</a></p>';
+ }
+
+ /** {@inheritdoc} */
+ public function hookFooterExtraJavascript() {
+ return
+ '<script src="' . WT_JQUERY_COLORBOX_URL . '"></script>' .
+ '<script src="' . WT_JQUERY_WHEELZOOM_URL . '"></script>' .
+ '<script>' .
+ 'activate_colorbox();' .
+ 'jQuery.extend(jQuery.colorbox.settings, {' .
+ ' width: "85%",' .
+ ' height: "85%",' .
+ ' transition: "none",' .
+ ' slideshowStart: "' . WT_I18N::translate('Play') . '",' .
+ ' slideshowStop: "' . WT_I18N::translate('Stop') . '"' .
+ ' title: function() { return jQuery(this).data("title"); }' .
+ '});' .
+ '</script>';
+ }
+
+ /** {@inheritdoc} */
+ public function parameter($parameter_name) {
+ $parameters = array(
+ 'chart-background-f' => 'dddddd',
+ 'chart-background-m' => 'cccccc',
+ 'chart-spacing-x' => 0,
+ 'distribution-chart-low-values' => 'cccccc',
+ 'distribution-chart-no-values' => 'ffffff',
+ );
+
+ if (array_key_exists($parameter_name, $parameters)) {
+ return $parameters[$parameter_name];
+ } else {
+ return parent::parameter($parameter_name);
+ }
+ }
+
+ /** {@inheritdoc} */
+ protected function stylesheets() {
+ return array(
+ 'themes/minimal/jquery-ui-1.11.2/jquery-ui.css',
+ $this->cssUrl() . 'style.css',
+ );
+ }
+
+ /** {@inheritdoc} */
+ public function themeId() {
+ return 'minimal';
+ }
+
+ /** {@inheritdoc} */
+ public function themeName() {
+ return /* I18N: Name of a theme. */ WT_I18N::translate('minimal');
+ }
+}
diff --git a/library/WT/Theme/Webtrees.php b/library/WT/Theme/Webtrees.php
new file mode 100644
index 0000000000..5be1df2264
--- /dev/null
+++ b/library/WT/Theme/Webtrees.php
@@ -0,0 +1,103 @@
+<?php
+// webtrees: Web based Family History software
+// Copyright (C) 2015 webtrees development team.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+namespace WT\Theme;
+
+use WT\Theme;
+use WT_I18N;
+
+/**
+ * Class Webtrees - The webtrees (default) theme.
+ */
+class Webtrees extends BaseTheme {
+ /** {@inheritdoc} */
+ public function cssUrl() {
+ return 'themes/webtrees/css-1.6.2/';
+ }
+
+ /** {@inheritdoc} */
+ protected function favicon() {
+ return '<link rel="icon" href="' . $this->cssUrl() . 'favicon.png" type="image/png">';
+ }
+
+ /** {@inheritdoc} */
+ protected function flashMessageContainer(\stdClass $message) {
+ // This theme uses jQuery markup.
+ return '<p class="ui-state-highlight">' . $message->text . '</p>';
+ }
+
+ /** {@inheritdoc} */
+ protected function formQuickSearchFields() {
+ return
+ '<input type="search" name="query" size="25" placeholder="' . WT_I18N::translate('Search') . '">' .
+ '<input type="image" class="image" src="' . Theme::theme()->parameter('image-search') . '" alt="' . WT_I18N::translate('Search') . '" title="' . WT_I18N::translate('Search') . '">';
+ }
+
+ /** {@inheritdoc} */
+ public function hookFooterExtraJavascript() {
+ return
+ '<script src="' . WT_JQUERY_COLORBOX_URL . '"></script>' .
+ '<script src="' . WT_JQUERY_WHEELZOOM_URL . '"></script>' .
+ '<script>' .
+ 'activate_colorbox();' .
+ 'jQuery.extend(jQuery.colorbox.settings, {' .
+ ' width:"85%",' .
+ ' height:"85%",' .
+ ' transition:"none",' .
+ ' slideshowStart:"' . WT_I18N::translate('Play') . '",' .
+ ' slideshowStop:"' . WT_I18N::translate('Stop') . '",' .
+ ' title: function() { return jQuery(this).data("title"); }' .
+ '});' .
+ '</script>';
+ }
+
+ /** {@inheritdoc} */
+ public function parameter($parameter_name) {
+ $parameters = array(
+ 'chart-background-f' => 'e9daf1',
+ 'chart-background-m' => 'b1cff0',
+ 'distribution-chart-high-values' => '84beff',
+ 'distribution-chart-low-values' => 'c3dfff',
+ 'image-search' => $this->cssUrl() . 'images/search.png',
+ );
+
+ if (array_key_exists($parameter_name, $parameters)) {
+ return $parameters[$parameter_name];
+ } else {
+ return parent::parameter($parameter_name);
+ }
+ }
+
+ /** {@inheritdoc} */
+ protected function stylesheets() {
+ return array(
+ 'themes/webtrees/jquery-ui-1.11.2/jquery-ui.css',
+ $this->cssUrl() . 'style.css',
+ );
+ }
+
+ /** {@inheritdoc} */
+ public function themeId() {
+ return 'webtrees';
+ }
+
+ /** {@inheritdoc} */
+ public function themeName() {
+ return WT_I18N::translate('webtrees');
+ }
+}
diff --git a/library/WT/Theme/Xenea.php b/library/WT/Theme/Xenea.php
new file mode 100644
index 0000000000..bc1565c41f
--- /dev/null
+++ b/library/WT/Theme/Xenea.php
@@ -0,0 +1,113 @@
+<?php
+// webtrees: Web based Family History software
+// Copyright (C) 2015 webtrees development team.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+namespace WT\Theme;
+
+use WT_I18N;
+
+/**
+ * Class Xenea - The xenea theme.
+ */
+class Xenea extends BaseTheme {
+ /** {@inheritdoc} */
+ public function cssUrl() {
+ return 'themes/xenea/css-1.6.2/';
+ }
+
+ /** {@inheritdoc} */
+ protected function favicon() {
+ return '<link rel="icon" href="' . $this->cssUrl() . 'favicon.png" type="image/png">';
+ }
+
+ /** {@inheritdoc} */
+ protected function flashMessageContainer(\stdClass $message) {
+ // This theme uses jQuery markup.
+ return '<p class="ui-state-highlight">' . $message->text . '</p>';
+ }
+
+ /** {@inheritdoc} */
+ protected function formQuickSearchFields() {
+ return
+ '<input type="search" name="query" size="12" placeholder="' . WT_I18N::translate('Search') . '">' .
+ '<input type="submit" name="search" value="&gt;">';
+ }
+
+ /** {@inheritdoc} */
+ protected function headerContent() {
+ return
+ '<div class="header-upper">' .
+ $this->formatTreeTitle() .
+ $this->formQuickSearch() .
+ '</div>' .
+ '<div class="header-lower">' .
+ $this->formatSecondaryMenu() .
+ '</div>';
+ }
+
+ /** {@inheritdoc} */
+ public function hookFooterExtraJavascript() {
+ return
+ '<script src="' . WT_JQUERY_COLORBOX_URL . '"></script>' .
+ '<script src="' . WT_JQUERY_WHEELZOOM_URL . '"></script>' .
+ '<script>' .
+ 'activate_colorbox();' .
+ 'jQuery.extend(jQuery.colorbox.settings, {' .
+ ' width: "85%",' .
+ ' height: "85%",' .
+ ' transition: "none",' .
+ ' slideshowStart: "' . WT_I18N::translate('Play') . '",' .
+ ' slideshowStop: "' . WT_I18N::translate('Stop') . '",' .
+ ' title: function() { return jQuery(this).data("title"); }' .
+ '});' .
+ '</script>';
+ }
+
+ /** {@inheritdoc} */
+ public function parameter($parameter_name) {
+ $parameters = array(
+ 'chart-background-f' => 'e9daf1',
+ 'chart-background-m' => 'b1cff0',
+ 'distribution-chart-high-values' => '84beff',
+ 'distribution-chart-low-values' => 'c3dfff',
+ );
+
+ if (array_key_exists($parameter_name, $parameters)) {
+ return $parameters[$parameter_name];
+ } else {
+ return parent::parameter($parameter_name);
+ }
+ }
+
+ /** {@inheritdoc} */
+ protected function stylesheets() {
+ return array(
+ 'themes/xenea/jquery-ui-1.11.2/jquery-ui.css',
+ $this->cssUrl() . 'style.css',
+ );
+ }
+
+ /** {@inheritdoc} */
+ public function themeId() {
+ return 'xenea';
+ }
+
+ /** {@inheritdoc} */
+ public function themeName() {
+ return /* I18N: Name of a theme. */ WT_I18N::translate('xenea');
+ }
+}
diff --git a/library/WT/User.php b/library/WT/User.php
index 51d91e1cbf..a605a15db1 100644
--- a/library/WT/User.php
+++ b/library/WT/User.php
@@ -8,7 +8,7 @@ use WT_Tree;
/**
* Class User - Provide an interface to the wt_user table.
*
- * @copyright (c) 2014 webtrees development team
+ * @copyright (c) 2015 webtrees development team
* @license This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
@@ -203,6 +203,29 @@ class User {
}
/**
+ * Get a list of all verified uses.
+ *
+ * @return User[]
+ */
+ public static function allVerified() {
+ $rows = WT_DB::prepare(
+ "SELECT SQL_CACHE user_id, user_name, real_name, email" .
+ " FROM `##user`" .
+ " JOIN `##user_setting` USING (user_id)" .
+ " WHERE user_id > 0" .
+ " AND setting_name = 'verified'" .
+ " AND setting_value = '1'"
+ )->fetchAll();
+
+ $users = array();
+ foreach ($rows as $row) {
+ $users[] = new User($row);
+ }
+
+ return $users;
+ }
+
+ /**
* Get a list of all users who are currently logged in.
*
* @return User[]
diff --git a/library/composer/autoload_classmap.php b/library/composer/autoload_classmap.php
index 11487797e5..d2f0b9b22a 100644
--- a/library/composer/autoload_classmap.php
+++ b/library/composer/autoload_classmap.php
@@ -16,6 +16,14 @@ return array(
'Fisharebest\\ExtCalendar\\JulianCalendar' => $vendorDir . '/fisharebest/ext-calendar/src/JulianCalendar.php',
'Fisharebest\\ExtCalendar\\PersianCalendar' => $vendorDir . '/fisharebest/ext-calendar/src/PersianCalendar.php',
'Fisharebest\\ExtCalendar\\Shim' => $vendorDir . '/fisharebest/ext-calendar/src/Shim.php',
+ 'WT\\Theme\\Administration' => $vendorDir . '/WT/Theme/Administration.php',
+ 'WT\\Theme\\BaseTheme' => $vendorDir . '/WT/Theme/BaseTheme.php',
+ 'WT\\Theme\\Clouds' => $vendorDir . '/WT/Theme/Clouds.php',
+ 'WT\\Theme\\Colors' => $vendorDir . '/WT/Theme/Colors.php',
+ 'WT\\Theme\\Fab' => $vendorDir . '/WT/Theme/Fab.php',
+ 'WT\\Theme\\Minimal' => $vendorDir . '/WT/Theme/Minimal.php',
+ 'WT\\Theme\\Webtrees' => $vendorDir . '/WT/Theme/Webtrees.php',
+ 'WT\\Theme\\Xenea' => $vendorDir . '/WT/Theme/Xenea.php',
'HTMLPurifier' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.php',
'HTMLPurifier_Arborize' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php',
'HTMLPurifier_AttrCollections' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php',
@@ -282,6 +290,7 @@ return array(
'TCPDF_STATIC' => $vendorDir . '/tecnick.com/tcpdf/include/tcpdf_static.php',
'WT\\Auth' => $vendorDir . '/WT/Auth.php',
'WT\\Log' => $vendorDir . '/WT/Log.php',
+ 'WT\\Theme' => $vendorDir . '/WT/Theme.php',
'WT\\User' => $vendorDir . '/WT/User.php',
'WT_Controller_AdvancedSearch' => $vendorDir . '/WT/Controller/AdvancedSearch.php',
'WT_Controller_Ajax' => $vendorDir . '/WT/Controller/Ajax.php',
@@ -337,7 +346,6 @@ return array(
'WT_Mail' => $vendorDir . '/WT/Mail.php',
'WT_Media' => $vendorDir . '/WT/Media.php',
'WT_Menu' => $vendorDir . '/WT/Menu.php',
- 'WT_MenuBar' => $vendorDir . '/WT/MenuBar.php',
'WT_Module' => $vendorDir . '/WT/Module.php',
'WT_Module_Block' => $vendorDir . '/WT/Module/Block.php',
'WT_Module_Chart' => $vendorDir . '/WT/Module/Chart.php',
diff --git a/medialist.php b/medialist.php
index e173fba615..1bf7bfb2cc 100644
--- a/medialist.php
+++ b/medialist.php
@@ -116,7 +116,9 @@ $medialist = WT_Query_Media::mediaList(
<?php
foreach (array('10', '20', '30', '40', '50', '75', '100', '125', '150', '200') as $selectEntry) {
echo '<option value="', $selectEntry, '"';
- if ($selectEntry==$max) echo ' selected="selected"';
+ if ($selectEntry == $max) {
+ echo ' selected="selected"';
+ }
echo '>', $selectEntry, '</option>';
}
?>
@@ -138,7 +140,9 @@ $medialist = WT_Query_Media::mediaList(
<?php
foreach (array('1', '2') as $selectEntry) {
echo '<option value="', $selectEntry, '"';
- if ($selectEntry==$columns) echo ' selected="selected"';
+ if ($selectEntry == $columns) {
+ echo ' selected="selected"';
+ }
echo '>', $selectEntry, '</option>';
}
?>
@@ -178,14 +182,16 @@ if ($search) {
echo '<', $tsection, '><tr><td colspan="2">';
echo '<table class="list_table_controls"><tr><td>';
- if ($TEXT_DIRECTION=='ltr') {
+ if ($TEXT_DIRECTION === 'ltr') {
if ($ct>$max) {
if ($currentPage > 1) {
echo '<a href="medialist.php?action=no&amp;search=no&amp;folder=', rawurlencode($folder), '&amp;sortby=', $sortby, '&amp;subdirs=', $subdirs, '&amp;filter=', rawurlencode($filter), '&amp;columns=', $columns, '&amp;apply_filter=', $apply_filter, '&amp;start=0&amp;max=', $max, '" class="icon-ldarrow"></a>';
}
- if ($start>0) {
+ if ($start > 0) {
$newstart = $start-$max;
- if ($start<0) $start = 0;
+ if ($start < 0) {
+ $start = 0;
+ }
echo '<a href="medialist.php?action=no&amp;search=no&amp;folder=', rawurlencode($folder), '&amp;sortby=', $sortby, '&amp;subdirs=', $subdirs, '&amp;filter=', rawurlencode($filter), '&amp;;columns=', $columns, '&amp;apply_filter=', $apply_filter, '&amp;start=', $newstart, '&amp;max=', $max, '" class="icon-larrow"></a>';
}
}
@@ -195,9 +201,11 @@ if ($search) {
$lastStart = ((int) ($ct / $max)) * $max;
echo '<a href="medialist.php?action=no&amp;search=no&amp;folder=', rawurlencode($folder), '&amp;sortby=', $sortby, '&amp;subdirs=', $subdirs, '&amp;filter=', rawurlencode($filter), '&amp;columns=', $columns, '&amp;apply_filter=', $apply_filter, '&amp;start=', $lastStart, '&amp;max=', $max, '" class="icon-rdarrow"></a>';
}
- if ($start+$max < $ct) {
+ if ($start + $max < $ct) {
$newstart = $start+$count;
- if ($start<0) $start = 0;
+ if ($start < 0) {
+ $start = 0;
+ }
echo '<a href="medialist.php?action=no&amp;search=no&amp;folder=', rawurlencode($folder), '&amp;sortby=', $sortby, '&amp;subdirs=', $subdirs, '&amp;filter=', rawurlencode($filter), '&amp;columns=', $columns, '&amp;apply_filter=', $apply_filter, '&amp;start=', $newstart, '&amp;max=', $max, '" class="icon-rarrow"></a>';
}
}
@@ -205,11 +213,13 @@ if ($search) {
echo '</td>';
echo '<td>', WT_I18N::translate('Page %s of %s', $currentPage, $lastPage), '</td>';
echo '<td>';
- if ($TEXT_DIRECTION=='ltr') {
+ if ($TEXT_DIRECTION === 'ltr') {
if ($ct>$max) {
- if ($start+$max < $ct) {
- $newstart = $start+$count;
- if ($start<0) $start = 0;
+ if ($start + $max < $ct) {
+ $newstart = $start + $count;
+ if ($start < 0) {
+ $start = 0;
+ }
echo '<a href="medialist.php?action=no&amp;search=no&amp;folder=', rawurlencode($folder), '&amp;sortby=', $sortby, '&amp;subdirs=', $subdirs, '&amp;filter=', rawurlencode($filter), '&amp;columns=', $columns, '&amp;apply_filter=', $apply_filter, '&amp;start=', $newstart, '&amp;max=', $max, '" class="icon-rarrow"></a>';
}
if ($currentPage < $lastPage) {
@@ -218,10 +228,12 @@ if ($search) {
}
}
} else {
- if ($ct>$max) {
- if ($start>0) {
- $newstart = $start-$max;
- if ($start<0) $start = 0;
+ if ($ct > $max) {
+ if ($start > 0) {
+ $newstart = $start - $max;
+ if ($start < 0) {
+ $start = 0;
+ }
echo '<a href="medialist.php?action=no&amp;search=no&amp;folder=', rawurlencode($folder), '&amp;sortby=', $sortby, '&amp;subdirs=', $subdirs, '&amp;filter=', rawurlencode($filter), '&amp;columns=', $columns, '&amp;apply_filter=', $apply_filter, '&amp;start=', $newstart, '&amp;max=', $max, '" class="icon-larrow"></a>';
}
if ($currentPage > 1) {
@@ -239,8 +251,12 @@ if ($search) {
for ($i=$start, $n=0; $i<$start+$count; ++$i) {
$mediaobject = $medialist[$i];
- if ($columns == '1') echo '<td class="list_value_wrap width80">';
- if ($columns == '2') echo '<td class="list_value_wrap width50">';
+ if ($columns == '1') {
+ echo '<td class="list_value_wrap width80">';
+ }
+ if ($columns == '2') {
+ echo '<td class="list_value_wrap width50">';
+ }
echo '<table><tr><td style="vertical-align:top; white-space:normal;">';
echo $mediaobject->displayImage();
diff --git a/modules_v3/GEDFact_assistant/_MEDIA/media_0_inverselink.php b/modules_v3/GEDFact_assistant/_MEDIA/media_0_inverselink.php
index 3e5cbf3512..ae7f23ea3f 100644
--- a/modules_v3/GEDFact_assistant/_MEDIA/media_0_inverselink.php
+++ b/modules_v3/GEDFact_assistant/_MEDIA/media_0_inverselink.php
@@ -4,7 +4,7 @@
// Media Link information about an individual
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team.
@@ -169,11 +169,7 @@ if ($action == 'choose' && $paramok) {
echo '<input type="text" data-autocomplete-type="IFS" name="gid" id="gid" size="6" value="">';
echo '</td><td style="padding-bottom: 2px; vertical-align: middle;">';
echo '&nbsp;';
- if (isset($WT_IMAGES["add"])) {
- echo '<img style="border-style:none;" src="', $WT_IMAGES["add"], '" alt="', WT_I18N::translate('Add'), ' " title="', WT_I18N::translate('Add'), '" align="middle" name="addLink" value="" onclick="blankwin(); return false;">';
- } else {
- echo '<button name="addLink" value="" type="button" onclick="blankwin(); return false;">', WT_I18N::translate('Add'), '</button>';
- }
+ echo '<img style="border-style:none;" src="', Theme::theme()->parameter('add'), '" alt="', WT_I18N::translate('Add'), ' " title="', WT_I18N::translate('Add'), '" align="middle" name="addLink" value="" onclick="blankwin(); return false;">';
echo ' ', print_findindi_link('gid');
echo ' ', print_findfamily_link('gid');
echo ' ', print_findsource_link('gid');
@@ -209,8 +205,8 @@ if ($action == 'choose' && $paramok) {
var ifamily = "<?php echo WT_I18N::translate('Family navigator'); ?>";
var remove = "<?php echo WT_I18N::translate('Remove'); ?>";
/* ===icons === */
- var removeLinkIcon = "<?php echo $WT_IMAGES['remove']; ?>";
- var familyNavIcon = "<?php echo $WT_IMAGES['button_family']; ?>";
+ var removeLinkIcon = "<?php echo Theme::theme()->parameter('remove'); ?>";
+ var familyNavIcon = "<?php echo Theme::theme()->parameter('button_family'); ?>";
var INPUT_NAME_PREFIX = 'InputCell_'; // this is being set via script
diff --git a/modules_v3/batch_update/admin_batch_update.php b/modules_v3/batch_update/admin_batch_update.php
index f7cb3b5ac0..8a7caa8aa3 100644
--- a/modules_v3/batch_update/admin_batch_update.php
+++ b/modules_v3/batch_update/admin_batch_update.php
@@ -77,8 +77,9 @@ class batch_update {
}
$html.='</td></tr>';
- if (!Auth::user()->getPreference('auto_accept'))
+ if (!Auth::user()->getPreference('auto_accept')) {
$html.='<tr><td colspan="2" class="warning">'.WT_I18N::translate('Your user account does not have “automatically approve changes” enabled. You will only be able to change one record at a time.').'</td></tr>';
+ }
// If a plugin is selected, display the details
if ($this->PLUGIN) {
diff --git a/modules_v3/charts/module.php b/modules_v3/charts/module.php
index cd74732edb..346841457e 100644
--- a/modules_v3/charts/module.php
+++ b/modules_v3/charts/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class charts_WT_Module
@@ -151,7 +152,7 @@ class charts_WT_Module extends WT_Module implements WT_Module_Block {
$PEDIGREE_FULL_DETAILS = $savePedigreeFullDetails;
if ($template) {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/families/module.php b/modules_v3/families/module.php
index 2b1487527a..128c7f7830 100644
--- a/modules_v3/families/module.php
+++ b/modules_v3/families/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -19,6 +19,8 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
+
/**
* Class families_WT_Module
*/
@@ -79,7 +81,7 @@ class families_WT_Module extends WT_Module implements WT_Module_Sidebar {
/** {@inheritdoc} */
public function getSidebarContent() {
- global $WT_IMAGES, $UNKNOWN_NN, $controller;
+ global $UNKNOWN_NN, $controller;
// Fetch a list of the initial letters of all surnames in the database
$initials = WT_Query_Name::surnameAlpha(true, false, WT_GED_ID, false);
@@ -114,7 +116,7 @@ class families_WT_Module extends WT_Module implements WT_Module_Sidebar {
success: function(html) {
jQuery("#sb_fam_"+surname+" div").html(html);
jQuery("#sb_fam_"+surname+" div").show();
- jQuery("#sb_fam_"+surname).css("list-style-image", "url('.$WT_IMAGES['minus'].')");
+ jQuery("#sb_fam_"+surname).css("list-style-image", "url(' . Theme::theme()->parameter('image-minus') . ')");
famloadedNames[surname]=2;
}
});
@@ -122,12 +124,12 @@ class families_WT_Module extends WT_Module implements WT_Module_Sidebar {
else if (famloadedNames[surname]==1) {
famloadedNames[surname]=2;
jQuery("#sb_fam_"+surname+" div").show();
- jQuery("#sb_fam_"+surname).css("list-style-image", "url('.$WT_IMAGES['minus'].')");
+ jQuery("#sb_fam_"+surname).css("list-style-image", "url(' . Theme::theme()->parameter('image-minus') . ')");
}
else {
famloadedNames[surname]=1;
jQuery("#sb_fam_"+surname+" div").hide();
- jQuery("#sb_fam_"+surname).css("list-style-image", "url('.$WT_IMAGES['plus'].')");
+ jQuery("#sb_fam_"+surname).css("list-style-image", "url(' . Theme::theme()->parameter('image-plus') . ')");
}
return false;
});
diff --git a/modules_v3/gedcom_block/module.php b/modules_v3/gedcom_block/module.php
index 309bea0c62..77f2fe9b31 100644
--- a/modules_v3/gedcom_block/module.php
+++ b/modules_v3/gedcom_block/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class gedcom_block_WT_Module
@@ -53,7 +54,7 @@ class gedcom_block_WT_Module extends WT_Module implements WT_Module_Block {
$content .= "</table>";
if ($template) {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/gedcom_favorites/module.php b/modules_v3/gedcom_favorites/module.php
index a984f6a047..04d418ed0b 100644
--- a/modules_v3/gedcom_favorites/module.php
+++ b/modules_v3/gedcom_favorites/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -21,6 +21,7 @@
use Rhumsaa\Uuid\Uuid;
use WT\Auth;
+use WT\Theme;
/**
* Class gedcom_favorites_WT_Module
@@ -96,7 +97,9 @@ class gedcom_favorites_WT_Module extends WT_Module implements WT_Module_Block {
}
// Override GEDCOM configuration temporarily
- if (isset($show_full)) $saveShowFull = $show_full;
+ if (isset($show_full)) {
+ $saveShowFull = $show_full;
+ }
$savePedigreeFullDetails = $PEDIGREE_FULL_DETAILS;
$show_full = 1;
$PEDIGREE_FULL_DETAILS = 1;
@@ -117,14 +120,17 @@ class gedcom_favorites_WT_Module extends WT_Module implements WT_Module_Block {
}
$content = '';
- $style = 2; // 1 means "regular box", 2 means "wide box"
if ($userfavs) {
foreach ($userfavs as $key=>$favorite) {
- if (isset($favorite['id'])) $key=$favorite['id'];
+ if (isset($favorite['id'])) {
+ $key=$favorite['id'];
+ }
$removeFavourite = '<a class="font9" href="index.php?ctype='.$ctype.'&amp;action=deletefav&amp;favorite_id='.$key.'" onclick="return confirm(\''.WT_I18N::translate('Are you sure you want to remove this item from your list of favorites?').'\');">'.WT_I18N::translate('Remove').'</a> ';
if ($favorite['type']=='URL') {
$content .= '<div id="boxurl'.$key.'.0" class="person_box">';
- if ($ctype=='user' || WT_USER_GEDCOM_ADMIN) $content .= $removeFavourite;
+ if ($ctype=='user' || WT_USER_GEDCOM_ADMIN) {
+ $content .= $removeFavourite;
+ }
$content .= '<a href="'.$favorite['url'].'"><b>'.$favorite['title'].'</b></a>';
$content .= '<br>'.$favorite['note'];
$content .= '</div>';
@@ -144,10 +150,10 @@ class gedcom_favorites_WT_Module extends WT_Module implements WT_Module_Block {
break;
}
$content .= '">';
- if ($ctype=="user" || WT_USER_GEDCOM_ADMIN) $content .= $removeFavourite;
- ob_start();
- print_pedigree_person($record, $style);
- $content .= ob_get_clean();
+ if ($ctype=="user" || WT_USER_GEDCOM_ADMIN) {
+ $content .= $removeFavourite;
+ }
+ $content .= Theme::theme()->individualBoxLarge($record);
$content .= $favorite['note'];
$content .= '</div>';
} else {
@@ -204,10 +210,9 @@ class gedcom_favorites_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR.'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/gedcom_news/module.php b/modules_v3/gedcom_news/module.php
index 313f4a6389..a7626a4a88 100644
--- a/modules_v3/gedcom_news/module.php
+++ b/modules_v3/gedcom_news/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
// Create tables, if not already present
try {
@@ -131,7 +132,7 @@ class gedcom_news_WT_Module extends WT_Module implements WT_Module_Block {
}
if ($template) {
- require WT_THEME_DIR . 'templates/block_main_temp.php';
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/gedcom_stats/module.php b/modules_v3/gedcom_stats/module.php
index daa7ba6357..ff248c2731 100644
--- a/modules_v3/gedcom_stats/module.php
+++ b/modules_v3/gedcom_stats/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class gedcom_stats_WT_Module
@@ -204,7 +205,7 @@ class gedcom_stats_WT_Module extends WT_Module implements WT_Module_Block {
}
if ($template) {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/googlemap/module.php b/modules_v3/googlemap/module.php
index 70b9d90966..9551f4749d 100644
--- a/modules_v3/googlemap/module.php
+++ b/modules_v3/googlemap/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -21,6 +21,7 @@
use WT\Auth;
use WT\Log;
+use WT\Theme;
/**
* Class googlemap_WT_Module
@@ -146,7 +147,7 @@ class googlemap_WT_Module extends WT_Module implements WT_Module_Config, WT_Modu
/** {@inheritdoc} */
public function getTabContent() {
- global $WT_IMAGES, $controller;
+ global $controller;
if ($this->checkMapData()) {
ob_start();
@@ -192,7 +193,7 @@ class googlemap_WT_Module extends WT_Module implements WT_Module_Config, WT_Modu
echo '</td>';
echo '</tr></table>';
// start
- echo '<img src="', $WT_IMAGES['spacer'], '" id="marker6" width="1" height="1" alt="">';
+ echo '<img src="', Theme::theme()->parameter('image-spacer'), '" id="marker6" width="1" height="1" alt="">';
// end
echo '</td></tr></table>';
echo '<script>loadMap();</script>';
@@ -1933,7 +1934,7 @@ class googlemap_WT_Module extends WT_Module implements WT_Module_Config, WT_Modu
'class' => 'optionbox',
'date' => $fact->getDate()->display(true),
'fact_label' => $fact->getLabel(),
- 'image' => $spouse ? $spouse->displayImage() : $fact->icon(),
+ 'image' => $spouse ? $spouse->displayImage() : Theme::theme()->icon($fact),
'info' => $fact->getValue(),
'lat' => str_replace(array('N', 'S', ','), array('', '-', '.') , $match1[1]),
'lng' => str_replace(array('E', 'W', ','), array('', '-', '.') , $match2[1]),
@@ -1955,7 +1956,7 @@ class googlemap_WT_Module extends WT_Module implements WT_Module_Config, WT_Modu
'class' => 'optionbox',
'date' => $fact->getDate()->display(true),
'fact_label' => $fact->getLabel(),
- 'image' => $spouse ? $spouse->displayImage() : $fact->icon(),
+ 'image' => $spouse ? $spouse->displayImage() : Theme::theme()->icon($fact),
'info' => $fact->getValue(),
'lat' => str_replace(array('N', 'S', ','), array('', '-', '.'), $latlongval->pl_lati),
'lng' => str_replace(array('E', 'W', ','), array('', '-', '.'), $latlongval->pl_long),
diff --git a/modules_v3/html/module.php b/modules_v3/html/module.php
index 6e4ddd2efd..292caec0bc 100644
--- a/modules_v3/html/module.php
+++ b/modules_v3/html/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class html_WT_Module
@@ -105,10 +106,9 @@ class html_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if (get_block_setting($block_id, 'block', false)) {
- require WT_THEME_DIR.'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/lightbox/module.php b/modules_v3/lightbox/module.php
index 5c49174ff9..811bacea4c 100644
--- a/modules_v3/lightbox/module.php
+++ b/modules_v3/lightbox/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class lightbox_WT_Module
@@ -64,19 +65,19 @@ class lightbox_WT_Module extends WT_Module implements WT_Module_Tab {
// Add a new media object
if ($WT_TREE->getPreference('MEDIA_UPLOAD') >= WT_USER_ACCESS_LEVEL) {
$html .= '<span><a href="#" onclick="window.open(\'addmedia.php?action=showmediaform&linktoid='.$controller->record->getXref().'\', \'_blank\', \'resizable=1,scrollbars=1,top=50,height=780,width=600\');return false;">';
- $html .= '<img src="'.WT_CSS_URL.'images/image_add.png" id="head_icon" class="icon" title="'.WT_I18N::translate('Add a new media object').'" alt="'.WT_I18N::translate('Add a new media object').'">';
+ $html .= '<img src="' . Theme::theme()->cssUrl() . 'images/image_add.png" id="head_icon" class="icon" title="'.WT_I18N::translate('Add a new media object').'" alt="'.WT_I18N::translate('Add a new media object').'">';
$html .= WT_I18N::translate('Add a new media object');
$html .= '</a></span>';
// Link to an existing item
$html .= '<span><a href="#" onclick="window.open(\'inverselink.php?linktoid='.$controller->record->getXref().'&linkto=person\', \'_blank\', \'resizable=1,scrollbars=1,top=50,height=300,width=450\');">';
- $html .= '<img src="'.WT_CSS_URL.'images/image_link.png" id="head_icon" class="icon" title="'.WT_I18N::translate('Link to an existing media object').'" alt="'.WT_I18N::translate('Link to an existing media object').'">';
+ $html .= '<img src="' . Theme::theme()->cssUrl() . 'images/image_link.png" id="head_icon" class="icon" title="'.WT_I18N::translate('Link to an existing media object').'" alt="'.WT_I18N::translate('Link to an existing media object').'">';
$html .= WT_I18N::translate('Link to an existing media object');
$html .= '</a></span>';
}
if (WT_USER_GEDCOM_ADMIN && $this->get_media()) {
// Popup Reorder Media
$html .= '<span><a href="#" onclick="reorder_media(\''.$controller->record->getXref().'\')">';
- $html .= '<img src="'.WT_CSS_URL.'images/images.png" id="head_icon" class="icon" title="'.WT_I18N::translate('Re-order media').'" alt="'.WT_I18N::translate('Re-order media').'">';
+ $html .= '<img src="' . Theme::theme()->cssUrl() . 'images/images.png" id="head_icon" class="icon" title="'.WT_I18N::translate('Re-order media').'" alt="'.WT_I18N::translate('Re-order media').'">';
$html .= WT_I18N::translate('Re-order media');
$html .= '</a></span>';
}
diff --git a/modules_v3/logged_in/module.php b/modules_v3/logged_in/module.php
index 3df59b1a48..3f9e8e35a3 100644
--- a/modules_v3/logged_in/module.php
+++ b/modules_v3/logged_in/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
use WT\User;
/**
@@ -81,7 +82,7 @@ class logged_in_WT_Module extends WT_Module implements WT_Module_Block {
}
if ($template) {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/login_block/module.php b/modules_v3/login_block/module.php
index fb8f4bf442..7e8fbddcfb 100644
--- a/modules_v3/login_block/module.php
+++ b/modules_v3/login_block/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class login_block_WT_Module
@@ -102,7 +103,7 @@ class login_block_WT_Module extends WT_Module implements WT_Module_Block {
}
if ($template) {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/random_media/module.php b/modules_v3/random_media/module.php
index 77256a6732..e71eb686a4 100644
--- a/modules_v3/random_media/module.php
+++ b/modules_v3/random_media/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class random_media_WT_Module
@@ -192,7 +193,7 @@ class random_media_WT_Module extends WT_Module implements WT_Module_Block {
$content = WT_I18N::translate('This family tree has no images to display.');
}
if ($template) {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ echo Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/recent_changes/module.php b/modules_v3/recent_changes/module.php
index bb051cadea..7be29001bc 100644
--- a/modules_v3/recent_changes/module.php
+++ b/modules_v3/recent_changes/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class recent_changes_WT_Module
@@ -91,10 +92,9 @@ class recent_changes_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR . 'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR . 'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/relatives/module.php b/modules_v3/relatives/module.php
index e5141fce4b..0ef826234b 100644
--- a/modules_v3/relatives/module.php
+++ b/modules_v3/relatives/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -18,6 +18,7 @@
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
/**
* Class relatives_WT_Module
@@ -121,7 +122,7 @@ class relatives_WT_Module extends WT_Module implements WT_Module_Tab {
<?php echo get_close_relationship_name($controller->record, $person); ?>
</td>
<td class="<?php echo $controller->getPersonStyle($person); ?>">
- <?php print_pedigree_person($person, 2); ?>
+ <?php echo Theme::theme()->individualBoxLarge($person); ?>
</td>
</tr>
<?php
@@ -155,7 +156,7 @@ class relatives_WT_Module extends WT_Module implements WT_Module_Tab {
<?php echo get_close_relationship_name($controller->record, $person); ?>
</td>
<td class="<?php echo $controller->getPersonStyle($person); ?>">
- <?php print_pedigree_person($person, 2); ?>
+ <?php echo Theme::theme()->individualBoxLarge($person); ?>
</td>
</tr>
<?php
@@ -240,7 +241,7 @@ class relatives_WT_Module extends WT_Module implements WT_Module_Tab {
<?php echo get_close_relationship_name($controller->record, $person); ?>
</td>
<td class="<?php echo $controller->getPersonStyle($person); ?>">
- <?php print_pedigree_person($person, 2); ?>
+ <?php echo Theme::theme()->individualBoxLarge($person); ?>
</td>
</tr>
<?php
diff --git a/modules_v3/review_changes/module.php b/modules_v3/review_changes/module.php
index 2a205a9fe3..a2a77771bc 100644
--- a/modules_v3/review_changes/module.php
+++ b/modules_v3/review_changes/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
use WT\User;
/**
@@ -119,10 +120,9 @@ class review_changes_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR.'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/theme_select/module.php b/modules_v3/theme_select/module.php
index f82c70fb9f..b83825a2d3 100644
--- a/modules_v3/theme_select/module.php
+++ b/modules_v3/theme_select/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -19,6 +19,8 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
+
/**
* Class theme_select_WT_Module
*/
@@ -35,15 +37,17 @@ class theme_select_WT_Module extends WT_Module implements WT_Module_Block {
/** {@inheritdoc} */
public function getBlock($block_id, $template=true, $cfg=null) {
+ /** @var \WT\Theme\BaseTheme */
$id=$this->getName().$block_id;
$class=$this->getName().'_block';
$title=$this->getTitle();
- $menu=WT_MenuBar::getThemeMenu();
+ $menu=Theme::theme()->menuThemes();
+
if ($menu) {
- $content='<div class="center theme_form">'.WT_MenuBar::getThemeMenu().'</div><br>';
+ $content='<div class="center theme_form">' . $menu . '</div><br>';
if ($template) {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/todays_events/module.php b/modules_v3/todays_events/module.php
index ade06ed20c..4eedfd385d 100644
--- a/modules_v3/todays_events/module.php
+++ b/modules_v3/todays_events/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class todays_events_WT_Module
@@ -81,10 +82,9 @@ class todays_events_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR . 'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR . 'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/todo/module.php b/modules_v3/todo/module.php
index 7318044e5c..89f17ea80b 100644
--- a/modules_v3/todo/module.php
+++ b/modules_v3/todo/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -21,6 +21,7 @@
use Rhumsaa\Uuid\Uuid;
use WT\Auth;
+use WT\Theme;
/**
* Class todo_WT_Module
@@ -130,10 +131,9 @@ class todo_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR.'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/top10_givnnames/module.php b/modules_v3/top10_givnnames/module.php
index 341253df1a..ca5e5756e0 100644
--- a/modules_v3/top10_givnnames/module.php
+++ b/modules_v3/top10_givnnames/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class top10_givnnames_WT_Module
@@ -98,10 +99,9 @@ class top10_givnnames_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR.'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/top10_pageviews/module.php b/modules_v3/top10_pageviews/module.php
index 0f38a3c6b9..627537eecb 100644
--- a/modules_v3/top10_pageviews/module.php
+++ b/modules_v3/top10_pageviews/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class top10_pageviews_WT_Module
@@ -95,10 +96,9 @@ class top10_pageviews_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR.'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/top10_surnames/module.php b/modules_v3/top10_surnames/module.php
index d22c8097a3..fa3c352485 100644
--- a/modules_v3/top10_surnames/module.php
+++ b/modules_v3/top10_surnames/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class top10_surnames_WT_Module
@@ -115,10 +116,9 @@ class top10_surnames_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR . 'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR . 'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
diff --git a/modules_v3/upcoming_events/module.php b/modules_v3/upcoming_events/module.php
index f01c895f89..778a88aa89 100644
--- a/modules_v3/upcoming_events/module.php
+++ b/modules_v3/upcoming_events/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class upcoming_events_WT_Module
@@ -83,10 +84,9 @@ class upcoming_events_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR . 'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR . 'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/user_blog/module.php b/modules_v3/user_blog/module.php
index 1659f63a65..321c295fda 100644
--- a/modules_v3/user_blog/module.php
+++ b/modules_v3/user_blog/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use \WT\Auth;
+use WT\Theme;
// Create tables, if not already present
try {
@@ -92,10 +93,9 @@ class user_blog_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR . 'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR . 'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/user_messages/module.php b/modules_v3/user_messages/module.php
index da8e9426fc..e94ee78513 100644
--- a/modules_v3/user_messages/module.php
+++ b/modules_v3/user_messages/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
use WT\User;
/**
@@ -64,7 +65,7 @@ class user_messages_WT_Module extends WT_Module implements WT_Module_Block {
$id = $this->getName() . $block_id;
$class = $this->getName() . '_block';
$title = WT_I18N::plural('%s message', '%s messages', $count, WT_I18N::number($count));
- $users = array_filter(User::all(), function($user){
+ $users = array_filter(User::all(), function(User $user){
return $user->getUserId() !== Auth::id() && $user->getPreference('verified_by_admin') && $user->getPreference('contactmethod') !== 'none';
});
@@ -119,10 +120,9 @@ class user_messages_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR . 'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR . 'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/user_welcome/module.php b/modules_v3/user_welcome/module.php
index 2eb5a59a53..7831cd9c8e 100644
--- a/modules_v3/user_welcome/module.php
+++ b/modules_v3/user_welcome/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -20,6 +20,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
use WT\Auth;
+use WT\Theme;
/**
* Class user_welcome_WT_Module
@@ -51,7 +52,7 @@ class user_welcome_WT_Module extends WT_Module implements WT_Module_Block {
$content .= '</tr></table>';
if ($template) {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/modules_v3/yahrzeit/module.php b/modules_v3/yahrzeit/module.php
index d4fe803b44..e30c7c48f4 100644
--- a/modules_v3/yahrzeit/module.php
+++ b/modules_v3/yahrzeit/module.php
@@ -1,6 +1,6 @@
<?php
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2010 John Finlay
@@ -22,6 +22,7 @@
use Fisharebest\ExtCalendar\JewishCalendar;
use Rhumsaa\Uuid\Uuid;
use WT\Auth;
+use WT\Theme;
/**
* Class yahrzeit_WT_Module
@@ -209,10 +210,9 @@ class yahrzeit_WT_Module extends WT_Module implements WT_Module_Block {
if ($template) {
if ($block) {
- require WT_THEME_DIR.'templates/block_small_temp.php';
- } else {
- require WT_THEME_DIR.'templates/block_main_temp.php';
+ $class .= ' small_inner_block';
}
+ return Theme::theme()->formatBlock($id, $title, $class, $content);
} else {
return $content;
}
diff --git a/packages/bootstrap-3.3.1/css/bootstrap.min.css b/packages/bootstrap-3.3.1/css/bootstrap.min.css
new file mode 100644
index 0000000000..b6fe4e0fbc
--- /dev/null
+++ b/packages/bootstrap-3.3.1/css/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file
diff --git a/packages/bootstrap-3.3.1/js/bootstrap.min.js b/packages/bootstrap-3.3.1/js/bootstrap.min.js
new file mode 100644
index 0000000000..d839865900
--- /dev/null
+++ b/packages/bootstrap-3.3.1/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.1",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.1",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.options.backdrop&&d.adjustBackdrop(),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$element.find(".modal-dialog").one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').prependTo(this.$element).on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.options.backdrop&&this.adjustBackdrop(),this.adjustDialog()},c.prototype.adjustBackdrop=function(){this.$backdrop.css("height",0).css("height",this.$element[0].scrollHeight)},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){this.bodyIsOverflowing=document.body.scrollHeight>document.documentElement.clientHeight,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.tooltip",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.1",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=this.tip(),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b,g=f&&f.selector;(e||"destroy"!=b)&&(g?(e||d.data("bs.popover",e={}),e[g]||(e[g]=new c(this,f))):e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.1",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.1",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.1",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})
+})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.1",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=i?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a("body").height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file
diff --git a/packages/bootstrap-rtl-3.2.0/css/bootstrap-rtl.min.css b/packages/bootstrap-rtl-3.2.0/css/bootstrap-rtl.min.css
new file mode 100644
index 0000000000..18173a276c
--- /dev/null
+++ b/packages/bootstrap-rtl-3.2.0/css/bootstrap-rtl.min.css
@@ -0,0 +1,9 @@
+/*******************************************************************************
+ * bootstrap-rtl (Version 3.2.0-rc3)
+ * Author: Morteza Ansarinia <ansarinia@me.com> (http://github.com/morteza)
+ * Created on: July 17,2014
+ * Project: bootstrap-rtl
+ * Copyright: See the file "LICENSE.md" for the full license governing this code.
+ *******************************************************************************/
+
+html{direction:rtl}body{direction:rtl}.list-unstyled{padding-right:0;padding-left:none}.list-inline{padding-right:0;padding-left:none;margin-right:-5px;margin-left:0}dd{margin-right:0;margin-left:none}@media (min-width:768px){.dl-horizontal dt{float:right;clear:right;text-align:left}.dl-horizontal dd{margin-right:180px;margin-left:0}}blockquote{border-right:5px solid #eee;border-left:0}.blockquote-reverse,blockquote.pull-left{padding-left:15px;padding-right:0;border-left:5px solid #eee;border-right:0;text-align:left}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:right}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{left:100%;right:auto}.col-xs-pull-11{left:91.66666667%;right:auto}.col-xs-pull-10{left:83.33333333%;right:auto}.col-xs-pull-9{left:75%;right:auto}.col-xs-pull-8{left:66.66666667%;right:auto}.col-xs-pull-7{left:58.33333333%;right:auto}.col-xs-pull-6{left:50%;right:auto}.col-xs-pull-5{left:41.66666667%;right:auto}.col-xs-pull-4{left:33.33333333%;right:auto}.col-xs-pull-3{left:25%;right:auto}.col-xs-pull-2{left:16.66666667%;right:auto}.col-xs-pull-1{left:8.33333333%;right:auto}.col-xs-pull-0{left:auto;right:auto}.col-xs-push-12{right:100%;left:0}.col-xs-push-11{right:91.66666667%;left:0}.col-xs-push-10{right:83.33333333%;left:0}.col-xs-push-9{right:75%;left:0}.col-xs-push-8{right:66.66666667%;left:0}.col-xs-push-7{right:58.33333333%;left:0}.col-xs-push-6{right:50%;left:0}.col-xs-push-5{right:41.66666667%;left:0}.col-xs-push-4{right:33.33333333%;left:0}.col-xs-push-3{right:25%;left:0}.col-xs-push-2{right:16.66666667%;left:0}.col-xs-push-1{right:8.33333333%;left:0}.col-xs-push-0{right:auto;left:0}.col-xs-offset-12{margin-right:100%;margin-left:0}.col-xs-offset-11{margin-right:91.66666667%;margin-left:0}.col-xs-offset-10{margin-right:83.33333333%;margin-left:0}.col-xs-offset-9{margin-right:75%;margin-left:0}.col-xs-offset-8{margin-right:66.66666667%;margin-left:0}.col-xs-offset-7{margin-right:58.33333333%;margin-left:0}.col-xs-offset-6{margin-right:50%;margin-left:0}.col-xs-offset-5{margin-right:41.66666667%;margin-left:0}.col-xs-offset-4{margin-right:33.33333333%;margin-left:0}.col-xs-offset-3{margin-right:25%;margin-left:0}.col-xs-offset-2{margin-right:16.66666667%;margin-left:0}.col-xs-offset-1{margin-right:8.33333333%;margin-left:0}.col-xs-offset-0{margin-right:0;margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:right}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{left:100%;right:auto}.col-sm-pull-11{left:91.66666667%;right:auto}.col-sm-pull-10{left:83.33333333%;right:auto}.col-sm-pull-9{left:75%;right:auto}.col-sm-pull-8{left:66.66666667%;right:auto}.col-sm-pull-7{left:58.33333333%;right:auto}.col-sm-pull-6{left:50%;right:auto}.col-sm-pull-5{left:41.66666667%;right:auto}.col-sm-pull-4{left:33.33333333%;right:auto}.col-sm-pull-3{left:25%;right:auto}.col-sm-pull-2{left:16.66666667%;right:auto}.col-sm-pull-1{left:8.33333333%;right:auto}.col-sm-pull-0{left:auto;right:auto}.col-sm-push-12{right:100%;left:0}.col-sm-push-11{right:91.66666667%;left:0}.col-sm-push-10{right:83.33333333%;left:0}.col-sm-push-9{right:75%;left:0}.col-sm-push-8{right:66.66666667%;left:0}.col-sm-push-7{right:58.33333333%;left:0}.col-sm-push-6{right:50%;left:0}.col-sm-push-5{right:41.66666667%;left:0}.col-sm-push-4{right:33.33333333%;left:0}.col-sm-push-3{right:25%;left:0}.col-sm-push-2{right:16.66666667%;left:0}.col-sm-push-1{right:8.33333333%;left:0}.col-sm-push-0{right:auto;left:0}.col-sm-offset-12{margin-right:100%;margin-left:0}.col-sm-offset-11{margin-right:91.66666667%;margin-left:0}.col-sm-offset-10{margin-right:83.33333333%;margin-left:0}.col-sm-offset-9{margin-right:75%;margin-left:0}.col-sm-offset-8{margin-right:66.66666667%;margin-left:0}.col-sm-offset-7{margin-right:58.33333333%;margin-left:0}.col-sm-offset-6{margin-right:50%;margin-left:0}.col-sm-offset-5{margin-right:41.66666667%;margin-left:0}.col-sm-offset-4{margin-right:33.33333333%;margin-left:0}.col-sm-offset-3{margin-right:25%;margin-left:0}.col-sm-offset-2{margin-right:16.66666667%;margin-left:0}.col-sm-offset-1{margin-right:8.33333333%;margin-left:0}.col-sm-offset-0{margin-right:0;margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:right}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{left:100%;right:auto}.col-md-pull-11{left:91.66666667%;right:auto}.col-md-pull-10{left:83.33333333%;right:auto}.col-md-pull-9{left:75%;right:auto}.col-md-pull-8{left:66.66666667%;right:auto}.col-md-pull-7{left:58.33333333%;right:auto}.col-md-pull-6{left:50%;right:auto}.col-md-pull-5{left:41.66666667%;right:auto}.col-md-pull-4{left:33.33333333%;right:auto}.col-md-pull-3{left:25%;right:auto}.col-md-pull-2{left:16.66666667%;right:auto}.col-md-pull-1{left:8.33333333%;right:auto}.col-md-pull-0{left:auto;right:auto}.col-md-push-12{right:100%;left:0}.col-md-push-11{right:91.66666667%;left:0}.col-md-push-10{right:83.33333333%;left:0}.col-md-push-9{right:75%;left:0}.col-md-push-8{right:66.66666667%;left:0}.col-md-push-7{right:58.33333333%;left:0}.col-md-push-6{right:50%;left:0}.col-md-push-5{right:41.66666667%;left:0}.col-md-push-4{right:33.33333333%;left:0}.col-md-push-3{right:25%;left:0}.col-md-push-2{right:16.66666667%;left:0}.col-md-push-1{right:8.33333333%;left:0}.col-md-push-0{right:auto;left:0}.col-md-offset-12{margin-right:100%;margin-left:0}.col-md-offset-11{margin-right:91.66666667%;margin-left:0}.col-md-offset-10{margin-right:83.33333333%;margin-left:0}.col-md-offset-9{margin-right:75%;margin-left:0}.col-md-offset-8{margin-right:66.66666667%;margin-left:0}.col-md-offset-7{margin-right:58.33333333%;margin-left:0}.col-md-offset-6{margin-right:50%;margin-left:0}.col-md-offset-5{margin-right:41.66666667%;margin-left:0}.col-md-offset-4{margin-right:33.33333333%;margin-left:0}.col-md-offset-3{margin-right:25%;margin-left:0}.col-md-offset-2{margin-right:16.66666667%;margin-left:0}.col-md-offset-1{margin-right:8.33333333%;margin-left:0}.col-md-offset-0{margin-right:0;margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:right}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{left:100%;right:auto}.col-lg-pull-11{left:91.66666667%;right:auto}.col-lg-pull-10{left:83.33333333%;right:auto}.col-lg-pull-9{left:75%;right:auto}.col-lg-pull-8{left:66.66666667%;right:auto}.col-lg-pull-7{left:58.33333333%;right:auto}.col-lg-pull-6{left:50%;right:auto}.col-lg-pull-5{left:41.66666667%;right:auto}.col-lg-pull-4{left:33.33333333%;right:auto}.col-lg-pull-3{left:25%;right:auto}.col-lg-pull-2{left:16.66666667%;right:auto}.col-lg-pull-1{left:8.33333333%;right:auto}.col-lg-pull-0{left:auto;right:auto}.col-lg-push-12{right:100%;left:0}.col-lg-push-11{right:91.66666667%;left:0}.col-lg-push-10{right:83.33333333%;left:0}.col-lg-push-9{right:75%;left:0}.col-lg-push-8{right:66.66666667%;left:0}.col-lg-push-7{right:58.33333333%;left:0}.col-lg-push-6{right:50%;left:0}.col-lg-push-5{right:41.66666667%;left:0}.col-lg-push-4{right:33.33333333%;left:0}.col-lg-push-3{right:25%;left:0}.col-lg-push-2{right:16.66666667%;left:0}.col-lg-push-1{right:8.33333333%;left:0}.col-lg-push-0{right:auto;left:0}.col-lg-offset-12{margin-right:100%;margin-left:0}.col-lg-offset-11{margin-right:91.66666667%;margin-left:0}.col-lg-offset-10{margin-right:83.33333333%;margin-left:0}.col-lg-offset-9{margin-right:75%;margin-left:0}.col-lg-offset-8{margin-right:66.66666667%;margin-left:0}.col-lg-offset-7{margin-right:58.33333333%;margin-left:0}.col-lg-offset-6{margin-right:50%;margin-left:0}.col-lg-offset-5{margin-right:41.66666667%;margin-left:0}.col-lg-offset-4{margin-right:33.33333333%;margin-left:0}.col-lg-offset-3{margin-right:25%;margin-left:0}.col-lg-offset-2{margin-right:16.66666667%;margin-left:0}.col-lg-offset-1{margin-right:8.33333333%;margin-left:0}.col-lg-offset-0{margin-right:0;margin-left:0}}th{text-align:right}@media screen and (max-width:767px){.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-right:0;border-left:auto}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-left:0;border-right:auto}}.radio label,.checkbox label{padding-right:20px;padding-left:auto}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{margin-right:-20px;margin-left:auto}.radio-inline,.checkbox-inline{padding-right:20px;padding-left:0}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-right:10px;margin-left:0}.has-feedback .form-control{padding-left:42.5px;padding-right:auto}.form-control-feedback{left:0;right:auto}@media (min-width:768px){.form-inline label{padding-right:0;padding-left:auto}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{margin-right:0;margin-left:auto}}@media (min-width:768px){.form-horizontal .control-label{text-align:left}}.form-horizontal .has-feedback .form-control-feedback{left:15px;right:auto}.caret{margin-right:2px;margin-left:0}.dropdown-menu{right:0;left:auto;float:left;text-align:right}.dropdown-menu.pull-left{left:0;float:right;right:auto}.pull-left>.dropdown-menu{left:0;float:right;right:auto}.navbar-nav.pull-left>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-left{right:auto;left:0}.btn-group>.btn,.btn-group-vertical>.btn{float:right}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-right:-1px;margin-left:0}.btn-toolbar{margin-right:-5px;margin-left:0}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:right}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-right:5px;margin-left:0}.btn-group>.btn:first-child{margin-right:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:4px;border-bottom-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group{float:right}.btn-group.btn-group-justified>.btn,.btn-group.btn-group-justified>.btn-group{float:none}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.btn .caret{margin-right:0}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-right:0}.input-group .form-control{float:right}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:first-child{border-right:1px solid #ccc;border-left:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:last-child{border-left:1px solid #ccc;border-right:0}.input-group-btn>.btn+.btn{margin-right:-1px;margin-left:auto}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-left:-1px;margin-right:auto}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-right:-1px;margin-left:auto}.nav{padding-right:0;padding-left:auto}.nav-tabs>li{float:right}.nav-tabs>li>a{margin-left:auto;margin-right:-2px;border-radius:4px 4px 0 0}.nav-pills>li{float:right}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-right:2px;margin-left:auto}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-right:0;margin-left:auto}.nav-justified>.dropdown .dropdown-menu{right:auto}.nav-tabs-justified>li>a{margin-left:0;margin-right:auto}@media (min-width:768px){.nav-tabs-justified>li>a{border-radius:4px 4px 0 0}}@media (min-width:768px){.navbar-header{float:right}}.navbar-collapse{padding-right:15px;padding-left:15px}.navbar-brand{float:right}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-right:-15px;margin-left:auto}}.navbar-toggle{float:left;margin-left:15px;margin-right:auto}@media (max-width:767px){.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 25px 5px 15px}}@media (min-width:768px){.navbar-nav{float:right}.navbar-nav>li{float:right}.navbar-nav.navbar-right:last-child{margin-left:-15px;margin-right:auto}.navbar-nav.navbar-right.flip{float:left!important}.navbar-nav.navbar-right .dropdown-menu{left:0;right:auto}}@media (min-width:768px){.navbar-text{float:right}.navbar-text.navbar-right:last-child{margin-left:0;margin-right:auto}}.pagination{padding-right:0}.pagination>li>a,.pagination>li>span{float:right;margin-right:-1px;margin-left:0}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{margin-right:-1px;border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-right:0;padding-left:none}.pager .next>a,.pager .next>span{float:left}.pager .previous>a,.pager .previous>span{float:right}.nav-pills>li>a>.badge{margin-left:0;margin-right:3px}.alert-dismissable,.alert-dismissible{padding-left:35px;padding-right:15px}.alert-dismissable .close,.alert-dismissible .close{right:0;left:21}.progress-bar{float:right}.media>.pull-left{margin-right:10px}.media>.pull-left.flip{margin-right:0;margin-left:10px}.media>.pull-right{margin-left:10px}.media>.pull-right.flip{margin-left:0;margin-right:10px}.media-list{padding-right:0;padding-left:auto;list-style:none}.list-group{padding-right:0;padding-left:auto}.list-group-item>.badge{float:left}.list-group-item>.badge+.badge{margin-ight:5px;margin-left:auto}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-right-radius:3px;border-top-left-radius:0}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-left-radius:3px;border-top-right-radius:0}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px;border-top-right-radius:0}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px;border-top-left-radius:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-right:0;border-left:none}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:none;border-left:0}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{right:0;left:none}.close{float:left}.modal-footer{text-align:left}.modal-footer .btn+.btn{margin-left:auto;margin-right:5px}.modal-footer .btn-group .btn+.btn{margin-right:-1px;margin-left:auto}.modal-footer .btn-block+.btn-block{margin-right:0;margin-left:auto}.popover{right:0;left:none;text-align:right}.popover.top>.arrow{right:50%;left:none;margin-right:-11px;margin-left:0}.popover.top>.arrow:after{margin-right:-10px;margin-left:0}.carousel-inner>.item{-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.active{left:0}.carousel-inner>.next{right:100%;left:0}.carousel-inner>.prev{right:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{right:0}.carousel-inner>.active.right{left:-100%}.carousel-inner>.active.left{right:100%}.carousel-control{right:0;bottom:0}.carousel-control.left{right:auto;left:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5)0),color-stop(rgba(0,0,0,.0001)100%));background-image:-o-linear-gradient(left,rgba(0,0,0,.5)0,rgba(0,0,0,.0001)100%);background-image:linear-gradient(to right,rgba(0,0,0,.5)0,rgba(0,0,0,.0001)100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001)0),color-stop(rgba(0,0,0,.5)100%));background-image:-o-linear-gradient(left,rgba(0,0,0,.0001)0,rgba(0,0,0,.5)100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001)0,rgba(0,0,0,.5)100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;right:auto;margin-right:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;left:auto;margin-left:-10px}.carousel-indicators{right:50%;left:0;margin-right:-30%;margin-left:0;padding-left:0}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:0;margin-right:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-left:0;margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}}.pull-right.flip{float:left!important}.pull-left.flip{float:right!important}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442} \ No newline at end of file
diff --git a/packages/datatables-1.10.4/css/jquery.dataTables.css b/packages/datatables-1.10.4/css/jquery.dataTables.css
new file mode 100644
index 0000000000..4e6fbe38b2
--- /dev/null
+++ b/packages/datatables-1.10.4/css/jquery.dataTables.css
@@ -0,0 +1,476 @@
+/*
+ * Table styles
+ */
+table.dataTable {
+ width: 100%;
+ margin: 0 auto;
+ clear: both;
+ border-collapse: separate;
+ border-spacing: 0;
+ /*
+ * Header and footer styles
+ */
+ /*
+ * Body styles
+ */
+}
+table.dataTable thead th,
+table.dataTable tfoot th {
+ font-weight: bold;
+}
+table.dataTable thead th,
+table.dataTable thead td {
+ padding: 10px 18px;
+ border-bottom: 1px solid #111111;
+}
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+ outline: none;
+}
+table.dataTable tfoot th,
+table.dataTable tfoot td {
+ padding: 10px 18px 6px 18px;
+ border-top: 1px solid #111111;
+}
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting {
+ cursor: pointer;
+ *cursor: hand;
+}
+table.dataTable thead .sorting {
+ background: url("../images/sort_both.png") no-repeat center right;
+}
+table.dataTable thead .sorting_asc {
+ background: url("../images/sort_asc.png") no-repeat center right;
+}
+table.dataTable thead .sorting_desc {
+ background: url("../images/sort_desc.png") no-repeat center right;
+}
+table.dataTable thead .sorting_asc_disabled {
+ background: url("../images/sort_asc_disabled.png") no-repeat center right;
+}
+table.dataTable thead .sorting_desc_disabled {
+ background: url("../images/sort_desc_disabled.png") no-repeat center right;
+}
+table.dataTable tbody tr {
+ background-color: white;
+}
+table.dataTable tbody tr.selected {
+ background-color: #b0bed9;
+}
+table.dataTable tbody th,
+table.dataTable tbody td {
+ padding: 8px 10px;
+}
+table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
+ border-top: 1px solid #dddddd;
+}
+table.dataTable.row-border tbody tr:first-child th,
+table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
+table.dataTable.display tbody tr:first-child td {
+ border-top: none;
+}
+table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
+ border-top: 1px solid #dddddd;
+ border-right: 1px solid #dddddd;
+}
+table.dataTable.cell-border tbody tr th:first-child,
+table.dataTable.cell-border tbody tr td:first-child {
+ border-left: 1px solid #dddddd;
+}
+table.dataTable.cell-border tbody tr:first-child th,
+table.dataTable.cell-border tbody tr:first-child td {
+ border-top: none;
+}
+table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
+ background-color: #f9f9f9;
+}
+table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
+ background-color: #abb9d3;
+}
+table.dataTable.hover tbody tr:hover,
+table.dataTable.hover tbody tr.odd:hover,
+table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,
+table.dataTable.display tbody tr.odd:hover,
+table.dataTable.display tbody tr.even:hover {
+ background-color: whitesmoke;
+}
+table.dataTable.hover tbody tr:hover.selected,
+table.dataTable.hover tbody tr.odd:hover.selected,
+table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,
+table.dataTable.display tbody tr.odd:hover.selected,
+table.dataTable.display tbody tr.even:hover.selected {
+ background-color: #a9b7d1;
+}
+table.dataTable.order-column tbody tr > .sorting_1,
+table.dataTable.order-column tbody tr > .sorting_2,
+table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
+table.dataTable.display tbody tr > .sorting_2,
+table.dataTable.display tbody tr > .sorting_3 {
+ background-color: #f9f9f9;
+}
+table.dataTable.order-column tbody tr.selected > .sorting_1,
+table.dataTable.order-column tbody tr.selected > .sorting_2,
+table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
+table.dataTable.display tbody tr.selected > .sorting_2,
+table.dataTable.display tbody tr.selected > .sorting_3 {
+ background-color: #acbad4;
+}
+table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+ background-color: #f1f1f1;
+}
+table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+ background-color: #f3f3f3;
+}
+table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+ background-color: whitesmoke;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+ background-color: #a6b3cd;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+ background-color: #a7b5ce;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+ background-color: #a9b6d0;
+}
+table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+ background-color: #f9f9f9;
+}
+table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+ background-color: #fbfbfb;
+}
+table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+ background-color: #fdfdfd;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+ background-color: #acbad4;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+ background-color: #adbbd6;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+ background-color: #afbdd8;
+}
+table.dataTable.display tbody tr:hover > .sorting_1,
+table.dataTable.display tbody tr.odd:hover > .sorting_1,
+table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {
+ background-color: #eaeaea;
+}
+table.dataTable.display tbody tr:hover > .sorting_2,
+table.dataTable.display tbody tr.odd:hover > .sorting_2,
+table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {
+ background-color: #ebebeb;
+}
+table.dataTable.display tbody tr:hover > .sorting_3,
+table.dataTable.display tbody tr.odd:hover > .sorting_3,
+table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {
+ background-color: #eeeeee;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_1,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_1,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {
+ background-color: #a1aec7;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_2,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_2,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {
+ background-color: #a2afc8;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_3,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_3,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {
+ background-color: #a4b2cb;
+}
+table.dataTable.no-footer {
+ border-bottom: 1px solid #111111;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+ white-space: nowrap;
+}
+table.dataTable.compact thead th,
+table.dataTable.compact thead td {
+ padding: 5px 9px;
+}
+table.dataTable.compact tfoot th,
+table.dataTable.compact tfoot td {
+ padding: 5px 9px 3px 9px;
+}
+table.dataTable.compact tbody th,
+table.dataTable.compact tbody td {
+ padding: 4px 5px;
+}
+table.dataTable th.dt-left,
+table.dataTable td.dt-left {
+ text-align: left;
+}
+table.dataTable th.dt-center,
+table.dataTable td.dt-center,
+table.dataTable td.dataTables_empty {
+ text-align: center;
+}
+table.dataTable th.dt-right,
+table.dataTable td.dt-right {
+ text-align: right;
+}
+table.dataTable th.dt-justify,
+table.dataTable td.dt-justify {
+ text-align: justify;
+}
+table.dataTable th.dt-nowrap,
+table.dataTable td.dt-nowrap {
+ white-space: nowrap;
+}
+table.dataTable thead th.dt-head-left,
+table.dataTable thead td.dt-head-left,
+table.dataTable tfoot th.dt-head-left,
+table.dataTable tfoot td.dt-head-left {
+ text-align: left;
+}
+table.dataTable thead th.dt-head-center,
+table.dataTable thead td.dt-head-center,
+table.dataTable tfoot th.dt-head-center,
+table.dataTable tfoot td.dt-head-center {
+ text-align: center;
+}
+table.dataTable thead th.dt-head-right,
+table.dataTable thead td.dt-head-right,
+table.dataTable tfoot th.dt-head-right,
+table.dataTable tfoot td.dt-head-right {
+ text-align: right;
+}
+table.dataTable thead th.dt-head-justify,
+table.dataTable thead td.dt-head-justify,
+table.dataTable tfoot th.dt-head-justify,
+table.dataTable tfoot td.dt-head-justify {
+ text-align: justify;
+}
+table.dataTable thead th.dt-head-nowrap,
+table.dataTable thead td.dt-head-nowrap,
+table.dataTable tfoot th.dt-head-nowrap,
+table.dataTable tfoot td.dt-head-nowrap {
+ white-space: nowrap;
+}
+table.dataTable tbody th.dt-body-left,
+table.dataTable tbody td.dt-body-left {
+ text-align: left;
+}
+table.dataTable tbody th.dt-body-center,
+table.dataTable tbody td.dt-body-center {
+ text-align: center;
+}
+table.dataTable tbody th.dt-body-right,
+table.dataTable tbody td.dt-body-right {
+ text-align: right;
+}
+table.dataTable tbody th.dt-body-justify,
+table.dataTable tbody td.dt-body-justify {
+ text-align: justify;
+}
+table.dataTable tbody th.dt-body-nowrap,
+table.dataTable tbody td.dt-body-nowrap {
+ white-space: nowrap;
+}
+
+table.dataTable,
+table.dataTable th,
+table.dataTable td {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper {
+ position: relative;
+ clear: both;
+ *zoom: 1;
+ zoom: 1;
+}
+.dataTables_wrapper .dataTables_length {
+ float: left;
+}
+.dataTables_wrapper .dataTables_filter {
+ float: right;
+ text-align: right;
+}
+.dataTables_wrapper .dataTables_filter input {
+ margin-left: 0.5em;
+}
+.dataTables_wrapper .dataTables_info {
+ clear: both;
+ float: left;
+ padding-top: 0.755em;
+}
+.dataTables_wrapper .dataTables_paginate {
+ float: right;
+ text-align: right;
+ padding-top: 0.25em;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button {
+ box-sizing: border-box;
+ display: inline-block;
+ min-width: 1.5em;
+ padding: 0.5em 1em;
+ margin-left: 2px;
+ text-align: center;
+ text-decoration: none !important;
+ cursor: pointer;
+ *cursor: hand;
+ color: #333333 !important;
+ border: 1px solid transparent;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
+ color: #333333 !important;
+ border: 1px solid #cacaca;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, gainsboro));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, white 0%, gainsboro 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, white 0%, gainsboro 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, white 0%, gainsboro 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, white 0%, gainsboro 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, white 0%, gainsboro 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
+ cursor: default;
+ color: #666 !important;
+ border: 1px solid transparent;
+ background: transparent;
+ box-shadow: none;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
+ color: white !important;
+ border: 1px solid #111111;
+ background-color: #585858;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111111));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #585858 0%, #111111 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, #585858 0%, #111111 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, #585858 0%, #111111 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, #585858 0%, #111111 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, #585858 0%, #111111 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:active {
+ outline: none;
+ background-color: #2b2b2b;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
+ /* W3C */
+ box-shadow: inset 0 0 3px #111;
+}
+.dataTables_wrapper .dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 40px;
+ margin-left: -50%;
+ margin-top: -25px;
+ padding-top: 20px;
+ text-align: center;
+ font-size: 1.2em;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+ color: #333333;
+}
+.dataTables_wrapper .dataTables_scroll {
+ clear: both;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
+ *margin-top: -1px;
+ -webkit-overflow-scrolling: touch;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing {
+ height: 0;
+ overflow: hidden;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.dataTables_wrapper.no-footer .dataTables_scrollBody {
+ border-bottom: 1px solid #111111;
+}
+.dataTables_wrapper.no-footer div.dataTables_scrollHead table,
+.dataTables_wrapper.no-footer div.dataTables_scrollBody table {
+ border-bottom: none;
+}
+.dataTables_wrapper:after {
+ visibility: hidden;
+ display: block;
+ content: "";
+ clear: both;
+ height: 0;
+}
+
+@media screen and (max-width: 767px) {
+ .dataTables_wrapper .dataTables_info,
+ .dataTables_wrapper .dataTables_paginate {
+ float: none;
+ text-align: center;
+ }
+ .dataTables_wrapper .dataTables_paginate {
+ margin-top: 0.5em;
+ }
+}
+@media screen and (max-width: 640px) {
+ .dataTables_wrapper .dataTables_length,
+ .dataTables_wrapper .dataTables_filter {
+ float: none;
+ text-align: center;
+ }
+ .dataTables_wrapper .dataTables_filter {
+ margin-top: 0.5em;
+ }
+}
diff --git a/packages/datatables-1.10.4/css/jquery.dataTables.min.css b/packages/datatables-1.10.4/css/jquery.dataTables.min.css
new file mode 100644
index 0000000000..a2c5489c89
--- /dev/null
+++ b/packages/datatables-1.10.4/css/jquery.dataTables.min.css
@@ -0,0 +1 @@
+table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting{cursor:pointer;*cursor:hand}table.dataTable thead .sorting{background:url("../images/sort_both.png") no-repeat center right}table.dataTable thead .sorting_asc{background:url("../images/sort_asc.png") no-repeat center right}table.dataTable thead .sorting_desc{background:url("../images/sort_desc.png") no-repeat center right}table.dataTable thead .sorting_asc_disabled{background:url("../images/sort_asc_disabled.png") no-repeat center right}table.dataTable thead .sorting_desc_disabled{background:url("../images/sort_desc_disabled.png") no-repeat center right}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.hover tbody tr.odd:hover,table.dataTable.hover tbody tr.even:hover,table.dataTable.display tbody tr:hover,table.dataTable.display tbody tr.odd:hover,table.dataTable.display tbody tr.even:hover{background-color:#f5f5f5}table.dataTable.hover tbody tr:hover.selected,table.dataTable.hover tbody tr.odd:hover.selected,table.dataTable.hover tbody tr.even:hover.selected,table.dataTable.display tbody tr:hover.selected,table.dataTable.display tbody tr.odd:hover.selected,table.dataTable.display tbody tr.even:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.display tbody tr.odd:hover>.sorting_1,table.dataTable.display tbody tr.even:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.display tbody tr.odd:hover>.sorting_2,table.dataTable.display tbody tr.even:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.display tbody tr.odd:hover>.sorting_3,table.dataTable.display tbody tr.even:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.display tbody tr.odd:hover.selected>.sorting_1,table.dataTable.display tbody tr.even:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.display tbody tr.odd:hover.selected>.sorting_2,table.dataTable.display tbody tr.even:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.display tbody tr.odd:hover.selected>.sorting_3,table.dataTable.display tbody tr.even:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:5px 9px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:5px 9px 3px 9px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px 5px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #cacaca;background-color:#fff;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}
diff --git a/packages/datatables-1.10.4/css/jquery.dataTables_themeroller.css b/packages/datatables-1.10.4/css/jquery.dataTables_themeroller.css
new file mode 100644
index 0000000000..5a56d97994
--- /dev/null
+++ b/packages/datatables-1.10.4/css/jquery.dataTables_themeroller.css
@@ -0,0 +1,330 @@
+/*
+ * Table styles
+ */
+table.dataTable {
+ width: 100%;
+ margin: 0 auto;
+ clear: both;
+ border-collapse: separate;
+ border-spacing: 0;
+ /*
+ * Header and footer styles
+ */
+ /*
+ * Body styles
+ */
+}
+table.dataTable thead th,
+table.dataTable thead td,
+table.dataTable tfoot th,
+table.dataTable tfoot td {
+ padding: 4px 10px;
+}
+table.dataTable thead th,
+table.dataTable tfoot th {
+ font-weight: bold;
+}
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+ outline: none;
+}
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting {
+ cursor: pointer;
+ *cursor: hand;
+}
+table.dataTable thead th div.DataTables_sort_wrapper {
+ position: relative;
+ padding-right: 10px;
+}
+table.dataTable thead th div.DataTables_sort_wrapper span {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+ right: -5px;
+}
+table.dataTable thead th.ui-state-default {
+ border-right-width: 0;
+}
+table.dataTable thead th.ui-state-default:last-child {
+ border-right-width: 1px;
+}
+table.dataTable tbody tr {
+ background-color: white;
+}
+table.dataTable tbody tr.selected {
+ background-color: #b0bed9;
+}
+table.dataTable tbody th,
+table.dataTable tbody td {
+ padding: 8px 10px;
+}
+table.dataTable th.center,
+table.dataTable td.center,
+table.dataTable td.dataTables_empty {
+ text-align: center;
+}
+table.dataTable th.right,
+table.dataTable td.right {
+ text-align: right;
+}
+table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
+ border-top: 1px solid #dddddd;
+}
+table.dataTable.row-border tbody tr:first-child th,
+table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
+table.dataTable.display tbody tr:first-child td {
+ border-top: none;
+}
+table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
+ border-top: 1px solid #dddddd;
+ border-right: 1px solid #dddddd;
+}
+table.dataTable.cell-border tbody tr th:first-child,
+table.dataTable.cell-border tbody tr td:first-child {
+ border-left: 1px solid #dddddd;
+}
+table.dataTable.cell-border tbody tr:first-child th,
+table.dataTable.cell-border tbody tr:first-child td {
+ border-top: none;
+}
+table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
+ background-color: #f9f9f9;
+}
+table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
+ background-color: #abb9d3;
+}
+table.dataTable.hover tbody tr:hover,
+table.dataTable.hover tbody tr.odd:hover,
+table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,
+table.dataTable.display tbody tr.odd:hover,
+table.dataTable.display tbody tr.even:hover {
+ background-color: whitesmoke;
+}
+table.dataTable.hover tbody tr:hover.selected,
+table.dataTable.hover tbody tr.odd:hover.selected,
+table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,
+table.dataTable.display tbody tr.odd:hover.selected,
+table.dataTable.display tbody tr.even:hover.selected {
+ background-color: #a9b7d1;
+}
+table.dataTable.order-column tbody tr > .sorting_1,
+table.dataTable.order-column tbody tr > .sorting_2,
+table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
+table.dataTable.display tbody tr > .sorting_2,
+table.dataTable.display tbody tr > .sorting_3 {
+ background-color: #f9f9f9;
+}
+table.dataTable.order-column tbody tr.selected > .sorting_1,
+table.dataTable.order-column tbody tr.selected > .sorting_2,
+table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
+table.dataTable.display tbody tr.selected > .sorting_2,
+table.dataTable.display tbody tr.selected > .sorting_3 {
+ background-color: #acbad4;
+}
+table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+ background-color: #f1f1f1;
+}
+table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+ background-color: #f3f3f3;
+}
+table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+ background-color: whitesmoke;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+ background-color: #a6b3cd;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+ background-color: #a7b5ce;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+ background-color: #a9b6d0;
+}
+table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+ background-color: #f9f9f9;
+}
+table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+ background-color: #fbfbfb;
+}
+table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+ background-color: #fdfdfd;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+ background-color: #acbad4;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+ background-color: #adbbd6;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+ background-color: #afbdd8;
+}
+table.dataTable.display tbody tr:hover > .sorting_1,
+table.dataTable.display tbody tr.odd:hover > .sorting_1,
+table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {
+ background-color: #eaeaea;
+}
+table.dataTable.display tbody tr:hover > .sorting_2,
+table.dataTable.display tbody tr.odd:hover > .sorting_2,
+table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {
+ background-color: #ebebeb;
+}
+table.dataTable.display tbody tr:hover > .sorting_3,
+table.dataTable.display tbody tr.odd:hover > .sorting_3,
+table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {
+ background-color: #eeeeee;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_1,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_1,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {
+ background-color: #a1aec7;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_2,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_2,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {
+ background-color: #a2afc8;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_3,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_3,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {
+ background-color: #a4b2cb;
+}
+
+table.dataTable,
+table.dataTable th,
+table.dataTable td {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper {
+ position: relative;
+ clear: both;
+ *zoom: 1;
+ zoom: 1;
+}
+.dataTables_wrapper .dataTables_length {
+ float: left;
+}
+.dataTables_wrapper .dataTables_filter {
+ float: right;
+ text-align: right;
+}
+.dataTables_wrapper .dataTables_filter input {
+ margin-left: 0.5em;
+}
+.dataTables_wrapper .dataTables_info {
+ clear: both;
+ float: left;
+ padding-top: 0.55em;
+}
+.dataTables_wrapper .dataTables_paginate {
+ float: right;
+ text-align: right;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button {
+ box-sizing: border-box;
+ display: inline-block;
+ min-width: 1.5em;
+ padding: 0.5em;
+ margin-left: 2px;
+ text-align: center;
+ text-decoration: none !important;
+ cursor: pointer;
+ *cursor: hand;
+ color: #333333 !important;
+ border: 1px solid transparent;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:active {
+ outline: none;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:first-child {
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:last-child {
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+.dataTables_wrapper .dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 40px;
+ margin-left: -50%;
+ margin-top: -25px;
+ padding-top: 20px;
+ text-align: center;
+ font-size: 1.2em;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+ color: #333333;
+}
+.dataTables_wrapper .dataTables_scroll {
+ clear: both;
+}
+.dataTables_wrapper .dataTables_scrollBody {
+ *margin-top: -1px;
+ -webkit-overflow-scrolling: touch;
+}
+.dataTables_wrapper .ui-widget-header {
+ font-weight: normal;
+}
+.dataTables_wrapper .ui-toolbar {
+ padding: 8px;
+}
+.dataTables_wrapper:after {
+ visibility: hidden;
+ display: block;
+ content: "";
+ clear: both;
+ height: 0;
+}
+
+@media screen and (max-width: 767px) {
+ .dataTables_wrapper .dataTables_length,
+ .dataTables_wrapper .dataTables_filter,
+ .dataTables_wrapper .dataTables_info,
+ .dataTables_wrapper .dataTables_paginate {
+ float: none;
+ text-align: center;
+ }
+ .dataTables_wrapper .dataTables_filter,
+ .dataTables_wrapper .dataTables_paginate {
+ margin-top: 0.5em;
+ }
+}
diff --git a/packages/datatables-1.10.4/images/Sorting icons.psd b/packages/datatables-1.10.4/images/Sorting icons.psd
new file mode 100644
index 0000000000..53b2e06850
--- /dev/null
+++ b/packages/datatables-1.10.4/images/Sorting icons.psd
Binary files differ
diff --git a/packages/datatables-1.10.4/images/back_disabled.png b/packages/datatables-1.10.4/images/back_disabled.png
new file mode 100644
index 0000000000..881de7976f
--- /dev/null
+++ b/packages/datatables-1.10.4/images/back_disabled.png
Binary files differ
diff --git a/packages/datatables-1.10.4/images/back_enabled.png b/packages/datatables-1.10.4/images/back_enabled.png
new file mode 100644
index 0000000000..c608682b04
--- /dev/null
+++ b/packages/datatables-1.10.4/images/back_enabled.png
Binary files differ
diff --git a/packages/datatables-1.10.4/images/back_enabled_hover.png b/packages/datatables-1.10.4/images/back_enabled_hover.png
new file mode 100644
index 0000000000..d300f1064b
--- /dev/null
+++ b/packages/datatables-1.10.4/images/back_enabled_hover.png
Binary files differ
diff --git a/packages/datatables-1.10.4/images/favicon.ico b/packages/datatables-1.10.4/images/favicon.ico
new file mode 100644
index 0000000000..6eeaa2a0d3
--- /dev/null
+++ b/packages/datatables-1.10.4/images/favicon.ico
Binary files differ
diff --git a/packages/datatables-1.10.4/images/forward_disabled.png b/packages/datatables-1.10.4/images/forward_disabled.png
new file mode 100644
index 0000000000..6a6ded7de8
--- /dev/null
+++ b/packages/datatables-1.10.4/images/forward_disabled.png
Binary files differ
diff --git a/packages/datatables-1.10.4/images/forward_enabled.png b/packages/datatables-1.10.4/images/forward_enabled.png
new file mode 100644
index 0000000000..a4e6b5384b
--- /dev/null
+++ b/packages/datatables-1.10.4/images/forward_enabled.png
Binary files differ
diff --git a/packages/datatables-1.10.4/images/forward_enabled_hover.png b/packages/datatables-1.10.4/images/forward_enabled_hover.png
new file mode 100644
index 0000000000..fc46c5ebf0
--- /dev/null
+++ b/packages/datatables-1.10.4/images/forward_enabled_hover.png
Binary files differ
diff --git a/packages/datatables-1.10.4/images/sort_asc.png b/packages/datatables-1.10.4/images/sort_asc.png
new file mode 100644
index 0000000000..a88d7975fe
--- /dev/null
+++ b/packages/datatables-1.10.4/images/sort_asc.png
Binary files differ
diff --git a/packages/datatables-1.10.4/images/sort_asc_disabled.png b/packages/datatables-1.10.4/images/sort_asc_disabled.png
new file mode 100644
index 0000000000..dcd7b7b8ca
--- /dev/null
+++ b/packages/datatables-1.10.4/images/sort_asc_disabled.png
Binary files differ
diff --git a/packages/datatables-1.10.4/images/sort_both.png b/packages/datatables-1.10.4/images/sort_both.png
new file mode 100644
index 0000000000..18670406bc
--- /dev/null
+++ b/packages/datatables-1.10.4/images/sort_both.png
Binary files differ
diff --git a/packages/datatables-1.10.4/images/sort_desc.png b/packages/datatables-1.10.4/images/sort_desc.png
new file mode 100644
index 0000000000..def071ed5a
--- /dev/null
+++ b/packages/datatables-1.10.4/images/sort_desc.png
Binary files differ
diff --git a/packages/datatables-1.10.4/images/sort_desc_disabled.png b/packages/datatables-1.10.4/images/sort_desc_disabled.png
new file mode 100644
index 0000000000..7824973cc6
--- /dev/null
+++ b/packages/datatables-1.10.4/images/sort_desc_disabled.png
Binary files differ
diff --git a/packages/datatables-1.10.4/js/jquery.dataTables.min.js b/packages/datatables-1.10.4/js/jquery.dataTables.min.js
new file mode 100644
index 0000000000..8885017c35
--- /dev/null
+++ b/packages/datatables-1.10.4/js/jquery.dataTables.min.js
@@ -0,0 +1,157 @@
+/*! DataTables 1.10.4
+ * ©2008-2014 SpryMedia Ltd - datatables.net/license
+ */
+(function(Da,P,l){var O=function(g){function V(a){var b,c,e={};g.each(a,function(d){if((b=d.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=d.replace(b[0],b[2].toLowerCase()),e[c]=d,"o"===b[1]&&V(a[d])});a._hungarianMap=e}function G(a,b,c){a._hungarianMap||V(a);var e;g.each(b,function(d){e=a._hungarianMap[d];if(e!==l&&(c||b[e]===l))"o"===e.charAt(0)?(b[e]||(b[e]={}),g.extend(!0,b[e],b[d]),G(a[e],b[e],c)):b[e]=b[d]})}function O(a){var b=p.defaults.oLanguage,c=a.sZeroRecords;
+!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&D(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&D(a,a,"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&cb(a)}function db(a){z(a,"ordering","bSort");z(a,"orderMulti","bSortMulti");z(a,"orderClasses","bSortClasses");z(a,"orderCellsTop","bSortCellsTop");z(a,"order","aaSorting");z(a,"orderFixed","aaSortingFixed");z(a,"paging","bPaginate");
+z(a,"pagingType","sPaginationType");z(a,"pageLength","iDisplayLength");z(a,"searching","bFilter");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&G(p.models.oSearch,a[b])}function eb(a){z(a,"orderable","bSortable");z(a,"orderData","aDataSort");z(a,"orderSequence","asSorting");z(a,"orderDataType","sortDataType")}function fb(a){var a=a.oBrowser,b=g("<div/>").css({position:"absolute",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(g("<div/>").css({position:"absolute",top:1,left:1,width:100,
+overflow:"scroll"}).append(g('<div class="test"/>').css({width:"100%",height:10}))).appendTo("body"),c=b.find(".test");a.bScrollOversize=100===c[0].offsetWidth;a.bScrollbarLeft=1!==c.offset().left;b.remove()}function gb(a,b,c,e,d,f){var h,i=!1;c!==l&&(h=c,i=!0);for(;e!==d;)a.hasOwnProperty(e)&&(h=i?b(h,a[e],e,a):a[e],i=!0,e+=f);return h}function Ea(a,b){var c=p.defaults.column,e=a.aoColumns.length,c=g.extend({},p.models.oColumn,c,{nTh:b?b:P.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:
+"",aDataSort:c.aDataSort?c.aDataSort:[e],mData:c.mData?c.mData:e,idx:e});a.aoColumns.push(c);c=a.aoPreSearchCols;c[e]=g.extend({},p.models.oSearch,c[e]);ja(a,e,null)}function ja(a,b,c){var b=a.aoColumns[b],e=a.oClasses,d=g(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=d.attr("width")||null;var f=(d.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==l&&null!==c&&(eb(c),G(p.defaults.column,c),c.mDataProp!==l&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&
+!c.sClass&&(c.sClass=c.className),g.extend(b,c),D(b,c,"sWidth","sWidthOrig"),"number"===typeof c.iDataSort&&(b.aDataSort=[c.iDataSort]),D(b,c,"aDataSort"));var h=b.mData,i=W(h),j=b.mRender?W(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=g.isPlainObject(h)&&(c(h.sort)||c(h.type)||c(h.filter));b.fnGetData=function(a,b,c){var e=i(a,b,l,c);return j&&b?j(e,b,a,c):e};b.fnSetData=function(a,b,c){return Q(h)(a,b,c)};"number"!==typeof h&&(a._rowReadObject=!0);a.oFeatures.bSort||
+(b.bSortable=!1,d.addClass(e.sSortableNone));a=-1!==g.inArray("asc",b.asSorting);c=-1!==g.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=e.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=e.sSortableAsc,b.sSortingClassJUI=e.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=e.sSortableDesc,b.sSortingClassJUI=e.sSortJUIDescAllowed):(b.sSortingClass=e.sSortable,b.sSortingClassJUI=e.sSortJUI)}function X(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Fa(a);for(var c=0,e=b.length;c<
+e;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&Y(a);u(a,null,"column-sizing",[a])}function ka(a,b){var c=Z(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function $(a,b){var c=Z(a,"bVisible"),c=g.inArray(b,c);return-1!==c?c:null}function aa(a){return Z(a,"bVisible").length}function Z(a,b){var c=[];g.map(a.aoColumns,function(a,d){a[b]&&c.push(d)});return c}function Ga(a){var b=a.aoColumns,c=a.aoData,e=p.ext.type.detect,d,f,h,i,j,g,m,o,k;d=0;for(f=b.length;d<f;d++)if(m=
+b[d],k=[],!m.sType&&m._sManualType)m.sType=m._sManualType;else if(!m.sType){h=0;for(i=e.length;h<i;h++){j=0;for(g=c.length;j<g;j++){k[j]===l&&(k[j]=v(a,j,d,"type"));o=e[h](k[j],a);if(!o&&h!==e.length-1)break;if("html"===o)break}if(o){m.sType=o;break}}m.sType||(m.sType="string")}}function hb(a,b,c,e){var d,f,h,i,j,n,m=a.aoColumns;if(b)for(d=b.length-1;0<=d;d--){n=b[d];var o=n.targets!==l?n.targets:n.aTargets;g.isArray(o)||(o=[o]);f=0;for(h=o.length;f<h;f++)if("number"===typeof o[f]&&0<=o[f]){for(;m.length<=
+o[f];)Ea(a);e(o[f],n)}else if("number"===typeof o[f]&&0>o[f])e(m.length+o[f],n);else if("string"===typeof o[f]){i=0;for(j=m.length;i<j;i++)("_all"==o[f]||g(m[i].nTh).hasClass(o[f]))&&e(i,n)}}if(c){d=0;for(a=c.length;d<a;d++)e(d,c[d])}}function I(a,b,c,e){var d=a.aoData.length,f=g.extend(!0,{},p.models.oRow,{src:c?"dom":"data"});f._aData=b;a.aoData.push(f);for(var b=a.aoColumns,f=0,h=b.length;f<h;f++)c&&Ha(a,d,f,v(a,d,f)),b[f].sType=null;a.aiDisplayMaster.push(d);(c||!a.oFeatures.bDeferRender)&&Ia(a,
+d,c,e);return d}function la(a,b){var c;b instanceof g||(b=g(b));return b.map(function(b,d){c=ma(a,d);return I(a,c.data,d,c.cells)})}function v(a,b,c,e){var d=a.iDraw,f=a.aoColumns[c],h=a.aoData[b]._aData,i=f.sDefaultContent,c=f.fnGetData(h,e,{settings:a,row:b,col:c});if(c===l)return a.iDrawError!=d&&null===i&&(R(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b,4),a.iDrawError=d),i;if((c===h||null===c)&&null!==i)c=i;else if("function"===typeof c)return c.call(h);
+return null===c&&"display"==e?"":c}function Ha(a,b,c,e){a.aoColumns[c].fnSetData(a.aoData[b]._aData,e,{settings:a,row:b,col:c})}function Ja(a){return g.map(a.match(/(\\.|[^\.])+/g),function(a){return a.replace(/\\./g,".")})}function W(a){if(g.isPlainObject(a)){var b={};g.each(a,function(a,c){c&&(b[a]=W(c))});return function(a,c,f,h){var i=b[c]||b._;return i!==l?i(a,c,f,h):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,h){return a(b,c,f,h)};if("string"===
+typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var h,i;if(""!==f){i=Ja(f);for(var j=0,g=i.length;j<g;j++){f=i[j].match(ba);h=i[j].match(S);if(f){i[j]=i[j].replace(ba,"");""!==i[j]&&(a=a[i[j]]);h=[];i.splice(0,j+1);i=i.join(".");j=0;for(g=a.length;j<g;j++)h.push(c(a[j],b,i));a=f[0].substring(1,f[0].length-1);a=""===a?h:h.join(a);break}else if(h){i[j]=i[j].replace(S,"");a=a[i[j]]();continue}if(null===a||a[i[j]]===l)return l;a=a[i[j]]}}return a};return function(b,
+d){return c(b,d,a)}}return function(b){return b[a]}}function Q(a){if(g.isPlainObject(a))return Q(a._);if(null===a)return function(){};if("function"===typeof a)return function(b,e,d){a(b,"set",e,d)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,e,d){var d=Ja(d),f;f=d[d.length-1];for(var h,i,j=0,g=d.length-1;j<g;j++){h=d[j].match(ba);i=d[j].match(S);if(h){d[j]=d[j].replace(ba,"");a[d[j]]=[];f=d.slice();f.splice(0,j+1);h=f.join(".");i=0;for(g=
+e.length;i<g;i++)f={},b(f,e[i],h),a[d[j]].push(f);return}i&&(d[j]=d[j].replace(S,""),a=a[d[j]](e));if(null===a[d[j]]||a[d[j]]===l)a[d[j]]={};a=a[d[j]]}if(f.match(S))a[f.replace(S,"")](e);else a[f.replace(ba,"")]=e};return function(c,e){return b(c,e,a)}}return function(b,e){b[a]=e}}function Ka(a){return C(a.aoData,"_aData")}function na(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0}function oa(a,b,c){for(var e=-1,d=0,f=a.length;d<f;d++)a[d]==b?e=d:a[d]>b&&a[d]--; -1!=e&&c===l&&
+a.splice(e,1)}function ca(a,b,c,e){var d=a.aoData[b],f,h=function(c,f){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=v(a,b,f,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===d.src)d._aData=ma(a,d,e,e===l?l:d._aData).data;else{var i=d.anCells;if(i)if(e!==l)h(i[e],e);else{c=0;for(f=i.length;c<f;c++)h(i[c],c)}}d._aSortData=null;d._aFilterData=null;h=a.aoColumns;if(e!==l)h[e].sType=null;else{c=0;for(f=h.length;c<f;c++)h[c].sType=null;La(d)}}function ma(a,b,c,e){var d=[],f=b.firstChild,
+h,i=0,j,n=a.aoColumns,m=a._rowReadObject,e=e||m?{}:[],o=function(a,b){if("string"===typeof a){var c=a.indexOf("@");-1!==c&&(c=a.substring(c+1),Q(a)(e,b.getAttribute(c)))}},a=function(a){if(c===l||c===i)h=n[i],j=g.trim(a.innerHTML),h&&h._bAttrSrc?(Q(h.mData._)(e,j),o(h.mData.sort,a),o(h.mData.type,a),o(h.mData.filter,a)):m?(h._setter||(h._setter=Q(h.mData)),h._setter(e,j)):e[i]=j;i++};if(f)for(;f;){b=f.nodeName.toUpperCase();if("TD"==b||"TH"==b)a(f),d.push(f);f=f.nextSibling}else{d=b.anCells;f=0;for(b=
+d.length;f<b;f++)a(d[f])}return{data:e,cells:d}}function Ia(a,b,c,e){var d=a.aoData[b],f=d._aData,h=[],i,j,g,m,o;if(null===d.nTr){i=c||P.createElement("tr");d.nTr=i;d.anCells=h;i._DT_RowIndex=b;La(d);m=0;for(o=a.aoColumns.length;m<o;m++){g=a.aoColumns[m];j=c?e[m]:P.createElement(g.sCellType);h.push(j);if(!c||g.mRender||g.mData!==m)j.innerHTML=v(a,b,m,"display");g.sClass&&(j.className+=" "+g.sClass);g.bVisible&&!c?i.appendChild(j):!g.bVisible&&c&&j.parentNode.removeChild(j);g.fnCreatedCell&&g.fnCreatedCell.call(a.oInstance,
+j,v(a,b,m),f,b,m)}u(a,"aoRowCreatedCallback",null,[i,f,b])}d.nTr.setAttribute("role","row")}function La(a){var b=a.nTr,c=a._aData;if(b){c.DT_RowId&&(b.id=c.DT_RowId);if(c.DT_RowClass){var e=c.DT_RowClass.split(" ");a.__rowc=a.__rowc?Ma(a.__rowc.concat(e)):e;g(b).removeClass(a.__rowc.join(" ")).addClass(c.DT_RowClass)}c.DT_RowData&&g(b).data(c.DT_RowData)}}function ib(a){var b,c,e,d,f,h=a.nTHead,i=a.nTFoot,j=0===g("th, td",h).length,n=a.oClasses,m=a.aoColumns;j&&(d=g("<tr/>").appendTo(h));b=0;for(c=
+m.length;b<c;b++)f=m[b],e=g(f.nTh).addClass(f.sClass),j&&e.appendTo(d),a.oFeatures.bSort&&(e.addClass(f.sSortingClass),!1!==f.bSortable&&(e.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Na(a,f.nTh,b))),f.sTitle!=e.html()&&e.html(f.sTitle),Oa(a,"header")(a,e,f,n);j&&da(a.aoHeader,h);g(h).find(">tr").attr("role","row");g(h).find(">tr>th, >tr>td").addClass(n.sHeaderTH);g(i).find(">tr>th, >tr>td").addClass(n.sFooterTH);if(null!==i){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=m[b],f.nTf=
+a[b].cell,f.sClass&&g(f.nTf).addClass(f.sClass)}}function ea(a,b,c){var e,d,f,h=[],i=[],j=a.aoColumns.length,n;if(b){c===l&&(c=!1);e=0;for(d=b.length;e<d;e++){h[e]=b[e].slice();h[e].nTr=b[e].nTr;for(f=j-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&h[e].splice(f,1);i.push([])}e=0;for(d=h.length;e<d;e++){if(a=h[e].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=h[e].length;f<b;f++)if(n=j=1,i[e][f]===l){a.appendChild(h[e][f].cell);for(i[e][f]=1;h[e+j]!==l&&h[e][f].cell==h[e+j][f].cell;)i[e+j][f]=1,j++;
+for(;h[e][f+n]!==l&&h[e][f].cell==h[e][f+n].cell;){for(c=0;c<j;c++)i[e+c][f+n]=1;n++}g(h[e][f].cell).attr("rowspan",j).attr("colspan",n)}}}}function L(a){var b=u(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==g.inArray(!1,b))B(a,!1);else{var b=[],c=0,e=a.asStripeClasses,d=e.length,f=a.oLanguage,h=a.iInitDisplayStart,i="ssp"==A(a),j=a.aiDisplay;a.bDrawing=!0;h!==l&&-1!==h&&(a._iDisplayStart=i?h:h>=a.fnRecordsDisplay()?0:h,a.iInitDisplayStart=-1);var h=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=
+!1,a.iDraw++,B(a,!1);else if(i){if(!a.bDestroying&&!jb(a))return}else a.iDraw++;if(0!==j.length){f=i?a.aoData.length:n;for(i=i?0:h;i<f;i++){var m=j[i],o=a.aoData[m];null===o.nTr&&Ia(a,m);m=o.nTr;if(0!==d){var k=e[c%d];o._sRowStripe!=k&&(g(m).removeClass(o._sRowStripe).addClass(k),o._sRowStripe=k)}u(a,"aoRowCallback",null,[m,o._aData,c,i]);b.push(m);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==A(a)?c=f.sLoadingRecords:f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=g("<tr/>",{"class":d?
+e[0]:""}).append(g("<td />",{valign:"top",colSpan:aa(a),"class":a.oClasses.sRowEmpty}).html(c))[0];u(a,"aoHeaderCallback","header",[g(a.nTHead).children("tr")[0],Ka(a),h,n,j]);u(a,"aoFooterCallback","footer",[g(a.nTFoot).children("tr")[0],Ka(a),h,n,j]);e=g(a.nTBody);e.children().detach();e.append(g(b));u(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function M(a,b){var c=a.oFeatures,e=c.bFilter;c.bSort&&kb(a);e?fa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();
+!0!==b&&(a._iDisplayStart=0);a._drawHold=b;L(a);a._drawHold=!1}function lb(a){var b=a.oClasses,c=g(a.nTable),c=g("<div/>").insertBefore(c),e=a.oFeatures,d=g("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=d[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),h,i,j,n,m,o,k=0;k<f.length;k++){h=null;i=f[k];if("<"==i){j=g("<div/>")[0];n=f[k+1];if("'"==n||'"'==n){m="";for(o=2;f[k+o]!=n;)m+=f[k+o],o++;"H"==m?m=b.sJUIHeader:
+"F"==m&&(m=b.sJUIFooter);-1!=m.indexOf(".")?(n=m.split("."),j.id=n[0].substr(1,n[0].length-1),j.className=n[1]):"#"==m.charAt(0)?j.id=m.substr(1,m.length-1):j.className=m;k+=o}d.append(j);d=g(j)}else if(">"==i)d=d.parent();else if("l"==i&&e.bPaginate&&e.bLengthChange)h=mb(a);else if("f"==i&&e.bFilter)h=nb(a);else if("r"==i&&e.bProcessing)h=ob(a);else if("t"==i)h=pb(a);else if("i"==i&&e.bInfo)h=qb(a);else if("p"==i&&e.bPaginate)h=rb(a);else if(0!==p.ext.feature.length){j=p.ext.feature;o=0;for(n=j.length;o<
+n;o++)if(i==j[o].cFeature){h=j[o].fnInit(a);break}}h&&(j=a.aanFeatures,j[i]||(j[i]=[]),j[i].push(h),d.append(h))}c.replaceWith(d)}function da(a,b){var c=g(b).children("tr"),e,d,f,h,i,j,n,m,o,k;a.splice(0,a.length);f=0;for(j=c.length;f<j;f++)a.push([]);f=0;for(j=c.length;f<j;f++){e=c[f];for(d=e.firstChild;d;){if("TD"==d.nodeName.toUpperCase()||"TH"==d.nodeName.toUpperCase()){m=1*d.getAttribute("colspan");o=1*d.getAttribute("rowspan");m=!m||0===m||1===m?1:m;o=!o||0===o||1===o?1:o;h=0;for(i=a[f];i[h];)h++;
+n=h;k=1===m?!0:!1;for(i=0;i<m;i++)for(h=0;h<o;h++)a[f+h][n+i]={cell:d,unique:k},a[f+h].nTr=e}d=d.nextSibling}}}function pa(a,b,c){var e=[];c||(c=a.aoHeader,b&&(c=[],da(c,b)));for(var b=0,d=c.length;b<d;b++)for(var f=0,h=c[b].length;f<h;f++)if(c[b][f].unique&&(!e[f]||!a.bSortCellsTop))e[f]=c[b][f].cell;return e}function qa(a,b,c){u(a,"aoServerParams","serverParams",[b]);if(b&&g.isArray(b)){var e={},d=/(.*?)\[\]$/;g.each(b,function(a,b){var c=b.name.match(d);c?(c=c[0],e[c]||(e[c]=[]),e[c].push(b.value)):
+e[b.name]=b.value});b=e}var f,h=a.ajax,i=a.oInstance;if(g.isPlainObject(h)&&h.data){f=h.data;var j=g.isFunction(f)?f(b):f,b=g.isFunction(f)&&j?j:g.extend(!0,b,j);delete h.data}j={data:b,success:function(b){var f=b.error||b.sError;f&&a.oApi._fnLog(a,0,f);a.json=b;u(a,null,"xhr",[a,b]);c(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var f=a.oApi._fnLog;"parsererror"==c?f(a,0,"Invalid JSON response",1):4===b.readyState&&f(a,0,"Ajax error",7);B(a,!1)}};a.oAjaxData=b;u(a,null,"preXhr",
+[a,b]);a.fnServerData?a.fnServerData.call(i,a.sAjaxSource,g.map(b,function(a,b){return{name:b,value:a}}),c,a):a.sAjaxSource||"string"===typeof h?a.jqXHR=g.ajax(g.extend(j,{url:h||a.sAjaxSource})):g.isFunction(h)?a.jqXHR=h.call(i,b,c,a):(a.jqXHR=g.ajax(g.extend(j,h)),h.data=f)}function jb(a){return a.bAjaxDataGet?(a.iDraw++,B(a,!0),qa(a,sb(a),function(b){tb(a,b)}),!1):!0}function sb(a){var b=a.aoColumns,c=b.length,e=a.oFeatures,d=a.oPreviousSearch,f=a.aoPreSearchCols,h,i=[],j,n,m,o=T(a);h=a._iDisplayStart;
+j=!1!==e.bPaginate?a._iDisplayLength:-1;var k=function(a,b){i.push({name:a,value:b})};k("sEcho",a.iDraw);k("iColumns",c);k("sColumns",C(b,"sName").join(","));k("iDisplayStart",h);k("iDisplayLength",j);var l={draw:a.iDraw,columns:[],order:[],start:h,length:j,search:{value:d.sSearch,regex:d.bRegex}};for(h=0;h<c;h++)n=b[h],m=f[h],j="function"==typeof n.mData?"function":n.mData,l.columns.push({data:j,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:m.sSearch,regex:m.bRegex}}),
+k("mDataProp_"+h,j),e.bFilter&&(k("sSearch_"+h,m.sSearch),k("bRegex_"+h,m.bRegex),k("bSearchable_"+h,n.bSearchable)),e.bSort&&k("bSortable_"+h,n.bSortable);e.bFilter&&(k("sSearch",d.sSearch),k("bRegex",d.bRegex));e.bSort&&(g.each(o,function(a,b){l.order.push({column:b.col,dir:b.dir});k("iSortCol_"+a,b.col);k("sSortDir_"+a,b.dir)}),k("iSortingCols",o.length));b=p.ext.legacy.ajax;return null===b?a.sAjaxSource?i:l:b?i:l}function tb(a,b){var c=b.sEcho!==l?b.sEcho:b.draw,e=b.iTotalRecords!==l?b.iTotalRecords:
+b.recordsTotal,d=b.iTotalDisplayRecords!==l?b.iTotalDisplayRecords:b.recordsFiltered;if(c){if(1*c<a.iDraw)return;a.iDraw=1*c}na(a);a._iRecordsTotal=parseInt(e,10);a._iRecordsDisplay=parseInt(d,10);c=ra(a,b);e=0;for(d=c.length;e<d;e++)I(a,c[e]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;L(a);a._bInitComplete||sa(a,b);a.bAjaxDataGet=!0;B(a,!1)}function ra(a,b){var c=g.isPlainObject(a.ajax)&&a.ajax.dataSrc!==l?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?W(c)(b):
+b}function nb(a){var b=a.oClasses,c=a.sTableId,e=a.oLanguage,d=a.oPreviousSearch,f=a.aanFeatures,h='<input type="search" class="'+b.sFilterInput+'"/>',i=e.sSearch,i=i.match(/_INPUT_/)?i.replace("_INPUT_",h):i+h,b=g("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(g("<label/>").append(i)),f=function(){var b=!this.value?"":this.value;b!=d.sSearch&&(fa(a,{sSearch:b,bRegex:d.bRegex,bSmart:d.bSmart,bCaseInsensitive:d.bCaseInsensitive}),a._iDisplayStart=0,L(a))},h=null!==a.searchDelay?a.searchDelay:
+"ssp"===A(a)?400:0,j=g("input",b).val(d.sSearch).attr("placeholder",e.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT",h?ta(f,h):f).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);g(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{j[0]!==P.activeElement&&j.val(d.sSearch)}catch(f){}});return b[0]}function fa(a,b,c){var e=a.oPreviousSearch,d=a.aoPreSearchCols,f=function(a){e.sSearch=a.sSearch;e.bRegex=a.bRegex;e.bSmart=a.bSmart;e.bCaseInsensitive=
+a.bCaseInsensitive};Ga(a);if("ssp"!=A(a)){ub(a,b.sSearch,c,b.bEscapeRegex!==l?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<d.length;b++)vb(a,d[b].sSearch,b,d[b].bEscapeRegex!==l?!d[b].bEscapeRegex:d[b].bRegex,d[b].bSmart,d[b].bCaseInsensitive);wb(a)}else f(b);a.bFiltered=!0;u(a,null,"search",[a])}function wb(a){for(var b=p.ext.search,c=a.aiDisplay,e,d,f=0,h=b.length;f<h;f++){for(var i=[],j=0,g=c.length;j<g;j++)d=c[j],e=a.aoData[d],b[f](a,e._aFilterData,d,e._aData,j)&&i.push(d);
+c.length=0;c.push.apply(c,i)}}function vb(a,b,c,e,d,f){if(""!==b)for(var h=a.aiDisplay,e=Pa(b,e,d,f),d=h.length-1;0<=d;d--)b=a.aoData[h[d]]._aFilterData[c],e.test(b)||h.splice(d,1)}function ub(a,b,c,e,d,f){var e=Pa(b,e,d,f),d=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,h;0!==p.ext.search.length&&(c=!0);h=xb(a);if(0>=b.length)a.aiDisplay=f.slice();else{if(h||c||d.length>b.length||0!==b.indexOf(d)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=c;c--)e.test(a.aoData[b[c]]._sFilterRow)||
+b.splice(c,1)}}function Pa(a,b,c,e){a=b?a:ua(a);c&&(a="^(?=.*?"+g.map(a.match(/"[^"]+"|[^ ]+/g)||"",function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,e?"i":"")}function ua(a){return a.replace(Xb,"\\$1")}function xb(a){var b=a.aoColumns,c,e,d,f,h,i,g,n,m=p.ext.type.search;c=!1;e=0;for(f=a.aoData.length;e<f;e++)if(n=a.aoData[e],!n._aFilterData){i=[];d=0;for(h=b.length;d<h;d++)c=b[d],c.bSearchable?(g=v(a,e,d,"filter"),
+m[c.sType]&&(g=m[c.sType](g)),null===g&&(g=""),"string"!==typeof g&&g.toString&&(g=g.toString())):g="",g.indexOf&&-1!==g.indexOf("&")&&(va.innerHTML=g,g=Yb?va.textContent:va.innerText),g.replace&&(g=g.replace(/[\r\n]/g,"")),i.push(g);n._aFilterData=i;n._sFilterRow=i.join(" ");c=!0}return c}function yb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function zb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}
+function qb(a){var b=a.sTableId,c=a.aanFeatures.i,e=g("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Ab,sName:"information"}),e.attr("role","status").attr("aria-live","polite"),g(a.nTable).attr("aria-describedby",b+"_info"));return e[0]}function Ab(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,e=a._iDisplayStart+1,d=a.fnDisplayEnd(),f=a.fnRecordsTotal(),h=a.fnRecordsDisplay(),i=h?c.sInfo:c.sInfoEmpty;h!==f&&(i+=" "+c.sInfoFiltered);i+=c.sInfoPostFix;
+i=Bb(a,i);c=c.fnInfoCallback;null!==c&&(i=c.call(a.oInstance,a,e,d,f,h,i));g(b).html(i)}}function Bb(a,b){var c=a.fnFormatNumber,e=a._iDisplayStart+1,d=a._iDisplayLength,f=a.fnRecordsDisplay(),h=-1===d;return b.replace(/_START_/g,c.call(a,e)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,f)).replace(/_PAGE_/g,c.call(a,h?1:Math.ceil(e/d))).replace(/_PAGES_/g,c.call(a,h?1:Math.ceil(f/d)))}function ga(a){var b,c,e=a.iInitDisplayStart,
+d=a.aoColumns,f;c=a.oFeatures;if(a.bInitialised){lb(a);ib(a);ea(a,a.aoHeader);ea(a,a.aoFooter);B(a,!0);c.bAutoWidth&&Fa(a);b=0;for(c=d.length;b<c;b++)f=d[b],f.sWidth&&(f.nTh.style.width=s(f.sWidth));M(a);d=A(a);"ssp"!=d&&("ajax"==d?qa(a,[],function(c){var f=ra(a,c);for(b=0;b<f.length;b++)I(a,f[b]);a.iInitDisplayStart=e;M(a);B(a,!1);sa(a,c)},a):(B(a,!1),sa(a)))}else setTimeout(function(){ga(a)},200)}function sa(a,b){a._bInitComplete=!0;b&&X(a);u(a,"aoInitComplete","init",[a,b])}function Qa(a,b){var c=
+parseInt(b,10);a._iDisplayLength=c;Ra(a);u(a,null,"length",[a,c])}function mb(a){for(var b=a.oClasses,c=a.sTableId,e=a.aLengthMenu,d=g.isArray(e[0]),f=d?e[0]:e,e=d?e[1]:e,d=g("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),h=0,i=f.length;h<i;h++)d[0][h]=new Option(e[h],f[h]);var j=g("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(j[0].id=c+"_length");j.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",d[0].outerHTML));g("select",j).val(a._iDisplayLength).bind("change.DT",
+function(){Qa(a,g(this).val());L(a)});g(a.nTable).bind("length.dt.DT",function(b,c,f){a===c&&g("select",j).val(f)});return j[0]}function rb(a){var b=a.sPaginationType,c=p.ext.pager[b],e="function"===typeof c,d=function(a){L(a)},b=g("<div/>").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;e||c.fnInit(a,b,d);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(e){var b=a._iDisplayStart,g=a._iDisplayLength,n=a.fnRecordsDisplay(),m=-1===g,b=m?0:Math.ceil(b/g),g=m?1:Math.ceil(n/
+g),n=c(b,g),o,m=0;for(o=f.p.length;m<o;m++)Oa(a,"pageButton")(a,f.p[m],m,n,b,g)}else c.fnUpdate(a,d)},sName:"pagination"}));return b}function Sa(a,b,c){var e=a._iDisplayStart,d=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===d?e=0:"number"===typeof b?(e=b*d,e>f&&(e=0)):"first"==b?e=0:"previous"==b?(e=0<=d?e-d:0,0>e&&(e=0)):"next"==b?e+d<f&&(e+=d):"last"==b?e=Math.floor((f-1)/d)*d:R(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==e;a._iDisplayStart=e;b&&(u(a,null,"page",[a]),c&&L(a));
+return b}function ob(a){return g("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function B(a,b){a.oFeatures.bProcessing&&g(a.aanFeatures.r).css("display",b?"block":"none");u(a,null,"processing",[a,b])}function pb(a){var b=g(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var e=c.sX,d=c.sY,f=a.oClasses,h=b.children("caption"),i=h.length?h[0]._captionSide:null,
+j=g(b[0].cloneNode(!1)),n=g(b[0].cloneNode(!1)),m=b.children("tfoot");c.sX&&"100%"===b.attr("width")&&b.removeAttr("width");m.length||(m=null);c=g("<div/>",{"class":f.sScrollWrapper}).append(g("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:e?!e?null:s(e):"100%"}).append(g("<div/>",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(j.removeAttr("id").css("margin-left",0).append("top"===i?h:null).append(b.children("thead"))))).append(g("<div/>",
+{"class":f.sScrollBody}).css({overflow:"auto",height:!d?null:s(d),width:!e?null:s(e)}).append(b));m&&c.append(g("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:e?!e?null:s(e):"100%"}).append(g("<div/>",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",0).append("bottom"===i?h:null).append(b.children("tfoot")))));var b=c.children(),o=b[0],f=b[1],k=m?b[2]:null;e&&g(f).scroll(function(){var a=this.scrollLeft;o.scrollLeft=a;m&&(k.scrollLeft=a)});a.nScrollHead=
+o;a.nScrollBody=f;a.nScrollFoot=k;a.aoDrawCallback.push({fn:Y,sName:"scrolling"});return c[0]}function Y(a){var b=a.oScroll,c=b.sX,e=b.sXInner,d=b.sY,f=b.iBarWidth,h=g(a.nScrollHead),i=h[0].style,j=h.children("div"),n=j[0].style,m=j.children("table"),j=a.nScrollBody,o=g(j),k=j.style,l=g(a.nScrollFoot).children("div"),p=l.children("table"),r=g(a.nTHead),q=g(a.nTable),t=q[0],N=t.style,J=a.nTFoot?g(a.nTFoot):null,u=a.oBrowser,w=u.bScrollOversize,y,v,x,K,z,A=[],B=[],C=[],D,E=function(a){a=a.style;a.paddingTop=
+"0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};q.children("thead, tfoot").remove();z=r.clone().prependTo(q);y=r.find("tr");x=z.find("tr");z.find("th, td").removeAttr("tabindex");J&&(K=J.clone().prependTo(q),v=J.find("tr"),K=K.find("tr"));c||(k.width="100%",h[0].style.width="100%");g.each(pa(a,z),function(b,c){D=ka(a,b);c.style.width=a.aoColumns[D].sWidth});J&&F(function(a){a.style.width=""},K);b.bCollapse&&""!==d&&(k.height=o[0].offsetHeight+r[0].offsetHeight+"px");
+h=q.outerWidth();if(""===c){if(N.width="100%",w&&(q.find("tbody").height()>j.offsetHeight||"scroll"==o.css("overflow-y")))N.width=s(q.outerWidth()-f)}else""!==e?N.width=s(e):h==o.width()&&o.height()<q.height()?(N.width=s(h-f),q.outerWidth()>h-f&&(N.width=s(h))):N.width=s(h);h=q.outerWidth();F(E,x);F(function(a){C.push(a.innerHTML);A.push(s(g(a).css("width")))},x);F(function(a,b){a.style.width=A[b]},y);g(x).height(0);J&&(F(E,K),F(function(a){B.push(s(g(a).css("width")))},K),F(function(a,b){a.style.width=
+B[b]},v),g(K).height(0));F(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+C[b]+"</div>";a.style.width=A[b]},x);J&&F(function(a,b){a.innerHTML="";a.style.width=B[b]},K);if(q.outerWidth()<h){v=j.scrollHeight>j.offsetHeight||"scroll"==o.css("overflow-y")?h+f:h;if(w&&(j.scrollHeight>j.offsetHeight||"scroll"==o.css("overflow-y")))N.width=s(v-f);(""===c||""!==e)&&R(a,1,"Possible column misalignment",6)}else v="100%";k.width=s(v);i.width=s(v);J&&(a.nScrollFoot.style.width=
+s(v));!d&&w&&(k.height=s(t.offsetHeight+f));d&&b.bCollapse&&(k.height=s(d),b=c&&t.offsetWidth>j.offsetWidth?f:0,t.offsetHeight<j.offsetHeight&&(k.height=s(t.offsetHeight+b)));b=q.outerWidth();m[0].style.width=s(b);n.width=s(b);m=q.height()>j.clientHeight||"scroll"==o.css("overflow-y");u="padding"+(u.bScrollbarLeft?"Left":"Right");n[u]=m?f+"px":"0px";J&&(p[0].style.width=s(b),l[0].style.width=s(b),l[0].style[u]=m?f+"px":"0px");o.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}function F(a,
+b,c){for(var e=0,d=0,f=b.length,h,g;d<f;){h=b[d].firstChild;for(g=c?c[d].firstChild:null;h;)1===h.nodeType&&(c?a(h,g,e):a(h,e),e++),h=h.nextSibling,g=c?g.nextSibling:null;d++}}function Fa(a){var b=a.nTable,c=a.aoColumns,e=a.oScroll,d=e.sY,f=e.sX,h=e.sXInner,i=c.length,e=Z(a,"bVisible"),j=g("th",a.nTHead),n=b.getAttribute("width"),m=b.parentNode,o=!1,k,l;for(k=0;k<e.length;k++)l=c[e[k]],null!==l.sWidth&&(l.sWidth=Cb(l.sWidthOrig,m),o=!0);if(!o&&!f&&!d&&i==aa(a)&&i==j.length)for(k=0;k<i;k++)c[k].sWidth=
+s(j.eq(k).width());else{i=g(b).clone().empty().css("visibility","hidden").removeAttr("id").append(g(a.nTHead).clone(!1)).append(g(a.nTFoot).clone(!1)).append(g("<tbody><tr/></tbody>"));i.find("tfoot th, tfoot td").css("width","");var p=i.find("tbody tr"),j=pa(a,i.find("thead")[0]);for(k=0;k<e.length;k++)l=c[e[k]],j[k].style.width=null!==l.sWidthOrig&&""!==l.sWidthOrig?s(l.sWidthOrig):"";if(a.aoData.length)for(k=0;k<e.length;k++)o=e[k],l=c[o],g(Db(a,o)).clone(!1).append(l.sContentPadding).appendTo(p);
+i.appendTo(m);f&&h?i.width(h):f?(i.css("width","auto"),i.width()<m.offsetWidth&&i.width(m.offsetWidth)):d?i.width(m.offsetWidth):n&&i.width(n);Eb(a,i[0]);if(f){for(k=h=0;k<e.length;k++)l=c[e[k]],d=g(j[k]).outerWidth(),h+=null===l.sWidthOrig?d:parseInt(l.sWidth,10)+d-g(j[k]).width();i.width(s(h));b.style.width=s(h)}for(k=0;k<e.length;k++)if(l=c[e[k]],d=g(j[k]).width())l.sWidth=s(d);b.style.width=s(i.css("width"));i.remove()}n&&(b.style.width=s(n));if((n||f)&&!a._reszEvt)g(Da).bind("resize.DT-"+a.sInstance,
+ta(function(){X(a)})),a._reszEvt=!0}function ta(a,b){var c=b!==l?b:200,e,d;return function(){var b=this,h=+new Date,g=arguments;e&&h<e+c?(clearTimeout(d),d=setTimeout(function(){e=l;a.apply(b,g)},c)):e?(e=h,a.apply(b,g)):e=h}}function Cb(a,b){if(!a)return 0;var c=g("<div/>").css("width",s(a)).appendTo(b||P.body),e=c[0].offsetWidth;c.remove();return e}function Eb(a,b){var c=a.oScroll;if(c.sX||c.sY)c=!c.sX?c.iBarWidth:0,b.style.width=s(g(b).outerWidth()-c)}function Db(a,b){var c=Fb(a,b);if(0>c)return null;
+var e=a.aoData[c];return!e.nTr?g("<td/>").html(v(a,c,b,"display"))[0]:e.anCells[b]}function Fb(a,b){for(var c,e=-1,d=-1,f=0,h=a.aoData.length;f<h;f++)c=v(a,f,b,"display")+"",c=c.replace(Zb,""),c.length>e&&(e=c.length,d=f);return d}function s(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Gb(){if(!p.__scrollbarWidth){var a=g("<p/>").css({width:"100%",height:200,padding:0})[0],b=g("<div/>").css({position:"absolute",top:0,left:0,width:200,height:150,padding:0,
+overflow:"hidden",visibility:"hidden"}).append(a).appendTo("body"),c=a.offsetWidth;b.css("overflow","scroll");a=a.offsetWidth;c===a&&(a=b[0].clientWidth);b.remove();p.__scrollbarWidth=c-a}return p.__scrollbarWidth}function T(a){var b,c,e=[],d=a.aoColumns,f,h,i,j;b=a.aaSortingFixed;c=g.isPlainObject(b);var n=[];f=function(a){a.length&&!g.isArray(a[0])?n.push(a):n.push.apply(n,a)};g.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<n.length;a++){j=n[a][0];f=d[j].aDataSort;
+b=0;for(c=f.length;b<c;b++)h=f[b],i=d[h].sType||"string",n[a]._idx===l&&(n[a]._idx=g.inArray(n[a][1],d[h].asSorting)),e.push({src:j,col:h,dir:n[a][1],index:n[a]._idx,type:i,formatter:p.ext.type.order[i+"-pre"]})}return e}function kb(a){var b,c,e=[],d=p.ext.type.order,f=a.aoData,h=0,g,j=a.aiDisplayMaster,n;Ga(a);n=T(a);b=0;for(c=n.length;b<c;b++)g=n[b],g.formatter&&h++,Hb(a,g.col);if("ssp"!=A(a)&&0!==n.length){b=0;for(c=j.length;b<c;b++)e[j[b]]=b;h===n.length?j.sort(function(a,b){var c,d,h,g,i=n.length,
+j=f[a]._aSortData,l=f[b]._aSortData;for(h=0;h<i;h++)if(g=n[h],c=j[g.col],d=l[g.col],c=c<d?-1:c>d?1:0,0!==c)return"asc"===g.dir?c:-c;c=e[a];d=e[b];return c<d?-1:c>d?1:0}):j.sort(function(a,b){var c,h,g,i,j=n.length,l=f[a]._aSortData,p=f[b]._aSortData;for(g=0;g<j;g++)if(i=n[g],c=l[i.col],h=p[i.col],i=d[i.type+"-"+i.dir]||d["string-"+i.dir],c=i(c,h),0!==c)return c;c=e[a];h=e[b];return c<h?-1:c>h?1:0})}a.bSorted=!0}function Ib(a){for(var b,c,e=a.aoColumns,d=T(a),a=a.oLanguage.oAria,f=0,h=e.length;f<h;f++){c=
+e[f];var g=c.asSorting;b=c.sTitle.replace(/<.*?>/g,"");var j=c.nTh;j.removeAttribute("aria-sort");c.bSortable&&(0<d.length&&d[0].col==f?(j.setAttribute("aria-sort","asc"==d[0].dir?"ascending":"descending"),c=g[d[0].index+1]||g[0]):c=g[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);j.setAttribute("aria-label",b)}}function Ta(a,b,c,e){var d=a.aaSorting,f=a.aoColumns[b].asSorting,h=function(a,b){var c=a._idx;c===l&&(c=g.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof d[0]&&
+(d=a.aaSorting=[d]);c&&a.oFeatures.bSortMulti?(c=g.inArray(b,C(d,"0")),-1!==c?(b=h(d[c],!0),null===b?d.splice(c,1):(d[c][1]=f[b],d[c]._idx=b)):(d.push([b,f[0],0]),d[d.length-1]._idx=0)):d.length&&d[0][0]==b?(b=h(d[0]),d.length=1,d[0][1]=f[b],d[0]._idx=b):(d.length=0,d.push([b,f[0]]),d[0]._idx=0);M(a);"function"==typeof e&&e(a)}function Na(a,b,c,e){var d=a.aoColumns[c];Ua(b,{},function(b){!1!==d.bSortable&&(a.oFeatures.bProcessing?(B(a,!0),setTimeout(function(){Ta(a,c,b.shiftKey,e);"ssp"!==A(a)&&B(a,
+!1)},0)):Ta(a,c,b.shiftKey,e))})}function wa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,e=T(a),d=a.oFeatures,f,h;if(d.bSort&&d.bSortClasses){d=0;for(f=b.length;d<f;d++)h=b[d].src,g(C(a.aoData,"anCells",h)).removeClass(c+(2>d?d+1:3));d=0;for(f=e.length;d<f;d++)h=e[d].src,g(C(a.aoData,"anCells",h)).addClass(c+(2>d?d+1:3))}a.aLastSort=e}function Hb(a,b){var c=a.aoColumns[b],e=p.ext.order[c.sSortDataType],d;e&&(d=e.call(a.oInstance,a,b,$(a,b)));for(var f,h=p.ext.type.order[c.sType+"-pre"],g=0,j=a.aoData.length;g<
+j;g++)if(c=a.aoData[g],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||e)f=e?d[g]:v(a,g,b,"sort"),c._aSortData[b]=h?h(f):f}function xa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:g.extend(!0,[],a.aaSorting),search:yb(a.oPreviousSearch),columns:g.map(a.aoColumns,function(b,e){return{visible:b.bVisible,search:yb(a.aoPreSearchCols[e])}})};u(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,
+a,b)}}function Jb(a){var b,c,e=a.aoColumns;if(a.oFeatures.bStateSave){var d=a.fnStateLoadCallback.call(a.oInstance,a);if(d&&d.time&&(b=u(a,"aoStateLoadParams","stateLoadParams",[a,d]),-1===g.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&d.time<+new Date-1E3*b)&&e.length===d.columns.length))){a.oLoadedState=g.extend(!0,{},d);a._iDisplayStart=d.start;a.iInitDisplayStart=d.start;a._iDisplayLength=d.length;a.aaSorting=[];g.each(d.order,function(b,c){a.aaSorting.push(c[0]>=e.length?[0,c[1]]:c)});g.extend(a.oPreviousSearch,
+zb(d.search));b=0;for(c=d.columns.length;b<c;b++){var f=d.columns[b];e[b].bVisible=f.visible;g.extend(a.aoPreSearchCols[b],zb(f.search))}u(a,"aoStateLoaded","stateLoaded",[a,d])}}}function ya(a){var b=p.settings,a=g.inArray(a,C(b,"nTable"));return-1!==a?b[a]:null}function R(a,b,c,e){c="DataTables warning: "+(null!==a?"table id="+a.sTableId+" - ":"")+c;e&&(c+=". For more information about this error, please see http://datatables.net/tn/"+e);if(b)Da.console&&console.log&&console.log(c);else if(a=p.ext,
+"alert"==(a.sErrMode||a.errMode))alert(c);else throw Error(c);}function D(a,b,c,e){g.isArray(c)?g.each(c,function(c,f){g.isArray(f)?D(a,b,f[0],f[1]):D(a,b,f)}):(e===l&&(e=c),b[c]!==l&&(a[e]=b[c]))}function Kb(a,b,c){var e,d;for(d in b)b.hasOwnProperty(d)&&(e=b[d],g.isPlainObject(e)?(g.isPlainObject(a[d])||(a[d]={}),g.extend(!0,a[d],e)):a[d]=c&&"data"!==d&&"aaData"!==d&&g.isArray(e)?e.slice():e);return a}function Ua(a,b,c){g(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",b,function(a){13===
+a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function x(a,b,c,e){c&&a[b].push({fn:c,sName:e})}function u(a,b,c,e){var d=[];b&&(d=g.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,e)}));null!==c&&g(a.nTable).trigger(c+".dt",e);return d}function Ra(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),e=a._iDisplayLength;b>=c&&(b=c-e);b-=b%e;if(-1===e||0>b)b=0;a._iDisplayStart=b}function Oa(a,b){var c=a.renderer,e=p.ext.renderer[b];return g.isPlainObject(c)&&
+c[b]?e[c[b]]||e._:"string"===typeof c?e[c]||e._:e._}function A(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Va(a,b){var c=[],c=Lb.numbers_length,e=Math.floor(c/2);b<=c?c=U(0,b):a<=e?(c=U(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-e?c=U(b-(c-2),b):(c=U(a-1,a+2),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function cb(a){g.each({num:function(b){return za(b,a)},"num-fmt":function(b){return za(b,a,Wa)},"html-num":function(b){return za(b,
+a,Aa)},"html-num-fmt":function(b){return za(b,a,Aa,Wa)}},function(b,c){w.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(w.type.search[b+a]=w.type.search.html)})}function Mb(a){return function(){var b=[ya(this[p.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return p.ext.internal[a].apply(this,b)}}var p,w,q,r,t,Xa={},Nb=/[\r\n]/g,Aa=/<.*?>/g,$b=/^[\w\+\-]/,ac=/[\w\+\-]$/,Xb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Wa=/[',$\u00a3\u20ac\u00a5%\u2009\u202F]/g,
+H=function(a){return!a||!0===a||"-"===a?!0:!1},Ob=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Pb=function(a,b){Xa[b]||(Xa[b]=RegExp(ua(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Xa[b],"."):a},Ya=function(a,b,c){var e="string"===typeof a;b&&e&&(a=Pb(a,b));c&&e&&(a=a.replace(Wa,""));return H(a)||!isNaN(parseFloat(a))&&isFinite(a)},Qb=function(a,b,c){return H(a)?!0:!(H(a)||"string"===typeof a)?null:Ya(a.replace(Aa,""),b,c)?!0:null},C=function(a,
+b,c){var e=[],d=0,f=a.length;if(c!==l)for(;d<f;d++)a[d]&&a[d][b]&&e.push(a[d][b][c]);else for(;d<f;d++)a[d]&&e.push(a[d][b]);return e},ha=function(a,b,c,e){var d=[],f=0,h=b.length;if(e!==l)for(;f<h;f++)a[b[f]][c]&&d.push(a[b[f]][c][e]);else for(;f<h;f++)d.push(a[b[f]][c]);return d},U=function(a,b){var c=[],e;b===l?(b=0,e=a):(e=b,b=a);for(var d=b;d<e;d++)c.push(d);return c},Rb=function(a){for(var b=[],c=0,e=a.length;c<e;c++)a[c]&&b.push(a[c]);return b},Ma=function(a){var b=[],c,e,d=a.length,f,h=0;
+e=0;a:for(;e<d;e++){c=a[e];for(f=0;f<h;f++)if(b[f]===c)continue a;b.push(c);h++}return b},z=function(a,b,c){a[b]!==l&&(a[c]=a[b])},ba=/\[.*?\]$/,S=/\(\)$/,va=g("<div>")[0],Yb=va.textContent!==l,Zb=/<.*?>/g;p=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new q(ya(this[w.iApiIndex])):new q(this)};this.fnAddData=function(a,b){var c=this.api(!0),e=g.isArray(a)&&(g.isArray(a[0])||g.isPlainObject(a[0]))?
+c.rows.add(a):c.row.add(a);(b===l||b)&&c.draw();return e.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],e=c.oScroll;a===l||a?b.draw(!1):(""!==e.sX||""!==e.sY)&&Y(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===l||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var e=this.api(!0),a=e.rows(a),d=a.settings()[0],g=d.aoData[a[0][0]];a.remove();b&&b.call(this,d,g);
+(c===l||c)&&e.draw();return g};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(!a)};this.fnFilter=function(a,b,c,e,d,g){d=this.api(!0);null===b||b===l?d.search(a,c,e,g):d.column(b).search(a,c,e,g);d.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==l){var e=a.nodeName?a.nodeName.toLowerCase():"";return b!==l||"td"==e||"th"==e?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);
+return a!==l?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===l||b)&&c.draw(!1)};this.fnSetColumnVis=
+function(a,b,c){a=this.api(!0).column(a).visible(b);(c===l||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return ya(this[w.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,e,d){var g=this.api(!0);c===l||null===c?g.row(b).data(a):g.cell(b,c).data(a);(d===l||d)&&g.columns.adjust();(e===l||e)&&g.draw();return 0};this.fnVersionCheck=w.fnVersionCheck;var b=this,c=a===l,e=this.length;
+c&&(a={});this.oApi=this.internal=w.internal;for(var d in p.ext.internal)d&&(this[d]=Mb(d));this.each(function(){var d={},d=1<e?Kb(d,a,!0):a,h=0,i,j=this.getAttribute("id"),n=!1,m=p.defaults;if("table"!=this.nodeName.toLowerCase())R(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{db(m);eb(m.column);G(m,m,!0);G(m.column,m.column,!0);G(m,d);var o=p.settings,h=0;for(i=o.length;h<i;h++){if(o[h].nTable==this){i=d.bRetrieve!==l?d.bRetrieve:m.bRetrieve;if(c||i)return o[h].oInstance;if(d.bDestroy!==
+l?d.bDestroy:m.bDestroy){o[h].oInstance.fnDestroy();break}else{R(o[h],0,"Cannot reinitialise DataTable",3);return}}if(o[h].sTableId==this.id){o.splice(h,1);break}}if(null===j||""===j)this.id=j="DataTables_Table_"+p.ext._unique++;var k=g.extend(!0,{},p.models.oSettings,{nTable:this,oApi:b.internal,oInit:d,sDestroyWidth:g(this)[0].style.width,sInstance:j,sTableId:j});o.push(k);k.oInstance=1===b.length?b:g(this).dataTable();db(d);d.oLanguage&&O(d.oLanguage);d.aLengthMenu&&!d.iDisplayLength&&(d.iDisplayLength=
+g.isArray(d.aLengthMenu[0])?d.aLengthMenu[0][0]:d.aLengthMenu[0]);d=Kb(g.extend(!0,{},m),d);D(k.oFeatures,d,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));D(k,d,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback",
+"renderer","searchDelay",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);D(k.oScroll,d,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);D(k.oLanguage,d,"fnInfoCallback");x(k,"aoDrawCallback",d.fnDrawCallback,"user");x(k,"aoServerParams",d.fnServerParams,"user");x(k,"aoStateSaveParams",d.fnStateSaveParams,"user");x(k,"aoStateLoadParams",
+d.fnStateLoadParams,"user");x(k,"aoStateLoaded",d.fnStateLoaded,"user");x(k,"aoRowCallback",d.fnRowCallback,"user");x(k,"aoRowCreatedCallback",d.fnCreatedRow,"user");x(k,"aoHeaderCallback",d.fnHeaderCallback,"user");x(k,"aoFooterCallback",d.fnFooterCallback,"user");x(k,"aoInitComplete",d.fnInitComplete,"user");x(k,"aoPreDrawCallback",d.fnPreDrawCallback,"user");j=k.oClasses;d.bJQueryUI?(g.extend(j,p.ext.oJUIClasses,d.oClasses),d.sDom===m.sDom&&"lfrtip"===m.sDom&&(k.sDom='<"H"lfr>t<"F"ip>'),k.renderer)?
+g.isPlainObject(k.renderer)&&!k.renderer.header&&(k.renderer.header="jqueryui"):k.renderer="jqueryui":g.extend(j,p.ext.classes,d.oClasses);g(this).addClass(j.sTable);if(""!==k.oScroll.sX||""!==k.oScroll.sY)k.oScroll.iBarWidth=Gb();!0===k.oScroll.sX&&(k.oScroll.sX="100%");k.iInitDisplayStart===l&&(k.iInitDisplayStart=d.iDisplayStart,k._iDisplayStart=d.iDisplayStart);null!==d.iDeferLoading&&(k.bDeferLoading=!0,h=g.isArray(d.iDeferLoading),k._iRecordsDisplay=h?d.iDeferLoading[0]:d.iDeferLoading,k._iRecordsTotal=
+h?d.iDeferLoading[1]:d.iDeferLoading);var r=k.oLanguage;g.extend(!0,r,d.oLanguage);""!==r.sUrl&&(g.ajax({dataType:"json",url:r.sUrl,success:function(a){O(a);G(m.oLanguage,a);g.extend(true,r,a);ga(k)},error:function(){ga(k)}}),n=!0);null===d.asStripeClasses&&(k.asStripeClasses=[j.sStripeOdd,j.sStripeEven]);var h=k.asStripeClasses,q=g("tbody tr:eq(0)",this);-1!==g.inArray(!0,g.map(h,function(a){return q.hasClass(a)}))&&(g("tbody tr",this).removeClass(h.join(" ")),k.asDestroyStripes=h.slice());var o=
+[],s,h=this.getElementsByTagName("thead");0!==h.length&&(da(k.aoHeader,h[0]),o=pa(k));if(null===d.aoColumns){s=[];h=0;for(i=o.length;h<i;h++)s.push(null)}else s=d.aoColumns;h=0;for(i=s.length;h<i;h++)Ea(k,o?o[h]:null);hb(k,d.aoColumnDefs,s,function(a,b){ja(k,a,b)});if(q.length){var t=function(a,b){return a.getAttribute("data-"+b)?b:null};g.each(ma(k,q[0]).cells,function(a,b){var c=k.aoColumns[a];if(c.mData===a){var e=t(b,"sort")||t(b,"order"),d=t(b,"filter")||t(b,"search");if(e!==null||d!==null){c.mData=
+{_:a+".display",sort:e!==null?a+".@data-"+e:l,type:e!==null?a+".@data-"+e:l,filter:d!==null?a+".@data-"+d:l};ja(k,a)}}})}var v=k.oFeatures;d.bStateSave&&(v.bStateSave=!0,Jb(k,d),x(k,"aoDrawCallback",xa,"state_save"));if(d.aaSorting===l){o=k.aaSorting;h=0;for(i=o.length;h<i;h++)o[h][1]=k.aoColumns[h].asSorting[0]}wa(k);v.bSort&&x(k,"aoDrawCallback",function(){if(k.bSorted){var a=T(k),b={};g.each(a,function(a,c){b[c.src]=c.dir});u(k,null,"order",[k,a,b]);Ib(k)}});x(k,"aoDrawCallback",function(){(k.bSorted||
+A(k)==="ssp"||v.bDeferRender)&&wa(k)},"sc");fb(k);h=g(this).children("caption").each(function(){this._captionSide=g(this).css("caption-side")});i=g(this).children("thead");0===i.length&&(i=g("<thead/>").appendTo(this));k.nTHead=i[0];i=g(this).children("tbody");0===i.length&&(i=g("<tbody/>").appendTo(this));k.nTBody=i[0];i=g(this).children("tfoot");if(0===i.length&&0<h.length&&(""!==k.oScroll.sX||""!==k.oScroll.sY))i=g("<tfoot/>").appendTo(this);0===i.length||0===i.children().length?g(this).addClass(j.sNoFooter):
+0<i.length&&(k.nTFoot=i[0],da(k.aoFooter,k.nTFoot));if(d.aaData)for(h=0;h<d.aaData.length;h++)I(k,d.aaData[h]);else(k.bDeferLoading||"dom"==A(k))&&la(k,g(k.nTBody).children("tr"));k.aiDisplay=k.aiDisplayMaster.slice();k.bInitialised=!0;!1===n&&ga(k)}});b=null;return this};var Sb=[],y=Array.prototype,bc=function(a){var b,c,e=p.settings,d=g.map(e,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=g.inArray(a,d),-1!==b?[e[b]]:
+null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=g(a):a instanceof g&&(c=a)}else return[];if(c)return c.map(function(){b=g.inArray(this,d);return-1!==b?e[b]:null}).toArray()};q=function(a,b){if(!this instanceof q)throw"DT API must be constructed as a new object";var c=[],e=function(a){(a=bc(a))&&c.push.apply(c,a)};if(g.isArray(a))for(var d=0,f=a.length;d<f;d++)e(a[d]);else e(a);this.context=Ma(c);b&&this.push.apply(this,b.toArray?b.toArray():b);this.selector=
+{rows:null,cols:null,opts:null};q.extend(this,this,Sb)};p.Api=q;q.prototype={concat:y.concat,context:[],each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new q(b[a],this[a]):null},filter:function(a){var b=[];if(y.filter)b=y.filter.call(this,a,this);else for(var c=0,e=this.length;c<e;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new q(this.context,b)},flatten:function(){var a=[];return new q(this.context,
+a.concat.apply(a,this.toArray()))},join:y.join,indexOf:y.indexOf||function(a,b){for(var c=b||0,e=this.length;c<e;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,e){var d=[],f,h,g,j,n,m=this.context,o,k,p=this.selector;"string"===typeof a&&(e=c,c=b,b=a,a=!1);h=0;for(g=m.length;h<g;h++){var r=new q(m[h]);if("table"===b)f=c.call(r,m[h],h),f!==l&&d.push(f);else if("columns"===b||"rows"===b)f=c.call(r,m[h],this[h],h),f!==l&&d.push(f);else if("column"===b||"column-rows"===b||"row"===b||"cell"===
+b){k=this[h];"column-rows"===b&&(o=Ba(m[h],p.opts));j=0;for(n=k.length;j<n;j++)f=k[j],f="cell"===b?c.call(r,m[h],f.row,f.column,h,j):c.call(r,m[h],f,h,j,o),f!==l&&d.push(f)}}return d.length||e?(a=new q(m,a?d.concat.apply([],d):d),b=a.selector,b.rows=p.rows,b.cols=p.cols,b.opts=p.opts,a):this},lastIndexOf:y.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(y.map)b=y.map.call(this,a,this);else for(var c=0,e=this.length;c<e;c++)b.push(a.call(this,
+this[c],c));return new q(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:y.pop,push:y.push,reduce:y.reduce||function(a,b){return gb(this,a,b,0,this.length,1)},reduceRight:y.reduceRight||function(a,b){return gb(this,a,b,this.length-1,-1,-1)},reverse:y.reverse,selector:null,shift:y.shift,sort:y.sort,splice:y.splice,toArray:function(){return y.slice.call(this)},to$:function(){return g(this)},toJQuery:function(){return g(this)},unique:function(){return new q(this.context,
+Ma(this))},unshift:y.unshift};q.extend=function(a,b,c){if(b&&(b instanceof q||b.__dt_wrapper)){var e,d,f,h=function(a,b,c){return function(){var e=b.apply(a,arguments);q.extend(e,e,c.methodExt);return e}};e=0;for(d=c.length;e<d;e++)f=c[e],b[f.name]="function"===typeof f.val?h(a,f.val,f):g.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,q.extend(a,b[f.name],f.propExt)}};q.register=r=function(a,b){if(g.isArray(a))for(var c=0,e=a.length;c<e;c++)q.register(a[c],b);else for(var d=a.split("."),
+f=Sb,h,i,c=0,e=d.length;c<e;c++){h=(i=-1!==d[c].indexOf("()"))?d[c].replace("()",""):d[c];var j;a:{j=0;for(var n=f.length;j<n;j++)if(f[j].name===h){j=f[j];break a}j=null}j||(j={name:h,val:{},methodExt:[],propExt:[]},f.push(j));c===e-1?j.val=b:f=i?j.methodExt:j.propExt}};q.registerPlural=t=function(a,b,c){q.register(a,c);q.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof q?a.length?g.isArray(a[0])?new q(a.context,a[0]):a[0]:l:a})};r("tables()",function(a){var b;
+if(a){b=q;var c=this.context;if("number"===typeof a)a=[c[a]];else var e=g.map(c,function(a){return a.nTable}),a=g(e).filter(a).map(function(){var a=g.inArray(this,e);return c[a]}).toArray();b=new b(a)}else b=this;return b});r("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new q(b[0]):a});t("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});t("tables().body()","table().body()",function(){return this.iterator("table",
+function(a){return a.nTBody},1)});t("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});t("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});t("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});r("draw()",function(a){return this.iterator("table",function(b){M(b,!1===a)})});r("page()",function(a){return a===
+l?this.page.info().page:this.iterator("table",function(b){Sa(b,a)})});r("page.info()",function(){if(0===this.context.length)return l;var a=this.context[0],b=a._iDisplayStart,c=a._iDisplayLength,e=a.fnRecordsDisplay(),d=-1===c;return{page:d?0:Math.floor(b/c),pages:d?1:Math.ceil(e/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:e}});r("page.len()",function(a){return a===l?0!==this.context.length?this.context[0]._iDisplayLength:l:this.iterator("table",function(b){Qa(b,
+a)})});var Tb=function(a,b,c){"ssp"==A(a)?M(a,b):(B(a,!0),qa(a,[],function(c){na(a);for(var c=ra(a,c),e=0,h=c.length;e<h;e++)I(a,c[e]);M(a,b);B(a,!1)}));if(c){var e=new q(a);e.one("draw",function(){c(e.ajax.json())})}};r("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});r("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});r("ajax.reload()",function(a,b){return this.iterator("table",function(c){Tb(c,!1===b,a)})});r("ajax.url()",function(a){var b=
+this.context;if(a===l){if(0===b.length)return l;b=b[0];return b.ajax?g.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){g.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});r("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Tb(c,!1===b,a)})});var Za=function(a,b){var c=[],e,d,f,h,i,j;e=typeof a;if(!a||"string"===e||"function"===e||a.length===l)a=[a];f=0;for(h=a.length;f<h;f++){d=a[f]&&a[f].split?a[f].split(","):[a[f]];i=0;for(j=
+d.length;i<j;i++)(e=b("string"===typeof d[i]?g.trim(d[i]):d[i]))&&e.length&&c.push.apply(c,e)}return c},$a=function(a){a||(a={});a.filter&&!a.search&&(a.search=a.filter);return{search:a.search||"none",order:a.order||"current",page:a.page||"all"}},ab=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Ba=function(a,b){var c,e,d,f=[],h=a.aiDisplay;c=a.aiDisplayMaster;var i=b.search;e=b.order;d=b.page;if("ssp"==A(a))return"removed"===
+i?[]:U(0,c.length);if("current"==d){c=a._iDisplayStart;for(e=a.fnDisplayEnd();c<e;c++)f.push(h[c])}else if("current"==e||"applied"==e)f="none"==i?c.slice():"applied"==i?h.slice():g.map(c,function(a){return-1===g.inArray(a,h)?a:null});else if("index"==e||"original"==e){c=0;for(e=a.aoData.length;c<e;c++)"none"==i?f.push(c):(d=g.inArray(c,h),(-1===d&&"removed"==i||0<=d&&"applied"==i)&&f.push(c))}return f};r("rows()",function(a,b){a===l?a="":g.isPlainObject(a)&&(b=a,a="");var b=$a(b),c=this.iterator("table",
+function(c){var d=b;return Za(a,function(a){var b=Ob(a);if(b!==null&&!d)return[b];var i=Ba(c,d);if(b!==null&&g.inArray(b,i)!==-1)return[b];if(!a)return i;if(typeof a==="function")return g.map(i,function(b){var d=c.aoData[b];return a(b,d._aData,d.nTr)?b:null});b=Rb(ha(c.aoData,i,"nTr"));return a.nodeName&&g.inArray(a,b)!==-1?[a._DT_RowIndex]:g(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()})},1);c.selector.rows=a;c.selector.opts=b;return c});r("rows().nodes()",function(){return this.iterator("row",
+function(a,b){return a.aoData[b].nTr||l},1)});r("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return ha(a.aoData,b,"_aData")},1)});t("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var e=b.aoData[c];return"search"===a?e._aFilterData:e._aSortData},1)});t("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ca(b,c,a)})});t("rows().indexes()","row().index()",function(){return this.iterator("row",
+function(a,b){return b},1)});t("rows().remove()","row().remove()",function(){var a=this;return this.iterator("row",function(b,c,e){var d=b.aoData;d.splice(c,1);for(var f=0,h=d.length;f<h;f++)null!==d[f].nTr&&(d[f].nTr._DT_RowIndex=f);g.inArray(c,b.aiDisplay);oa(b.aiDisplayMaster,c);oa(b.aiDisplay,c);oa(a[e],c,!1);Ra(b)})});r("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,h,g=[];f=0;for(h=a.length;f<h;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?g.push(la(b,c)[0]):
+g.push(I(b,c));return g},1),c=this.rows(-1);c.pop();c.push.apply(c,b.toArray());return c});r("row()",function(a,b){return ab(this.rows(a,b))});r("row().data()",function(a){var b=this.context;if(a===l)return b.length&&this.length?b[0].aoData[this[0]]._aData:l;b[0].aoData[this[0]]._aData=a;ca(b[0],this[0],"data");return this});r("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});r("row.add()",function(a){a instanceof g&&a.length&&(a=a[0]);
+var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?la(b,a)[0]:I(b,a)});return this.row(b[0])});var bb=function(a,b){var c=a.context;c.length&&(c=c[0].aoData[b!==l?b:a[0]],c._details&&(c._details.remove(),c._detailsShow=l,c._details=l))},Ub=function(a,b){var c=a.context;if(c.length&&a.length){var e=c[0].aoData[a[0]];if(e._details){(e._detailsShow=b)?e._details.insertAfter(e.nTr):e._details.detach();var d=c[0],f=new q(d),h=d.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");
+0<C(h,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){d===b&&f.rows({page:"current"}).eq(0).each(function(a){a=h[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(d===b)for(var c,e=aa(b),f=0,g=h.length;f<g;f++)c=h[f],c._details&&c._details.children("td[colspan]").attr("colspan",e)}),f.on("destroy.dt.DT_details",function(a,b){if(d===b)for(var c=0,e=h.length;c<e;c++)h[c]._details&&bb(f,c)}))}}};r("row().child()",function(a,b){var c=
+this.context;if(a===l)return c.length&&this.length?c[0].aoData[this[0]]._details:l;if(!0===a)this.child.show();else if(!1===a)bb(this);else if(c.length&&this.length){var e=c[0],c=c[0].aoData[this[0]],d=[],f=function(a,b){if(a.nodeName&&"tr"===a.nodeName.toLowerCase())d.push(a);else{var c=g("<tr><td/></tr>").addClass(b);g("td",c).addClass(b).html(a)[0].colSpan=aa(e);d.push(c[0])}};if(g.isArray(a)||a instanceof g)for(var h=0,i=a.length;h<i;h++)f(a[h],b);else f(a,b);c._details&&c._details.remove();c._details=
+g(d);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});r(["row().child.show()","row().child().show()"],function(){Ub(this,!0);return this});r(["row().child.hide()","row().child().hide()"],function(){Ub(this,!1);return this});r(["row().child.remove()","row().child().remove()"],function(){bb(this);return this});r("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var cc=/^(.+):(name|visIdx|visible)$/,Vb=function(a,
+b,c,e,d){for(var c=[],e=0,f=d.length;e<f;e++)c.push(v(a,d[e],b));return c};r("columns()",function(a,b){a===l?a="":g.isPlainObject(a)&&(b=a,a="");var b=$a(b),c=this.iterator("table",function(c){var d=a,f=b,h=c.aoColumns,i=C(h,"sName"),j=C(h,"nTh");return Za(d,function(a){var b=Ob(a);if(a==="")return U(h.length);if(b!==null)return[b>=0?b:h.length+b];if(typeof a==="function"){var d=Ba(c,f);return g.map(h,function(b,f){return a(f,Vb(c,f,0,0,d),j[f])?f:null})}var k=typeof a==="string"?a.match(cc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=
+parseInt(k[1],10);if(b<0){var l=g.map(h,function(a,b){return a.bVisible?b:null});return[l[l.length+b]]}return[ka(c,b)];case "name":return g.map(i,function(a,b){return a===k[1]?b:null})}else return g(j).filter(a).map(function(){return g.inArray(this,j)}).toArray()})},1);c.selector.cols=a;c.selector.opts=b;return c});t("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});t("columns().footer()","column().footer()",function(){return this.iterator("column",
+function(a,b){return a.aoColumns[b].nTf},1)});t("columns().data()","column().data()",function(){return this.iterator("column-rows",Vb,1)});t("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});t("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,e,d,f){return ha(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});t("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",
+function(a,b,c,e,d){return ha(a.aoData,d,"anCells",b)},1)});t("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,e){if(a===l)return c.aoColumns[e].bVisible;var d=c.aoColumns,f=d[e],h=c.aoData,i,j,n;if(a!==l&&f.bVisible!==a){if(a){var m=g.inArray(!0,C(d,"bVisible"),e+1);i=0;for(j=h.length;i<j;i++)n=h[i].nTr,d=h[i].anCells,n&&n.insertBefore(d[e],d[m]||null)}else g(C(c.aoData,"anCells",e)).detach();f.bVisible=a;ea(c,c.aoHeader);ea(c,c.aoFooter);if(b===l||
+b)X(c),(c.oScroll.sX||c.oScroll.sY)&&Y(c);u(c,null,"column-visibility",[c,e,a]);xa(c)}})});t("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?$(b,c):c},1)});r("columns.adjust()",function(){return this.iterator("table",function(a){X(a)},1)});r("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return ka(c,b);if("fromData"===a||"toVisible"===a)return $(c,b)}});r("column()",
+function(a,b){return ab(this.columns(a,b))});r("cells()",function(a,b,c){g.isPlainObject(a)&&(typeof a.row!==l?(c=b,b=null):(c=a,a=null));g.isPlainObject(b)&&(c=b,b=null);if(null===b||b===l)return this.iterator("table",function(b){var e=a,d=$a(c),f=b.aoData,h=Ba(b,d),d=Rb(ha(f,h,"anCells")),i=g([].concat.apply([],d)),j,m=b.aoColumns.length,n,p,r,q,s,t;return Za(e,function(a){var c=typeof a==="function";if(a===null||a===l||c){n=[];p=0;for(r=h.length;p<r;p++){j=h[p];for(q=0;q<m;q++){s={row:j,column:q};
+if(c){t=b.aoData[j];a(s,v(b,j,q),t.anCells[q])&&n.push(s)}else n.push(s)}}return n}return g.isPlainObject(a)?[a]:i.filter(a).map(function(a,b){j=b.parentNode._DT_RowIndex;return{row:j,column:g.inArray(b,f[j].anCells)}}).toArray()})});var e=this.columns(b,c),d=this.rows(a,c),f,h,i,j,n,m=this.iterator("table",function(a,b){f=[];h=0;for(i=d[b].length;h<i;h++){j=0;for(n=e[b].length;j<n;j++)f.push({row:d[b][h],column:e[b][j]})}return f},1);g.extend(m.selector,{cols:b,rows:a,opts:c});return m});t("cells().nodes()",
+"cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b].anCells)?a[c]:l},1)});r("cells().data()",function(){return this.iterator("cell",function(a,b,c){return v(a,b,c)},1)});t("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,e){return b.aoData[c][a][e]},1)});t("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,e){return v(b,c,e,a)},1)});t("cells().indexes()",
+"cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:$(a,c)}},1)});t("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,e){ca(b,c,a,e)})});r("cell()",function(a,b,c){return ab(this.cells(a,b,c))});r("cell().data()",function(a){var b=this.context,c=this[0];if(a===l)return b.length&&c.length?v(b[0],c[0].row,c[0].column):l;Ha(b[0],c[0].row,c[0].column,a);ca(b[0],c[0].row,"data",c[0].column);return this});
+r("order()",function(a,b){var c=this.context;if(a===l)return 0!==c.length?c[0].aaSorting:l;"number"===typeof a?a=[[a,b]]:g.isArray(a[0])||(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});r("order.listener()",function(a,b,c){return this.iterator("table",function(e){Na(e,a,b,c)})});r(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,e){var d=[];g.each(b[e],function(b,c){d.push([c,a])});
+c.aaSorting=d})});r("search()",function(a,b,c,e){var d=this.context;return a===l?0!==d.length?d[0].oPreviousSearch.sSearch:l:this.iterator("table",function(d){d.oFeatures.bFilter&&fa(d,g.extend({},d.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===e?!0:e}),1)})});t("columns().search()","column().search()",function(a,b,c,e){return this.iterator("column",function(d,f){var h=d.aoPreSearchCols;if(a===l)return h[f].sSearch;d.oFeatures.bFilter&&(g.extend(h[f],
+{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===e?!0:e}),fa(d,d.oPreviousSearch,1))})});r("state()",function(){return this.context.length?this.context[0].oSavedState:null});r("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});r("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});r("state.save()",function(){return this.iterator("table",function(a){xa(a)})});p.versionCheck=
+p.fnVersionCheck=function(a){for(var b=p.version.split("."),a=a.split("."),c,e,d=0,f=a.length;d<f;d++)if(c=parseInt(b[d],10)||0,e=parseInt(a[d],10)||0,c!==e)return c>e;return!0};p.isDataTable=p.fnIsDataTable=function(a){var b=g(a).get(0),c=!1;g.each(p.settings,function(a,d){if(d.nTable===b||d.nScrollHead===b||d.nScrollFoot===b)c=!0});return c};p.tables=p.fnTables=function(a){return g.map(p.settings,function(b){if(!a||a&&g(b.nTable).is(":visible"))return b.nTable})};p.util={throttle:ta,escapeRegex:ua};
+p.camelToHungarian=G;r("$()",function(a,b){var c=this.rows(b).nodes(),c=g(c);return g([].concat(c.filter(a).toArray(),c.find(a).toArray()))});g.each(["on","one","off"],function(a,b){r(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0].match(/\.dt\b/)||(a[0]+=".dt");var e=g(this.tables().nodes());e[b].apply(e,a);return this})});r("clear()",function(){return this.iterator("table",function(a){na(a)})});r("settings()",function(){return new q(this.context,this.context)});r("data()",function(){return this.iterator("table",
+function(a){return C(a.aoData,"_aData")}).flatten()});r("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,e=b.oClasses,d=b.nTable,f=b.nTBody,h=b.nTHead,i=b.nTFoot,j=g(d),f=g(f),l=g(b.nTableWrapper),m=g.map(b.aoData,function(a){return a.nTr}),o;b.bDestroying=!0;u(b,"aoDestroyCallback","destroy",[b]);a||(new q(b)).columns().visible(!0);l.unbind(".DT").find(":not(tbody *)").unbind(".DT");g(Da).unbind(".DT-"+b.sInstance);d!=h.parentNode&&(j.children("thead").detach(),
+j.append(h));i&&d!=i.parentNode&&(j.children("tfoot").detach(),j.append(i));j.detach();l.detach();b.aaSorting=[];b.aaSortingFixed=[];wa(b);g(m).removeClass(b.asStripeClasses.join(" "));g("th, td",h).removeClass(e.sSortable+" "+e.sSortableAsc+" "+e.sSortableDesc+" "+e.sSortableNone);b.bJUI&&(g("th span."+e.sSortIcon+", td span."+e.sSortIcon,h).detach(),g("th, td",h).each(function(){var a=g("div."+e.sSortJUIWrapper,this);g(this).append(a.contents());a.detach()}));!a&&c&&c.insertBefore(d,b.nTableReinsertBefore);
+f.children().detach();f.append(m);j.css("width",b.sDestroyWidth).removeClass(e.sTable);(o=b.asDestroyStripes.length)&&f.children().each(function(a){g(this).addClass(b.asDestroyStripes[a%o])});c=g.inArray(b,p.settings);-1!==c&&p.settings.splice(c,1)})});p.version="1.10.4";p.settings=[];p.models={};p.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};p.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null};p.models.oColumn=
+{idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};p.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,
+aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,
+fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,
+iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",
+sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:g.extend({},p.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null};V(p.defaults);p.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,
+bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};V(p.defaults.column);p.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},
+oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],
+sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:l,oAjaxData:l,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,
+_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==A(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==A(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,e=this.aiDisplay.length,d=this.oFeatures,f=d.bPaginate;return d.bServerSide?!1===f||-1===a?b+e:
+Math.min(b+a,this._iRecordsDisplay):!f||c>e||-1===a?e:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{}};p.ext=w={classes:{},errMode:"alert",feature:[],search:[],internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:p.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:p.version};g.extend(w,{afnFiltering:w.search,aTypes:w.type.detect,ofnSearch:w.type.search,
+oSort:w.type.order,afnSortData:w.order,aoFeatures:w.feature,oApi:w.internal,oStdClasses:w.classes,oPagination:w.pager});g.extend(p.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",
+sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",
+sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Ca="",Ca="",E=Ca+"ui-state-default",ia=Ca+"css_right ui-icon ui-icon-",Wb=Ca+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";g.extend(p.ext.oJUIClasses,p.ext.classes,{sPageButton:"fg-button ui-button "+E,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",
+sSortAsc:E+" sorting_asc",sSortDesc:E+" sorting_desc",sSortable:E+" sorting",sSortableAsc:E+" sorting_asc_disabled",sSortableDesc:E+" sorting_desc_disabled",sSortableNone:E+" sorting_disabled",sSortJUIAsc:ia+"triangle-1-n",sSortJUIDesc:ia+"triangle-1-s",sSortJUI:ia+"carat-2-n-s",sSortJUIAscAllowed:ia+"carat-1-n",sSortJUIDescAllowed:ia+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+E,sScrollFoot:"dataTables_scrollFoot "+E,
+sHeaderTH:E,sFooterTH:E,sJUIHeader:Wb+" ui-corner-tl ui-corner-tr",sJUIFooter:Wb+" ui-corner-bl ui-corner-br"});var Lb=p.ext.pager;g.extend(Lb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},simple_numbers:function(a,b){return["previous",Va(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Va(a,b),"next","last"]},_numbers:Va,numbers_length:7});g.extend(!0,p.ext.renderer,{pageButton:{_:function(a,b,c,e,d,f){var h=a.oClasses,i=
+a.oLanguage.oPaginate,j,l,m=0,o=function(b,e){var k,p,r,q,s=function(b){Sa(a,b.data.action,true)};k=0;for(p=e.length;k<p;k++){q=e[k];if(g.isArray(q)){r=g("<"+(q.DT_el||"div")+"/>").appendTo(b);o(r,q)}else{l=j="";switch(q){case "ellipsis":b.append("<span>&hellip;</span>");break;case "first":j=i.sFirst;l=q+(d>0?"":" "+h.sPageButtonDisabled);break;case "previous":j=i.sPrevious;l=q+(d>0?"":" "+h.sPageButtonDisabled);break;case "next":j=i.sNext;l=q+(d<f-1?"":" "+h.sPageButtonDisabled);break;case "last":j=
+i.sLast;l=q+(d<f-1?"":" "+h.sPageButtonDisabled);break;default:j=q+1;l=d===q?h.sPageButtonActive:""}if(j){r=g("<a>",{"class":h.sPageButton+" "+l,"aria-controls":a.sTableId,"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof q==="string"?a.sTableId+"_"+q:null}).html(j).appendTo(b);Ua(r,{action:q},s);m++}}}};try{var k=g(P.activeElement).data("dt-idx");o(g(b).empty(),e);k!==null&&g(b).find("[data-dt-idx="+k+"]").focus()}catch(p){}}}});g.extend(p.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;
+return Ya(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!$b.test(a)||!ac.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||H(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Ya(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Qb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Qb(a,c,!0)?"html-num-fmt"+c:null},function(a){return H(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);g.extend(p.ext.type.search,
+{html:function(a){return H(a)?a:"string"===typeof a?a.replace(Nb," ").replace(Aa,""):""},string:function(a){return H(a)?a:"string"===typeof a?a.replace(Nb," "):a}});var za=function(a,b,c,e){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Pb(a,b));a.replace&&(c&&(a=a.replace(c,"")),e&&(a=a.replace(e,"")));return 1*a};g.extend(w.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return H(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return H(a)?
+"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});cb("");g.extend(!0,p.ext.renderer,{header:{_:function(a,b,c,e){g(a.nTable).on("order.dt.DT",function(d,f,h,g){if(a===f){d=c.idx;b.removeClass(c.sSortingClass+" "+e.sSortAsc+" "+e.sSortDesc).addClass(g[d]=="asc"?e.sSortAsc:g[d]=="desc"?e.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,e){g("<div/>").addClass(e.sSortJUIWrapper).append(b.contents()).append(g("<span/>").addClass(e.sSortIcon+
+" "+c.sSortingClassJUI)).appendTo(b);g(a.nTable).on("order.dt.DT",function(d,f,g,i){if(a===f){d=c.idx;b.removeClass(e.sSortAsc+" "+e.sSortDesc).addClass(i[d]=="asc"?e.sSortAsc:i[d]=="desc"?e.sSortDesc:c.sSortingClass);b.find("span."+e.sSortIcon).removeClass(e.sSortJUIAsc+" "+e.sSortJUIDesc+" "+e.sSortJUI+" "+e.sSortJUIAscAllowed+" "+e.sSortJUIDescAllowed).addClass(i[d]=="asc"?e.sSortJUIAsc:i[d]=="desc"?e.sSortJUIDesc:c.sSortingClassJUI)}})}}});p.render={number:function(a,b,c,e){return{display:function(d){var f=
+0>d?"-":"",d=Math.abs(parseFloat(d)),g=parseInt(d,10),d=c?b+(d-g).toFixed(c).substring(2):"";return f+(e||"")+g.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+d}}}};g.extend(p.ext.internal,{_fnExternApiFunc:Mb,_fnBuildAjax:qa,_fnAjaxUpdate:jb,_fnAjaxParameters:sb,_fnAjaxUpdateDraw:tb,_fnAjaxDataSrc:ra,_fnAddColumn:Ea,_fnColumnOptions:ja,_fnAdjustColumnSizing:X,_fnVisibleToColumnIndex:ka,_fnColumnIndexToVisible:$,_fnVisbleColumns:aa,_fnGetColumns:Z,_fnColumnTypes:Ga,_fnApplyColumnDefs:hb,_fnHungarianMap:V,
+_fnCamelToHungarian:G,_fnLanguageCompat:O,_fnBrowserDetect:fb,_fnAddData:I,_fnAddTr:la,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==l?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return g.inArray(c,a.aoData[b].anCells)},_fnGetCellData:v,_fnSetCellData:Ha,_fnSplitObjNotation:Ja,_fnGetObjectDataFn:W,_fnSetObjectDataFn:Q,_fnGetDataMaster:Ka,_fnClearTable:na,_fnDeleteIndex:oa,_fnInvalidate:ca,_fnGetRowElements:ma,_fnCreateTr:Ia,_fnBuildHead:ib,_fnDrawHead:ea,_fnDraw:L,_fnReDraw:M,
+_fnAddOptionsHtml:lb,_fnDetectHeader:da,_fnGetUniqueThs:pa,_fnFeatureHtmlFilter:nb,_fnFilterComplete:fa,_fnFilterCustom:wb,_fnFilterColumn:vb,_fnFilter:ub,_fnFilterCreateSearch:Pa,_fnEscapeRegex:ua,_fnFilterData:xb,_fnFeatureHtmlInfo:qb,_fnUpdateInfo:Ab,_fnInfoMacros:Bb,_fnInitialise:ga,_fnInitComplete:sa,_fnLengthChange:Qa,_fnFeatureHtmlLength:mb,_fnFeatureHtmlPaginate:rb,_fnPageChange:Sa,_fnFeatureHtmlProcessing:ob,_fnProcessingDisplay:B,_fnFeatureHtmlTable:pb,_fnScrollDraw:Y,_fnApplyToChildren:F,
+_fnCalculateColumnWidths:Fa,_fnThrottle:ta,_fnConvertToWidth:Cb,_fnScrollingWidthAdjust:Eb,_fnGetWidestNode:Db,_fnGetMaxLenString:Fb,_fnStringToCss:s,_fnScrollBarWidth:Gb,_fnSortFlatten:T,_fnSort:kb,_fnSortAria:Ib,_fnSortListener:Ta,_fnSortAttachListener:Na,_fnSortingClasses:wa,_fnSortData:Hb,_fnSaveState:xa,_fnLoadState:Jb,_fnSettingsFromNode:ya,_fnLog:R,_fnMap:D,_fnBindAction:Ua,_fnCallbackReg:x,_fnCallbackFire:u,_fnLengthOverflow:Ra,_fnRenderer:Oa,_fnDataSource:A,_fnRowAttributes:La,_fnCalculateEnd:function(){}});
+g.fn.dataTable=p;g.fn.dataTableSettings=p.settings;g.fn.dataTableExt=p.ext;g.fn.DataTable=function(a){return g(this).dataTable(a).api()};g.each(p,function(a,b){g.fn.DataTable[a]=b});return g.fn.dataTable};"function"===typeof define&&define.amd?define("datatables",["jquery"],O):"object"===typeof exports?O(require("jquery")):jQuery&&!jQuery.fn.dataTable&&O(jQuery)})(window,document);
diff --git a/packages/datatables-1.10.4/plugins/dataTables.bootstrap.css b/packages/datatables-1.10.4/plugins/dataTables.bootstrap.css
new file mode 100644
index 0000000000..f65e264b3d
--- /dev/null
+++ b/packages/datatables-1.10.4/plugins/dataTables.bootstrap.css
@@ -0,0 +1,314 @@
+div.dataTables_length label {
+ font-weight: normal;
+ text-align: left;
+ white-space: nowrap;
+}
+
+div.dataTables_length select {
+ width: 75px;
+ display: inline-block;
+}
+
+div.dataTables_filter {
+ text-align: right;
+}
+
+div.dataTables_filter label {
+ font-weight: normal;
+ white-space: nowrap;
+ text-align: left;
+}
+
+div.dataTables_filter input {
+ margin-left: 0.5em;
+ display: inline-block;
+}
+
+div.dataTables_info {
+ padding-top: 8px;
+ white-space: nowrap;
+}
+
+div.dataTables_paginate {
+ margin: 0;
+ white-space: nowrap;
+ text-align: right;
+}
+
+div.dataTables_paginate ul.pagination {
+ margin: 2px 0;
+ white-space: nowrap;
+}
+
+@media screen and (max-width: 767px) {
+ div.dataTables_length,
+ div.dataTables_filter,
+ div.dataTables_info,
+ div.dataTables_paginate {
+ text-align: center;
+ }
+}
+
+
+table.dataTable td,
+table.dataTable th {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+
+table.dataTable {
+ clear: both;
+ margin-top: 6px !important;
+ margin-bottom: 6px !important;
+ max-width: none !important;
+}
+
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+ cursor: pointer;
+}
+
+table.dataTable thead .sorting { background: url('../images/sort_both.png') no-repeat center right; }
+table.dataTable thead .sorting_asc { background: url('../images/sort_asc.png') no-repeat center right; }
+table.dataTable thead .sorting_desc { background: url('../images/sort_desc.png') no-repeat center right; }
+
+table.dataTable thead .sorting_asc_disabled { background: url('../images/sort_asc_disabled.png') no-repeat center right; }
+table.dataTable thead .sorting_desc_disabled { background: url('../images/sort_desc_disabled.png') no-repeat center right; }
+
+table.dataTable thead > tr > th {
+ padding-left: 18px;
+ padding-right: 18px;
+}
+
+table.dataTable th:active {
+ outline: none;
+}
+
+/* Scrolling */
+div.dataTables_scrollHead table {
+ margin-bottom: 0 !important;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+div.dataTables_scrollHead table thead tr:last-child th:first-child,
+div.dataTables_scrollHead table thead tr:last-child td:first-child {
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+
+div.dataTables_scrollBody table {
+ border-top: none;
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+div.dataTables_scrollBody tbody tr:first-child th,
+div.dataTables_scrollBody tbody tr:first-child td {
+ border-top: none;
+}
+
+div.dataTables_scrollFoot table {
+ margin-top: 0 !important;
+ border-top: none;
+}
+
+/* Frustratingly the border-collapse:collapse used by Bootstrap makes the column
+ width calculations when using scrolling impossible to align columns. We have
+ to use separate
+ */
+table.table-bordered.dataTable {
+ border-collapse: separate !important;
+}
+table.table-bordered thead th,
+table.table-bordered thead td {
+ border-left-width: 0;
+ border-top-width: 0;
+}
+table.table-bordered tbody th,
+table.table-bordered tbody td {
+ border-left-width: 0;
+ border-bottom-width: 0;
+}
+table.table-bordered th:last-child,
+table.table-bordered td:last-child {
+ border-right-width: 0;
+}
+div.dataTables_scrollHead table.table-bordered {
+ border-bottom-width: 0;
+}
+
+
+
+
+/*
+ * TableTools styles
+ */
+.table.dataTable tbody tr.active td,
+.table.dataTable tbody tr.active th {
+ background-color: #08C;
+ color: white;
+}
+
+.table.dataTable tbody tr.active:hover td,
+.table.dataTable tbody tr.active:hover th {
+ background-color: #0075b0 !important;
+}
+
+.table.dataTable tbody tr.active th > a,
+.table.dataTable tbody tr.active td > a {
+ color: white;
+}
+
+.table-striped.dataTable tbody tr.active:nth-child(odd) td,
+.table-striped.dataTable tbody tr.active:nth-child(odd) th {
+ background-color: #017ebc;
+}
+
+table.DTTT_selectable tbody tr {
+ cursor: pointer;
+}
+
+div.DTTT .btn:hover {
+ text-decoration: none !important;
+}
+
+ul.DTTT_dropdown.dropdown-menu {
+ z-index: 2003;
+}
+
+ul.DTTT_dropdown.dropdown-menu a {
+ color: #333 !important; /* needed only when demo_page.css is included */
+}
+
+ul.DTTT_dropdown.dropdown-menu li {
+ position: relative;
+}
+
+ul.DTTT_dropdown.dropdown-menu li:hover a {
+ background-color: #0088cc;
+ color: white !important;
+}
+
+div.DTTT_collection_background {
+ z-index: 2002;
+}
+
+/* TableTools information display */
+div.DTTT_print_info {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ width: 400px;
+ height: 150px;
+ margin-left: -200px;
+ margin-top: -75px;
+ text-align: center;
+ color: #333;
+ padding: 10px 30px;
+ opacity: 0.95;
+
+ background-color: white;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+
+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
+}
+
+div.DTTT_print_info h6 {
+ font-weight: normal;
+ font-size: 28px;
+ line-height: 28px;
+ margin: 1em;
+}
+
+div.DTTT_print_info p {
+ font-size: 14px;
+ line-height: 20px;
+}
+
+div.dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 60px;
+ margin-left: -50%;
+ margin-top: -25px;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ text-align: center;
+ font-size: 1.2em;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));
+ background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
+ background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
+ background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
+ background: -o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
+ background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
+}
+
+
+
+/*
+ * FixedColumns styles
+ */
+div.DTFC_LeftHeadWrapper table,
+div.DTFC_LeftFootWrapper table,
+div.DTFC_RightHeadWrapper table,
+div.DTFC_RightFootWrapper table,
+table.DTFC_Cloned tr.even {
+ background-color: white;
+ margin-bottom: 0;
+}
+
+div.DTFC_RightHeadWrapper table ,
+div.DTFC_LeftHeadWrapper table {
+ border-bottom: none !important;
+ margin-bottom: 0 !important;
+ border-top-right-radius: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+
+div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,
+div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,
+div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,
+div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+
+div.DTFC_RightBodyWrapper table,
+div.DTFC_LeftBodyWrapper table {
+ border-top: none;
+ margin: 0 !important;
+}
+
+div.DTFC_RightBodyWrapper tbody tr:first-child th,
+div.DTFC_RightBodyWrapper tbody tr:first-child td,
+div.DTFC_LeftBodyWrapper tbody tr:first-child th,
+div.DTFC_LeftBodyWrapper tbody tr:first-child td {
+ border-top: none;
+}
+
+div.DTFC_RightFootWrapper table,
+div.DTFC_LeftFootWrapper table {
+ border-top: none;
+ margin-top: 0 !important;
+}
+
+
+/*
+ * FixedHeader styles
+ */
+div.FixedHeader_Cloned table {
+ margin: 0 !important
+}
+
diff --git a/packages/datatables-1.10.4/plugins/dataTables.bootstrap.js b/packages/datatables-1.10.4/plugins/dataTables.bootstrap.js
new file mode 100644
index 0000000000..2c6959d182
--- /dev/null
+++ b/packages/datatables-1.10.4/plugins/dataTables.bootstrap.js
@@ -0,0 +1,186 @@
+/*! DataTables Bootstrap 3 integration
+ * ©2011-2014 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
+ * for further information.
+ */
+(function(window, document, undefined){
+
+var factory = function( $, DataTable ) {
+"use strict";
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+ dom:
+ "<'row'<'col-sm-6'l><'col-sm-6'f>>" +
+ "<'row'<'col-sm-12'tr>>" +
+ "<'row'<'col-sm-6'i><'col-sm-6'p>>",
+ renderer: 'bootstrap'
+} );
+
+
+/* Default class modification */
+$.extend( DataTable.ext.classes, {
+ sWrapper: "dataTables_wrapper form-inline dt-bootstrap",
+ sFilterInput: "form-control input-sm",
+ sLengthSelect: "form-control input-sm"
+} );
+
+
+/* Bootstrap paging button renderer */
+DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
+ var api = new DataTable.Api( settings );
+ var classes = settings.oClasses;
+ var lang = settings.oLanguage.oPaginate;
+ var btnDisplay, btnClass;
+
+ var attach = function( container, buttons ) {
+ var i, ien, node, button;
+ var clickHandler = function ( e ) {
+ e.preventDefault();
+ if ( !$(e.currentTarget).hasClass('disabled') ) {
+ api.page( e.data.action ).draw( false );
+ }
+ };
+
+ for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+ button = buttons[i];
+
+ if ( $.isArray( button ) ) {
+ attach( container, button );
+ }
+ else {
+ btnDisplay = '';
+ btnClass = '';
+
+ switch ( button ) {
+ case 'ellipsis':
+ btnDisplay = '&hellip;';
+ btnClass = 'disabled';
+ break;
+
+ case 'first':
+ btnDisplay = lang.sFirst;
+ btnClass = button + (page > 0 ?
+ '' : ' disabled');
+ break;
+
+ case 'previous':
+ btnDisplay = lang.sPrevious;
+ btnClass = button + (page > 0 ?
+ '' : ' disabled');
+ break;
+
+ case 'next':
+ btnDisplay = lang.sNext;
+ btnClass = button + (page < pages-1 ?
+ '' : ' disabled');
+ break;
+
+ case 'last':
+ btnDisplay = lang.sLast;
+ btnClass = button + (page < pages-1 ?
+ '' : ' disabled');
+ break;
+
+ default:
+ btnDisplay = button + 1;
+ btnClass = page === button ?
+ 'active' : '';
+ break;
+ }
+
+ if ( btnDisplay ) {
+ node = $('<li>', {
+ 'class': classes.sPageButton+' '+btnClass,
+ 'aria-controls': settings.sTableId,
+ 'tabindex': settings.iTabIndex,
+ 'id': idx === 0 && typeof button === 'string' ?
+ settings.sTableId +'_'+ button :
+ null
+ } )
+ .append( $('<a>', {
+ 'href': '#'
+ } )
+ .html( btnDisplay )
+ )
+ .appendTo( container );
+
+ settings.oApi._fnBindAction(
+ node, {action: button}, clickHandler
+ );
+ }
+ }
+ }
+ };
+
+ attach(
+ $(host).empty().html('<ul class="pagination"/>').children('ul'),
+ buttons
+ );
+};
+
+
+/*
+ * TableTools Bootstrap compatibility
+ * Required TableTools 2.1+
+ */
+if ( DataTable.TableTools ) {
+ // Set the classes that TableTools uses to something suitable for Bootstrap
+ $.extend( true, DataTable.TableTools.classes, {
+ "container": "DTTT btn-group",
+ "buttons": {
+ "normal": "btn btn-default",
+ "disabled": "disabled"
+ },
+ "collection": {
+ "container": "DTTT_dropdown dropdown-menu",
+ "buttons": {
+ "normal": "",
+ "disabled": "disabled"
+ }
+ },
+ "print": {
+ "info": "DTTT_print_info"
+ },
+ "select": {
+ "row": "active"
+ }
+ } );
+
+ // Have the collection use a bootstrap compatible drop down
+ $.extend( true, DataTable.TableTools.DEFAULTS.oTags, {
+ "collection": {
+ "container": "ul",
+ "button": "li",
+ "liner": "a"
+ }
+ } );
+}
+
+}; // /factory
+
+
+// Define as an AMD module if possible
+if ( typeof define === 'function' && define.amd ) {
+ define( ['jquery', 'datatables'], factory );
+}
+else if ( typeof exports === 'object' ) {
+ // Node/CommonJS
+ factory( require('jquery'), require('datatables') );
+}
+else if ( jQuery ) {
+ // Otherwise simply initialise as normal, stopping multiple evaluation
+ factory( jQuery, jQuery.fn.dataTable );
+}
+
+
+})(window, document);
+
diff --git a/packages/font-awesome-4.1.0/css/font-awesome.min.css b/packages/font-awesome-4.1.0/css/font-awesome.min.css
new file mode 100644
index 0000000000..3d920fc87c
--- /dev/null
+++ b/packages/font-awesome-4.1.0/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.1.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-square:before,.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"} \ No newline at end of file
diff --git a/packages/font-awesome-4.1.0/fonts/FontAwesome.otf b/packages/font-awesome-4.1.0/fonts/FontAwesome.otf
new file mode 100644
index 0000000000..3461e3fce6
--- /dev/null
+++ b/packages/font-awesome-4.1.0/fonts/FontAwesome.otf
Binary files differ
diff --git a/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.eot b/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000000..6cfd566095
--- /dev/null
+++ b/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.eot
Binary files differ
diff --git a/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.svg b/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000000..a9f8469503
--- /dev/null
+++ b/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.svg
@@ -0,0 +1,504 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#xd8;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" horiz-adv-x="1537" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" horiz-adv-x="1537" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M93 1350q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78z" />
+<glyph unicode="&#xf001;" d="M0 -64q0 50 34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5 q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M0 32v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5 t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768zM128 1120q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317 q54 43 100.5 115.5t46.5 131.5v11v13.5t-0.5 13t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z " />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354 q-25 27 -25 48zM221 829l306 -297l-73 -421l378 199l377 -199l-72 421l306 297l-422 62l-189 382l-189 -382z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M0 131q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5 h-874q-121 0 -194 69.5t-73 189.5zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M0 -96v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 64v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 320q0 -26 19 -45t45 -19h128 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19 h-128q-26 0 -45 -19t-19 -45v-128zM512 -64q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM512 704q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM1536 64 v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM1536 320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M0 128v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM0 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 128v384q0 52 38 90t90 38h512q52 0 90 -38 t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 608v192 q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M121 608q0 40 28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M110 214q0 40 28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-294 -294l294 -294q28 -28 28 -68t-28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294 q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf011;" d="M0 640q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181 q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298zM640 768v640q0 52 38 90t90 38t90 -38t38 -90v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M0 -96v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM384 -96v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM768 -96v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576 q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 -96v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1536 -96v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf013;" d="M0 531v222q0 12 8 23t19 13l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10 q129 -119 165 -170q7 -8 7 -22q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108 q-44 -23 -91 -38q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5z M512 640q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M0 1056v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23zM256 76q0 -22 7 -40.5 t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5v948h-896v-948zM384 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM640 224v576q0 14 9 23t23 9h64 q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM896 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M26 636.5q1 13.5 11 21.5l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5zM256 64 v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf016;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22 v-376z" />
+<glyph unicode="&#xf017;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 544v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M50 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256 q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73zM809 540q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M0 96v320q0 40 28 68t68 28h465l135 -136q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 985q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39q17 -41 -14 -70 l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70zM1152 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf01a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM418 620q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35z" />
+<glyph unicode="&#xf01b;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM416 672q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf01c;" d="M0 64v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552q25 -61 25 -123v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM197 576h316l95 -192h320l95 192h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8 t-2.5 -8z" />
+<glyph unicode="&#xf01d;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 320v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55t-32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56z" />
+<glyph unicode="&#xf01e;" d="M0 640q0 156 61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5 t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298z" />
+<glyph unicode="&#xf021;" d="M0 0v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129 q-19 -19 -45 -19t-45 19t-19 45zM18 800v7q65 268 270 434.5t480 166.5q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179 q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M0 160v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832z M256 288v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 544v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z M256 800v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 288v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z M512 544v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5zM512 800v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z " />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110zM320 320v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19 q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M0 650q0 151 67 291t179 242.5t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32 q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32 q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5zM1008 228q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5 q140 -59 225 -188.5t85 -282.5t-85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45zM1109 -7q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19 q13 0 26 -5q211 -91 338 -283.5t127 -422.5t-127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M0 0v640h640v-640h-640zM0 768v640h640v-640h-640zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM256 256v128h128v-128h-128zM256 1024v128h128v-128h-128zM768 0v640h384v-128h128v128h128v-384h-384v128h-128v-384h-128zM768 768v640h640v-640h-640z M896 896h384v384h-384v-384zM1024 0v128h128v-128h-128zM1024 1024v128h128v-128h-128zM1280 0v128h128v-128h-128z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M0 0v1408h63v-1408h-63zM94 1v1407h32v-1407h-32zM189 1v1407h31v-1407h-31zM346 1v1407h31v-1407h-31zM472 1v1407h62v-1407h-62zM629 1v1407h31v-1407h-31zM692 1v1407h31v-1407h-31zM755 1v1407h31v-1407h-31zM880 1v1407h63v-1407h-63zM1037 1v1407h63v-1407h-63z M1163 1v1407h63v-1407h-63zM1289 1v1407h63v-1407h-63zM1383 1v1407h63v-1407h-63zM1541 1v1407h94v-1407h-94zM1666 1v1407h32v-1407h-32zM1729 0v1408h63v-1408h-63z" />
+<glyph unicode="&#xf02b;" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5zM704 1408h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M10 184q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23 t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57 q38 -15 59 -43q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5zM575 1056 q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M0 160v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-224 q-13 0 -22.5 9.5t-9.5 22.5zM384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1408 576q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M0 128v896q0 106 75 181t181 75h224l51 136q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181zM512 576q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM672 576q0 119 84.5 203.5t203.5 84.5t203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8 t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27 q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14zM555 527q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5 t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12zM533 1292q0 -50 4 -151t4 -152q0 -27 -0.5 -80 t-0.5 -79q0 -46 1 -69q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13zM538.5 165q0.5 -37 4.5 -83.5t12 -66.5q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25 t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5 q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9 t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44zM1414 109.5q9 18.5 42 18.5h80v1024 h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5z" />
+<glyph unicode="&#xf035;" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1 t-103 1t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29 t78 27q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44zM5 -64q0 28 26 49q4 3 36 30t59.5 49 t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5q12 0 42 -19.5t57.5 -41.5t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5 t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1536 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h896 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h1280 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 416v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5zM0 800v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192 q-13 0 -22.5 9.5t-9.5 22.5zM384 32v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 416v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 800v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 1184v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5 t-9.5 22.5zM32 704q0 14 9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088 q-13 0 -22.5 9.5t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 416v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23t-9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5z M0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5 t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5q39 -17 39 -59v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5 t-84.5 203.5z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v192l320 320l160 -160l512 512l416 -416v-448h-1408zM256 960q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136z" />
+<glyph unicode="&#xf040;" d="M0 -128v416l832 832l416 -416l-832 -832h-416zM128 128h128v-128h107l91 91l-235 235l-91 -91v-107zM298 384q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17zM896 1184l166 165q36 38 90 38q53 0 91 -38l235 -234 q37 -39 37 -91q0 -53 -37 -90l-166 -166z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M0 896q0 212 150 362t362 150t362 -150t150 -362q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179zM256 896q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
+<glyph unicode="&#xf042;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73v1088q-148 0 -273 -73t-198 -198t-73 -273z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M0 512q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275q0 -212 -150 -362t-362 -150t-362 150t-150 362zM256 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29v-190 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM640 256v288l672 672l288 -288l-672 -672h-288zM736 448h96v-96h56l116 116l-152 152l-116 -116v-56zM944 688q16 -16 33 1l350 350q17 17 1 33t-33 -1l-350 -350q-17 -17 -1 -33zM1376 1280l92 92 q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68l-92 -92z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h255q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29v-259 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM256 704q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45l-384 -384 q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5t-38.5 114t-17.5 122z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3 q20 -8 20 -29v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM257 768q0 33 24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110q24 -24 24 -57t-24 -57l-814 -814q-24 -24 -57 -24t-57 24l-430 430 q-24 24 -24 57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256 q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-710q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45 t-45 -19h-128q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M122 640q0 26 19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M0 -96v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31l-1328 -738q-23 -13 -39.5 -3t-16.5 36z" />
+<glyph unicode="&#xf04c;" d="M0 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM896 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf04d;" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32v710 q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M1 64v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM1 525q-6 13 13 32l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M154 704q0 26 19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M90 128q0 26 19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45z" />
+<glyph unicode="&#xf055;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19 t19 45v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128z" />
+<glyph unicode="&#xf056;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19 t-19 -45v-128z" />
+<glyph unicode="&#xf057;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM387 414q0 -27 19 -46l90 -90q19 -19 46 -19q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19 l90 90q19 19 19 46q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45z" />
+<glyph unicode="&#xf058;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 621q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45q0 28 -18 46l-91 90 q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46z" />
+<glyph unicode="&#xf059;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM417 939q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26 t37.5 -59q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213zM640 160q0 -14 9 -23t23 -9 h192q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192z" />
+<glyph unicode="&#xf05a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320 q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160zM640 1056q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160z" />
+<glyph unicode="&#xf05b;" d="M0 576v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143 q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45zM339 512q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5h-109q-26 0 -45 19 t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109z" />
+<glyph unicode="&#xf05c;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM429 480q0 13 10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23l-137 -137l137 -137q10 -10 10 -23t-10 -23l-146 -146q-10 -10 -23 -10t-23 10l-137 137 l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23z" />
+<glyph unicode="&#xf05d;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM346 640q0 26 19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45z" />
+<glyph unicode="&#xf05e;" d="M0 643q0 157 61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5t-61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61t-245 164t-163.5 246t-61 300zM224 643q0 -162 89 -299l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199 t-73 -274zM471 185q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5q0 161 -87 295z" />
+<glyph unicode="&#xf060;" d="M64 576q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5t32.5 -90.5v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90 z" />
+<glyph unicode="&#xf061;" d="M0 512v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M53 565q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651q37 -39 37 -91q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75 q-38 38 -38 90z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M53 704q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M0 416q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45t-19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123 q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22t-13.5 30t-10.5 24q-127 285 -127 451z" />
+<glyph unicode="&#xf065;" d="M0 -64v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45zM781 800q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448 q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
+<glyph unicode="&#xf066;" d="M13 32q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23zM768 704v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10 t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M122.5 408.5q13.5 51.5 59.5 77.5l266 154l-266 154q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5 l-266 -154l266 -154q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5z" />
+<glyph unicode="&#xf06a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM624 1126l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5l18 621q0 12 -10 18 q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18zM640 161q0 -13 10 -23t23 -10h192q13 0 22 9.5t9 23.5v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190z" />
+<glyph unicode="&#xf06b;" d="M0 544v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68 t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23zM376 1120q0 -40 28 -68t68 -28h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68zM608 180q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5v56v468v192h-320v-192v-468v-56zM870 1024h194q40 0 68 28 t28 68t-28 68t-68 28q-43 0 -69 -31z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M0 121q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96 q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5zM384 448q0 -26 19 -45t45 -19q24 0 45 19 q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45t-19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M0 -160q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64zM256 640q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100 t113.5 -122.5t72.5 -150.5t27.5 -184q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M0 576q0 34 20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69t-20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69zM128 576q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5q-152 236 -381 353 q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M0 576q0 38 20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5q16 -10 16 -27q0 -7 -1 -9q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87 q-143 65 -263.5 173t-208.5 245q-20 31 -20 69zM128 576q167 -258 427 -375l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5zM896 0l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69t-20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95zM1056 286l280 502q8 -45 8 -84q0 -139 -79 -253.5t-209 -164.5z" />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M16 61l768 1408q17 31 47 49t65 18t65 -18t47 -49l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126zM752 992l17 -457q0 -10 10 -16.5t24 -6.5h185q14 0 23.5 6.5t10.5 16.5l18 459q0 12 -10 19q-13 11 -24 11h-220 q-11 0 -24 -11q-10 -7 -10 -21zM768 161q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M0 477q-1 13 9 25l96 97q9 9 23 9q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16 l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h288v288h-288v-288zM128 224 h288v320h-288v-320zM128 608h288v288h-288v-288zM384 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM480 -128h320v288h-320v-288zM480 224h320v320h-320v-320zM480 608h320v288h-320 v-288zM864 -128h320v288h-320v-288zM864 224h320v320h-320v-320zM864 608h320v288h-320v-288zM1152 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM1248 -128h288v288h-288v-288z M1248 224h288v320h-288v-320zM1248 608h288v288h-288v-288z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M0 160v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23zM0 1056v192q0 14 9 23t23 9h224q250 0 410 -225q-60 -92 -137 -273q-22 45 -37 72.5 t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23zM743 353q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 q-32 0 -85 -0.5t-81 -1t-73 1t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M0 640q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5 t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281z" />
+<glyph unicode="&#xf076;" d="M0 576v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5 t-98.5 362zM0 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45zM1024 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M90 250.5q0 26.5 19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M90 773.5q0 26.5 19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M0 704q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45z M640 1120q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M0 1216q0 26 19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024 q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45zM384 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1280 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5t-0.5 12.5zM73 56q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43 q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M64 64q0 26 19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v384h256v-384h-256zM640 128v896h256v-896h-256zM1024 128v640h256v-640h-256zM1408 128v1024h256v-1024h-256z" />
+<glyph unicode="&#xf081;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 286q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109 q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4q21 -63 74.5 -104 t121.5 -42q-116 -90 -261 -90q-26 0 -50 3z" />
+<glyph unicode="&#xf082;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544 q-119 0 -203.5 84.5t-84.5 203.5z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M0 0v1280q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM128 0h1536v128h-1536v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM256 1216h384v128h-384v-128zM512 574 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM640 574q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM736 576q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9 t9 23t-9 23t-23 9q-66 0 -113 -47t-47 -113z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M0 752q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41q0 -17 -49 -66t-66 -49 q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5zM192 768q0 -80 56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56 t56 136t-56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M0 549v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8 q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90 q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5zM384 640q0 -106 75 -181t181 -75 t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM1152 58v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31 v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1152 1082v140q0 16 149 31q13 29 30 52 q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71 q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1408 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90zM1408 1152q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM616 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5 t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" />
+<glyph unicode="&#xf087;" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5 t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85 t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640z" />
+<glyph unicode="&#xf088;" d="M0 512v640q0 53 37.5 90.5t90.5 37.5h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186 q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5zM128 1088q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 512h32q16 0 35.5 -9 t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5 t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z M128 940q0 -168 187 -355l581 -560l580 559q188 188 188 356q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5 t-21.5 -143z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5q0 -4 1 -20t0.5 -26.5t-3 -23.5 t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5zM384 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf08c;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM223 1030q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86z M237 122h231v694h-231v-694zM595 122h231v388q0 38 7 56q15 35 45 59.5t74 24.5q116 0 116 -157v-371h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M0 320q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19 t-19 45zM416 672q0 -14 9 -23t23 -9t23 9t9 23v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832 q-119 0 -203.5 84.5t-84.5 203.5zM685 576q0 13 10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
+<glyph unicode="&#xf090;" d="M0 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45zM894.5 78.5q0.5 10.5 3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113 t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5q0 4 -1 20t-0.5 26.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M0 928v128q0 40 28 68t68 28h288v96q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91t97.5 -37q75 0 133.5 -45.5 t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143zM128 928q0 -78 94.5 -162t235.5 -113q-74 162 -74 371 h-256v-96zM1206 653q141 29 235.5 113t94.5 162v96h-256q0 -209 -74 -371z" />
+<glyph unicode="&#xf092;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204 q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52 t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5h-224q-119 0 -203.5 84.5t-84.5 203.5zM271 315q3 5 13 2 q10 -5 7 -12q-5 -7 -13 -2q-10 5 -7 12zM304 290q6 6 16 -3q9 -11 2 -16q-6 -7 -16 3q-9 11 -2 16zM335 233q-9 13 0 18q9 7 17 -6q9 -12 0 -19q-8 -6 -17 7zM370 206q8 9 20 -3q12 -11 4 -19q-8 -9 -20 3q-13 11 -4 19zM419 168q4 11 19 7q16 -5 13 -16q-4 -12 -19 -6 q-17 4 -13 15zM481 154q0 11 16 11q17 2 17 -11q0 -11 -16 -11q-17 -2 -17 11zM540 158q-2 12 14 15q16 2 18 -9q2 -10 -14 -14t-18 8z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M0 -32v320q0 40 28 68t68 28h427q21 -56 70.5 -92t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 936q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69q-17 -40 -59 -40 h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40zM1152 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf094;" d="M0 433q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5q0 -165 -70 -327.5 t-196 -288t-281 -180.5q-124 -44 -326 -44q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5zM128 434q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5 q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24 q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M0 1069q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235 t235 -174q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5 t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62zM128 38l423 406l89 85l89 -85l423 -406 v1242h-1024v-1242z" />
+<glyph unicode="&#xf098;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 905q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5 q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5 t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M44 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5 q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M95 631v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255z" />
+<glyph unicode="&#xf09b;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44 l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3 q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M0 96v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v608h-1664v-608zM128 1024h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600 q-13 0 -22.5 -9.5t-9.5 -22.5v-224zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M0 192q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 697v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5t259 -181.5q114 -113 181.5 -259t80.5 -306q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5 t-391.5 184.5q-25 2 -41.5 20t-16.5 43zM0 1201v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294q187 -186 294 -425.5t120 -501.5q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102 q-25 1 -42.5 19.5t-17.5 43.5z" />
+<glyph unicode="&#xf0a0;" d="M0 160v320q0 25 16 75l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-1216 q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM880 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1136 320q0 33 23.5 56.5t56.5 23.5 t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M0 672v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50 t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113zM768 633q377 -42 768 -341v954q-394 -302 -768 -343v-270z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
+<glyph unicode="&#xf0a3;" d="M2 435q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70l-53 -186l188 -48 q40 -10 52 -51q10 -42 -20 -70l-138 -135l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53 q-41 -12 -70 19q-31 29 -19 70l53 186l-188 48q-40 10 -52 51z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179q0 -105 -75.5 -181 t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q72 0 167 -32 t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139 q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106q-69 -57 -140 -57h-32v-640z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M0 769q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5v-640 q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181zM128 768q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119 q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5 t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5t-39 -89.5zM1536 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf0a6;" d="M0 640q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5t-90.5 -37.5h-640 q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5zM128 640q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140 v-32h640v32q0 72 32 167t64 193.5t32 179.5q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576q-20 0 -48.5 15t-55 33t-68 33t-84.5 15 q-67 0 -97.5 -44.5t-30.5 -115.5zM1152 -64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf0a7;" d="M0 640q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317q0 -142 -77.5 -230t-217.5 -87 l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5zM128 640q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33t55 33t48.5 15v-576q0 -50 38.5 -89 t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112 q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5zM1152 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf0a8;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM251 640q0 -27 18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45z" />
+<glyph unicode="&#xf0a9;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM256 576q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18 l362 362l91 91q18 18 18 45t-18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128z" />
+<glyph unicode="&#xf0aa;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 641q0 -27 18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19 t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45t-18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45z" />
+<glyph unicode="&#xf0ab;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 639q0 -27 18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45t-18 45l-91 91 q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45z" />
+<glyph unicode="&#xf0ac;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM226 979q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18 q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13 q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5 t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13 q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25 t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5 t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4 q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5q15 10 -7 16q-17 5 -43 -12q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8 q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5 q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26 q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5 q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14 q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5 q-16 0 -22 -1q-146 -80 -235 -222zM877 26q0 -6 2 -16q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7 t-10 1.5t-11.5 -7q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M21 0q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90zM256 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM768 960q0 185 131.5 316.5t316.5 131.5q58 0 121.5 -16.5 t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25q0 -39 -23 -106q-47 -134 -164.5 -217.5t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M0 64v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 576v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1088v256q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM640 640h1024v128h-1024v-128zM1024 128h640v128h-640v-128zM1280 1152h384v128h-384v-128z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M5 1241q17 39 59 39h1280q42 0 59 -39q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M0 160v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM0 736v384q0 66 47 113t113 47h352v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113v-384h-1792z M640 1280h512v128h-512v-128zM768 512v128h256v-128h-256z" />
+<glyph unicode="&#xf0b2;" d="M0 -64v448q0 42 40 59q39 17 69 -14l144 -144l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45 v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19l-144 144l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19 t-19 45z" />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M0 671q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5zM128 1280q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM256 3q0 53 3.5 103.5 t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5 zM576 896q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM1280 1280q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM1327 640q81 117 81 256q0 29 -5 66q66 -23 133 -23 q59 0 119 21.5t97.5 42.5t43.5 21q124 0 124 -353q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M16 1088q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l206 -207q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204t-85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88 q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204zM208 1088q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15t21.5 -21.5t18.5 -19q33 31 33 73 q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67zM911 383q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26l147 146q28 28 28 67q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5 q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M0 448q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z" />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M115.5 -64.5q-34.5 63.5 21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399l503 -793q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5zM476 384h712l-272 429l-20 31v37v399h-128v-399v-37 l-20 -31z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M1 157q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148q4 -48 -10 -97q4 -1 12 -5 l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56l-507 -398l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207zM168 176q-25 -66 21 -108q39 -36 113 -36q100 0 192 59q81 51 106 117t-21 108q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117zM168 976q25 -66 106 -117q92 -59 192 -59q74 0 113 36q46 42 21 108t-106 117q-92 59 -192 59 q-74 0 -113 -36q-46 -42 -21 -108zM672 448l9 -8q2 -2 7 -6q4 -4 11 -12t11 -12l26 -26l160 96l96 -32l736 576l-128 64l-768 -431v-113zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 576q0 26 19 45t45 19t45 -19 t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1018 391l582 -327l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M0 224v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68zM128 256h512v256q0 40 20 88t48 76l316 316v416h-384 v-416q0 -40 -28 -68t-68 -28h-416v-640zM213 1024h299v299zM768 -128h896v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640zM853 640h299v299z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M4 1023q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581 q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776 q-113 115 -113 271z" />
+<glyph unicode="&#xf0c7;" d="M0 -32v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 0h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20 t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280zM384 0h768v384h-768v-384zM640 928q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320z" />
+<glyph unicode="&#xf0c8;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5z" />
+<glyph unicode="&#xf0c9;" d="M0 64v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM0 576v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM0 1088v128q0 26 19 45t45 19h1408 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M0 128q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 640q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 1152q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM512 32v192 q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 544v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z M512 1056v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M15 438q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105v-159h-362q-6 36 -6 54zM19 -190 l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66zM34 1400l136 127h106v-404h108v-99 h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54zM512 32v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 544v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 1056v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M0 544v64q0 14 9 23t23 9h1728q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23zM384 972q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6l-14 2q-50 149 -103 205 q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743q-28 35 -51 80q-48 97 -48 188zM414 154q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22 q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156z" />
+<glyph unicode="&#xf0cd;" d="M0 -32v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-1472q-14 0 -23 -9t-9 -23zM0 1405q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5 t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2 q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195 q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39q-37 2 -45 4z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M0 160v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113zM128 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM128 544q0 -14 9 -23t23 -9h320 q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM128 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM640 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192zM640 544q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM640 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23 v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 544q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M27 160q0 27 18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45t-18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45zM128 1408l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98zM320 1216l196 60l60 196l60 -196l196 -60l-196 -60 l-60 -196l-60 196zM768 1408l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98zM1083 1062l107 -107l293 293l-107 107zM1408 768l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M64 192q0 26 19 45t45 19v320q0 8 -0.5 35t0 38t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45v-1024q0 -15 -4 -26.5t-13.5 -18.5t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5 q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM384 128q0 -52 38 -90t90 -38 t90 38t38 90t-38 90t-90 38t-90 -38t-38 -90zM1280 128q0 -52 38 -90t90 -38t90 38t38 90t-38 90t-90 38t-90 -38t-38 -90z" />
+<glyph unicode="&#xf0d2;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63 q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5 q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423z" />
+<glyph unicode="&#xf0d3;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5 q-104 0 -194.5 -28.5t-153 -76.5t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118 q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5z" />
+<glyph unicode="&#xf0d4;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM276 309q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117 q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94 q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95zM395 338q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78z M462 969q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5t-57.5 96.5t-17.5 106zM960 672h128v-160h64v160h128v64h-128v128h-64v-128h-128v-64z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M32 182q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65 t-59.5 -61.5t-24.5 -66q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131zM218 228q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5q58 0 111.5 13t99 39t73 73 t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5zM324 1222q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q38 0 78 16.5t66 43.5q53 57 53 159 q0 58 -17 125t-48.5 129.5t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160zM1084 731v108h212v217h105v-217h213v-108h-213v-219h-105v219h-212z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M0 64v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45zM128 384q106 0 181 -75t75 -181h1152q0 106 75 181t181 75v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512zM640 640q0 70 21 142 t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142t-21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142zM762 791l77 -80q42 37 55 57h2v-288h-128v-96h384v96h-128v448h-114z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M0 832q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M0 320q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M64 640q0 26 19 45l448 448q19 19 45 19t45 -19t19 -45v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M0 192v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M0 32v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h608v1152h-640v-1120zM896 0h608q13 0 22.5 9.5t9.5 22.5v1120h-640v-1152z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M0 448q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45zM0 832q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M0 448q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M0 832q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M0 32v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM0 1098q0 78 41.5 130t118.5 52h1472 q65 0 112.5 -47t47.5 -113q0 -79 -49 -151t-122 -123q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5z" />
+<glyph unicode="&#xf0e1;" d="M0 1217q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122zM19 -80v991h330v-991h-330zM531 -80q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5v-568 h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329z" />
+<glyph unicode="&#xf0e2;" d="M0 832v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298t-61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12 q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M40 736q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18 q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5 q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5 t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M0 384q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29q-141 221 -141 483zM128 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M320 832q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM710 241q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91l101 382q6 26 -7.5 48.5t-38.5 29.5t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5 t-63 -98.5zM768 1024q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1216 832q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1408 384q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M0 640q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5 t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281zM128 640q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5t-381.5 -69.5 t-282 -187.5t-104.5 -255z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM128 768q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52t-286 -52t-211.5 -141t-78.5 -191zM616 132 q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22 t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M1 551l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M0 -32v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M0 681q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17 q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5z M384 128q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180zM768 1310v98q0 26 19 45t45 19t45 -19t19 -45v-98q-42 2 -64 2t-64 -2z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M0 96v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88v-672q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68zM256 1312q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5v64 q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64zM768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1280 640h299l-299 299v-299z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M0 960q0 99 44.5 184.5t117 142t164 89t186.5 32.5t186.5 -32.5t164 -89t117 -142t44.5 -184.5q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47q0 -46 -31.5 -71t-77.5 -25 q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268zM128 960q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228 q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134zM480 1088q0 13 9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5 q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M0 256q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22zM0 800v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23 t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M0 448q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z M512 608q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M0 448q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z M512 672q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M0 131q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89 q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5 t81 -103t47.5 -132.5t24 -138t5.5 -131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190zM256 192q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5 t-271.5 112.5t-112.5 271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M0 768v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48 q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5 t-131.5 271.5v132q-164 20 -274 128t-110 252zM1152 832q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M0 96v832q0 92 66 158t158 66h64v-1280h-64q-92 0 -158 66t-66 158zM384 -128v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128v-1280h-1024zM640 1152h512v128h-512v-128zM1504 -128v1280h64q92 0 158 -66t66 -158v-832q0 -92 -66 -158t-158 -66h-64z " />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM256 480v736q0 26 19 45t45 19h1152q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158zM1408 704h64q80 0 136 56t56 136 t-56 136t-136 56h-64v-384z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M0 832v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128 q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111zM768 416v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf0f6;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM384 160v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64 q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM384 416v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM384 672v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M0 -192v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM128 -128h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224h384v1536h-1152v-1536zM256 160v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 416v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 928v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 1184v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M0 -192v1280q0 26 19 45t45 19h320v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM128 -128h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224h384v1152h-256 v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152zM256 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 1056q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128 v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM768 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M64 192q0 26 19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128 q-26 0 -45 19t-19 45zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM384 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM896 800q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192 q14 0 23 9t9 23v224h224q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192zM1280 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M0 96v832q0 92 66 158t158 66h32v-1280h-32q-92 0 -158 66t-66 158zM352 -128v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160v-1280h-1088zM512 416q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23v192 q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192zM640 1152h512v128h-512v-128zM1536 -128v1280h32q92 0 158 -66t66 -158v-832q0 -92 -66 -158t-158 -66h-32z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M0 512v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93l1 -3q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5 t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M64 1152l32 128h480l32 128h960l32 -192l-64 -32v-800l128 -192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320zM384 768q0 -53 37.5 -90.5t90.5 -37.5h128v384h-256v-256z" />
+<glyph unicode="&#xf0fd;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 192q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896z" />
+<glyph unicode="&#xf0fe;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 576q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM429 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23 l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM397 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10 l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M77 224q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM77 608q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23 l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M77 672q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM77 1056q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10 l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M77 352q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M77 800q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M0 288v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113zM128 544q0 -13 9.5 -22.5 t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M0 96v96h160h1600h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68zM256 416v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113zM384 416q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5 t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-704zM864 112q0 -16 16 -16h160q16 0 16 16t-16 16h-160q-16 0 -16 -16z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M0 160v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-832q-66 0 -113 47t-47 113zM128 288q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM512 128 q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M0 128v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM96 288q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704zM288 1136 q0 -16 16 -16h160q16 0 16 16t-16 16h-160q-16 0 -16 -16zM304 128q0 -33 23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5z" />
+<glyph unicode="&#xf10c;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M0 192v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136z M896 192v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M0 832v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136zM896 832v384 q0 80 56 136t136 56h384q80 0 136 -56t56 -136v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M0 640q0 66 47 113t113 47t113 -47t47 -113t-47 -113t-113 -47t-113 47t-47 113zM176 1088q0 73 51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5t-51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5zM208 192q0 60 42 102t102 42q59 0 101.5 -42t42.5 -102t-42.5 -102 t-101.5 -42q-60 0 -102 42t-42 102zM608 1280q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM672 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1136 192q0 46 33 79t79 33t79 -33t33 -79 t-33 -79t-79 -33t-79 33t-33 79zM1168 1088q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1344 640q0 40 28 68t68 28t68 -28t28 -68t-28 -68t-68 -28t-68 28t-28 68z" />
+<glyph unicode="&#xf111;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M0 896q0 26 19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101 t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19l-512 512q-19 19 -19 45z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M0 496q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218q0 -87 -27 -168q136 -160 136 -398q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86t-170 -47.5t-171.5 -22t-167 -4.5 q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331zM224 320q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11 q-152 21 -195 21q-118 0 -187 -84t-69 -204zM384 320q0 40 12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82t-12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82zM1024 320q0 40 12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82t-12.5 -82t-43 -76t-72.5 -34t-72.5 34 t-43 76t-12.5 82z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158zM128 224q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64 q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158zM128 331l256 315q44 53 116 87.5 t140 34.5h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-853zM171 163q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1792" />
+<glyph unicode="&#xf117;" horiz-adv-x="1792" />
+<glyph unicode="&#xf118;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM402 461q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38 q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5q-37 -121 -138 -195t-228 -74t-228 74t-138 195zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf119;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM402 307q37 121 138 195t228 74t228 -74t138 -195q8 -25 -4 -48.5 t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf11a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 448q0 26 19 45t45 19h640q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M0 512q0 212 150 362t362 150h896q212 0 362 -150t150 -362t-150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150t-150 362zM192 448q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23v128 q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128zM1152 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1408 640q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M0 128v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5zM128 128h1664v896h-1664v-896zM256 272v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM256 528v96 q0 16 16 16h224q16 0 16 -16v-96q0 -16 -16 -16h-224q-16 0 -16 16zM256 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM512 272v96q0 16 16 16h864q16 0 16 -16v-96q0 -16 -16 -16h-864q-16 0 -16 16zM512 784v96q0 16 16 16h96q16 0 16 -16v-96 q0 -16 -16 -16h-96q-16 0 -16 16zM640 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM768 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM896 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16z M1024 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1152 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1280 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1408 528v96q0 16 16 16h112v240 q0 16 16 16h96q16 0 16 -16v-352q0 -16 -16 -16h-224q-16 0 -16 16zM1536 272v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64zM320 320v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86 q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56zM448 426 q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64zM320 320v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86 q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56zM448 426 q205 96 384 110v192q-181 -16 -384 -117v-185zM448 836q215 111 384 118v197q-172 -8 -384 -126v-189zM832 730h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15 t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2q-23 0 -49 -3v-222zM1280 828q148 -42 384 90v189q-169 -91 -306 -91q-45 0 -78 8v-196z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM640 32v64q0 14 9 23t23 9h960q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-960 q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM712 -52l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5 l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5zM1293 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M0 896q0 26 19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45l397 -397v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45zM384 896q0 26 19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221 q169 -173 169 -509q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M2 900.5q9 27.5 54 34.5l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5z M832 310l59 -31l318 -168l-60 355l-12 66l49 47l257 250l-356 52l-66 10l-30 60l-159 322v-963z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M2 561q-5 22 4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M0 928v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864 q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23zM512 301l595 595h-595v-595zM557 256h595v595z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M0 64q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136 q0 -52 -26 -96.5t-70 -69.5q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136zM96 64q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68zM96 1216q0 -40 28 -68 t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68zM736 1088q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M0 448q0 14 9 23t23 9h320q14 0 23 -9t9 -23t-9 -23t-23 -9h-320q-14 0 -23 9t-9 23zM16 1088q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56l-239 -18l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68 l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204zM128 32q0 13 9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23zM544 -96v320q0 14 9 23t23 9t23 -9t9 -23v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23zM633 364 l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56zM1056 1184v320q0 14 9 23t23 9t23 -9t9 -23v-320 q0 -14 -9 -23t-23 -9t-23 9t-9 23zM1216 1120q0 13 9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23zM1280 960q0 14 9 23t23 9h320q14 0 23 -9t9 -23t-9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M96.5 986q-2.5 15 5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5t-10.5 37.5v45q0 83 65 156.5 t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25zM384 40v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M0 64v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM128 1152v192q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-192 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M98 1344q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45zM128 64v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf12b;" d="M5 0v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258zM1013 713q0 64 26 117t65 86.5 t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80h126v-206h-514l-3 27q-4 28 -4 46z " />
+<glyph unicode="&#xf12c;" d="M5 0v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258zM1015 -183q0 64 26 117t65 86.5 t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126v-206h-514l-4 27q-3 45 -3 46z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M1.5 146.5q5.5 37.5 30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5zM128 128h768l336 384h-768z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M0 0v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5 q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124 q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89 q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M0 704v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45 t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5zM256 704v512q0 132 94 226t226 94t226 -94t94 -226v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M13 64q0 13 10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23t-10 -23l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -221 -147.5 -384.5 t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23zM128 704v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113l-101 -101 q-42 103 -42 214zM384 704v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M0 576v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150t-33.5 170.5zM640 79 q119 63 213 137q235 184 235 360v640h-448v-1137z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h1408v1024h-1408v-1024z M384 1088q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288zM1152 1088q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M3.5 940q-8.5 25 3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96 q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37 zM384 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M36 464l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85 q-3 -1 -9 -1q-14 0 -23 9l-64 64q-17 19 -5 39zM1248 1088q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M0 0l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334z" />
+<glyph unicode="&#xf137;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM346 640q0 -26 19 -45l454 -454q19 -19 45 -19t45 19l102 102q19 19 19 45t-19 45l-307 307l307 307 q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45z" />
+<glyph unicode="&#xf138;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM506 288q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l454 454q19 19 19 45t-19 45l-454 454 q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45z" />
+<glyph unicode="&#xf139;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM250 544q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19l102 102 q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45z" />
+<glyph unicode="&#xf13a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM250 736q0 -26 19 -45l454 -454q19 -19 45 -19t45 19l454 454q19 19 19 45t-19 45l-102 102 q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M0 1408h1408l-128 -1438l-578 -162l-574 162zM262 1114l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674l16 175h-884z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M12 75l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208l59 297h1505l-266 -1333l-804 -267z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M0 0v352q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5 l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30zM832 1280q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181v-320h736q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28 t-28 68z" />
+<glyph unicode="&#xf140;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM256 640q0 212 150 362t362 150t362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362zM384 640q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM512 640q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM512 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM1024 608v192q0 40 28 68t68 28h192 q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M0 96v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h192q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68z" />
+<glyph unicode="&#xf143;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 256q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M256 575q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10t9 24q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128zM256 959q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128 q13 0 23 10q11 9 9 23q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128z" />
+<glyph unicode="&#xf144;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 320q0 -37 32 -56q16 -8 32 -8q17 0 32 9l544 320q32 18 32 55t-32 55l-544 320q-31 19 -64 1 q-32 -19 -32 -56v-640z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M54 448.5q0 53.5 37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136t-136 56t-136 -56l-125 126q-37 37 -37 90.5z M342 512q0 -26 19 -45l362 -362q18 -18 45 -18t45 18l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45zM452 512l572 572l316 -316l-572 -572z" />
+<glyph unicode="&#xf146;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 576q0 -26 19 -45t45 -19h896q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128 z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832zM256 672v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M3 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M3 1261q9 19 29 19h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34z" />
+<glyph unicode="&#xf14a;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM218 640q0 -26 19 -45l358 -358q19 -19 45 -19t45 19l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19 t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45z" />
+<glyph unicode="&#xf14b;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 128h288l544 544l-288 288l-544 -544v-288zM352 320v56l52 52l152 -152l-52 -52h-56v96h-96zM494 494 q-14 13 3 30l291 291q17 17 30 3q14 -13 -3 -30l-291 -291q-17 -17 -30 -3zM864 1024l288 -288l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28z" />
+<glyph unicode="&#xf14c;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM282 320q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59 v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45z" />
+<glyph unicode="&#xf14d;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 448q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5t224 23.5v-160 q0 -42 40 -59q12 -5 24 -5q26 0 45 19l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5z" />
+<glyph unicode="&#xf14e;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 241v542l512 256v-542zM640 448l256 128l-256 128v-256z" />
+<glyph unicode="&#xf150;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM391 861q17 35 57 35h640q40 0 57 -35q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66z" />
+<glyph unicode="&#xf151;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM391 419q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66q-17 -35 -57 -35h-640q-40 0 -57 35z" />
+<glyph unicode="&#xf152;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -14 9 -23t23 -9h960q14 0 23 9t9 23v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960z M512 320v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52t-27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M0 514v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5 t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5 l12 3l5 2q13 5 26 -2q12 -7 15 -21l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M0 32v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215 h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M52 171l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242 t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48 t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50t53 -63.5t31.5 -76.5t13 -94q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5 t-17.5 18q-17 21 -2 41z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M0 605v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171 q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M4 1360q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103 q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M0 256v128q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315t-126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9 h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23zM487 747h320q106 0 171 62t65 162t-65 162t-171 62h-320v-448z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M0 672v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111 q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23z M373 896l32 -128h225l35 128h-292zM436 640l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5l81 299h-159zM822 768h139l-35 128h-70zM1118 896l34 -128h230l33 128h-297zM1187 640l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3l78 300h-162z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M56 0l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89 t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200zM522 182q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30t24.5 40t9.5 51q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1 t-47.5 -1v-338zM522 674q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307z" />
+<glyph unicode="&#xf15b;" d="M0 -160v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472z" />
+<glyph unicode="&#xf15c;" d="M0 -160v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM384 160q0 -14 9 -23t23 -9h704q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM384 416q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM384 672q0 -14 9 -23t23 -9h704q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM899 768v106h70l230 662h162l230 -662h70v-106h-288v106h75l-47 144h-243l-47 -144h75v-106 h-287zM988 -166l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121v-233h-584v90zM1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18 t-7.5 -29z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM899 -150h70l230 662h162l230 -662h70v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287 v106zM988 768v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248v119h121v-233h-584zM1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29 z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM896 -32q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9 t-9 23v192zM896 288v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23zM896 800v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23zM896 1312v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23 v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM896 -32q0 14 9 23t23 9h256q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9 t-9 23v192zM896 288v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23zM896 800v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23zM896 1312v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23 v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf162;" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM946 261q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5q0 -62 -13 -121.5t-41 -114 t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5zM976 1351l192 185h123v-654h165v-114h-469v114h167v432q0 7 0.5 19t0.5 17 v16h-2l-7 -12q-8 -13 -26 -31l-62 -58zM1085 261q0 -57 36.5 -95t104.5 -38q50 0 85 27t35 68q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94z" />
+<glyph unicode="&#xf163;" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM946 1285q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5q0 -62 -13 -121.5t-41 -114 t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5zM976 327l192 185h123v-654h165v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16 h-2l-7 -12q-8 -13 -26 -31l-62 -58zM1085 1285q0 -57 36.5 -95t104.5 -38q50 0 85 27t35 68q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M0 64v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45zM128 192q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45zM480 64v641q0 25 18 43.5t43 20.5q24 2 76 59 t101 121q68 87 101 120q18 18 31 48t17.5 48.5t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135 q0 -86 -55 -149q15 -44 15 -76q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M0 448q0 -26 19 -45t45 -19h288q26 0 45 19t19 45v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640zM128 960q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45zM480 447v641q0 26 19 44.5t45 19.5q35 1 158 44 q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76q55 -61 55 -149q-1 -78 -57.5 -135t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39 t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121t-76 59q-25 2 -43 20.5t-18 43.5z" />
+<glyph unicode="&#xf166;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM218 366q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73 q20 84 20 260q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5q-20 -87 -20 -260zM300 551v70h232v-70h-80v-423h-74v423h-78zM396 1313l24 -69t23 -69q35 -103 46 -158v-201h74v201l90 296h-75l-51 -195l-53 195 h-78zM542 205v290h66v-270q0 -24 1 -26q1 -15 15 -15q20 0 42 31v280h67v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54zM654 936q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38q-21 -29 -21 -87v-130zM721 923 v156q0 52 32 52t32 -52v-156q0 -51 -32 -51t-32 51zM790 128v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67zM857 200q16 -16 33 -16q29 0 29 49v157q0 50 -29 50q-17 0 -33 -16v-224zM907 893q0 -37 6 -55 q11 -27 43 -27q36 0 77 45v-40h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293zM1037 247v129q0 59 20 86q29 38 80 38t78 -38q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68v-9q0 -29 -2 -43q-3 -22 -15 -40 q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86zM1103 355h66v34q0 51 -33 51t-33 -51v-34z" />
+<glyph unicode="&#xf167;" d="M27 260q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99q-26 112 -26 350zM138 509h105v-569h100v569h107v94h-312 v-94zM266 1536h106l71 -263l68 263h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187zM463 43q0 -49 8 -73q12 -37 58 -37q48 0 102 61v-54h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391zM614 1028v175q0 80 28 117q38 51 105 51 q69 0 106 -51q28 -37 28 -117v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51q-28 38 -28 118zM704 1011q0 -70 43 -70t43 70v210q0 69 -43 69t-43 -69v-210zM798 -60h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89 v-663zM887 36v301q22 22 45 22q39 0 39 -67v-211q0 -67 -39 -67q-23 0 -45 22zM955 971v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75zM1130 100q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54 q2 9 2 58v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51q-28 -37 -28 -116v-173zM1219 245v46q0 68 45 68t45 -68v-46h-90z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M5 384q-10 17 0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45l164 -286q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17zM536 539q18 32 531 942q25 45 64 45h241q22 0 31 -15q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37 q-10 -15 -32 -15h-239q-42 0 -66 45z" />
+<glyph unicode="&#xf169;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM227 396q8 -13 24 -13h185q31 0 50 36l199 352q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29 l125 -216v-1l-196 -346q-9 -14 0 -28zM638 516q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1l409 723q8 16 0 28q-7 12 -24 12h-187q-30 0 -49 -35z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M0 640q0 96 1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150t-1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58 t-69.5 123q-14 65 -21.5 147.5t-8.5 136.5t-1 150zM640 320q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54t-30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M64 558l338 271l494 -305l-342 -285zM64 1099l490 319l342 -285l-494 -304zM407 166v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284l147 96v-108l-490 -293v-1l-1 1l-1 -1v1zM896 524l494 305l338 -271l-489 -319zM896 1133l343 285l489 -319l-338 -270z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M0 -255v736h121v-618h928v618h120v-701l-1 -35v-1h-1132l-35 1h-1zM221 -17v151l707 1v-151zM227 243l14 150l704 -65l-13 -150zM270 563l39 146l683 -183l-39 -146zM395 928l77 130l609 -360l-77 -130zM707 1303l125 86l398 -585l-124 -85zM1136 1510l149 26l121 -697 l-149 -26z" />
+<glyph unicode="&#xf16d;" d="M0 69v1142q0 81 58 139t139 58h1142q81 0 139 -58t58 -139v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139zM171 110q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62 q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648zM461 643q0 -124 90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5t-90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5zM1050 1003q0 -29 20 -49t49 -20h174q29 0 49 20t20 49v165q0 28 -20 48.5 t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165z" />
+<glyph unicode="&#xf16e;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM274 640q0 -88 62 -150t150 -62t150 62t62 150t-62 150t-150 62t-150 -62t-62 -150zM838 640q0 -88 62 -150 t150 -62t150 62t62 150t-62 150t-150 62t-150 -62t-62 -150z" />
+<glyph unicode="&#xf170;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM309 384h94l104 160h522l104 -160h94l-459 691zM567 608l201 306l201 -306h-402z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M0 1222q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34 t-6 39.5t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158zM173 285l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18t-76.5 27 t-73 43.5t-52 61.5q-25 96 -57 292zM243 1240q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5q-20 27 -56 44.5t-58 22t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43zM481 657q4 -91 77.5 -155t165.5 -56q91 8 152 84 t50 168q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5zM599 710q14 41 52 58q36 18 72.5 12t64 -35.5t27.5 -67.5q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82z" />
+<glyph unicode="&#xf172;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM260 1060q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63 q24 13 39.5 23t31 29t19.5 40q48 267 80 473q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54zM385 384q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71q0 7 5.5 26.5t3 32 t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6zM436 1073q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5t-52.5 16t-54.5 32.5zM607 653q-2 49 25.5 93t72.5 64 q70 31 141.5 -10t81.5 -118q8 -66 -36 -121t-110 -61t-119 40t-56 113zM687.5 660.5q0.5 -52.5 43.5 -70.5q39 -23 81 4t36 72q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M78 779v217q91 30 155 84q64 55 103 132q39 78 54 196h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170z" />
+<glyph unicode="&#xf174;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM413 744h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49v181 q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M3 237q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19t-5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M3 1043q-8 19 5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M64 637q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M0 544v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M0 634q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32 q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503zM683 1131q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M0 -27v557h682v-651zM0 614v565l682 94v-659h-682zM757 -131v661h907v-786zM757 614v669l907 125v-794h-907z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M0 337v430q0 42 30 72t73 30q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30t-73 30t-30 73zM241 886q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20l-71 -131q107 -55 171 -153.5t64 -215.5 h-925zM245 184v666h918v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78zM455 1092q0 -16 11 -27.5t27 -11.5t27.5 11.5t11.5 27.5t-11.5 27.5 t-27.5 11.5t-27 -11.5t-11 -27.5zM876 1092q0 -16 11.5 -27.5t27.5 -11.5t27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5zM1203 337v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73z" />
+<glyph unicode="&#xf17c;" d="M11 -115q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5 t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195q-12 112 -16 310q-2 90 24 151.5 t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5 t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13 t16.5 -9.5q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5 q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5zM321 495q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54 t7 -70.5q46 24 7 92q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5 t60 -22.5q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18zM372 630q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12zM603 1190q2 -5 5 -6 q10 0 7 -15q-3 -20 8 -20q3 0 3 3q3 17 -2.5 30t-11.5 15q-9 2 -9 -7zM634 1110q0 12 19 15h10q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5zM721 1122q24 11 32 -2q3 -6 -3 -9q-4 -1 -11.5 6.5t-17.5 4.5zM835 1196l4 -2q14 -4 18 -31q0 -3 8 2l2 3q0 11 -5 19.5t-11 12.5 t-9 3q-14 -1 -7 -7zM851 1381.5q-1 -2.5 3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9zM981 1002q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20q-2 8 -6.5 11.5t-13 5 t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5z" />
+<glyph unicode="&#xf17d;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM112 640q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81t99.5 48l37 13 q4 1 13 3.5t13 4.5q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21zM126 775q302 0 606 80q-120 213 -244 378q-138 -65 -234 -186t-128 -272zM350 134q184 -150 418 -150q132 0 256 52q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5 t-103 -148zM609 1276q1 1 2 1q-1 0 -2 -1zM613 1277q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5l12.5 17.5q-185 164 -433 164q-76 0 -155 -19zM909 797q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5 t36.5 -6t25 -4.5l10 -2q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5zM1007 565q87 -239 128 -469q111 75 185 189.5t96 250.5q-210 60 -409 29z" />
+<glyph unicode="&#xf17e;" d="M0 1024q0 159 112.5 271.5t271.5 112.5q130 0 234 -80q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225 t-55.5 273.5q0 73 16 150q-80 104 -80 234zM376 399q0 -92 122 -157.5t291 -65.5q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12 t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5 q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M0 640q0 75 53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41l619 619l2 -3q53 -53 53 -128t-53 -128l-587 -587 q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128zM302 660q0 21 14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36z" />
+<glyph unicode="&#xf181;" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM160 192q0 -14 9 -23t23 -9h480q14 0 23 9t9 23v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024zM832 576q0 -14 9 -23t23 -9h480q14 0 23 9t9 23 v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M0 480q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192 q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43q-40 0 -68 28t-28 68zM416 1280q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M0 416v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68z M288 1280q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
+<glyph unicode="&#xf184;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM399.5 766q8.5 -37 24.5 -59l349 -473l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5 t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M44 363q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29q-4 -15 -20 -20 l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20zM320 640q0 -117 45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5 t-45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5z" />
+<glyph unicode="&#xf186;" d="M0 640q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M64 1088v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM128 -64v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM704 704q0 -26 19 -45t45 -19h256 q26 0 45 19t19 45t-19 45t-45 19h-256q-26 0 -45 -19t-19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M32 576q0 26 19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19t19 -45t-19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19 t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45z M512 1152q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5h-640z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M-1 1004q0 11 3 16l4 6q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24 q17 19 38 30q53 26 239 24q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5 t13 3t20 0.5l288 2q39 5 64 -2.5t31 -16.5l6 -10q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12 q-30 21 -70 64t-68.5 77.5t-61 58t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211 t-130.5 272q-6 16 -6 27z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M0 391q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5q0 -68 -37 -139.5 t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5zM181 320q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5zM413.5 230.5 q-40.5 92.5 6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5q-45 -102 -158 -150t-224 -12q-107 34 -147.5 126.5zM495 257.5q9 -34.5 43 -50.5t74.5 -2.5t62.5 47.5q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5zM705 399 q-17 -31 13 -45q14 -5 29 0.5t22 18.5q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5zM1165 1274q-6 28 9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158 q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5zM1224 1047q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5t54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37z" />
+<glyph unicode="&#xf18b;" d="M0 638q0 187 83.5 349.5t229.5 269.5t325 137v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495zM398 -34q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211q-171 -94 -368 -94q-196 0 -367 94zM898 909v485q179 -30 325 -137t229.5 -269.5 t83.5 -349.5q0 -280 -181 -495q-204 99 -330.5 306.5t-126.5 459.5z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M0 -211q0 19 13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23 t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89 t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283 q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32z" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M21 217v66h1238v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5zM21 354v255h1238v-255h-1238zM21 682v255h1238v-255h-1238zM21 1010v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5v-67h-1238z" />
+<glyph unicode="&#xf18e;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM384 544v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5z" />
+<glyph unicode="&#xf190;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM384 640q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23z" />
+<glyph unicode="&#xf191;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM448 640q0 33 27 52l448 320q17 12 37 12q26 0 45 -19t19 -45v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52z" />
+<glyph unicode="&#xf192;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 640q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
+<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M0 320q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5zM416 1348q-2 16 6 42 q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455l198 99l58 -114l-256 -128q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5z" />
+<glyph unicode="&#xf194;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 806q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5 q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237q104 139 172.5 292.5t82.5 226.5q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143 q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7z" />
+<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M0 608v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31 l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26z" />
+<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832zM256 672v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M0 576q0 12 38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113q-110 -64 -268 -64h-128v64 h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5zM323 336h29q157 0 273 64h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96zM323 816l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5 t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64h-29zM1739 484l81 -30q68 48 68 122t-68 122l-81 -30q53 -36 53 -92t-53 -92z" />
+<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M0 796q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5 t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72 l-55 163l-153 -53q-29 -9 -50 -9q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5zM620 811l105 -313l310 105l-105 315z" />
+<glyph unicode="&#xf199;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 352q0 -40 28 -68t68 -28h832q40 0 68 28t28 68v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99 q-98 -69 -164 -69t-164 69q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436zM256 928q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13 t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68z" />
+<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM41 640q0 -173 68 -331.5t182.5 -273t273 -182.5t331.5 -68t331.5 68t273 182.5t182.5 273t68 331.5 t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5zM127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM254 1062q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5 q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21t14.5 -24t14 -23q63 -107 63 -212q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15 t-1.5 -18.5t9 -16.5t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5zM679 -97l230 670l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1282 -24l235 678q59 169 59 276q0 42 -6 79 q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5z" />
+<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M0 455q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360l272 133v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5zM1134 860v172q277 -33 481 -157l140 79l37 -390l-525 114l147 83 q-119 70 -280 99z" />
+<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M0 -128q0 26 20.5 45t48.5 19h1782q28 0 48.5 -19t20.5 -45v-128h-1920v128zM0 1024v128l960 384l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128zM128 0v64q0 26 20.5 45t48.5 19h59v768h256v-768h128v768h256v-768h128v768h256 v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664z" />
+<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M0 1024q0 23 22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31t-22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433 q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31zM512 384l18 316l574 -181q22 -7 48 -7t48 7l574 181l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128z" />
+<glyph unicode="&#xf19e;" d="M109 1536q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610l13 -707q-62 11 -105 11 q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287z" />
+<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M111 182q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5t-59.5 -93 t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131zM297 228q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13 t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5zM403 1222q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5 q53 56 53 159q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160z" />
+<glyph unicode="&#xf1a1;" horiz-adv-x="1984" d="M0 722q0 94 66 160t160 66q83 0 148 -55q248 158 592 164l134 423q4 14 17.5 21.5t28.5 4.5l347 -82q22 50 68.5 81t102.5 31q77 0 131.5 -54.5t54.5 -131.5t-54.5 -132t-131.5 -55q-76 0 -130.5 54t-55.5 131l-315 74l-116 -366q327 -14 560 -166q64 58 151 58 q94 0 160 -66t66 -160q0 -62 -31 -114t-83 -82q5 -33 5 -61q0 -121 -68.5 -230.5t-197.5 -193.5q-125 -82 -285.5 -125.5t-335.5 -43.5q-176 0 -336.5 43.5t-284.5 125.5q-129 84 -197.5 193t-68.5 231q0 29 5 66q-48 31 -77 81.5t-29 109.5zM77 722q0 -67 51 -111 q49 131 180 235q-36 25 -82 25q-62 0 -105.5 -43.5t-43.5 -105.5zM178 465q0 -101 59.5 -194t171.5 -166q116 -75 265.5 -115.5t313.5 -40.5t313.5 40.5t265.5 115.5q112 73 171.5 166t59.5 194t-59.5 193.5t-171.5 165.5q-116 75 -265.5 115.5t-313.5 40.5t-313.5 -40.5 t-265.5 -115.5q-112 -73 -171.5 -165.5t-59.5 -193.5zM555 572q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96zM661 209.5q0 16.5 11 27.5t27 11t27 -11q77 -77 265 -77h2q188 0 265 77q11 11 27 11t27 -11t11 -27.5t-11 -27.5 q-99 -99 -319 -99h-2q-220 0 -319 99q-11 11 -11 27.5zM1153 572q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96zM1555 1350q0 -45 32 -77t77 -32t77 32t32 77t-32 77t-77 32t-77 -32t-32 -77zM1672 843q131 -105 178 -238 q57 46 57 117q0 62 -43.5 105.5t-105.5 43.5q-49 0 -86 -28z" />
+<glyph unicode="&#xf1a2;" d="M0 193v894q0 133 94 227t226 94h896q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227zM155 709q0 -37 19.5 -67.5t52.5 -45.5q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54 q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43 q-51 0 -87 -36.5t-36 -87.5zM493 613q0 37 26 63t63 26t63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64zM560 375q0 11 8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18z M882 613q0 37 26 63t63 26t63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64zM1143 1120q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21q-29 0 -50 21t-21 50z" />
+<glyph unicode="&#xf1a3;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 502q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14 q19 0 32.5 -14t13.5 -33v-54l60 -28l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122zM806 500q0 -80 58 -137t139 -57t138.5 57t57.5 139v122h-150v-126q0 -20 -13.5 -33.5t-33.5 -13.5 q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123z" />
+<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M0 336v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58l-131 61v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5zM1062 332 v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275h328v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5z" />
+<glyph unicode="&#xf1a5;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM64 640h704v-704h480q93 0 158.5 65.5t65.5 158.5v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480z " />
+<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M0 271v697h328v286h204v-983h-532zM205 435h123v369h-123v-369zM614 271h205v697h-205v-697zM614 1050h205v204h-205v-204zM901 26v163h328v82h-328v697h533v-942h-533zM1106 435h123v369h-123v-369zM1516 26v163h327v82h-327v697h532v-942h-532zM1720 435h123v369h-123 v-369z" />
+<glyph unicode="&#xf1a7;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM293 388l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229t-88.5 229t-213.5 95q-74 0 -141 -36h-186v-840z M504 804v277q28 17 70 17q53 0 91 -45t38 -109t-38 -109.5t-91 -45.5q-43 0 -70 15zM636 -39l211 41v206q51 -19 117 -19q125 0 213 95t88 229t-88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101v-636zM847 377v277q28 17 70 17q53 0 91 -45.5t38 -109.5 t-38 -109t-91 -45q-43 0 -70 15z" />
+<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M41 455q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80 t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5l1 -21q75 3 143.5 -20.5 t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14q6 -5 28 -23.5t25.5 -22t19 -18 t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63 t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27zM764 676q10 1 32.5 7t34.5 6q19 0 35 -10l-96 -20zM822 568l48 12l109 -177l-73 -48zM859 884q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1 v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5 t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43zM1061 45h31l10 -83l-41 -12v95zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM1116 29 q21 2 60.5 8.5t72 10t60.5 3.5h14q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13t-54 -9.5t-53.5 -7.5t-32 -4.5zM1947 1528l1 3l2 4l-1 -5zM1950 1535v1v-1zM1950 1535l1 1z" />
+<glyph unicode="&#xf1a9;" d="M0 520q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5 t19.5 -177.5q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302zM333 256q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5zM685.5 -76q-0.5 -10 7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5 q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16zM852 31q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5 t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10q-29 -12 -78 -56q-26 -24 -12 -44z" />
+<glyph unicode="&#xf1aa;" d="M0 78q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160l151 -152l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5 t-60 145.5zM2 1202q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5t149.5 -87.5l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5 q-70 15 -115 71t-45 129zM446 803l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126t135.5 51q85 0 145 -60.5t60 -145.5q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152 l-160 -160zM776 793l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5q76 -11 126.5 -68.5t50.5 -134.5q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30 l-152 152z" />
+<glyph unicode="&#xf1ab;" d="M0 -16v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5q20 0 20 -21v-418l147 -47v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3zM39 15l694 232v1032l-694 -233v-1031zM147 293q6 4 82 92 q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8 t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110 q-4 -2 -19.5 -4t-18.5 0zM268 933l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41zM310 -116q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11q73 -37 159.5 -61.5t157.5 -24.5 q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5l-43 73l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16zM777 1294l573 -184v380zM885 453l102 -31l45 110l211 -65l37 -135l102 -31l-181 657l-100 31z M1071 630l76 185l63 -227z" />
+<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M0 -96v1088q0 66 47 113t113 47h128q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113zM512 -96v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-163q58 -34 93 -93t35 -128v-768q0 -106 -75 -181 t-181 -75h-864q-66 0 -113 47t-47 113zM640 896h896v256h-160q-40 0 -68 28t-28 68v160h-640v-512zM736 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM736 256q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9 h-128q-14 0 -23 -9t-9 -23v-128zM736 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 256q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM1248 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23 v-128zM1248 256q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM1248 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128z" />
+<glyph unicode="&#xf1ad;" d="M0 -192v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM256 160q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 1184q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 96v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23zM512 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64zM512 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 928q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 160q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64zM1024 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64z" />
+<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M64 1056q0 40 28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68zM416 1152q0 93 65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
+<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M0 724q0 80 42 139.5t119 59.5q76 0 141.5 -55.5t100.5 -134t35 -152.5q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152zM256 19q0 86 56 191.5t139.5 192.5t187.5 146t193 59q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45 t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146zM333 1163q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151zM884 1064 q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5q-61 0 -105 39t-63 92.5t-19 113.5zM1226 581q0 74 35 152.5t100.5 134t141.5 55.5q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5 q-77 0 -119 59t-42 139z" />
+<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M64 1008q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5z" />
+<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M0 256v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65zM134 1026l698 -254l698 254l-698 254zM896 -93l640 349v636l-640 -233v-752z" />
+<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M0 96v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70v-400l434 -186q36 -16 57 -48t21 -70v-416q0 -36 -19 -67t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4 l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67zM172 531l404 -173l404 173l-404 173zM640 -96l384 192v314l-384 -164v-342zM647 1219l441 -189l441 189l-441 189zM1152 651l384 165v266l-384 -164v-267zM1196 531l404 -173l404 173l-404 173zM1664 -96 l384 192v314l-384 -164v-342z" />
+<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M0 22v1260h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5 t45.5 113.5q0 144 -190 144h-260v-294zM1137 477q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658q0 -111 57.5 -171.5t166.5 -60.5q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347zM1337 1073h511v124 h-511v-124zM1388 576h408q-18 195 -200 195q-90 0 -146 -52.5t-62 -142.5z" />
+<glyph unicode="&#xf1b5;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 254h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5t-56.5 60.5t-79 29.5 t-97 8.5h-371v-787zM301 388v217h189q124 0 124 -113q0 -104 -128 -104h-185zM301 723v184h163q119 0 119 -90q0 -94 -106 -94h-176zM838 538q0 -135 79 -217t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20q-68 0 -104 38t-36 107h411q1 10 1 30 q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216zM964 911v77h319v-77h-319zM996 600q4 56 39 89t91 33q113 0 124 -122h-254z" />
+<glyph unicode="&#xf1b6;" horiz-adv-x="2048" d="M0 764q0 86 61 146.5t146 60.5q73 0 130 -46t73 -117l783 -315q49 29 106 29q14 0 21 -1l173 248q1 114 82 194.5t195 80.5q115 0 196.5 -81t81.5 -196t-81.5 -196.5t-196.5 -81.5l-265 -194q-8 -80 -67.5 -133.5t-138.5 -53.5q-73 0 -130 46t-73 117l-783 315 q-51 -30 -106 -30q-85 0 -146 61t-61 147zM55 764q0 -64 44.5 -108.5t107.5 -44.5q11 0 33 4l-64 26q-33 14 -52.5 44.5t-19.5 66.5q0 50 35.5 85.5t85.5 35.5q20 0 41 -8v1l76 -31q-20 37 -56.5 59t-78.5 22q-63 0 -107.5 -44.5t-44.5 -107.5zM1164 244q19 -37 55.5 -59 t79.5 -22q63 0 107.5 44.5t44.5 107.5t-44.5 108t-107.5 45q-13 0 -33 -4q2 -1 20 -8t21.5 -8.5t18.5 -8.5t19 -10t16 -11t15.5 -13.5t11 -14.5t10 -18t5 -21t2.5 -25q0 -50 -35.5 -85.5t-85.5 -35.5q-14 0 -31.5 4.5t-29 9t-31.5 13.5t-28 12zM1584 767q0 -77 54.5 -131.5 t131.5 -54.5t132 54.5t55 131.5t-55 131.5t-132 54.5q-76 0 -131 -54.5t-55 -131.5zM1623 767q0 62 43.5 105.5t104.5 43.5t105 -44t44 -105t-43.5 -104.5t-105.5 -43.5q-61 0 -104.5 43.5t-43.5 104.5z" />
+<glyph unicode="&#xf1b7;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 693q0 -53 38 -91t92 -38q36 0 66 18l489 -197q10 -44 45.5 -73t81.5 -29q50 0 86.5 34t41.5 83l167 122 q71 0 122 50.5t51 122.5t-51 123t-122 51q-72 0 -122.5 -50.5t-51.5 -121.5l-108 -155q-2 0 -6.5 0.5t-6.5 0.5q-35 0 -67 -19l-489 197q-10 44 -45.5 73t-80.5 29q-54 0 -92 -38t-38 -92zM162 693q0 40 28 68t68 28q27 0 49.5 -14t34.5 -37l-48 19q-29 11 -56.5 -2 t-38.5 -41q-12 -29 -0.5 -57t39.5 -40v-1l40 -16q-14 -2 -20 -2q-40 0 -68 27.5t-28 67.5zM855 369q5 -2 47 -19q29 -12 58 0.5t41 41.5q11 29 -1 57.5t-41 40.5l-40 16q14 2 21 2q39 0 67 -27.5t28 -67.5t-28 -67.5t-67 -27.5q-59 0 -85 51zM1118 695q0 48 34 82t83 34 q48 0 82 -34t34 -82t-34 -82t-82 -34q-49 0 -83 34t-34 82zM1142 696q0 -39 27.5 -66t65.5 -27t65.5 27t27.5 66q0 38 -27.5 65.5t-65.5 27.5t-65.5 -27.5t-27.5 -65.5z" />
+<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M16 970l433 -17l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188zM270.5 158q-3.5 28 4 65t12 55t21.5 64t19 53q78 -12 509 -28l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5 q-11 27 -14.5 55zM294 1124l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5t36 -39.5t32 -35q-47 -63 -265 -435l-317 187zM782 1524l405 -1q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190l142 83l-220 -373l-419 20l151 86q-34 89 -75 166 t-75.5 123.5t-64.5 80t-47 46.5zM953 197l211 362l7 -173q170 -16 283 -5t170 33l56 22l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164zM1218 847l313 195l19 11l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22 t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436z" />
+<glyph unicode="&#xf1b9;" horiz-adv-x="1984" d="M0 160v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h704q98 0 179 -63.5t104 -157.5l105 -419h28q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-128v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-928v-128q0 -80 -56 -136 t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23zM160 448q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113zM516 768h952l-89 357q-2 8 -14 17.5t-21 9.5h-704q-9 0 -21 -9.5t-14 -17.5zM1472 448q0 -66 47 -113t113 -47t113 47t47 113 t-47 113t-113 47t-113 -47t-47 -113z" />
+<glyph unicode="&#xf1ba;" horiz-adv-x="1984" d="M0 32v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h64q98 0 179 -63.5t104 -157.5l105 -419h28q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-128v-64q0 -80 -56 -136t-136 -56 t-136 56t-56 136v64h-928v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23zM160 320q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113zM516 640h952l-89 357q-2 8 -14 17.5t-21 9.5h-704q-9 0 -21 -9.5t-14 -17.5zM1472 320 q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113z" />
+<glyph unicode="&#xf1bb;" d="M32 64q0 26 19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45t-19 -45t-45 -19 h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45z" />
+<glyph unicode="&#xf1bc;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM237 886q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37q159 0 309.5 -34t253.5 -95q21 -12 40 -12 q29 0 50.5 20.5t21.5 51.5q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5zM289 637q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5q0 40 -35 61 q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64zM321 406q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52z" />
+<glyph unicode="&#xf1bd;" d="M0 11v1258q0 58 40.5 98.5t98.5 40.5h1258q58 0 98.5 -40.5t40.5 -98.5v-1258q0 -58 -40.5 -98.5t-98.5 -40.5h-1258q-58 0 -98.5 40.5t-40.5 98.5zM71 11q0 -28 20 -48t48 -20h1258q28 0 48 20t20 48v1258q0 28 -20 48t-48 20h-1258q-28 0 -48 -20t-20 -48v-1258z M121 11v141l711 195l-212 439q4 1 12 2.5t12 1.5q170 32 303.5 21.5t221 -46t143.5 -94.5q27 -28 -25 -42q-64 -16 -256 -62l-97 198q-111 7 -240 -16l188 -387l533 145v-496q0 -7 -5.5 -12.5t-12.5 -5.5h-1258q-7 0 -12.5 5.5t-5.5 12.5zM121 709v560q0 7 5.5 12.5 t12.5 5.5h1258q7 0 12.5 -5.5t5.5 -12.5v-428q-85 30 -188 52q-294 64 -645 12l-18 -3l-65 134h-233l85 -190q-132 -51 -230 -137zM246 413q-24 203 166 305l129 -270l-255 -61q-14 -3 -26 4.5t-14 21.5z" />
+<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M0 405l17 128q2 9 9 9t9 -9l20 -128l-20 -126q-2 -9 -9 -9t-9 9zM79 405l23 207q0 9 9 9q8 0 10 -9l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10zM169 405l21 245q2 12 12 12q11 0 11 -12l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11zM259 405l21 252q0 13 13 13 q12 0 14 -13l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13zM350 405l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5zM401 159zM442 405l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5l21 -380l-21 -246q0 -7 -5 -12.5 t-12 -5.5q-16 0 -18 18zM534 403l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19zM628 405l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5l18 -506l-18 -242q-2 -21 -22 -21q-19 0 -21 21zM723 405l14 -241 q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17zM784 164zM817 405l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18zM913 404l12 492q1 12 9 20t19 8t18.5 -8 t8.5 -20l14 -492l-14 -236q0 -11 -8 -19t-19 -8t-19 8t-9 19zM1010 405q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11q11 0 20 9q9 7 9 20l1 24l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6zM1079 169zM1103 404l12 636v3q2 15 12 24q9 7 20 7 q8 0 15 -5q14 -8 16 -26l14 -639l-14 -231q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114zM1204 174v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22z" />
+<glyph unicode="&#xf1c0;" d="M0 0v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 384v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 768 v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 1152v128q0 69 103 128t280 93.5t385 34.5t385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128z" />
+<glyph unicode="&#xf1c1;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM257 60q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4 q52 85 107 197q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38 q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83z M714 842q1 7 7 44q0 3 7 43q1 4 4 8q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2q-15 -42 -2 -132zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1098 353q76 -28 124 -28q14 0 18 1q0 1 -2 3q-24 24 -140 24z" />
+<glyph unicode="&#xf1c2;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM233 661h70l164 -661h159l128 485q7 20 10 46q2 16 2 24 h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300v-107zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
+<glyph unicode="&#xf1c3;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM429 0h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4 h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107h-290v-107h68l189 -272l-194 -283h-68v-106zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
+<glyph unicode="&#xf1c4;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM416 0h327v106h-93v167h137q76 0 118 15q67 23 106.5 87 t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92v-106zM650 386v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15h-119zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
+<glyph unicode="&#xf1c5;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 0v192l192 192l128 -128l384 384l320 -320v-320 h-1024zM256 704q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
+<glyph unicode="&#xf1c6;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536zM384 192q0 25 8 52q21 63 120 396 v128h128v-128h79q22 0 39 -13t23 -34l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5zM512 192q0 -26 37.5 -45t90.5 -19t90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45zM512 896h128v128h-128v-128zM512 1152h128v128h-128v-128 zM640 768h128v128h-128v-128zM640 1024h128v128h-128v-128zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
+<glyph unicode="&#xf1c7;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 288v192q0 14 9 23t23 9h131l166 167q16 15 35 7 q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23zM762 206.5q1 -26.5 20 -44.5q20 -17 44 -17q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5z M973.5 54.5q2.5 -26.5 23.5 -42.5q18 -15 40 -15q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
+<glyph unicode="&#xf1c8;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 256v384q0 52 38 90t90 38h384q52 0 90 -38t38 -90 v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90zM960 403v90l265 266q9 9 23 9q4 0 12 -2q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
+<glyph unicode="&#xf1c9;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM254 429q-14 19 0 38l226 301q8 11 21 12.5t24 -6.5 l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5zM636 43l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5l-63 10q-13 2 -20.5 13t-5.5 24zM947.5 181 q-1.5 13 6.5 24l182 243l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5l226 -301q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
+<glyph unicode="&#xf1ca;" d="M39 1286h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132 t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390z" />
+<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M0 367v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64v-546q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64zM154 511l193 129l-193 129v-258zM216 367l603 -402v359l-334 223zM216 913l269 -180l334 223v359zM624 640 l272 -182l272 182l-272 182zM973 -35l603 402l-269 180l-334 -223v-359zM973 956l334 -223l269 180l-603 402v-359zM1445 640l193 -129v258z" />
+<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M0 407q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5 h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55t121.5 -21 q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z " />
+<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM128 640q0 -190 90 -361l194 194q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361zM512 640 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM535 -38q171 -90 361 -90t361 90l-194 194q-82 -28 -167 -28t-167 28zM535 1318l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90t-361 -90z M1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M0 640q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348z" />
+<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM44 640q0 -173 67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331 t-67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331zM87 640q0 205 98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385zM206 217l58 34q29 -49 73 -99 l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13v-66q-208 6 -385 109.5t-283 275.5zM207 1063q106 172 282 275.5t385 109.5v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98zM415 805q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10 t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162q-67 77 -98 169l232 80q-14 42 -14 85t14 85zM918 -102 q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99l58 -34q-106 -172 -283 -275.5t-385 -109.5v66zM918 1382v66q209 -6 385 -109.5t282 -275.5l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13zM1516 428q36 103 36 212q0 112 -35 212l82 28 q-19 56 -49 112l57 33q98 -180 98 -385t-98 -385l-57 33q27 52 49 112z" />
+<glyph unicode="&#xf1d2;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 218q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5 t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85q0 -53 41 -77v-3q-113 -37 -113 -139zM382 225q0 64 98 64q102 0 102 -61q0 -66 -93 -66 q-107 0 -107 63zM395 693q0 90 77 90q36 0 55 -25.5t19 -63.5q0 -85 -74 -85q-77 0 -77 84zM755 1072q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392q0 -50 -3 -75z M966 771q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117z" />
+<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M68 7q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47q98 0 218 47v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58q0 -31 22.5 -51.5t58 -32 t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5zM272 18q0 -101 172 -101q151 0 151 105q0 100 -165 100q-158 0 -158 -104zM293 775q0 -135 124 -135q119 0 119 137q0 61 -30 102t-89 41 q-124 0 -124 -145zM875 1389q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5t-39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5zM901 220q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134h-222zM1217 901v190h96v76q0 54 -6 89h227q-6 -41 -6 -165 h171v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6z" />
+<glyph unicode="&#xf1d4;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM368 1135l323 -589v-435h134v436l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3 q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150z" />
+<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M57 953q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5t-78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153 t-153 102t-186 38t-186 -38t-153 -102t-102 -153t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265zM113.5 38.5q10.5 121.5 29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5t136.5 -56.5 t56.5 -136.5t-57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5z" />
+<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M18 264q0 275 252 466q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5 t3.5 -5t2 -3.5q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9 t-98 20t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20 q-18 -41 -54.5 -74.5t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100z" />
+<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M0 858q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490z M380 1075q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5t-25 66t-66 25q-43 0 -76 -25.5t-33 -65.5zM816 404q0 143 81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109q-150 -37 -218 -37 q-169 0 -311 70.5t-223.5 191.5t-81.5 264zM888 1075q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5t-24.5 66t-65.5 25q-43 0 -76 -25.5t-33 -65.5zM1160 568q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5 t-22.5 -49.5zM1559 568q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5z" />
+<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M0 508q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55z" />
+<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M0 508q-3 39 32 59l1664 960q35 21 68 -2q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55zM209 522l336 -137l863 639l-478 -797l492 -201 l221 1323z" />
+<glyph unicode="&#xf1da;" d="M0 832v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298t-61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12 q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45zM512 480v64q0 14 9 23t23 9h224v352 q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf1db;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5z" />
+<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M62 1338q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5 t45 -15t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18 q-15 10 -45 12t-53 2t-41 14t-18 45z" />
+<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M24 926q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108 q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179q-64 117 -64 259z" />
+<glyph unicode="&#xf1de;" d="M0 736v64q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM128 -96v672h256v-672q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM128 960v416q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-416h-256zM512 224v64q0 40 28 68 t68 28h320q40 0 68 -28t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 64h256v-160q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v160zM640 448v928q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-928h-256zM1024 992v64q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1152 -96v928h256v-928q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 1216v160q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-160h-256z" />
+<glyph unicode="&#xf1e0;" d="M0 640q0 133 93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86q133 0 226.5 -93.5t93.5 -226.5 t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5z" />
+<glyph unicode="&#xf1e1;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 640q0 -88 62.5 -150.5t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5 t150.5 62.5t62.5 150.5t-62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5z" />
+<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M0 448q0 143 55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68l243 244l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5 t-225 150t-150 225t-55.5 273.5zM170 615q10 -24 35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49t-34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49zM1376 1472q0 13 9 23q10 9 23 9t23 -9l90 -91q10 -9 10 -22.5t-10 -22.5 q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23zM1536 1408v96q0 14 9 23t23 9t23 -9t9 -23v-96q0 -14 -9 -23t-23 -9t-23 9t-9 23zM1605 1242.5q0 13.5 10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5z M1605 1381.5q0 13.5 10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5zM1632 1312q0 14 9 23t23 9h96q14 0 23 -9t9 -23t-9 -23t-23 -9h-96q-14 0 -23 9t-9 23z" />
+<glyph unicode="&#xf1e3;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1e4;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1e5;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1e6;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1e7;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1e8;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1e9;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1ea;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1eb;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1ec;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1ed;" horiz-adv-x="1792" />
+<glyph unicode="&#xf1ee;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+<glyph horiz-adv-x="1792" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf b/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000000..5cd6cff6d6
--- /dev/null
+++ b/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf
Binary files differ
diff --git a/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.woff b/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000000..9eaecb3799
--- /dev/null
+++ b/packages/font-awesome-4.1.0/fonts/fontawesome-webfont.woff
Binary files differ
diff --git a/relationship.php b/relationship.php
index e15c380de4..b11e2d2913 100644
--- a/relationship.php
+++ b/relationship.php
@@ -2,7 +2,7 @@
// Calculates the relationship between two individuals in the gedcom
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team.
@@ -21,6 +21,8 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
+
define('WT_SCRIPT_NAME', 'relationship.php');
require './includes/session.php';
require WT_ROOT.'includes/functions/functions_edit.php';
@@ -37,9 +39,9 @@ $asc = WT_Filter::getBool('asc');
$asc = $asc ? -1 : 1;
$Dbwidth=$bwidth;
if (!$show_full) {
- $bwidth = $cbwidth;
- $bheight = $cbheight;
- $Dbwidth = $cbwidth;
+ $bwidth = Theme::theme()->parameter('compact-chart-box-x');
+ $bheight = Theme::theme()->parameter('compact-chart-box-y');
+ $Dbwidth = Theme::theme()->parameter('compact-chart-box-x');
}
$Dbheight = $bheight;
@@ -251,7 +253,7 @@ if ($person1 && $person2) {
case 'mother':
case 'parent':
$arrow_img = $down_arrow;
- $line = $WT_IMAGES['vline'];
+ $line = Theme::theme()->parameter('image-vline');
$liney += $Dbheight;
$linex += $Dbwidth/2;
$lh = 54;
@@ -281,11 +283,11 @@ if ($person1 && $person2) {
}
$joinx = $xoffset-$xs;
$joiny = $liney-2-($asc-1)/2*$lh;
- echo "<div id=\"joina", $index, "\" style=\"position:absolute; ", $TEXT_DIRECTION=='ltr'?'left':'right', ':', $joinx + $Dbxspacing, 'px; top:', $joiny + $Dbyspacing, "px;\" align=\"center\"><img src=\"", $WT_IMAGES['hline'], "\" align=\"left\" width=\"", $joinw, "\" height=\"", $joinh, "\" alt=\"\"></div>";
+ echo "<div id=\"joina", $index, "\" style=\"position:absolute; ", $TEXT_DIRECTION=='ltr'?'left':'right', ':', $joinx + $Dbxspacing, 'px; top:', $joiny + $Dbyspacing, "px;\" align=\"center\"><img src=\"", Theme::theme()->parameter('image-hline'), "\" align=\"left\" width=\"", $joinw, "\" height=\"", $joinh, "\" alt=\"\"></div>";
$joinw = $xs/2+2;
$joinx = $joinx+$xs/2;
$joiny = $joiny+$asc*$lh;
- echo "<div id=\"joinb", $index, "\" style=\"position:absolute; ", $TEXT_DIRECTION=='ltr'?'left':'right', ':', $joinx + $Dbxspacing, 'px; top:', $joiny + $Dbyspacing, "px;\" align=\"center\"><img src=\"", $WT_IMAGES["hline"], "\" align=\"left\" width=\"", $joinw, "\" height=\"", $joinh, "\" alt=\"\"></div>";
+ echo "<div id=\"joinb", $index, "\" style=\"position:absolute; ", $TEXT_DIRECTION=='ltr'?'left':'right', ':', $joinx + $Dbxspacing, 'px; top:', $joiny + $Dbyspacing, "px;\" align=\"center\"><img src=\"", Theme::theme()->parameter('image-hline'), "\" align=\"left\" width=\"", $joinw, "\" height=\"", $joinh, "\" alt=\"\"></div>";
}
else $change_count='';
$previous='parent';
@@ -300,7 +302,7 @@ if ($person1 && $person2) {
$xoffset += $Dbwidth+$Dbxspacing+70;
$colNum ++;
//$rowNum is inherited from the box immediately to the left
- $line = $WT_IMAGES['hline'];
+ $line = Theme::theme()->parameter('image-hline');
$linex += $Dbwidth;
$liney += $Dbheight/2;
$lh = 3;
@@ -314,7 +316,7 @@ if ($person1 && $person2) {
case 'daughter':
case 'child':
$arrow_img = $up_arrow;
- $line = $WT_IMAGES['vline'];
+ $line = Theme::theme()->parameter('image-vline');
$liney += $Dbheight;
$linex += $Dbwidth/2;
$lh = 54;
@@ -344,11 +346,11 @@ if ($person1 && $person2) {
}
$joinx = $xoffset-$xs;
$joiny = $liney-2+($asc+1)/2*$lh;
- echo '<div id="joina', $index, '" style="position:absolute; ', $TEXT_DIRECTION=='ltr'?'left':'right', ':', $joinx+$Dbxspacing, 'px; top:', $joiny+$Dbyspacing, 'px;" align="center"><img src="', $WT_IMAGES['hline'], '" align="left" width="', $joinw, '" height="', $joinh, '" alt=""></div>';
+ echo '<div id="joina', $index, '" style="position:absolute; ', $TEXT_DIRECTION=='ltr'?'left':'right', ':', $joinx+$Dbxspacing, 'px; top:', $joiny+$Dbyspacing, 'px;" align="center"><img src="', Theme::theme()->parameter('image-hline'), '" align="left" width="', $joinw, '" height="', $joinh, '" alt=""></div>';
$joinw = $xs/2+2;
$joinx = $joinx+$xs/2;
$joiny = $joiny-$asc*$lh;
- echo '<div id="joinb', $index, '" style="position:absolute; ', $TEXT_DIRECTION=='ltr'?'left':'right', ':', $joinx+$Dbxspacing, 'px; top:', $joiny+$Dbyspacing, 'px;" align="center"><img src="', $WT_IMAGES['hline'], '" align="left" width="', $joinw, '" height="', $joinh, '" alt=""></div>';
+ echo '<div id="joinb', $index, '" style="position:absolute; ', $TEXT_DIRECTION=='ltr'?'left':'right', ':', $joinx+$Dbxspacing, 'px; top:', $joiny+$Dbyspacing, 'px;" align="center"><img src="', Theme::theme()->parameter('image-hline'), '" align="left" width="', $joinw, '" height="', $joinh, '" alt=""></div>';
}
else $change_count='';
$previous='child';
@@ -364,7 +366,7 @@ if ($person1 && $person2) {
$pyoffset = $yoffset - 2;
if ($index>0) {
- if ($TEXT_DIRECTION=='rtl' && $line!=$WT_IMAGES['hline']) {
+ if ($TEXT_DIRECTION === 'rtl' && $line !== Theme::theme()->parameter('image-hline')) {
echo '<div id="line', $index, '" style="background:none; position:absolute; right:', $plinex+$Dbxspacing, 'px; top:', $liney+$Dbyspacing, 'px; width:', $lw+$lh*2, 'px;" align="right">';
echo '<img src="', $line, '" align="right" width="', $lw, '" height="', $lh, '" alt="">';
echo '<br>';
diff --git a/save.php b/save.php
index 0bedb397fa..ffc6a5e5a4 100644
--- a/save.php
+++ b/save.php
@@ -2,7 +2,7 @@
// Callback function for inline editing.
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -57,90 +57,6 @@ $value=WT_Filter::post('value');
// Every switch must have a default case, and every case must end in ok() or fail()
switch ($table) {
-case 'site_setting':
- //////////////////////////////////////////////////////////////////////////////
- // Table name: WT_SITE_SETTING
- // ID format: site_setting-{setting_name}
- //////////////////////////////////////////////////////////////////////////////
-
- // Authorisation
- if (!Auth::isAdmin()) {
- fail();
- }
-
- // Validation
- switch ($id1) {
- case 'MAX_EXECUTION_TIME':
- if ($value=='') {
- // Delete the existing value
- $value=null;
- } elseif (!is_numeric($value)) {
- fail();
- }
- break;
- case 'SESSION_TIME':
- case 'SMTP_PORT':
- if (!is_numeric($value)) {
- fail();
- }
- break;
- case 'INDEX_DIRECTORY':
- if (!is_dir($value) || substr($value, -1)!='/') {
- fail();
- }
- break;
- case 'MEMORY_LIMIT':
- if ($value=='') {
- // Delete the existing value
- $value=null;
- } elseif (!preg_match('/^[0-9]+[KMG]$/', $value)) {
- // A number must be followed by K, M or G.
- fail();
- }
- break;
- case 'USE_REGISTRATION_MODULE':
- case 'REQUIRE_ADMIN_AUTH_REGISTRATION':
- case 'ALLOW_USER_THEMES':
- case 'ALLOW_CHANGE_GEDCOM':
- case 'SMTP_AUTH':
- case 'SHOW_REGISTER_CAUTION':
- $value=(int)$value;
- break;
- case 'WELCOME_TEXT_AUTH_MODE_4':
- // Save a different version of this for each language.
- $id1 = 'WELCOME_TEXT_AUTH_MODE_' . WT_LOCALE;
- break;
- case 'LOGIN_URL':
- if ($value && !preg_match('/^https?:\/\//', $value)) {
- fail();
- }
- break;
- case 'THEME_DIR':
- case 'SERVER_URL':
- case 'SMTP_ACTIVE':
- case 'SMTP_AUTH_USER':
- case 'SMTP_FROM_NAME':
- case 'SMTP_HELO':
- case 'SMTP_HOST':
- case 'SMTP_SSL':
- case 'WELCOME_TEXT_AUTH_MODE':
- break;
- case 'SMTP_AUTH_PASS':
- // The password will be displayed as "click to edit" on screen.
- // Accept the update, but pretend to fail. This will leave the "click to edit" on screen
- if ($value) {
- WT_Site::setPreference($id1, $value);
- }
- fail();
- default:
- // An unrecognized setting
- fail();
- }
-
- // Authorised and valid - make update
- WT_Site::setPreference($id1, $value);
- ok();
-
case 'site_access_rule':
//////////////////////////////////////////////////////////////////////////////
// Table name: WT_SITE_ACCESS_RULE
@@ -282,29 +198,6 @@ case 'user_setting':
$user->setPreference($id2, $value);
ok();
-case 'module':
- //////////////////////////////////////////////////////////////////////////////
- // Table name: WT_MODULE
- // ID format: module-{column}-{module_name}
- //////////////////////////////////////////////////////////////////////////////
-
- // Authorisation
- if (!Auth::isAdmin()) {
- fail();
- }
-
- switch($id1) {
- case 'status':
- case 'tab_order':
- case 'menu_order':
- case 'sidebar_order':
- WT_DB::prepare("UPDATE `##module` SET {$id1}=? WHERE module_name=?")
- ->execute(array($value, $id2));
- ok();
- default:
- fail();
- }
-
default:
// An unrecognized table
fail();
diff --git a/tests/includes/functions/FunctionsPrintTest.php b/tests/includes/functions/FunctionsPrintTest.php
index 87ac8ca40c..650c40acb3 100644
--- a/tests/includes/functions/FunctionsPrintTest.php
+++ b/tests/includes/functions/FunctionsPrintTest.php
@@ -8,7 +8,7 @@ use PHPUnit_Framework_TestCase;
*
* @package webtrees
* @author Greg Roach <fisharebest@gmail.com>
- * @copyright (c) 2014 webtrees development team
+ * @copyright (c) 2015 webtrees development team
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2
*/
@@ -32,58 +32,6 @@ class FunctionsPrintTest extends PHPUnit_Framework_TestCase {
}
/**
- * Test that function header_links() exists in the global namespace.
- *
- * @return void
- */
- public function testFunctionHeaderLinksExists() {
- $this->assertEquals(function_exists('\\header_links'), true);
- }
-
- /**
- * Test that function execution_statistics() exists in the global namespace.
- *
- * @return void
- */
- public function testFunctionExecutionStatsExists() {
- $this->assertEquals(function_exists('\\execution_stats'), true);
- }
-
- /**
- * Test that function login_link() exists in the global namespace.
- *
- * @return void
- */
- public function testFunctionLoginLinkExists() {
- $this->assertEquals(function_exists('\\login_link'), true);
- }
-
- /**
- * Test that function logout_link() exists in the global namespace.
- *
- * @return void
- */
- public function testFunctionLogoutLinkExists() {
- $this->assertEquals(function_exists('\\logout_link'), true);
- }
-
- /**
- * Test that function user_contact_link() exists in the global namespace.
- *
- * @return void
- */
- public function testFunctionUserContactLinkExists() {
- $this->assertEquals(function_exists('\\user_contact_link'), true);
- }
-
- /**
- * Test that function contact_links() exists in the global namespace.
- *
- * @return void
- */
- public function testFunctionContactLinksExists() {
- $this->assertEquals(function_exists('\\contact_links'), true);
- }
/**
* Test that function print_note_record() exists in the global namespace.
diff --git a/tests/includes/functions/FunctionsTest.php b/tests/includes/functions/FunctionsTest.php
index 077af4459a..b598b10f12 100644
--- a/tests/includes/functions/FunctionsTest.php
+++ b/tests/includes/functions/FunctionsTest.php
@@ -8,7 +8,7 @@ use PHPUnit_Framework_TestCase;
*
* @package webtrees
* @author Greg Roach <fisharebest@gmail.com>
- * @copyright (c) 2014 webtrees development team
+ * @copyright (c) 2015 webtrees development team
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2
*/
@@ -158,15 +158,6 @@ class FunctionsTest extends PHPUnit_Framework_TestCase {
}
/**
- * Test that function get_theme_names() exists in the global namespace.
- *
- * @return void
- */
- public function testFunctionGetThemeNamesExists() {
- $this->assertEquals(function_exists('\\get_theme_names'), true);
- }
-
- /**
* Test that function get_query_url() exists in the global namespace.
*
* @return void
diff --git a/tests/library/WT/MenuBarTest.php b/tests/library/WT/MenuBarTest.php
deleted file mode 100644
index 4fd5f9c16c..0000000000
--- a/tests/library/WT/MenuBarTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-namespace WT;
-
-use PHPUnit_Framework_TestCase;
-
-/**
- * Test harness for the class WT_MenuBar
- *
- * @package webtrees
- * @author Greg Roach <fisharebest@gmail.com>
- * @copyright (c) 2014 webtrees development team
- * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2
- */
-
-class MenuBarTest extends PHPUnit_Framework_TestCase {
- /**
- * Prepare the environment for these tests
- *
- * @return void
- */
- public function setUp() {
- }
-
- /**
- * Test that the class exists
- *
- * @return void
- */
- public function testClassExists() {
- $this->assertTrue(class_exists('\WT_MenuBar'));
- }
-}
diff --git a/themes/_administration/css-1.6.2/paper_fibers.png b/themes/_administration/css-1.6.2/paper_fibers.png
new file mode 100644
index 0000000000..2d93493f86
--- /dev/null
+++ b/themes/_administration/css-1.6.2/paper_fibers.png
Binary files differ
diff --git a/themes/_administration/css-1.6.2/paper_fibers_@2X.png b/themes/_administration/css-1.6.2/paper_fibers_@2X.png
new file mode 100644
index 0000000000..6a9fc6a6e4
--- /dev/null
+++ b/themes/_administration/css-1.6.2/paper_fibers_@2X.png
Binary files differ
diff --git a/themes/_administration/css-1.6.2/style.css b/themes/_administration/css-1.6.2/style.css
index 50a4e25869..837d96a82e 100644
--- a/themes/_administration/css-1.6.2/style.css
+++ b/themes/_administration/css-1.6.2/style.css
@@ -19,86 +19,49 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-/* Add a permanent scrollbar, to prevent "flickering" when hover effects lengthen page */
-html {
- overflow-y: scroll;
+/* Some menus (e.g. languages) can be longer than a page */
+.dropdown-menu {
+ max-height: 320px;
+ overflow-x: hidden;
}
-/* general styles */
-body {
- font-family: "Trebuchet MS", Tahoma, Verdana, Arial, sans-serif;
- font-size: 12px;
- margin: 10px;
- min-width: 800px;
+/* Provide visual feedback for invalid and missing fields */
+[pattern]:valid,
+[required]:valid {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAONJREFUeNpi/P//PwMlgImBQjDwBrCgCzDOF2Zg+Adk/AOGDRvQfHZGoDWMxgyMDMb/Q1/NIt0F/xk8gIbNZPj7P41YL4AUGsM1//rfkuyeYMzw8z9xXgBqgNm0nuHnv0D/IH/juavmngV6oYY4F3z7y2DqY2oMpANB9MYl684yfP9Xw3Dzzw7sXgQmJGTM0MbjwdDKc0b2vt5/EM2QwunBoMyCVS1YPYYAMOwZ7FmiGLLYzjBYsSQD+QpALAjErNgMYERPyoyMjMxAih+IOYD4LxD/hOJfQLV/MaJ9NC8wAAQYAPbPfH2KJKx/AAAAAElFTkSuQmCC) no-repeat right center;
}
-input.ui-button {
- padding: 1px 3px;
+[pattern]:invalid,
+[required]:invalid {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMpJREFUeNpi/P//PwMlgImBQjAMDGBBF1jFyOgBpFqAuOYPA8MOoAI4P+z//x0YJoBiARkvYWA486+k5D+IBuJqZD66WnAMogvMA9o4F6j4R3Lyf2R6IQODMVEGTAW6CoirgfjMB2/v/yB6CgNDYQ8W14IwRiB+A7rgOwNDYLChofGcrVvPgugfDAzR/yFhwUAwDJqBNj6Ulf0PooEhV4jMx+YCRvSknAeMBWDotwgwMKRzMTCcfQW0GcQHxkbNJCyxwDiaFxgAAgwAYy67YIOQ//cAAAAASUVORK5CYII=) no-repeat right center;
}
-input,
-textarea,
-select {
- border: 1px solid grey;
- color: #000;
- font: inherit;
- padding: 0 3px;
+[dir=rtl] [pattern]:invalid,
+[dir=rtl] [required]:invalid,
+[dir=rtl] [pattern]:invalid,
+[dir=rtl] [required]:invalid {
+ background-position: left center;
}
-button,
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="file"] {
- background: url(../jquery-ui-1.11.2/images/ui-bg_fine-grain_10_f8f7f6_60x60.png) 50% 50% #f8f7f6;
- border: 1px solid #cbc7bd;
- color: #654b24;
- font-weight: 700;
- border-radius: 3px;
- margin: 0.3em;
+/* Drag-n-drop sort handles for modules, etc. */
+.sortme {
+ cursor: move;
}
-button:hover,
-input[type="submit"]:hover,
-input[type="reset"]:hover,
-input[type="button"]:hover,
-input[type="file"]:hover {
- background: url(../jquery-ui-1.11.2/images/ui-bg_fine-grain_65_654b24_60x60.png) 50% 50% #654b24;
- border: 1px solid #654b24;
- color: #fff;
- font-weight: 700;
- border-radius: 3px;
+/* http://www.subtlepatterns.com */
+body {
+ background: url(paper_fibers.png);
}
-
-fieldset {
- margin: 8px 8px 4px;
+@media (min-device-pixel-ratio: 2) {
+ body {
+ background: url(paper_fibers_@2X.png);
+ }
}
-legend {
- font-style: italic;
- font-weight: bold;
- padding: 0 5px 5px;
- vertical-align: top;
-}
+/* http://bootstrapdesigntools.com */
-img {
- border: 0;
- vertical-align: middle;
-}
-h3 {
- margin: 0;
-}
-
-h4 {
- margin: 5px 3px;
- font-weight: normal;
- font-style: italic;
-}
-td {
- vertical-align: top;
-}
.icon {
border: 0;
@@ -135,165 +98,13 @@ a.accepted {
padding-right: 15px;
}
-.parentdeath {
- border: thin solid #f00;
- padding: 1px;
-}
-
-.submenu {
- background-color: #eee;
- border: thin solid #aaa;
- padding: 3px;
-}
-
-.rela {
- opacity: 0.4;
-}
-
-/* jQuery styling over-rides */
-.ui-widget-content a {
- text-decoration: none;
-}
-
-.ui-widget-content a.current {
- color: #e17009;
- font-weight: bold;
-}
-
-.ui-widget-content a:hover,
-.DataTables_sort_wrapper:hover {
- color: #f00;
- cursor: pointer;
-}
-
-.ui-widget-header {
- padding: 5px;
-}
-
-.ui-progressbar-value {
- height: 60% !important;
- background: #d3d3d3 !important;
-}
-
-.ui-accordion .ui-accordion-content-active {
- display: block;
-}
-
-.css_right {
- float: right;
-}
-[dir=rtl] .css_right {
- float: left;
-}
[dir=rtl] input {
padding-right: 3px;
padding-left: 0;
}
-[dir=rtl] .ui-tabs .ui-tabs-nav li {
- float: right;
-}
-
-/* jEditable styling over-rides */
-.editable:hover {
- color: #f00;
- cursor: pointer;
-}
-
-/* both cursors needed for cross-browser support */
-.editable input,
-select {
- padding: 0;
-}
-
-.editable input {
- font-size: 90%;
- height: 18px !important;
-}
-
-.editable button {
- font-size: 85%;
- padding: 0;
-}
-
-/* jQuery.datatable styling over-rides */
-.odd {
- background-color: #dfd;
-}
-
-.even {
- background-color: #efe;
-}
-
-.fg-button {
- padding: 2px 6px;
-}
-
-.dataTables_paginate {
- float: left;
-}
-
-.dataTables_processing {
- float: left;
- margin-top: 5px;
- padding-left: 5px;
-}
-
-.dataTables_filter {
- float: right;
-}
-
-.dataTables_info {
- float: left;
- margin-top: 5px;
- font-weight: normal;
-}
-
-.dataTables_length {
- float: right;
-}
-
-.dataTables_length select,
-.dataTables_filter input {
- font-size: 11px;
- padding: 1px;
-}
-
-.dataTables_wrapper th {
- white-space: nowrap;
-}
-
-.dt-clear {
- clear: both;
-}
-
-[dir=rtl] .dataTables_paginate {
- float: right;
-}
-
-[dir=rtl] .dataTables_processing {
- float: right;
-}
-
-[dir=rtl] .dataTables_filter {
- float: left;
-}
-
-[dir=rtl] .dataTables_info {
- float: right;
-}
-
-[dir=rtl] .dataTables_length {
- float: left;
-}
-
-/* Drag-n-drop sorting for modules, etc. */
-.sortme {
- cursor: move;
-}
-
/* Find special characters */
.largechars {
font-family: monospace;
@@ -318,100 +129,6 @@ select {
width: 24px;
}
-/* HEADER */
-#admin_head {
- position: relative;
- height: 70px;
- margin-bottom: 10px;
- min-width: 970px;
- z-index: 1000;
-}
-
-#title {
- position: absolute;
- left: 47%;
- top: 20px;
- font-size: 18px;
- font-weight: bold;
-}
-
-#info {
- position: absolute;
- right: 10px;
- bottom: 0;
- text-align: right;
-}
-
-[dir=rtl] #info {
- right: auto;
- left: 10px;
- text-align: left;
-}
-
-#links {
- position: absolute;
- left: 10px;
- bottom: 0;
- display: inline;
- margin-bottom: 5px;
- white-space: nowrap;
-}
-
-[dir=rtl] #links {
- left: auto;
- right: 10px;
-}
-
-#links li {
- display: inline;
- position: relative;
-}
-
-#links li ul {
- display: none;
- position: absolute;
- left: 0;
- top: 1.2em;
- background: url("../jquery-ui-1.11.2/images/ui-bg_fine-grain_10_eceadf_60x60.png") repeat scroll 50% 50% #eceadf;
- border: 1px solid #d9d6c4;
- z-index: 999;
-}
-
-[dir=rtl] #links li ul {
- left: auto;
- right: 0;
-}
-
-#links li ul li {
- display: block;
- padding: 0 5px;
- text-align: left;
-}
-
-[dir=rtl] #links li ul li {
- text-align: right;
-}
-
-#links,
-#links li ul {
- list-style: none;
- margin: 0;
- padding: 1px;
-}
-
-#links li:hover > ul {
- display: block;
-}
-
-.ui-widget-content a.lang-active {
- color: #008000;
-}
-
-#links .langmenu {
- display: inline;
- padding: 0;
-}
-
/* SIDE and CONTENT panels */
#admin_menu,
#admin_content {
@@ -1282,23 +999,6 @@ table#adduser2 {
text-align: center;
}
-input:required:valid,
-textarea:required:valid {
- background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAONJREFUeNpi/P//PwMlgImBQjDwBrCgCzDOF2Zg+Adk/AOGDRvQfHZGoDWMxgyMDMb/Q1/NIt0F/xk8gIbNZPj7P41YL4AUGsM1//rfkuyeYMzw8z9xXgBqgNm0nuHnv0D/IH/juavmngV6oYY4F3z7y2DqY2oMpANB9MYl684yfP9Xw3Dzzw7sXgQmJGTM0MbjwdDKc0b2vt5/EM2QwunBoMyCVS1YPYYAMOwZ7FmiGLLYzjBYsSQD+QpALAjErNgMYERPyoyMjMxAih+IOYD4LxD/hOJfQLV/MaJ9NC8wAAQYAPbPfH2KJKx/AAAAAElFTkSuQmCC) no-repeat right top;
-}
-
-input:required:invalid,
-textarea:required:invalid {
- background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMpJREFUeNpi/P//PwMlgImBQjAMDGBBF1jFyOgBpFqAuOYPA8MOoAI4P+z//x0YJoBiARkvYWA486+k5D+IBuJqZD66WnAMogvMA9o4F6j4R3Lyf2R6IQODMVEGTAW6CoirgfjMB2/v/yB6CgNDYQ8W14IwRiB+A7rgOwNDYLChofGcrVvPgugfDAzR/yFhwUAwDJqBNj6Ulf0PooEhV4jMx+YCRvSknAeMBWDotwgwMKRzMTCcfQW0GcQHxkbNJCyxwDiaFxgAAgwAYy67YIOQ//cAAAAASUVORK5CYII=) no-repeat right top;
-}
-
-[dir=rtl] input:required:valid,
-[dir=rtl] textarea:required:valid,
-[dir=rtl] input:required:invalid,
-[dir=rtl] textarea:required:invalid {
- background-position: left top;
-}
-
/* BROADCAST MESSAGES */
/* no styles used */
diff --git a/themes/_administration/footer.php b/themes/_administration/footer.php
deleted file mode 100644
index ab4d3dc0f7..0000000000
--- a/themes/_administration/footer.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-// Footer for webtrees administration theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo '</div>'; // id="admin_content"
diff --git a/themes/_administration/header.php b/themes/_administration/header.php
deleted file mode 100644
index a7f457b873..0000000000
--- a/themes/_administration/header.php
+++ /dev/null
@@ -1,164 +0,0 @@
-<?php
-// Header for webtrees administration theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-use WT\Auth;
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-// This theme uses the jQuery “colorbox” plugin to display images
-$this
- ->addExternalJavascript(WT_JQUERY_COLORBOX_URL)
- ->addExternalJavascript(WT_JQUERY_WHEELZOOM_URL)
- ->addInlineJavascript('activate_colorbox();')
- ->addInlineJavascript('jQuery.extend(jQuery.colorbox.settings, {width:"75%", height:"75%", transition:"none", slideshowStart:"'. WT_I18N::translate('Play').'", slideshowStop:"'. WT_I18N::translate('Stop').'"})')
- ->addInlineJavascript('
- jQuery.extend(jQuery.colorbox.settings, {
- title: function() {
- var img_title = jQuery(this).data("title");
- return img_title;
- }
- });
- ');
-echo
- '<!DOCTYPE html>',
- '<html ', WT_I18N::html_markup(), '>',
- '<head>',
- '<meta charset="UTF-8">',
- '<meta http-equiv="X-UA-Compatible" content="IE=edge">',
- '<meta name="robots" content="noindex,nofollow">',
- '<title>', htmlspecialchars($title), '</title>',
- '<link rel="icon" href="', WT_CSS_URL, 'favicon.png" type="image/png">',
- '<link rel="stylesheet" href="', WT_THEME_URL, 'jquery-ui-1.11.2/jquery-ui.css" type="text/css">',
- '<link rel="stylesheet" href="', WT_CSS_URL, 'style.css" type="text/css">',
- '<!--[if IE 8]>',
- '<script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>',
- '<![endif]-->';
-
-echo
- '</head>',
- '<body id="body">',
-// Header
- '<div id="admin_head" class="ui-widget-content">',
- '<i class="icon-webtrees"></i>',
- '<div id="title"><a href="admin.php">', WT_I18N::translate('Administration'), '</a></div>',
- '<div id="links">',
- '<a href="index.php">', WT_I18N::translate('My page'), '</a> | ',
- logout_link(),
- '<span> | </span>',
- '<ul class="langmenu">';
- $language_menu=WT_MenuBar::getLanguageMenu();
- if ($language_menu) {
- echo $language_menu->getMenuAsList();
- }
- echo '</ul>';
- if (WT_USER_CAN_ACCEPT && exists_pending_change()) {
- echo ' | <li><a href="#" onclick="window.open(\'edit_changes.php\',\'_blank\', chan_window_specs); return false;" style="color:red;">', WT_I18N::translate('Pending changes'), '</a></li>';
- }
- echo '</div>',
- '<div id="info">',
- WT_WEBTREES, ' ', WT_VERSION,
- '<br>',
- /* I18N: The local time on the server */
- WT_I18N::translate('Server time'), ' — ', format_timestamp(WT_SERVER_TIMESTAMP),
- '<br>',
- /* I18N: The local time on the client/browser */
- WT_I18N::translate('Client time'), ' — ', format_timestamp(WT_CLIENT_TIMESTAMP),
- '<br>',
- /* I18N: Timezone - http://en.wikipedia.org/wiki/UTC */
- WT_I18N::translate('UTC'), ' — ', format_timestamp(WT_TIMESTAMP),
- '</div>',
- '</div>',
-// Side menu
- '<div id="admin_menu" class="ui-widget-content">',
- '<ul>',
- '<li><a ', (WT_SCRIPT_NAME=='admin.php' ? 'class="current" ' : ''), 'href="admin.php">', WT_I18N::translate('Administration'), '</a></li>';
-if (Auth::isAdmin()) {
- echo
- '<li><ul>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_site_config.php' ? 'class="current" ' : ''), 'href="admin_site_config.php">', WT_I18N::translate('Site configuration' ), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_site_logs.php' ? 'class="current" ' : ''), 'href="admin_site_logs.php">', WT_I18N::translate('Logs' ), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_site_readme.php' ? 'class="current" ' : ''), 'href="admin_site_readme.php">', WT_I18N::translate('README documentation' ), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_site_info.php' ? 'class="current" ' : ''), 'href="admin_site_info.php">', WT_I18N::translate('PHP information' ), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_site_access.php' ? 'class="current" ' : ''), 'href="admin_site_access.php">', WT_I18N::translate('Site access rules' ), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_site_clean.php' ? 'class="current" ' : ''), 'href="admin_site_clean.php">', WT_I18N::translate('Clean up data folder'), '</a></li>',
- '</ul></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_trees_manage.php' ? 'class="current" ' : ''), 'href="admin_trees_manage.php">', WT_I18N::translate('Family trees' ), '</a></li>';
-} else {
- echo '<li>', WT_I18N::translate('Family trees'), '</li>';
-}
-echo '<li><ul>';
-//-- gedcom list
-foreach (WT_Tree::getAll() as $tree) {
- if (Auth::isManager($tree)) {
- // Add a title="" element, since long tree titles are cropped
- echo
- '<li><span><a ', (WT_SCRIPT_NAME=='admin_trees_config.php' && WT_GED_ID==$tree->tree_id ? 'class="current" ' : ''), 'href="admin_trees_config.php?ged='.$tree->tree_name_url.'" title="', WT_Filter::escapeHtml($tree->tree_title), '" dir="auto">', $tree->tree_title_html,
- '</a></span></li>';
- }
-}
-echo
- '<li><a ', (WT_SCRIPT_NAME=='admin_site_merge.php' ? 'class="current" ' : ''), 'href="admin_site_merge.php">', WT_I18N::translate('Merge records'), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_trees_merge.php' ? 'class="current" ' : ''), 'href="admin_trees_merge.php">', WT_I18N::translate('Merge family trees'), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_site_other.php' ? 'class="current" ' : ''), 'href="admin_site_other.php">', WT_I18N::translate('Add unlinked records'), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_trees_places.php' ? 'class="current" ' : ''), 'href="admin_trees_places.php">', WT_I18N::translate('Update place names'), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_trees_check.php' ? 'class="current" ' : ''), 'href="admin_trees_check.php">', WT_I18N::translate('Check for errors'), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_site_change.php' ? 'class="current" ' : ''), 'href="admin_site_change.php">', WT_I18N::translate('Changes log'),'</a></li>',
- '<li><a href="index_edit.php?gedcom_id=-1" onclick="return modalDialog(\'index_edit.php?gedcom_id=-1'.'\', \'', WT_I18N::translate('Set the default blocks for new family trees'), '\');">', WT_I18N::translate('Set the default blocks'), '</a></li>',
- '</ul></li>';
-
-if (Auth::isAdmin()) {
- echo
- '<li><a ', (WT_SCRIPT_NAME=='admin_users.php' && WT_Filter::get('action')!="cleanup"&& WT_Filter::get('action')!="createform" ? 'class="current" ' : ''), 'href="admin_users.php">',
- WT_I18N::translate('Users'),
- '</a></li>',
- '<li><ul>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_users.php' && WT_Filter::get('action')=='createform' ? 'class="current" ' : ''), 'href="admin_users.php?action=createform">', WT_I18N::translate('Add a new user'), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_users_bulk.php' ? 'class="current" ' : ''), 'href="admin_users_bulk.php">', WT_I18N::translate('Send broadcast messages'), '</a>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_users.php' && WT_Filter::get('action')=='cleanup' ? 'class="current" ' : ''), 'href="admin_users.php?action=cleanup">', WT_I18N::translate('Delete inactive users'), '</a></li>',
- '<li><a href="index_edit.php?user_id=-1" onclick="return modalDialog(\'index_edit.php?user_id=-1'.'\', \'', WT_I18N::translate('Set the default blocks for new users'), '\');">', WT_I18N::translate('Set the default blocks'), '</a></li>',
- '</ul></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_media.php' ? 'class="current" ' : ''), 'href="admin_media.php">', WT_I18N::translate('Media'), '</a></li>',
- '<li><ul>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_media_upload.php' ? 'class="current" ' : ''), 'href="admin_media_upload.php">', WT_I18N::translate('Upload media files'), '</a></li>',
- '</ul></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_modules.php' ? 'class="current" ' : ''), 'href="admin_modules.php">',
- WT_I18N::translate('Modules'),
- '</a></li>',
- '<li><ul>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_module_menus.php' ? 'class="current" ' : ''), 'href="admin_module_menus.php">', WT_I18N::translate('Menus' ), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_module_tabs.php' ? 'class="current" ' : ''), 'href="admin_module_tabs.php">', WT_I18N::translate('Tabs' ), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_module_blocks.php' ? 'class="current" ' : ''), 'href="admin_module_blocks.php">', WT_I18N::translate('Blocks' ), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_module_sidebar.php' ? 'class="current" ' : ''), 'href="admin_module_sidebar.php">', WT_I18N::translate('Sidebar'), '</a></li>',
- '<li><a ', (WT_SCRIPT_NAME=='admin_module_reports.php' ? 'class="current" ' : ''), 'href="admin_module_reports.php">', WT_I18N::translate('Reports'), '</a></li>',
- '</ul></li>';
- foreach (WT_Module::getActiveModules(true) as $module) {
- if ($module instanceof WT_Module_Config) {
- echo '<li><span><a ', (WT_SCRIPT_NAME=='module.php' && WT_Filter::get('mod')==$module->getName() ? 'class="current" ' : ''), 'href="', $module->getConfigLink(), '">', $module->getTitle(), '</a></span></li>';
- }
- }
-}
-echo
- '</ul>',
- '</div>',
- '<div id="admin_content" class="ui-widget-content">',
- WT_FlashMessages::getHtmlMessages(); // Feedback from asynchronous actions;
diff --git a/themes/_administration/theme.php b/themes/_administration/theme.php
index 48e96d06c9..72440131fe 100644
--- a/themes/_administration/theme.php
+++ b/themes/_administration/theme.php
@@ -2,10 +2,7 @@
// Administration theme
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -21,27 +18,4 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-// Theme name - this needs double quotes, as file is scanned/parsed by script
-$theme_name = "_administration";
-
-// A version number in the path prevents browser-cache problems during upgrade
-define('WT_CSS_URL', WT_THEME_URL . 'css-1.6.2/');
-
-$headerfile = WT_THEME_DIR . 'header.php';
-$footerfile = WT_THEME_DIR . 'footer.php';
-
-// Main icons
-$WT_IMAGES=array(
- // Lightbox module uses this in manage media links, and also admin_media.php for delete folder.
- 'remove' => WT_CSS_URL . 'images/delete.png',
-
- // Need different sizes before moving to CSS
- 'default_image_F' => WT_CSS_URL . 'images/silhouette_female.png',
- 'default_image_M' => WT_CSS_URL . 'images/silhouette_male.png',
- 'default_image_U' => WT_CSS_URL . 'images/silhouette_unknown.png',
-);
+return new WT\Theme\Administration();
diff --git a/themes/_custom/theme.php b/themes/_custom/theme.php
new file mode 100644
index 0000000000..d037fb14e8
--- /dev/null
+++ b/themes/_custom/theme.php
@@ -0,0 +1,104 @@
+<?php
+// webtrees: Web based Family History software
+// Copyright (C) 2015 webtrees development team.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+/**
+ * Class CustomTheme - This is a template showing how to create a custom theme.
+ *
+ * Since theme folders beginning with an underscore are reserved for special
+ * use, you should copy this entire folder ("themes/_custom") to a new name.
+ * For example, "themes/custom". You should also rename the class.
+ *
+ * In this example, we are extending the webtrees theme, but you could
+ * also extend any of the core themes, or even the base theme. You
+ * should choose a unique class name, as users may install many custom themes.
+ *
+ * Only the first two functions are required: themeId() and themeName().
+ * The rest are just examples, and should be removed in actual themes.
+ *
+ * Many of the core classes are being moved to namespaces. For example,
+ * WT_Foo will be renamed to WT\Foo. The object API should remain the
+ * same. Avoid unecessary type-hints to allow your
+ */
+class CustomTheme extends WT\Theme\Webtrees {
+ /**
+ * Give your theme a unique identifier. Themes beginning with an underscore
+ * are reserved for internal use.
+ *
+ * {@inheritdoc}
+ */
+ public function themeId() {
+ return '_custom';
+ }
+
+ /**
+ * Give your theme a name. This is shown to the users.
+ * Use HTML entities where appropriate. e.g. “Black &amp; white”.
+ *
+ * You could use switch($this->locale) {} to provide a translated versions
+ * of the theme name.
+ *
+ * {@inheritdoc}
+ */
+ public function themeName() {
+ return 'Custom theme';
+ }
+
+ /**
+ * This is an example function which shows how to add an additional CSS file to the theme.
+ *
+ * {@inheritdoc}
+ */
+ public function stylesheets() {
+ try {
+ $css_files = parent::stylesheets();
+ // Put a version number in the URL, to prevent browsers from caching old versions.
+ $css_files[] = WT_SERVER_NAME . WT_SCRIPT_PATH . 'themes/custom/custom.css';
+ } catch (Exception $ex) {
+ // Something went wrong with our script? Use the default behaviour instead.
+ return parent::stylesheets();
+ }
+
+ return $css_files;
+ }
+
+ /**
+ * This is an example function which shows one way to remove an entry from a menu.
+ *
+ * {@inheritdoc}
+ */
+ public function menuLists() {
+ try {
+ // Start with the default "Lists" menu.
+ $menu = parent::menuLists();
+ // Remove the "notes" sub-menu.
+ $submenus = array_filter($menu->getSubmenus(), function (WT_Menu $menu) {
+ return $menu->getId() !== 'menu-list-note';
+ });
+ // Replace the sub-menus
+ $menu->setSubmenus($submenus);
+ } catch (Exception $ex) {
+ // Something went wrong with our script? Maybe the core code was updated?
+ // Use the default behaviour instead, so that our theme continues to work.
+ return parent::menuLists();
+ }
+
+ return $menu;
+ }
+}
+
+return new CustomTheme; // This script must return a theme object.
diff --git a/themes/clouds/css-1.6.2/style.css b/themes/clouds/css-1.6.2/style.css
index 8ea54cc4b2..a1392b64b3 100644
--- a/themes/clouds/css-1.6.2/style.css
+++ b/themes/clouds/css-1.6.2/style.css
@@ -4275,8 +4275,7 @@ li a.link {
content: "";
}
-.lang-active,
-.theme-active {
+.secondary-menu .active {
color: #006;
font-weight: 900;
}
diff --git a/themes/clouds/footer.php b/themes/clouds/footer.php
deleted file mode 100644
index 565ddf53c9..0000000000
--- a/themes/clouds/footer.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-// Footer for Clouds theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView Cloudy theme
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo '</main>';
-if ($view !== 'simple') {
- echo '<footer>';
- echo contact_links();
- echo '<p class="logo">';
- echo '<a href="', WT_WEBTREES_URL, '" target="_blank" class="icon-webtrees" title="', WT_WEBTREES, ' ', WT_VERSION, '"></a>';
- echo '</p>';
- if ($WT_TREE && $WT_TREE->getPreference('SHOW_STATS')) {
- echo execution_stats();
- }
- if (exists_pending_change()) {
- echo '<a href="#" onclick="window.open(\'edit_changes.php\', \'_blank\', chan_window_specs); return false;">';
- echo '<p class="error center">', WT_I18N::translate('There are pending changes for you to moderate.'), '</p>';
- echo '</a>';
- }
- echo '</footer>';
-}
diff --git a/themes/clouds/header.php b/themes/clouds/header.php
deleted file mode 100644
index 32f54f9223..0000000000
--- a/themes/clouds/header.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-// Header for clouds theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-use WT\Auth;
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-global $WT_IMAGES;
-
-// This theme uses the jQuery “colorbox” plugin to display images
-$this
- ->addExternalJavascript(WT_JQUERY_COLORBOX_URL)
- ->addExternalJavascript(WT_JQUERY_WHEELZOOM_URL)
- ->addInlineJavascript('activate_colorbox();')
- ->addInlineJavascript('jQuery.extend(jQuery.colorbox.settings, {width:"85%", height:"85%", transition:"none", slideshowStart:"'. WT_I18N::translate('Play').'", slideshowStop:"'. WT_I18N::translate('Stop').'"})')
- ->addInlineJavascript('
- jQuery.extend(jQuery.colorbox.settings, {
- title: function() {
- var img_title = jQuery(this).data("title");
- return img_title;
- }
- });
- ');
-
-$menu_items = array(
- WT_MenuBar::getGedcomMenu(),
- WT_MenuBar::getMyPageMenu(),
- WT_MenuBar::getChartsMenu(),
- WT_MenuBar::getListsMenu(),
- WT_MenuBar::getCalendarMenu(),
- WT_MenuBar::getReportsMenu(),
- WT_MenuBar::getSearchMenu(),
-);
-foreach (WT_MenuBar::getModuleMenus() as $menu) {
- $menu_items[] = $menu;
-}
-
-?>
-<!DOCTYPE html>
-<html <?php echo WT_I18N::html_markup(); ?>>
-<head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <?php echo header_links($META_DESCRIPTION, $META_ROBOTS, $META_GENERATOR, $LINK_CANONICAL); ?>
- <title><?php echo WT_Filter::escapeHtml($title); ?></title>
- <link rel="icon" href="<?php echo WT_CSS_URL; ?>favicon.png" type="image/png">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_THEME_URL; ?>jquery-ui-1.11.2/jquery-ui.css">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_CSS_URL; ?>style.css">
- <!--[if IE 8]>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
- <![endif]-->
-</head>
-<body>
- <?php if ($view !== 'simple') { ?>
- <header>
- <div class="header-logo"></div>
- <form class="header-search" style="display:inline;" action="search.php" method="post" role="search">
- <input type="hidden" name="action" value="general">
- <input type="hidden" name="ged" value="<?php echo WT_GEDCOM; ?>">
- <input type="hidden" name="topsearch" value="yes">
- <input type="search" name="query" size="15" placeholder="<?php echo WT_I18N::translate('Search'); ?>">
- <input class="search-icon" type="image" src="<?php echo $WT_IMAGES['search']; ?>" alt="<?php echo WT_I18N::translate('Search'); ?>" title="<?php echo WT_I18N::translate('Search'); ?>">
- </form>
- <ul class="secondary-menu">
- <?php
- if (Auth::check()) {
- echo '<li><a href="edituser.php" class="link">', WT_Filter::escapeHtml(Auth::user()->getRealName()), '</a></li><li>', logout_link(), '</li>';
- if (WT_USER_CAN_ACCEPT && exists_pending_change()) {
- echo ' <li><a href="#" onclick="window.open(\'edit_changes.php\',\'_blank\', chan_window_specs); return false;" style="color:red;">', WT_I18N::translate('Pending changes'), '</a></li>';
- }
- } else {
- echo '<li>', login_link(),'</li>';
- }
- ?>
- <?php echo WT_MenuBar::getFavoritesMenu(); ?>
- <?php echo WT_MenuBar::getLanguageMenu(); ?>
- <?php echo WT_MenuBar::getThemeMenu(); ?>
- </ul>
- <h1><?php echo WT_TREE_TITLE; ?></h1>
- <nav>
- <ul class="primary-menu">
- <?php
- foreach (array_filter($menu_items) as $menu) {
- echo getMenuAsCustomList($menu);
- }
- ?>
- </ul>
- </nav>
- </header>
- <?php } ?>
- <?php echo WT_FlashMessages::getHtmlMessages(); ?>
- <main id="content">
diff --git a/themes/clouds/templates/block_main_temp.php b/themes/clouds/templates/block_main_temp.php
deleted file mode 100644
index dbfe4965a0..0000000000
--- a/themes/clouds/templates/block_main_temp.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-// Template for drawing the main blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-?>
-<div id="<?php echo $id; ?>" class="block" >
- <table class="blockheader">
- <tr>
- <td class="blockh1" ></td>
- <td class="blockh2" >
- <div class="blockhc"><b><?php echo $title; ?></b></div>
- </td>
- <td class="blockh3"></td>
- </tr>
- </table>
- <div class="blockcontent <?php echo $class; ?>">
- <?php echo $content; ?>
- </div>
-</div>
diff --git a/themes/clouds/templates/block_small_temp.php b/themes/clouds/templates/block_small_temp.php
deleted file mode 100644
index 24af18c7d8..0000000000
--- a/themes/clouds/templates/block_small_temp.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-// Template for drawing the height-restricted blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-?>
-<div id="<?php echo $id; ?>" class="block" >
- <table class="blockheader">
- <tr>
- <td class="blockh1" ></td>
- <td class="blockh2" >
- <div class="blockhc"><b><?php echo $title; ?></b></div>
- </td>
- <td class="blockh3"></td>
- </tr>
- </table>
- <div class="blockcontent <?php echo $class; ?>">
- <div class="small_inner_block">
- <?php echo $content; ?>
- </div>
- </div>
-</div>
diff --git a/themes/clouds/templates/compactbox_template.php b/themes/clouds/templates/compactbox_template.php
deleted file mode 100644
index 4a3386f801..0000000000
--- a/themes/clouds/templates/compactbox_template.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $outBoxAdd, $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '"' , $outBoxAdd, '>
- <div class="compact_view">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '" title="',strip_tags($name.$addname),'">
- <span class="namedef name',$style,'">', $shortname, '</span>
- </a>
- </div>
- <div class="inout2 details',$style,'">',
- $person->getLifeSpan(), '
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/clouds/templates/personbox_template.php b/themes/clouds/templates/personbox_template.php
deleted file mode 100644
index b1fdc7ade2..0000000000
--- a/themes/clouds/templates/personbox_template.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $genderImage, $BirthDeath, $outBoxAdd,
-// $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team. All rights reserved.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '" ',$outBoxAdd,'>
- <div class="noprint icons">', $icons, '</div>',
- '<div class="chart_textbox" style="max-height:', $bheight,'px;">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '">
- <span class="namedef name',$style,'">',
- $name,
- $genderImage,'
- <span class="details',$style,'">' . $LDSord . '</span>
- </span>
- </a>
- <div class="namedef name',$style,'">',$addname,'</div>
- <div class="inout2 details',$style,'">',
- $BirthDeath,
- '</div>
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/clouds/theme.php b/themes/clouds/theme.php
index 1433358e86..64d23eca49 100644
--- a/themes/clouds/theme.php
+++ b/themes/clouds/theme.php
@@ -2,11 +2,7 @@
// Clouds theme
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView Cloudy theme
-// Original author w.a. bastein http://genealogy.bastein.biz
-// Copyright (C) 2010 PGV Development Team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,108 +18,4 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-/**
- * Convert a menu into our theme-specific format
- *
- * @param WT_Menu $menu
- *
- * @return string
- */
-function getMenuAsCustomList(WT_Menu $menu) {
- // Create an inert menu - to use as a label
- $tmp = new WT_Menu(strip_tags($menu->getLabel()), '');
-
- // Insert the label into the submenu
- $submenus = $menu->getSubmenus();
- array_unshift($submenus, $tmp);
- $menu->setSubmenus($submenus);
-
- // Neutralise the top-level menu
- $menu->setLabel('');
- $menu->setOnclick('');
-
- return $menu->getMenuAsList();
-}
-
-// Theme name - this needs double quotes, as file is scanned/parsed by script
-$theme_name = "clouds"; /* I18N: Name of a theme. */ WT_I18N::translate('clouds');
-
-// A version number in the path prevents browser-cache problems during upgrade
-define('WT_CSS_URL', WT_THEME_URL . 'css-1.6.2/');
-
-$headerfile = WT_THEME_DIR . 'header.php';
-$footerfile = WT_THEME_DIR . 'footer.php';
-
-$WT_IMAGES=array(
- // used to draw charts
- 'dline' => WT_CSS_URL .'images/dline.png',
- 'dline2' => WT_CSS_URL .'images/dline2.png',
- 'hline' => WT_CSS_URL .'images/hline.png',
- 'spacer' => WT_CSS_URL .'images/spacer.png',
- 'vline' => WT_CSS_URL .'images/vline.png',
-
- // used in button images and javascript
- 'add' => WT_CSS_URL .'images/add.png',
- 'button_family' => WT_CSS_URL .'images/buttons/family.png',
- 'minus' => WT_CSS_URL .'images/minus.png',
- 'plus' => WT_CSS_URL .'images/plus.png',
- 'remove' => WT_CSS_URL .'images/delete.png',
- 'search' => WT_CSS_URL .'images/go.png',
-
- // need different sizes before moving to CSS
- 'default_image_F' => WT_CSS_URL .'images/silhouette_female.png',
- 'default_image_M' => WT_CSS_URL .'images/silhouette_male.png',
- 'default_image_U' => WT_CSS_URL .'images/silhouette_unknown.png',
-);
-
-// Variables for the Fan chart
-$fanChart = array(
- 'font' => WT_ROOT . 'includes/fonts/DejaVuSans.ttf',
- 'size' => 7,
- 'color' => '#000000',
- 'bgColor' => '#eeeeee',
- 'bgMColor' => '#b1cff0',
- 'bgFColor' => '#e9daf1'
-);
-
-// This section defines variables for the charts
-$bwidth = 250; // width of boxes on all person-box based charts
-$bheight = 80; // height of boxes on all person-box based chart
-$baseyoffset = 10; // position the timeline chart relative to the top of the page
-$basexoffset = 10; // position the pedigree and timeline charts relative to the left of the page
-$bxspacing = 4; // horizontal spacing between boxes on the pedigree chart
-$byspacing = 5; // vertical spacing between boxes on the pedigree chart
-$brborder = 1; // pedigree chart box right border thickness
-$linewidth = 1.5; // width of joining lines
-$shadowcolor = ''; // shadow color for joining lines
-$shadowblur = 0; // shadow blur for joining lines
-$shadowoffsetX = 0; // shadowOffsetX for joining lines
-$shadowoffsetY = 0; // shadowOffsetY for joining lines
-
-// Other settings that should not be touched
-$Dbxspacing = 5; // position vertical line between boxes in relationship chart
-$Dbyspacing = 10; // position vertical spacing between boxes in relationship chart
-$Dbwidth = 250; // horizontal spacing between boxes in all charts
-$Dbheight = 80; // horizontal spacing between boxes in all charts
-$Dindent = 15; // width to indent ancestry and descendancy charts boxes
-$Darrowwidth = 300; // not used that I can see ***
-
-// -- Dimensions for compact version of chart displays
-$cbwidth = 240;
-$cbheight = 50;
-
-// The largest possible area for charts is 300,000 pixels. As the maximum height or width is 1000 pixels
-$WT_STATS_S_CHART_X = 440;
-$WT_STATS_S_CHART_Y = 125;
-$WT_STATS_L_CHART_X = 900;
-// For map charts, the maximum size is 440 pixels wide by 220 pixels high
-$WT_STATS_MAP_X = 440;
-$WT_STATS_MAP_Y = 220;
-$WT_STATS_CHART_COLOR1 = "ffffff";
-$WT_STATS_CHART_COLOR2 = "95b8e0";
-$WT_STATS_CHART_COLOR3 = "c8e7ff";
+return new WT\Theme\Clouds;
diff --git a/themes/colors/css-1.6.2/style.css b/themes/colors/css-1.6.2/style.css
index a0f43ddbc8..fa93caf5a0 100644
--- a/themes/colors/css-1.6.2/style.css
+++ b/themes/colors/css-1.6.2/style.css
@@ -4266,8 +4266,7 @@ header {
content: "";
}
-.lang-active,
-.theme-active {
+.secondary-menu .active {
font-weight: 900;
}
diff --git a/themes/colors/footer.php b/themes/colors/footer.php
deleted file mode 100644
index bd596f2801..0000000000
--- a/themes/colors/footer.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-// Footer for Colors theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo '</main>';
-if ($view !== 'simple') {
- echo '<footer>';
- echo contact_links();
- echo '<p class="logo">';
- echo '<a href="', WT_WEBTREES_URL, '" target="_blank" class="icon-webtrees" title="', WT_WEBTREES, ' ', WT_VERSION, '"></a>';
- echo '</p>';
- if ($WT_TREE && $WT_TREE->getPreference('SHOW_STATS')) {
- echo execution_stats();
- }
- if (exists_pending_change()) {
- echo '<a href="#" onclick="window.open(\'edit_changes.php\', \'_blank\', chan_window_specs); return false;">';
- echo '<p class="error center">', WT_I18N::translate('There are pending changes for you to moderate.'), '</p>';
- echo '</a>';
- }
- echo '</footer>';
-}
diff --git a/themes/colors/header.php b/themes/colors/header.php
deleted file mode 100644
index b145e01236..0000000000
--- a/themes/colors/header.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-// Header for colors theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-use WT\Auth;
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-global $WT_IMAGES, $subColor;
-
-// This theme uses the jQuery “colorbox” plugin to display images
-$this
- ->addExternalJavascript(WT_JQUERY_COLORBOX_URL)
- ->addExternalJavascript(WT_JQUERY_WHEELZOOM_URL)
- ->addInlineJavascript('activate_colorbox();')
- ->addInlineJavascript('jQuery.extend(jQuery.colorbox.settings, {width:"85%", height:"85%", transition:"none", slideshowStart:"'. WT_I18N::translate('Play').'", slideshowStop:"'. WT_I18N::translate('Stop').'"})')
- ->addInlineJavascript('
- jQuery.extend(jQuery.colorbox.settings, {
- title: function() {
- var img_title = jQuery(this).data("title");
- return img_title;
- }
- });
- ');
-
-// Remove list from home when only 1 gedcom
-$this->addInlineJavaScript(
- 'if (jQuery("#menu-tree ul li").length == 2) jQuery("#menu-tree ul li:last-child").remove();'
-);
-
-
-
-$menu_items = array(
- WT_MenuBar::getGedcomMenu(),
- WT_MenuBar::getMyPageMenu(),
- WT_MenuBar::getChartsMenu(),
- WT_MenuBar::getListsMenu(),
- WT_MenuBar::getCalendarMenu(),
- WT_MenuBar::getReportsMenu(),
- WT_MenuBar::getSearchMenu(),
-);
-foreach (WT_MenuBar::getModuleMenus() as $menu) {
- $menu_items[] = $menu;
-}
-
-?>
-<!DOCTYPE html>
-<html <?php echo WT_I18N::html_markup(); ?>>
-<head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <?php echo header_links($META_DESCRIPTION, $META_ROBOTS, $META_GENERATOR, $LINK_CANONICAL); ?>
- <title><?php echo WT_Filter::escapeHtml($title); ?></title>
- <link rel="icon" href="<?php echo WT_CSS_URL; ?>favicon.png" type="image/png">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_THEME_URL; ?>jquery-ui-1.11.2/jquery-ui.css">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_CSS_URL; ?>style.css">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_CSS_URL; ?>palette/<?php echo $subColor; ?>.css">
- <!--[if IE 8]>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
- <![endif]-->
-</head>
-<body>
- <?php if ($view !== 'simple') { ?>
- <header>
- <h1><?php echo WT_TREE_TITLE; ?></h1>
- <ul class="secondary-menu" role="menubar">
- <?php
- if (Auth::check()) {
- echo '<li><a href="edituser.php" class="link">', WT_Filter::escapeHtml(Auth::user()->getRealName()), '</a></li><li>', logout_link(), '</li>';
- if (WT_USER_CAN_ACCEPT && exists_pending_change()) {
- echo ' <li><a href="#" onclick="window.open(\'edit_changes.php\', \'_blank\', chan_window_specs); return false;" style="color:red;">', WT_I18N::translate('Pending changes'), '</a></li>';
- }
- } else {
- echo '<li>', login_link(),'</li>';
- }
- ?>
- <?php echo WT_MenuBar::getFavoritesMenu(); ?>
- <?php echo WT_MenuBar::getLanguageMenu(); ?>
- <?php echo WT_MenuBar::getThemeMenu(); ?>
- <?php if (WT_MenuBar::getThemeMenu()) { echo color_theme_dropdown(); } ?>
- <li>
- <form style="display:inline;" action="search.php" method="post">
- <input type="hidden" name="action" value="general">
- <input type="hidden" name="ged" value="<?php echo WT_GEDCOM; ?>">
- <input type="hidden" name="topsearch" value="yes">
- <input type="search" name="query" size="15" placeholder="<?php echo WT_I18N::translate('Search'); ?>">
- <input class="search-icon" type="image" src="<?php echo $WT_IMAGES['search']; ?>" alt="<?php echo WT_I18N::translate('Search'); ?>" title="<?php echo WT_I18N::translate('Search'); ?>">
- </form>
- </li>
- </ul>
- <nav>
- <ul class="primary-menu" role="menubar">
- <?php
- foreach (array_filter($menu_items) as $menu) {
- echo getMenuAsCustomList($menu);
- }
- ?>
- </ul>
- </nav>
- </header>
- <?php } ?>
- <?php echo WT_FlashMessages::getHtmlMessages(); ?>
- <main id="content">
diff --git a/themes/colors/templates/block_main_temp.php b/themes/colors/templates/block_main_temp.php
deleted file mode 100644
index dbfe4965a0..0000000000
--- a/themes/colors/templates/block_main_temp.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-// Template for drawing the main blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-?>
-<div id="<?php echo $id; ?>" class="block" >
- <table class="blockheader">
- <tr>
- <td class="blockh1" ></td>
- <td class="blockh2" >
- <div class="blockhc"><b><?php echo $title; ?></b></div>
- </td>
- <td class="blockh3"></td>
- </tr>
- </table>
- <div class="blockcontent <?php echo $class; ?>">
- <?php echo $content; ?>
- </div>
-</div>
diff --git a/themes/colors/templates/block_small_temp.php b/themes/colors/templates/block_small_temp.php
deleted file mode 100644
index 24af18c7d8..0000000000
--- a/themes/colors/templates/block_small_temp.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-// Template for drawing the height-restricted blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-?>
-<div id="<?php echo $id; ?>" class="block" >
- <table class="blockheader">
- <tr>
- <td class="blockh1" ></td>
- <td class="blockh2" >
- <div class="blockhc"><b><?php echo $title; ?></b></div>
- </td>
- <td class="blockh3"></td>
- </tr>
- </table>
- <div class="blockcontent <?php echo $class; ?>">
- <div class="small_inner_block">
- <?php echo $content; ?>
- </div>
- </div>
-</div>
diff --git a/themes/colors/templates/compactbox_template.php b/themes/colors/templates/compactbox_template.php
deleted file mode 100644
index 4a3386f801..0000000000
--- a/themes/colors/templates/compactbox_template.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $outBoxAdd, $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '"' , $outBoxAdd, '>
- <div class="compact_view">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '" title="',strip_tags($name.$addname),'">
- <span class="namedef name',$style,'">', $shortname, '</span>
- </a>
- </div>
- <div class="inout2 details',$style,'">',
- $person->getLifeSpan(), '
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/colors/templates/personbox_template.php b/themes/colors/templates/personbox_template.php
deleted file mode 100644
index b1fdc7ade2..0000000000
--- a/themes/colors/templates/personbox_template.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $genderImage, $BirthDeath, $outBoxAdd,
-// $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team. All rights reserved.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '" ',$outBoxAdd,'>
- <div class="noprint icons">', $icons, '</div>',
- '<div class="chart_textbox" style="max-height:', $bheight,'px;">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '">
- <span class="namedef name',$style,'">',
- $name,
- $genderImage,'
- <span class="details',$style,'">' . $LDSord . '</span>
- </span>
- </a>
- <div class="namedef name',$style,'">',$addname,'</div>
- <div class="inout2 details',$style,'">',
- $BirthDeath,
- '</div>
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/colors/theme.php b/themes/colors/theme.php
index c6acf28e85..0cfe922b7a 100644
--- a/themes/colors/theme.php
+++ b/themes/colors/theme.php
@@ -2,10 +2,7 @@
// Colors theme
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -22,190 +19,4 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
// PNG Icons By: Alessandro Rei; License: GPL; www.deviantdark.com
-use WT\Auth;
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-/**
- * Convert a menu into our theme-specific format
- *
- * @param WT_Menu $menu
- *
- * @return string
- */
-function getMenuAsCustomList(WT_Menu $menu) {
- // Create an inert menu - to use as a label
- $tmp = new WT_Menu(strip_tags($menu->getLabel()), '');
-
- // Insert the label into the submenu
- $submenus = $menu->getSubmenus();
- array_unshift($submenus, $tmp);
- $menu->setSubmenus($submenus);
-
- // Neutralise the top-level menu
- $menu->setLabel('');
- $menu->setOnclick('');
-
- return $menu->getMenuAsList();
-}
-
-/**
- * Print color theme sub type change dropdown box
- *
- * @return string
- */
-function color_theme_dropdown() {
- global $COLOR_THEME_LIST, $WT_SESSION, $subColor;
- $menu = new WT_Menu(/* I18N: A colour scheme */ WT_I18N::translate('Palette'), '#', 'menu-color');
- uasort($COLOR_THEME_LIST, array('WT_I18N', 'strcasecmp'));
- foreach ($COLOR_THEME_LIST as $colorChoice => $colorName) {
- $submenu = new WT_Menu($colorName, get_query_url(array('themecolor' => $colorChoice), '&amp;'), 'menu-color-' . $colorChoice);
- if (isset($WT_SESSION->subColor)) {
- if ($WT_SESSION->subColor === $colorChoice) {
- $submenu->addClass('', '', 'theme-active');
- }
- } elseif (WT_Site::getPreference('DEFAULT_COLOR_PALETTE') === $colorChoice) { /* here when visitor changes palette from default */
- $submenu->addClass('', '', 'theme-active');
- } elseif ($subColor === 'ash') { /* here when site has different theme as default and user switches to colors */
- if ($subColor === $colorChoice) {
- $submenu->addClass('', '', 'theme-active');
- }
- }
- $menu->addSubMenu($submenu);
- }
-
- return $menu->getMenuAsList();
-}
-
-/**
- * Define the default palette to be used. Set $subColor
- * to one of the collowing values to determine the default:
- *
- */
-
-$COLOR_THEME_LIST = array(
- 'aquamarine' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Aqua Marine'),
- 'ash' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Ash'),
- 'belgianchocolate'=> /* I18N: The name of a colour-scheme */ WT_I18N::translate('Belgian Chocolate'),
- 'bluelagoon' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Blue Lagoon'),
- 'bluemarine' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Blue Marine'),
- 'coffeeandcream' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Coffee and Cream'),
- 'coldday' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Cold Day'),
- 'greenbeam' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Green Beam'),
- 'mediterranio' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Mediterranio'),
- 'mercury' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Mercury'),
- 'nocturnal' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Nocturnal'),
- 'olivia' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Olivia'),
- 'pinkplastic' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Pink Plastic'),
- 'sage' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Sage'),
- 'shinytomato' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Shiny Tomato'),
- 'tealtop' => /* I18N: The name of a colour-scheme */ WT_I18N::translate('Teal Top'),
-);
-
-// If we've selected a new palette, and we are logged in, set this value as a default.
-if (isset($_GET['themecolor']) && array_key_exists($_GET['themecolor'], $COLOR_THEME_LIST)) {
- // Request to change color
- $subColor = $_GET['themecolor'];
- Auth::user()->setPreference('themecolor', $subColor);
- if (Auth::isAdmin()) {
- WT_Site::setPreference('DEFAULT_COLOR_PALETTE', $subColor);
- }
- unset($_GET['themecolor']);
- // Rember that we have selected a value
- $WT_SESSION->subColor = $subColor;
-}
-// If we are logged in, use our preference
-$subColor = Auth::user()->getPreference('themecolor');
-// If not logged in or no preference, use one we selected earlier in the session?
-if (!$subColor) {
- $subColor = $WT_SESSION->subColor;
-}
-// We haven't selected one this session? Use the site default
-if (!$subColor) {
- $subColor = WT_Site::getPreference('DEFAULT_COLOR_PALETTE');
-}
-// Make sure our selected palette actually exists
-if (!array_key_exists($subColor, $COLOR_THEME_LIST)) {
- $subColor = 'ash';
-}
-
-// Theme name - this needs double quotes, as file is scanned/parsed by script
-$theme_name = "colors"; /* I18N: Name of a theme. */ WT_I18N::translate('colors');
-
-// A version number in the path prevents browser-cache problems during upgrade
-define('WT_CSS_URL', WT_THEME_URL . 'css-1.6.2/');
-
-$footerfile = WT_THEME_DIR . 'footer.php';
-$headerfile = WT_THEME_DIR . 'header.php';
-
-$WT_IMAGES = array(
- // used to draw charts
- 'dline' => WT_CSS_URL . 'images/dline.png',
- 'dline2' => WT_CSS_URL . 'images/dline2.png',
- 'hline' => WT_CSS_URL . 'images/hline.png',
- 'spacer' => WT_CSS_URL . 'images/spacer.png',
- 'vline' => WT_CSS_URL . 'images/vline.png',
-
- // used in button images and javascript
- 'add' => WT_CSS_URL . 'images/add.png',
- 'button_family' => WT_CSS_URL . 'images/buttons/family.png',
- 'minus' => WT_CSS_URL . 'images/minus.png',
- 'plus' => WT_CSS_URL . 'images/plus.png',
- 'remove' => WT_CSS_URL . 'images/delete.png',
- 'search' => WT_CSS_URL . 'images/go.png',
-
- // need different sizes before moving to CSS
- 'default_image_F' => WT_CSS_URL . 'images/silhouette_female.png',
- 'default_image_M' => WT_CSS_URL . 'images/silhouette_male.png',
- 'default_image_U' => WT_CSS_URL . 'images/silhouette_unknown.png',
-);
-
-//-- Variables for the Fan chart
-$fanChart = array(
- 'font' => WT_ROOT . 'includes/fonts/DejaVuSans.ttf',
- 'size' => 7,
- 'color' => '#000000',
- 'bgColor' => '#eeeeee',
- 'bgMColor' => '#b1cff0',
- 'bgFColor' => '#e9daf1'
-);
-
-// This section defines variables for the charts
-$bwidth = 250; // width of boxes on all person-box based charts
-$bheight = 80; // height of boxes on all person-box based chart
-$baseyoffset = 10; // position the timeline chart relative to the top of the page
-$basexoffset = 10; // position the pedigree and timeline charts relative to the left of the page
-$bxspacing = 4; // horizontal spacing between boxes on the pedigree chart
-$byspacing = 5; // vertical spacing between boxes on the pedigree chart
-$brborder = 1; // pedigree chart box right border thickness
-$linewidth = 1.5; // width of joining lines
-$shadowcolor = ''; // shadow color for joining lines
-$shadowblur = 0; // shadow blur for joining lines
-$shadowoffsetX = 0; // shadowOffsetX for joining lines
-$shadowoffsetY = 0; // shadowOffsetY for joining lines
-
-// Other settings that should not be touched
-$Dbxspacing = 5; // position vertical line between boxes in relationship chart
-$Dbyspacing = 10; // position vertical spacing between boxes in relationship chart
-$Dbwidth = 250; // horizontal spacing between boxes in all charts
-$Dbheight = 80; // horizontal spacing between boxes in all charts
-$Dindent = 15; // width to indent ancestry and descendancy charts boxes
-$Darrowwidth = 300; // not used that I can see ***
-
-// Dimensions for compact version of chart displays
-$cbwidth = 240;
-$cbheight = 50;
-
-// The largest possible area for charts is 300,000 pixels. As the maximum height or width is 1000 pixels
-$WT_STATS_S_CHART_X = 440;
-$WT_STATS_S_CHART_Y = 125;
-$WT_STATS_L_CHART_X = 900;
-
-// For map charts, the maximum size is 440 pixels wide by 220 pixels high
-$WT_STATS_MAP_X = 440;
-$WT_STATS_MAP_Y = 220;
-$WT_STATS_CHART_COLOR1 = 'ffffff';
-$WT_STATS_CHART_COLOR2 = '95b8e0';
-$WT_STATS_CHART_COLOR3 = 'c8e7ff';
+return new WT\Theme\Colors;
diff --git a/themes/fab/css-1.6.2/style.css b/themes/fab/css-1.6.2/style.css
index 72fcc6f045..52ceeff275 100644
--- a/themes/fab/css-1.6.2/style.css
+++ b/themes/fab/css-1.6.2/style.css
@@ -4191,8 +4191,7 @@ header h1 {
display: block;
}
-.lang-active,
-.theme-active {
+.secondary-menu .active {
font-weight: 900;
}
diff --git a/themes/fab/footer.php b/themes/fab/footer.php
deleted file mode 100644
index 27f9c81442..0000000000
--- a/themes/fab/footer.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-// Footer for FAB theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Modifications Copyright (c) 2010 Greg Roach
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo '</main>';
-if ($view!='simple') {
- echo '<footer><div class="block">', contact_links();
- if ($WT_TREE && $WT_TREE->getPreference('SHOW_STATS')) {
- echo execution_stats();
- }
- echo '</div><a style="font-size:150%; color:#888;" href="', WT_WEBTREES_URL, '" title="', WT_WEBTREES , ' - ', WT_VERSION, '">', WT_WEBTREES, '</a></footer>';
-}
diff --git a/themes/fab/header.php b/themes/fab/header.php
deleted file mode 100644
index aaf24866a1..0000000000
--- a/themes/fab/header.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-// Header for FAB theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Modifications Copyright (c) 2010 Greg Roach
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-use WT\Auth;
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-// This theme uses the jQuery “colorbox” plugin to display images
-$this
- ->addExternalJavascript(WT_JQUERY_COLORBOX_URL)
- ->addExternalJavascript(WT_JQUERY_WHEELZOOM_URL)
- ->addInlineJavascript('activate_colorbox();')
- ->addInlineJavascript('jQuery.extend(jQuery.colorbox.settings, {width:"85%", height:"85%", transition:"none", slideshowStart:"'. WT_I18N::translate('Play').'", slideshowStop:"'. WT_I18N::translate('Stop').'"})')
- ->addInlineJavascript('
- jQuery.extend(jQuery.colorbox.settings, {
- title: function() {
- var img_title = jQuery(this).data("title");
- return img_title;
- }
- });
- ');
-?>
-<!DOCTYPE html>
-<html <?php echo WT_I18N::html_markup(); ?>>
-<head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <?php echo header_links($META_DESCRIPTION, $META_ROBOTS, $META_GENERATOR, $LINK_CANONICAL); ?>
- <title><?php echo WT_Filter::escapeHtml($title); ?></title>
- <link rel="icon" href="<?php echo WT_CSS_URL; ?>favicon.png" type="image/png">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_THEME_URL; ?>jquery-ui-1.11.2/jquery-ui.css">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_CSS_URL; ?>style.css">
- <!--[if IE 8]>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
- <![endif]-->
-</head>
-<body>
- <?php if ($view !== 'simple') { ?>
- <header>
- <ul class="secondary-menu">
- <?php
- if (Auth::check()) {
- echo '<li><a href="edituser.php">', WT_Filter::escapeHtml(Auth::user()->getRealName()), '</a></li> <li>', logout_link(), '</li>';
- if (WT_USER_CAN_ACCEPT && exists_pending_change()) {
- echo ' <li><a href="#" onclick="window.open(\'edit_changes.php\',\'_blank\',chan_window_specs); return false;" style="color:red;">', WT_I18N::translate('Pending changes'), '</a></li>';
- }
- } else {
- echo '<li>', login_link(), '</li> ';
- }
- ?>
- <?php echo WT_MenuBar::getFavoritesMenu(); ?>
- <?php echo WT_MenuBar::getLanguageMenu(); ?>
- <?php echo WT_MenuBar::getThemeMenu(); ?>
- <li>
- <form style="display:inline;" action="search.php" method="post" role="search">
- <input type="hidden" name="action" value="general">
- <input type="hidden" name="ged" value="<?php echo WT_GEDCOM; ?>">
- <input type="hidden" name="topsearch" value="yes">
- <input type="search" name="query" size="20" placeholder="<?php echo WT_I18N::translate('Search'); ?>">
- </form>
- </li>
- </ul>
- <h1><?php echo WT_TREE_TITLE; ?></h1>
- <nav>
- <ul class="primary-menu" role="menubar">
- <?php echo WT_MenuBar::getGedcomMenu(); ?>
- <?php echo WT_MenuBar::getMyPageMenu(); ?>
- <?php echo WT_MenuBar::getChartsMenu(); ?>
- <?php echo WT_MenuBar::getListsMenu(); ?>
- <?php echo WT_MenuBar::getCalendarMenu(); ?>
- <?php echo WT_MenuBar::getReportsMenu(); ?>
- <?php echo WT_MenuBar::getSearchMenu(); ?>
- <?php echo implode('', WT_MenuBar::getModuleMenus()); ?>
- </ul>
- </nav>
- </header>
- <?php } ?>
- <?php echo WT_FlashMessages::getHtmlMessages(); ?>
- <main id="content">
diff --git a/themes/fab/templates/block_main_temp.php b/themes/fab/templates/block_main_temp.php
deleted file mode 100644
index 35a3b0a990..0000000000
--- a/themes/fab/templates/block_main_temp.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-// Template for drawing the full-height blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-?>
-<div id="<?php echo $id; ?>" class="block">
- <div class="blockheader"><?php echo $title; ?></div>
- <div class="blockcontent <?php echo $class; ?>"><?php echo $content; ?></div>
-</div>
diff --git a/themes/fab/templates/block_small_temp.php b/themes/fab/templates/block_small_temp.php
deleted file mode 100644
index 1c226b5f32..0000000000
--- a/themes/fab/templates/block_small_temp.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-// Template for drawing the height-restricted blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-?>
-<div id="<?php echo $id; ?>" class="block">
- <div class="blockheader"><?php echo $title; ?></div>
- <div class="blockcontent <?php echo $class; ?>" style="max-height:240px; overflow:auto;"><?php echo $content; ?></div>
-</div>
diff --git a/themes/fab/templates/compactbox_template.php b/themes/fab/templates/compactbox_template.php
deleted file mode 100644
index 4a3386f801..0000000000
--- a/themes/fab/templates/compactbox_template.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $outBoxAdd, $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '"' , $outBoxAdd, '>
- <div class="compact_view">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '" title="',strip_tags($name.$addname),'">
- <span class="namedef name',$style,'">', $shortname, '</span>
- </a>
- </div>
- <div class="inout2 details',$style,'">',
- $person->getLifeSpan(), '
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/fab/templates/personbox_template.php b/themes/fab/templates/personbox_template.php
deleted file mode 100644
index b1fdc7ade2..0000000000
--- a/themes/fab/templates/personbox_template.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $genderImage, $BirthDeath, $outBoxAdd,
-// $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team. All rights reserved.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '" ',$outBoxAdd,'>
- <div class="noprint icons">', $icons, '</div>',
- '<div class="chart_textbox" style="max-height:', $bheight,'px;">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '">
- <span class="namedef name',$style,'">',
- $name,
- $genderImage,'
- <span class="details',$style,'">' . $LDSord . '</span>
- </span>
- </a>
- <div class="namedef name',$style,'">',$addname,'</div>
- <div class="inout2 details',$style,'">',
- $BirthDeath,
- '</div>
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/fab/theme.php b/themes/fab/theme.php
index 00ec20957a..241de3828f 100644
--- a/themes/fab/theme.php
+++ b/themes/fab/theme.php
@@ -2,9 +2,7 @@
// FAB theme
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Based on standard theme, which is Copyright (C) 2002 to 2010 PGV Development Team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -20,88 +18,4 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-// Theme name - this needs double quotes, as file is scanned/parsed by script
-$theme_name="F.A.B."; /* I18N: Name of a theme. */ WT_I18N::translate('F.A.B.');
-
-// A version number in the path prevents browser-cache problems during upgrade
-define('WT_CSS_URL', WT_THEME_URL . 'css-1.6.2/');
-
-$headerfile = WT_THEME_DIR.'header.php';
-$footerfile = WT_THEME_DIR.'footer.php';
-
-$WT_IMAGES = array(
- // used to draw charts
- 'dline' => WT_CSS_URL . 'images/dline.png',
- 'dline2' => WT_CSS_URL . 'images/dline2.png',
- 'hline' => WT_CSS_URL . 'images/hline.png',
- 'spacer' => WT_CSS_URL . 'images/spacer.png',
- 'vline' => WT_CSS_URL . 'images/vline.png',
-
- // used in button images and javascript
- 'add' => WT_CSS_URL . 'images/add.png',
- 'button_family' => WT_CSS_URL . 'images/buttons/family.png',
- 'minus' => WT_CSS_URL . 'images/minus.png',
- 'plus' => WT_CSS_URL . 'images/plus.png',
- 'remove' => WT_CSS_URL . 'images/remove.png',
- 'search' => WT_CSS_URL . 'images/search.png',
-
- // need different sizes before moving to CSS
- 'default_image_F' => WT_CSS_URL . 'images/silhouette_female.png',
- 'default_image_M' => WT_CSS_URL . 'images/silhouette_male.png',
- 'default_image_U' => WT_CSS_URL . 'images/silhouette_unknown.png',
-);
-
-// Fan chart
-$fanChart = array(
- 'font' => WT_ROOT . 'includes/fonts/DejaVuSans.ttf',
- 'size' => 7,
- 'color' => '#000000',
- 'bgColor' => '#eeeeee',
- 'bgMColor' => '#b1cff0',
- 'bgFColor' => '#e9daf1'
-);
-
-// variables for the pedigree chart
-$bwidth = 260; // width of boxes on pedigree chart
-$bheight = 80; // height of boxes on pedigree chart
-$baseyoffset = 10; // position the entire pedigree tree relative to the top of the page
-$basexoffset = 10; // position the entire pedigree tree relative to the left of the page
-$bxspacing = 0; // horizontal spacing between boxes on the pedigree chart
-$byspacing = 5; // vertical spacing between boxes on the pedigree chart
-$brborder = 1; // box right border thickness
-$linewidth = 1.5; // width of joining lines
-$shadowcolor = ''; // shadow color for joining lines
-$shadowblur = 0; // shadow blur for joining lines
-$shadowoffsetX = 0; // shadowOffsetX for joining lines
-$shadowoffsetY = 0; // shadowOffsetY for joining lines
-
-// Descendancy and relationship chart variables
-$Dbaseyoffset = 20; // position the entire descendancy tree relative to the top of the page
-$Dbasexoffset = 20; // position the entire descendancy tree relative to the left of the page
-$Dbxspacing = 5; // horizontal spacing between boxes
-$Dbyspacing = 10; // vertical spacing between boxes
-$Dbwidth = 290; // width of DIV layer boxes
-$Dbheight = 80; // height of DIV layer boxes
-$Dindent = 15; // width to indent descendancy boxes
-$Darrowwidth = 30; // additional width to include for the up arrows
-
-// Dimensions for compact version of chart displays
-$cbwidth = 240;
-$cbheight = 50;
-
-// The largest possible area for charts is 300,000 pixels. As the maximum height or width is 1000 pixels
-$WT_STATS_S_CHART_X = 440;
-$WT_STATS_S_CHART_Y = 125;
-$WT_STATS_L_CHART_X = 900;
-
-// For map charts, the maximum size is 440 pixels wide by 220 pixels high
-$WT_STATS_MAP_X = 440;
-$WT_STATS_MAP_Y = 220;
-$WT_STATS_CHART_COLOR1='ffffff';
-$WT_STATS_CHART_COLOR2='9ca3d4';
-$WT_STATS_CHART_COLOR3='e5e6ef';
+return new WT\Theme\Fab;
diff --git a/themes/minimal/css-1.6.2/style.css b/themes/minimal/css-1.6.2/style.css
index bcc59b800e..40c1e19d63 100644
--- a/themes/minimal/css-1.6.2/style.css
+++ b/themes/minimal/css-1.6.2/style.css
@@ -4226,8 +4226,7 @@ header nav {
display: block;
}
-.lang-active,
-.theme-active {
+.secondary-menu .active {
font-weight: 900;
}
diff --git a/themes/minimal/footer.php b/themes/minimal/footer.php
deleted file mode 100644
index 74247e1960..0000000000
--- a/themes/minimal/footer.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-// Footer for Minimal theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo '</main>';
-if ($view!='simple') {
- echo '<footer>';
- echo contact_links();
- echo '<p class="logo">';
- echo '<a href="', WT_WEBTREES_URL, '" target="_blank" title="', WT_WEBTREES, ' ', WT_VERSION, '">webtrees</a>';
- echo '</p>';
- if ($WT_TREE && $WT_TREE->getPreference('SHOW_STATS')) {
- echo execution_stats();
- }
- echo '</footer>';
-}
diff --git a/themes/minimal/header.php b/themes/minimal/header.php
deleted file mode 100644
index c2049a48c7..0000000000
--- a/themes/minimal/header.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-// Header for Minimal theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-use WT\Auth;
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-// This theme uses the jQuery “colorbox” plugin to display images
-$this
- ->addExternalJavascript(WT_JQUERY_COLORBOX_URL)
- ->addExternalJavascript(WT_JQUERY_WHEELZOOM_URL)
- ->addInlineJavascript('activate_colorbox();')
- ->addInlineJavascript('jQuery.extend(jQuery.colorbox.settings, {width:"85%", height:"85%", transition:"none", slideshowStart:"'. WT_I18N::translate('Play').'", slideshowStop:"'. WT_I18N::translate('Stop').'"})')
- ->addInlineJavascript('
- jQuery.extend(jQuery.colorbox.settings, {
- title: function() {
- var img_title = jQuery(this).data("title");
- return img_title;
- }
- });
- ');
-?>
-<!DOCTYPE html>
-<html <?php echo WT_I18N::html_markup(); ?>>
-<head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <?php echo header_links($META_DESCRIPTION, $META_ROBOTS, $META_GENERATOR, $LINK_CANONICAL); ?>
- <title><?php echo WT_Filter::escapeHtml($title); ?></title>
- <link rel="icon" href="<?php echo WT_CSS_URL; ?>favicon.png" type="image/png">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_THEME_URL; ?>jquery-ui-1.11.2/jquery-ui.css">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_CSS_URL; ?>style.css">
- <!--[if IE 8]>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
- <![endif]-->
-</head>
-<body>
- <?php if ($view !== 'simple') { ?>
- <header>
- <h1><?php echo WT_TREE_TITLE; ?></h1>
- <ul class="secondary-menu">
- <?php
- if (Auth::check()) {
- echo '<li><a href="edituser.php">', WT_Filter::escapeHtml(Auth::user()->getRealName()), '</a></li> <li>', logout_link(), '</li>';
- if (WT_USER_CAN_ACCEPT && exists_pending_change()) {
- echo ' <li><a href="#" onclick="window.open(\'edit_changes.php\',\'_blank\',chan_window_specs); return false;" style="color:red;">', WT_I18N::translate('Pending changes'), '</a></li>';
- }
- } else {
- echo '<li>', login_link(), '</li> ';
- }
- ?>
- <?php echo WT_MenuBar::getFavoritesMenu(); ?>
- <?php echo WT_MenuBar::getLanguageMenu(); ?>
- <?php echo WT_MenuBar::getThemeMenu(); ?>
- <li>
- <form style="display:inline;" action="search.php" method="post">
- <input type="hidden" name="action" value="general">
- <input type="hidden" name="ged" value="<?php echo WT_GEDCOM; ?>">
- <input type="hidden" name="topsearch" value="yes">
- <input type="search" name="query" size="20" placeholder="<?php echo WT_I18N::translate('Search'); ?>">
- </form>
- </li>
- </ul>
- <nav>
- <ul class="primary-menu" role="menubar">
- <?php echo WT_MenuBar::getGedcomMenu(); ?>
- <?php echo WT_MenuBar::getMyPageMenu(); ?>
- <?php echo WT_MenuBar::getChartsMenu(); ?>
- <?php echo WT_MenuBar::getListsMenu(); ?>
- <?php echo WT_MenuBar::getCalendarMenu(); ?>
- <?php echo WT_MenuBar::getReportsMenu(); ?>
- <?php echo WT_MenuBar::getSearchMenu(); ?>
- <?php echo implode('', WT_MenuBar::getModuleMenus()); ?>
- </ul>
- </nav>
- </header>
- <?php } ?>
- <?php echo WT_FlashMessages::getHtmlMessages(); ?>
- <main id="content">
diff --git a/themes/minimal/templates/block_main_temp.php b/themes/minimal/templates/block_main_temp.php
deleted file mode 100644
index 0f0b4416e0..0000000000
--- a/themes/minimal/templates/block_main_temp.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-// Template for drawing the main blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2008 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-?>
-<div id="<?php echo $id; ?>" class="block" >
- <div class="blockheader">
- <?php echo $title; ?>
- </div>
- <div class="blockcontent normal_inner_block <?php echo $class; ?>">
- <?php echo $content; ?>
- </div>
-</div>
diff --git a/themes/minimal/templates/block_small_temp.php b/themes/minimal/templates/block_small_temp.php
deleted file mode 100644
index 37e618400c..0000000000
--- a/themes/minimal/templates/block_small_temp.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-// Template for drawing the height-restricted blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2008 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-?>
-<div id="<?php echo $id; ?>" class="block" >
- <div class="blockheader">
- <?php echo $title; ?>
- </div>
- <div class="blockcontent small_inner_block <?php echo $class; ?>">
- <?php echo $content; ?>
- </div>
-</div>
diff --git a/themes/minimal/templates/compactbox_template.php b/themes/minimal/templates/compactbox_template.php
deleted file mode 100644
index 4a3386f801..0000000000
--- a/themes/minimal/templates/compactbox_template.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $outBoxAdd, $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '"' , $outBoxAdd, '>
- <div class="compact_view">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '" title="',strip_tags($name.$addname),'">
- <span class="namedef name',$style,'">', $shortname, '</span>
- </a>
- </div>
- <div class="inout2 details',$style,'">',
- $person->getLifeSpan(), '
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/minimal/templates/personbox_template.php b/themes/minimal/templates/personbox_template.php
deleted file mode 100644
index b1fdc7ade2..0000000000
--- a/themes/minimal/templates/personbox_template.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $genderImage, $BirthDeath, $outBoxAdd,
-// $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team. All rights reserved.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '" ',$outBoxAdd,'>
- <div class="noprint icons">', $icons, '</div>',
- '<div class="chart_textbox" style="max-height:', $bheight,'px;">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '">
- <span class="namedef name',$style,'">',
- $name,
- $genderImage,'
- <span class="details',$style,'">' . $LDSord . '</span>
- </span>
- </a>
- <div class="namedef name',$style,'">',$addname,'</div>
- <div class="inout2 details',$style,'">',
- $BirthDeath,
- '</div>
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/minimal/theme.php b/themes/minimal/theme.php
index dd9f5aeafb..52b66b9b28 100644
--- a/themes/minimal/theme.php
+++ b/themes/minimal/theme.php
@@ -2,10 +2,7 @@
// Minimal theme
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2010 PGV Development Team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -21,90 +18,4 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-// Theme name - this needs double quotes, as file is scanned/parsed by script
-$theme_name = "minimal"; /* I18N: Name of a theme. */ WT_I18N::translate('minimal');
-
-// A version number in the path prevents browser-cache problems during upgrade
-define('WT_CSS_URL', WT_THEME_URL . 'css-1.6.2/');
-
-$headerfile = WT_THEME_DIR.'header.php';
-$footerfile = WT_THEME_DIR.'footer.php';
-
-//-- variables for image names
-$WT_IMAGES = array(
- // used to draw charts
- 'dline' => WT_CSS_URL . 'images/dline.png',
- 'dline2' => WT_CSS_URL . 'images/dline2.png',
- 'hline' => WT_CSS_URL . 'images/hline.png',
- 'spacer' => WT_CSS_URL . 'images/spacer.png',
- 'vline' => WT_CSS_URL . 'images/vline.png',
-
- // used in button images and javascript
- 'add' => WT_CSS_URL . 'images/add.png',
- 'button_family' => WT_CSS_URL . 'images/buttons/family.png',
- 'minus' => WT_CSS_URL . 'images/minus.png',
- 'plus' => WT_CSS_URL . 'images/plus.png',
- 'remove' => WT_CSS_URL . 'images/remove.png',
- 'search' => WT_CSS_URL . 'images/search.png',
-
- // need different sizes before moving to CSS
- 'default_image_F' => WT_CSS_URL . 'images/silhouette_female.png',
- 'default_image_M' => WT_CSS_URL . 'images/silhouette_male.png',
- 'default_image_U' => WT_CSS_URL . 'images/silhouette_unknown.png',
-);
-
-//-- Variables for the Fan chart
-$fanChart = array(
- 'font' => WT_ROOT . 'includes/fonts/DejaVuSans.ttf',
- 'size' => 7,
- 'color' => '#000000',
- 'bgColor' => '#eeeeee',
- 'bgMColor' => '#cccccc',
- 'bgFColor' => '#dddddd'
-);
-
-// This section defines variables for the pedigree chart
-$bwidth = 250; // width of boxes on pedigree chart
-$bheight = 80; // height of boxes on pedigree chart
-$baseyoffset = 10; // position the entire pedigree tree relative to the top of the page
-$basexoffset = 10; // position the entire pedigree tree relative to the left of the page
-$bxspacing = 0; // horizontal spacing between boxes on the pedigree chart
-$byspacing = 5; // vertical spacing between boxes on the pedigree chart
-$brborder = 1; // box right border thickness
-$linewidth = 1.5; // width of joining lines
-$shadowcolor = ''; // shadow color for joining lines
-$shadowblur = 0; // shadow blur for joining lines
-$shadowoffsetX = 0; // shadowOffsetX for joining lines
-$shadowoffsetY = 0; // shadowOffsetY for joining lines
-
-// Global variables for the descendancy chart
-$Dbaseyoffset = 20; // position the entire descendancy tree relative to the top of the page
-$Dbasexoffset = 20; // position the entire descendancy tree relative to the left of the page
-$Dbxspacing = 5; // horizontal spacing between boxes
-$Dbyspacing = 10; // vertical spacing between boxes
-$Dbwidth = 260; // width of DIV layer boxes
-$Dbheight = 80; // height of DIV layer boxes
-$Dindent = 15; // width to indent descendancy boxes
-$Darrowwidth = 30; // additional width to include for the up arrows
-$Darrowwidth = 15; // additional width to include for the up arrows
-
-// Dimensions for compact version of chart displays
-$cbwidth = 240;
-$cbheight = 50;
-
-// The largest possible area for charts is 300,000 pixels. As the maximum height or width is 1000 pixels
-$WT_STATS_S_CHART_X = 440;
-$WT_STATS_S_CHART_Y = 125;
-$WT_STATS_L_CHART_X = 900;
-// For map charts, the maximum size is 440 pixels wide by 220 pixels high
-$WT_STATS_MAP_X = 440;
-$WT_STATS_MAP_Y = 220;
-
-$WT_STATS_CHART_COLOR1 = "ffffff";
-$WT_STATS_CHART_COLOR2 = "555555";
-$WT_STATS_CHART_COLOR3 = "cccccc";
+return new WT\Theme\Minimal;
diff --git a/themes/webtrees/css-1.6.2/style.css b/themes/webtrees/css-1.6.2/style.css
index 37f10d7fea..b590d3b9c2 100644
--- a/themes/webtrees/css-1.6.2/style.css
+++ b/themes/webtrees/css-1.6.2/style.css
@@ -4145,8 +4145,7 @@ header h1 {
display: block;
}
-.lang-active,
-.theme-active {
+.secondary-menu .active.theme-active {
color: #006;
font-weight: 900;
}
diff --git a/themes/webtrees/footer.php b/themes/webtrees/footer.php
deleted file mode 100644
index feaea74f89..0000000000
--- a/themes/webtrees/footer.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-// Footer for webtrees theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo '</main>';
-if ($view !== 'simple') {
- echo '<footer>';
- echo contact_links();
- echo '<p class="logo">';
- echo '<a href="', WT_WEBTREES_URL, '" target="_blank" class="icon-webtrees" title="', WT_WEBTREES, ' ', WT_VERSION, '"></a>';
- echo '</p>';
-
- if ($WT_TREE && $WT_TREE->getPreference('SHOW_STATS')) {
- echo execution_stats();
- }
- if (exists_pending_change()) {
- echo '<a href="#" onclick="window.open(\'edit_changes.php\', \'_blank\', chan_window_specs); return false;">';
- echo '<p class="error center">', WT_I18N::translate('There are pending changes for you to moderate.'), '</p>';
- echo '</a>';
- }
- echo '</footer>';
-}
diff --git a/themes/webtrees/header.php b/themes/webtrees/header.php
deleted file mode 100644
index eac7a2f120..0000000000
--- a/themes/webtrees/header.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-// Header for webtrees theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-use WT\Auth;
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-global $WT_IMAGES;
-
-// This theme uses the jQuery “colorbox” plugin to display images
-$this
- ->addExternalJavascript(WT_JQUERY_COLORBOX_URL)
- ->addExternalJavascript(WT_JQUERY_WHEELZOOM_URL)
- ->addInlineJavascript('activate_colorbox();')
- ->addInlineJavascript('jQuery.extend(jQuery.colorbox.settings, { width:"85%", height:"85%", transition:"none", slideshowStart:"'. WT_I18N::translate('Play').'", slideshowStop:"'. WT_I18N::translate('Stop').'", title: function() { var img_title = jQuery(this).data("title"); return img_title; } } );');
-?>
-<!DOCTYPE html>
-<html <?php echo WT_I18N::html_markup(); ?>>
-<head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <?php echo header_links($META_DESCRIPTION, $META_ROBOTS, $META_GENERATOR, $LINK_CANONICAL); ?>
- <title><?php echo WT_Filter::escapeHtml($title); ?></title>
- <link rel="icon" href="<?php echo WT_CSS_URL; ?>favicon.png" type="image/png">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_THEME_URL; ?>jquery-ui-1.11.2/jquery-ui.css">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_CSS_URL; ?>style.css">
- <!--[if IE 8]>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
- <![endif]-->
-</head>
-<body>
- <?php if ($view !== 'simple') { ?>
- <header>
- <div class="header-logo"></div>
- <ul class="secondary-menu" role="menubar">
- <li>
- <?php
- if (Auth::check()) {
- echo '<a href="edituser.php">', WT_I18N::translate('Logged in as '), ' ', WT_Filter::escapeHtml(Auth::user()->getRealName()), '</a></li> <li>', logout_link();
- } else {
- echo login_link();
- }
- ?>
- </li>
- <?php echo WT_MenuBar::getFavoritesMenu(); ?>
- <?php echo WT_MenuBar::getThemeMenu(); ?>
- <?php echo WT_MenuBar::getLanguageMenu(); ?>
- </ul>
- <h1><?php echo WT_TREE_TITLE; ?></h1>
- <form class="header-search" action="search.php" method="post" role="search">
- <input type="hidden" name="action" value="general">
- <input type="hidden" name="ged" value="<?php echo WT_GEDCOM; ?>">
- <input type="hidden" name="topsearch" value="yes">
- <input type="search" name="query" size="25" placeholder="<?php echo WT_I18N::translate('Search'); ?>">
- <input type="image" class="image" src="<?php echo $WT_IMAGES['search']; ?>" alt="<?php echo WT_I18N::translate('Search'); ?>" title="<?php echo WT_I18N::translate('Search'); ?>">
- </form>
- <nav>
- <ul class="primary-menu" role="menubar">
- <?php echo WT_MenuBar::getGedcomMenu(); ?>
- <?php echo WT_MenuBar::getMyPageMenu(); ?>
- <?php echo WT_MenuBar::getChartsMenu(); ?>
- <?php echo WT_MenuBar::getListsMenu(); ?>
- <?php echo WT_MenuBar::getCalendarMenu(); ?>
- <?php echo WT_MenuBar::getReportsMenu(); ?>
- <?php echo WT_MenuBar::getSearchMenu(); ?>
- <?php echo implode('', WT_MenuBar::getModuleMenus()); ?>
- </ul>
- </nav>
- </header>
- <?php } ?>
- <?php echo WT_FlashMessages::getHtmlMessages(); ?>
- <main id="content">
diff --git a/themes/webtrees/templates/block_main_temp.php b/themes/webtrees/templates/block_main_temp.php
deleted file mode 100644
index 41dc615aa9..0000000000
--- a/themes/webtrees/templates/block_main_temp.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-// Template for drawing the main blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-?>
-<div id="<?php echo $id; ?>" class="block" >
- <div class="blockheader">
- <?php echo $title; ?>
- </div>
- <div class="blockcontent normal_inner_block <?php echo $class; ?>">
- <?php echo $content; ?>
- </div>
-</div>
diff --git a/themes/webtrees/templates/block_small_temp.php b/themes/webtrees/templates/block_small_temp.php
deleted file mode 100644
index 8fa95335ed..0000000000
--- a/themes/webtrees/templates/block_small_temp.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-// Template for drawing the height-restricted blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-?>
-<div id="<?php echo $id; ?>" class="block" >
- <div class="blockheader">
- <?php echo $title; ?>
- </div>
- <div class="blockcontent small_inner_block <?php echo $class; ?>">
- <?php echo $content; ?>
- </div>
-</div>
diff --git a/themes/webtrees/templates/compactbox_template.php b/themes/webtrees/templates/compactbox_template.php
deleted file mode 100644
index 4a3386f801..0000000000
--- a/themes/webtrees/templates/compactbox_template.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $outBoxAdd, $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '"' , $outBoxAdd, '>
- <div class="compact_view">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '" title="',strip_tags($name.$addname),'">
- <span class="namedef name',$style,'">', $shortname, '</span>
- </a>
- </div>
- <div class="inout2 details',$style,'">',
- $person->getLifeSpan(), '
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/webtrees/templates/personbox_template.php b/themes/webtrees/templates/personbox_template.php
deleted file mode 100644
index b1fdc7ade2..0000000000
--- a/themes/webtrees/templates/personbox_template.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $genderImage, $BirthDeath, $outBoxAdd,
-// $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team. All rights reserved.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '" ',$outBoxAdd,'>
- <div class="noprint icons">', $icons, '</div>',
- '<div class="chart_textbox" style="max-height:', $bheight,'px;">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '">
- <span class="namedef name',$style,'">',
- $name,
- $genderImage,'
- <span class="details',$style,'">' . $LDSord . '</span>
- </span>
- </a>
- <div class="namedef name',$style,'">',$addname,'</div>
- <div class="inout2 details',$style,'">',
- $BirthDeath,
- '</div>
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/webtrees/theme.php b/themes/webtrees/theme.php
index 28927345db..f625281c15 100644
--- a/themes/webtrees/theme.php
+++ b/themes/webtrees/theme.php
@@ -2,10 +2,7 @@
// Standard theme
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -20,92 +17,5 @@
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-//
-// PNG Icons By:Alessandro Rei; License: GPL; http://www.kde-look.org/content/show.php/Dark-Glass+reviewed?content=67902
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-// Theme name - this needs double quotes, as file is scanned/parsed by script
-$theme_name = "webtrees";
-
-// A version number in the path prevents browser-cache problems during upgrade
-define('WT_CSS_URL', WT_THEME_URL . 'css-1.6.2/');
-
-$headerfile = WT_THEME_DIR.'header.php';
-$footerfile = WT_THEME_DIR.'footer.php';
-
-// Legacy icons.
-$WT_IMAGES=array(
- // used to draw charts
- 'dline' => WT_CSS_URL . 'images/dline.png',
- 'dline2' => WT_CSS_URL . 'images/dline2.png',
- 'hline' => WT_CSS_URL . 'images/hline.png',
- 'spacer' => WT_CSS_URL . 'images/spacer.png',
- 'vline' => WT_CSS_URL . 'images/vline.png',
-
- // used in button images and javascript
- 'add' => WT_CSS_URL . 'images/add.png',
- 'button_family' => WT_CSS_URL . 'images/buttons/family.png',
- 'minus' => WT_CSS_URL . 'images/minus.png',
- 'plus' => WT_CSS_URL . 'images/plus.png',
- 'remove' => WT_CSS_URL . 'images/remove.png',
- 'search' => WT_CSS_URL . 'images/search.png',
-
- // need different sizes before moving to CSS
- 'default_image_M' => WT_CSS_URL . 'images/silhouette_male.png',
- 'default_image_F' => WT_CSS_URL . 'images/silhouette_female.png',
- 'default_image_U' => WT_CSS_URL . 'images/silhouette_unknown.png',
-);
-
-//-- variables for the fan chart
-$fanChart = array(
- 'font' => WT_ROOT . 'includes/fonts/DejaVuSans.ttf',
- 'size' => 7,
- 'color' => '#000000',
- 'bgColor' => '#eeeeee',
- 'bgMColor' => '#b1cff0',
- 'bgFColor' => '#e9daf1'
-);
-
-// Pedigree chart variables
-$bwidth = 250; // width of boxes on pedigree chart
-$bheight = 80; // height of boxes on pedigree chart
-$baseyoffset = 10; // position the entire pedigree tree relative to the top of the page
-$basexoffset = 10; // position the entire pedigree tree relative to the left of the page
-$bxspacing = 1; // horizontal spacing between boxes on the pedigree chart
-$byspacing = 5; // vertical spacing between boxes on the pedigree chart
-$linewidth = 1.5; // width of joining lines
-$shadowcolor = ''; // shadow color for joining lines
-$shadowblur = 0; // shadow blur for joining lines
-$shadowoffsetX = 0; // shadowOffsetX for joining lines
-$shadowoffsetY = 0; // shadowOffsetY for joining lines
-
-// Descendancy and relationship chart variables
-$Dbaseyoffset = 20; // position the entire descendancy tree relative to the top of the page
-$Dbasexoffset = 20; // position the entire descendancy tree relative to the left of the page
-$Dbxspacing = 5; // horizontal spacing between boxes
-$Dbyspacing = 10; // vertical spacing between boxes
-$Dbwidth = 260; // width of DIV layer boxes
-$Dbheight = 80; // height of DIV layer boxes
-$Dindent = 15; // width to indent descendancy boxes
-$Darrowwidth = 30; // additional width to include for the up arrows
-
-// Compact version of chart displays
-$cbwidth = 240;
-$cbheight = 50;
-
-// The largest possible area for charts is 300,000 pixels. As the maximum height or width is 1000 pixels
-$WT_STATS_S_CHART_X = 440;
-$WT_STATS_S_CHART_Y = 125;
-$WT_STATS_L_CHART_X = 900;
-
-// For map charts, the maximum size is 440 pixels wide by 220 pixels high
-$WT_STATS_MAP_X = 440;
-$WT_STATS_MAP_Y = 220;
-$WT_STATS_CHART_COLOR1 = "ffffff";
-$WT_STATS_CHART_COLOR2 = "9ca3d4";
-$WT_STATS_CHART_COLOR3 = "e5e6ef";
+return new WT\Theme\Webtrees;
diff --git a/themes/xenea/css-1.6.2/style.css b/themes/xenea/css-1.6.2/style.css
index e72bb8eea2..ba953484a4 100644
--- a/themes/xenea/css-1.6.2/style.css
+++ b/themes/xenea/css-1.6.2/style.css
@@ -4216,14 +4216,7 @@ header h1 {
display: block;
}
-.secondary-menu li li a.lang-active,
-.secondary-menu li li a.theme-active {
- color: #006;
- font-weight: 900;
-}
-
-.lang-active,
-.theme-active {
+.secondary-menu .active {
color: #006;
font-weight: 900;
}
diff --git a/themes/xenea/footer.php b/themes/xenea/footer.php
deleted file mode 100644
index 7865eb974c..0000000000
--- a/themes/xenea/footer.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-// Footer for Xenea theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo '</main>';
-if ($view!='simple') {
- echo '<footer>';
- echo contact_links();
- echo '<p class="logo">';
- echo '<a href="', WT_WEBTREES_URL, '" target="_blank" class="icon-webtrees" title="', WT_WEBTREES, ' ', WT_VERSION, '"></a>';
- echo '</p>';
- if ($WT_TREE && $WT_TREE->getPreference('SHOW_STATS')) {
- echo execution_stats();
- }
- if (exists_pending_change()) {
- echo '<a href="#" onclick="window.open(\'edit_changes.php\', \'_blank\', chan_window_specs); return false;">';
- echo '<p class="error center">', WT_I18N::translate('There are pending changes for you to moderate.'), '</p>';
- echo '</a>';
- }
- echo '</footer>';
-}
diff --git a/themes/xenea/header.php b/themes/xenea/header.php
deleted file mode 100644
index d4cbe341cd..0000000000
--- a/themes/xenea/header.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-// Header for xenea theme
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-use WT\Auth;
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-// This theme uses the jQuery “colorbox” plugin to display images
-$this
- ->addExternalJavascript(WT_JQUERY_COLORBOX_URL)
- ->addExternalJavascript(WT_JQUERY_WHEELZOOM_URL)
- ->addInlineJavascript('activate_colorbox();')
- ->addInlineJavascript('jQuery.extend(jQuery.colorbox.settings, {width:"85%", height:"85%", transition:"none", slideshowStart:"'. WT_I18N::translate('Play').'", slideshowStop:"'. WT_I18N::translate('Stop').'"});')
- ->addInlineJavascript('
- jQuery.extend(jQuery.colorbox.settings, {
- title: function() {
- var img_title = jQuery(this).data("title");
- return img_title;
- }
- });
- ');
-?>
-<!DOCTYPE html>
-<html <?php echo WT_I18N::html_markup(); ?>>
-<head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <?php echo header_links($META_DESCRIPTION, $META_ROBOTS, $META_GENERATOR, $LINK_CANONICAL); ?>
- <title><?php echo WT_Filter::escapeHtml($title); ?></title>
- <link rel="icon" href="<?php echo WT_CSS_URL; ?>favicon.png" type="image/png">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_THEME_URL; ?>jquery-ui-1.11.2/jquery-ui.css">
- <link rel="stylesheet" type="text/css" href="<?php echo WT_CSS_URL; ?>style.css">
- <!--[if IE 8]>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
- <![endif]-->
-</head>
-<body>
- <?php if ($view !== 'simple') { ?>
- <header>
- <div class="header-upper">
- <h1><?php echo WT_TREE_TITLE; ?></h1>
- <div class="header-search">
- <form action="search.php" method="post" role="search">
- <input type="hidden" name="action" value="general">
- <input type="hidden" name="ged" value="<?php echo WT_GEDCOM; ?>">
- <input type="hidden" name="topsearch" value="yes">
- <input type="search" name="query" size="12" placeholder="<?php echo WT_I18N::translate('Search'); ?>">
- <input type="submit" name="search" value="&gt;">
- </form>
- </div>
- </div>
- <div class="header-lower">
- <ul class="secondary-menu" role="menubar">
- <?php echo WT_MenuBar::getFavoritesMenu(); ?>
- <?php echo WT_MenuBar::getThemeMenu(); ?>
- <?php
- if (Auth::check()) {
- echo '<li><a href="edituser.php">', WT_Filter::escapeHtml(Auth::user()->getRealName()), '</a></li> <li>', logout_link(), '</li>';
- if (WT_USER_CAN_ACCEPT && exists_pending_change()) {
- echo ' <li><a href="#" onclick="window.open(\'edit_changes.php\', \'_blank\', chan_window_specs); return false;" style="color:red;">', WT_I18N::translate('Pending changes'), '</a></li>';
- }
- } else {
- echo '<li>', login_link(), '</li> ';
- }
- ?>
- <?php echo WT_MenuBar::getLanguageMenu(); ?>
- </ul>
- </div>
- <nav>
- <ul class="primary-menu" role="menubar">
- <?php echo WT_MenuBar::getGedcomMenu(); ?>
- <?php echo WT_MenuBar::getMyPageMenu(); ?>
- <?php echo WT_MenuBar::getChartsMenu(); ?>
- <?php echo WT_MenuBar::getListsMenu(); ?>
- <?php echo WT_MenuBar::getCalendarMenu(); ?>
- <?php echo WT_MenuBar::getReportsMenu(); ?>
- <?php echo WT_MenuBar::getSearchMenu(); ?>
- <?php echo implode('', WT_MenuBar::getModuleMenus()); ?>
- </ul>
- </nav>
- </header>
- <?php } ?>
- <?php echo WT_FlashMessages::getHtmlMessages(); ?>
- <main id="content">
diff --git a/themes/xenea/templates/block_main_temp.php b/themes/xenea/templates/block_main_temp.php
deleted file mode 100644
index 0f0b4416e0..0000000000
--- a/themes/xenea/templates/block_main_temp.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-// Template for drawing the main blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2008 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-?>
-<div id="<?php echo $id; ?>" class="block" >
- <div class="blockheader">
- <?php echo $title; ?>
- </div>
- <div class="blockcontent normal_inner_block <?php echo $class; ?>">
- <?php echo $content; ?>
- </div>
-</div>
diff --git a/themes/xenea/templates/block_small_temp.php b/themes/xenea/templates/block_small_temp.php
deleted file mode 100644
index 37e618400c..0000000000
--- a/themes/xenea/templates/block_small_temp.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-// Template for drawing the height-restricted blocks on the portal pages
-//
-// This template expects that the following variables will be set
-// $id - the DOM id for the block div
-// $title - the title of the block
-// $class - the additional class of the block
-// $content - the content of the block
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2008 to 2009 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-?>
-<div id="<?php echo $id; ?>" class="block" >
- <div class="blockheader">
- <?php echo $title; ?>
- </div>
- <div class="blockcontent small_inner_block <?php echo $class; ?>">
- <?php echo $content; ?>
- </div>
-</div>
diff --git a/themes/xenea/templates/compactbox_template.php b/themes/xenea/templates/compactbox_template.php
deleted file mode 100644
index 4a3386f801..0000000000
--- a/themes/xenea/templates/compactbox_template.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $outBoxAdd, $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '"' , $outBoxAdd, '>
- <div class="compact_view">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '" title="',strip_tags($name.$addname),'">
- <span class="namedef name',$style,'">', $shortname, '</span>
- </a>
- </div>
- <div class="inout2 details',$style,'">',
- $person->getLifeSpan(), '
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/xenea/templates/personbox_template.php b/themes/xenea/templates/personbox_template.php
deleted file mode 100644
index b1fdc7ade2..0000000000
--- a/themes/xenea/templates/personbox_template.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-// Template for drawing person boxes
-// This template expects that the following variables will be set
-// $pid, $boxID, $icons, $GEDCOM, $style,
-// $name, $genderImage, $BirthDeath, $outBoxAdd,
-// $addname
-//
-// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2010 PGV Development Team. All rights reserved.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-echo
-'<div data-pid="'. $pid . '" ',$outBoxAdd,'>
- <div class="noprint icons">', $icons, '</div>',
- '<div class="chart_textbox" style="max-height:', $bheight,'px;">',
- $thumbnail,
- '<a href="individual.php?pid=', $pid, '&amp;ged=', rawurlencode($GEDCOM), '">
- <span class="namedef name',$style,'">',
- $name,
- $genderImage,'
- <span class="details',$style,'">' . $LDSord . '</span>
- </span>
- </a>
- <div class="namedef name',$style,'">',$addname,'</div>
- <div class="inout2 details',$style,'">',
- $BirthDeath,
- '</div>
- </div>
- <div class="inout"></div>
-</div>';
-
diff --git a/themes/xenea/theme.php b/themes/xenea/theme.php
index e54bfcfd58..4e7fe5a4ff 100644
--- a/themes/xenea/theme.php
+++ b/themes/xenea/theme.php
@@ -2,10 +2,7 @@
// Xenea theme
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
-//
-// Derived from PhpGedView
-// Copyright (C) 2002 to 2010 PGV Development Team.
+// Copyright (C) 2015 webtrees development team.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -21,88 +18,4 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-if (!defined('WT_WEBTREES')) {
- header('HTTP/1.0 403 Forbidden');
- exit;
-}
-
-// Theme name - this needs double quotes, as file is scanned/parsed by script
-$theme_name = "xenea"; /* I18N: Name of a theme. */ WT_I18N::translate('xenea');
-
-// A version number in the path prevents browser-cache problems during upgrade
-define('WT_CSS_URL', WT_THEME_URL . 'css-1.6.2/');
-
-$headerfile = WT_THEME_DIR.'header.php';
-$footerfile = WT_THEME_DIR.'footer.php';
-
-//-- variables for image names
-$WT_IMAGES = array(
- // used to draw charts
- 'dline' => WT_CSS_URL . 'images/dline.png',
- 'dline2' => WT_CSS_URL . 'images/dline2.png',
- 'hline' => WT_CSS_URL . 'images/hline.png',
- 'spacer' => WT_CSS_URL . 'images/spacer.png',
- 'vline' => WT_CSS_URL . 'images/vline.png',
-
- // used in button images and javascript
- 'add' => WT_CSS_URL . 'images/add.png',
- 'button_family' => WT_CSS_URL . 'images/buttons/family.png',
- 'minus' => WT_CSS_URL . 'images/minus.png',
- 'plus' => WT_CSS_URL . 'images/plus.png',
- 'remove' => WT_CSS_URL . 'images/remove.png',
- 'search' => WT_CSS_URL . 'images/search.png',
-
- // need different sizes before moving to CSS
- 'default_image_F' => WT_CSS_URL . 'images/silhouette_female.png',
- 'default_image_M' => WT_CSS_URL . 'images/silhouette_male.png',
- 'default_image_U' => WT_CSS_URL . 'images/silhouette_unknown.png',
-);
-
-// Variables for the Fan chart
-$fanChart = array(
- 'font' => WT_ROOT . 'includes/fonts/DejaVuSans.ttf',
- 'size' => 7,
- 'color' => '#000000',
- 'bgColor' => '#eeeeee',
- 'bgMColor' => '#b1cff0',
- 'bgFColor' => '#e9daf1'
-);
-
-// This section defines variables for the pedigree chart
-$bwidth = 250; // width of boxes on pedigree chart
-$bheight = 80; // height of boxes on pedigree chart
-$baseyoffset = 10; // position the entire pedigree tree relative to the top of the page
-$basexoffset = 10; // position the entire pedigree tree relative to the left of the page
-$bxspacing = 1; // horizontal spacing between boxes on the pedigree chart
-$byspacing = 5; // vertical spacing between boxes on the pedigree chart
-$brborder = 1; // box right border thickness
-$linewidth = 1.5; // width of joining lines
-$shadowcolor = ''; // shadow color for joining lines
-$shadowblur = 0; // shadow blur for joining lines
-$shadowoffsetX = 0; // shadowOffsetX for joining lines
-$shadowoffsetY = 0; // shadowOffsetY for joining lines
-
-// Global variables for the descendancy chart
-$Dbaseyoffset = 20; // position the entire descendancy tree relative to the top of the page
-$Dbasexoffset = 20; // position the entire descendancy tree relative to the left of the page
-$Dbxspacing = 5; // horizontal spacing between boxes
-$Dbyspacing = 10; // vertical spacing between boxes
-$Dbwidth = 260; // width of DIV layer boxes
-$Dbheight = 80; // height of DIV layer boxes
-$Dindent = 15; // width to indent descendancy boxes
-$Darrowwidth = 30; // additional width to include for the up arrows
-
-// Dimensions for compact version of chart displays
-$cbwidth=240;
-$cbheight=50;
-
-// The largest possible area for charts is 300,000 pixels. As the maximum height or width is 1000 pixels
-$WT_STATS_S_CHART_X = 440;
-$WT_STATS_S_CHART_Y = 125;
-$WT_STATS_L_CHART_X = 900;
-// For map charts, the maximum size is 440 pixels wide by 220 pixels high
-$WT_STATS_MAP_X = 440;
-$WT_STATS_MAP_Y = 220;
-$WT_STATS_CHART_COLOR1 = "ffffff";
-$WT_STATS_CHART_COLOR2 = "84beff";
-$WT_STATS_CHART_COLOR3 = "c3dfff";
+return new WT\Theme\Xenea;
diff --git a/timeline.php b/timeline.php
index af8a59077f..6942bd8707 100644
--- a/timeline.php
+++ b/timeline.php
@@ -4,7 +4,7 @@
// Use the $pids array to set which individuals to show on the chart
//
// webtrees: Web based Family History software
-// Copyright (C) 2014 webtrees development team.
+// Copyright (C) 2015 webtrees development team.
//
// Derived from PhpGedView
// Copyright (C) 2002 to 2009 PGV Development Team.
@@ -23,6 +23,8 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+use WT\Theme;
+
define('WT_SCRIPT_NAME', 'timeline.php');
require './includes/session.php';
@@ -183,20 +185,20 @@ document.onmousemove = function (e) {
if (newy < boxmean) {
if (textDirection === 'rtl') {
- dbox.style.backgroundImage = "url('<?php echo $WT_IMAGES["dline2"]; ?>')";
+ dbox.style.backgroundImage = "url('<?php echo Theme::theme()->parameter('image-dline2'); ?>')";
dbox.style.backgroundPosition = "0% 0%";
} else {
- dbox.style.backgroundImage = "url('<?php echo $WT_IMAGES["dline"]; ?>')";
+ dbox.style.backgroundImage = "url('<?php echo Theme::theme()->parameter('image-dline'); ?>')";
dbox.style.backgroundPosition = "0% 100%";
}
dy = -dy;
dbox.style.top = (newy + bheight / 3) + "px";
} else {
if (textDirection === 'rtl') {
- dbox.style.backgroundImage = "url('<?php echo $WT_IMAGES["dline"]; ?>')";
+ dbox.style.backgroundImage = "url('<?php echo Theme::theme()->parameter('image-dline'); ?>')";
dbox.style.backgroundPosition = "0% 100%";
} else {
- dbox.style.backgroundImage = "url('<?php echo $WT_IMAGES["dline2"]; ?>')";
+ dbox.style.backgroundImage = "url('<?php echo Theme::theme()->parameter('image-dline2'); ?>')";
dbox.style.backgroundPosition = "0% 0%";
}
@@ -321,7 +323,7 @@ if (count($controller->people) > 0) {
<div id="timeline_chart">
<!-- print the timeline line image -->
<div id="line" style="position:absolute; <?php echo $TEXT_DIRECTION =="ltr"?"left: ".($basexoffset + 22):"right: ".($basexoffset + 22); ?>px; top: <?php echo $baseyoffset; ?>px;">
- <img src="<?php echo $WT_IMAGES["vline"]; ?>" width="3" height="<?php echo ($baseyoffset + (($controller->topyear-$controller->baseyear)*$controller->scale)); ?>" alt="">
+ <img src="<?php echo Theme::theme()->parameter('image-vline'); ?>" width="3" height="<?php echo ($baseyoffset + (($controller->topyear-$controller->baseyear)*$controller->scale)); ?>" alt="">
</div>
<!-- print divs for the grid -->
<div id="scale<?php echo $controller->baseyear; ?>" style="position:absolute; <?php echo ($TEXT_DIRECTION =="ltr"?"left: $basexoffset":"right: $basexoffset"); ?>px; top: <?php echo ($baseyoffset-5); ?>px; font-size: 7pt; text-align: <?php echo ($TEXT_DIRECTION =="ltr"?"left":"right"); ?>;">
@@ -360,7 +362,7 @@ if (count($controller->people) > 0) {
<table cellspacing="0" cellpadding="0">
<tr>
<td>
- <img src="<?php echo $WT_IMAGES["hline"]; ?>" name="ageline<?php echo $p; ?>" id="ageline<?php echo $p; ?>" align="left" width="25" height="3" alt="">
+ <img src="<?php echo Theme::theme()->parameter('image-hline'); ?>" name="ageline<?php echo $p; ?>" id="ageline<?php echo $p; ?>" align="left" width="25" height="3" alt="">
</td>
<td valign="top">
<?php